Pablo Greco 40546a
From 016b5348df8fc1007c08b0d0deec68d923be2e75 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <016b5348df8fc1007c08b0d0deec68d923be2e75@dist-git>
Pablo Greco 40546a
From: Jiri Denemark <jdenemar@redhat.com>
Pablo Greco 40546a
Date: Fri, 21 Jun 2019 09:26:08 +0200
Pablo Greco 40546a
Subject: [PATCH] cpu_x86: Introduce virCPUx86FeatureFilter*MSR
Pablo Greco 40546a
MIME-Version: 1.0
Pablo Greco 40546a
Content-Type: text/plain; charset=UTF-8
Pablo Greco 40546a
Content-Transfer-Encoding: 8bit
Pablo Greco 40546a
Pablo Greco 40546a
This functions may be used as a virCPUDefFeatureFilter callbacks for
Pablo Greco 40546a
virCPUDefCheckFeatures, virCPUDefFilerFeatures, and similar functions to
Pablo Greco 40546a
select (virCPUx86FeatureFilterSelectMSR) or drop
Pablo Greco 40546a
(virCPUx86FeatureFilterDropMSR) features reported via MSR.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
(cherry picked from commit bcfed7f1c84cbff21d129a79cbd675b0cd51613c)
Pablo Greco 40546a
Pablo Greco 40546a
https://bugzilla.redhat.com/show_bug.cgi?id=1697627
Pablo Greco 40546a
Pablo Greco 40546a
Conflicts:
Pablo Greco 40546a
	src/cpu/cpu_x86.h
Pablo Greco 40546a
            - downstream did not switch to #pragma once
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Pablo Greco 40546a
Message-Id: <1a0fd2733f3aaec22e4ad598086baac0f086bb47.1561068591.git.jdenemar@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 src/cpu/cpu_x86.c        | 57 ++++++++++++++++++++++++++++++++++++++++
Pablo Greco 40546a
 src/cpu/cpu_x86.h        |  6 +++++
Pablo Greco 40546a
 src/libvirt_private.syms |  3 ++-
Pablo Greco 40546a
 3 files changed, 65 insertions(+), 1 deletion(-)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
Pablo Greco 40546a
index 75527fd28f..ec0e408f98 100644
Pablo Greco 40546a
--- a/src/cpu/cpu_x86.c
Pablo Greco 40546a
+++ b/src/cpu/cpu_x86.c
Pablo Greco 40546a
@@ -3351,6 +3351,63 @@ virCPUx86DataAddFeature(virCPUDataPtr cpuData,
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
 
Pablo Greco 40546a
+static bool
Pablo Greco 40546a
+virCPUx86FeatureIsMSR(const char *name)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    virCPUx86FeaturePtr feature;
Pablo Greco 40546a
+    virCPUx86DataIterator iter;
Pablo Greco 40546a
+    virCPUx86DataItemPtr item;
Pablo Greco 40546a
+    virCPUx86MapPtr map;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (!(map = virCPUx86GetMap()))
Pablo Greco 40546a
+        return false;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (!(feature = x86FeatureFind(map, name)) &&
Pablo Greco 40546a
+        !(feature = x86FeatureFindInternal(name)))
Pablo Greco 40546a
+        return false;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    virCPUx86DataIteratorInit(&iter, &feature->data);
Pablo Greco 40546a
+    while ((item = virCPUx86DataNext(&iter))) {
Pablo Greco 40546a
+        if (item->type == VIR_CPU_X86_DATA_MSR)
Pablo Greco 40546a
+            return true;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    return false;
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+
Pablo Greco 40546a
+/**
Pablo Greco 40546a
+ * virCPUx86FeatureFilterSelectMSR:
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * This is a callback for functions filtering features in virCPUDef. The result
Pablo Greco 40546a
+ * will contain only MSR features.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * Returns true if @name is an MSR feature, false otherwise.
Pablo Greco 40546a
+ */
Pablo Greco 40546a
+bool
Pablo Greco 40546a
+virCPUx86FeatureFilterSelectMSR(const char *name,
Pablo Greco 40546a
+                                void *opaque ATTRIBUTE_UNUSED)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    return virCPUx86FeatureIsMSR(name);
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+
Pablo Greco 40546a
+/**
Pablo Greco 40546a
+ * virCPUx86FeatureFilterDropMSR:
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * This is a callback for functions filtering features in virCPUDef. The result
Pablo Greco 40546a
+ * will not contain any MSR feature.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * Returns true if @name is not an MSR feature, false otherwise.
Pablo Greco 40546a
+ */
Pablo Greco 40546a
+bool
Pablo Greco 40546a
+virCPUx86FeatureFilterDropMSR(const char *name,
Pablo Greco 40546a
+                              void *opaque ATTRIBUTE_UNUSED)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    return !virCPUx86FeatureIsMSR(name);
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+
Pablo Greco 40546a
 struct cpuArchDriver cpuDriverX86 = {
Pablo Greco 40546a
     .name = "x86",
Pablo Greco 40546a
     .arch = archs,
Pablo Greco 40546a
diff --git a/src/cpu/cpu_x86.h b/src/cpu/cpu_x86.h
Pablo Greco 40546a
index 519024b7c0..5126679985 100644
Pablo Greco 40546a
--- a/src/cpu/cpu_x86.h
Pablo Greco 40546a
+++ b/src/cpu/cpu_x86.h
Pablo Greco 40546a
@@ -45,4 +45,10 @@ uint32_t virCPUx86DataGetSignature(virCPUDataPtr cpuData,
Pablo Greco 40546a
 int virCPUx86DataSetVendor(virCPUDataPtr cpuData,
Pablo Greco 40546a
                            const char *vendor);
Pablo Greco 40546a
 
Pablo Greco 40546a
+bool virCPUx86FeatureFilterSelectMSR(const char *name,
Pablo Greco 40546a
+                                     void *opaque);
Pablo Greco 40546a
+
Pablo Greco 40546a
+bool virCPUx86FeatureFilterDropMSR(const char *name,
Pablo Greco 40546a
+                                   void *opaque);
Pablo Greco 40546a
+
Pablo Greco 40546a
 #endif /* __VIR_CPU_X86_H__ */
Pablo Greco 40546a
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
Pablo Greco 40546a
index 0290f960a0..f158a17b49 100644
Pablo Greco 40546a
--- a/src/libvirt_private.syms
Pablo Greco 40546a
+++ b/src/libvirt_private.syms
Pablo Greco 40546a
@@ -1210,7 +1210,8 @@ virCPUx86DataAdd;
Pablo Greco 40546a
 virCPUx86DataGetSignature;
Pablo Greco 40546a
 virCPUx86DataSetSignature;
Pablo Greco 40546a
 virCPUx86DataSetVendor;
Pablo Greco 40546a
-
Pablo Greco 40546a
+virCPUx86FeatureFilterDropMSR;
Pablo Greco 40546a
+virCPUx86FeatureFilterSelectMSR;
Pablo Greco 40546a
 
Pablo Greco 40546a
 # datatypes.h
Pablo Greco 40546a
 virConnectClass;
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a