From: Jiri Denemark <[email protected]>

The function will later be called when probing QEMU capabilities.

Signed-off-by: Jiri Denemark <[email protected]>
---

Notes:
    Version 2:
    - no change

 src/libvirt_private.syms |  1 +
 src/util/virhostcpu.c    | 16 +++++++++++++++-
 src/util/virhostcpu.h    |  3 +++
 tests/qemucpumock.c      | 22 ++++++++++++++++++++++
 4 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 95f7b409db..4538315db0 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2620,6 +2620,7 @@ virHostCPUGetKVMMaxVCPUs;
 virHostCPUGetMap;
 virHostCPUGetMicrocodeVersion;
 virHostCPUGetMSR;
+virHostCPUGetMSRFromKVM;
 virHostCPUGetOnline;
 virHostCPUGetOnlineBitmap;
 virHostCPUGetPhysAddrSize;
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
index 60743765a4..afa9ee3849 100644
--- a/src/util/virhostcpu.c
+++ b/src/util/virhostcpu.c
@@ -1376,7 +1376,12 @@ virHostCPUGetMicrocodeVersion(virArch hostArch 
G_GNUC_UNUSED)
 
 #if WITH_LINUX_KVM_H && defined(KVM_GET_MSRS) && \
     (defined(__i386__) || defined(__x86_64__))
-static int
+/*
+ * Returns 0 on success,
+ *         1 when the MSR is not supported by the host CPU,
+ *        -1 on error.
+ */
+int
 virHostCPUGetMSRFromKVM(unsigned long index,
                         uint64_t *result)
 {
@@ -1613,6 +1618,15 @@ virHostCPUGetCPUID(void)
     return NULL;
 }
 
+int
+virHostCPUGetMSRFromKVM(unsigned long index G_GNUC_UNUSED,
+                        uint64_t *result G_GNUC_UNUSED)
+{
+    virReportSystemError(ENOSYS, "%s",
+                         _("Reading MSRs is not supported on this platform"));
+    return -1;
+}
+
 int
 virHostCPUGetMSR(unsigned long index G_GNUC_UNUSED,
                  uint64_t *msr G_GNUC_UNUSED)
diff --git a/src/util/virhostcpu.h b/src/util/virhostcpu.h
index 238054ed34..4df126dcc4 100644
--- a/src/util/virhostcpu.h
+++ b/src/util/virhostcpu.h
@@ -78,6 +78,9 @@ int virHostCPUGetOnline(unsigned int cpu, bool *online);
 unsigned int
 virHostCPUGetMicrocodeVersion(virArch hostArch) ATTRIBUTE_MOCKABLE;
 
+int virHostCPUGetMSRFromKVM(unsigned long index,
+                            uint64_t *result) ATTRIBUTE_MOCKABLE;
+
 int virHostCPUGetMSR(unsigned long index,
                      uint64_t *msr);
 
diff --git a/tests/qemucpumock.c b/tests/qemucpumock.c
index c85721f448..f8410912d4 100644
--- a/tests/qemucpumock.c
+++ b/tests/qemucpumock.c
@@ -23,6 +23,7 @@
 #include "qemu/qemu_capspriv.h"
 #include "testutilshostcpus.h"
 #include "virarch.h"
+#include "util/virhostcpu.h"
 
 
 virCPUDef *
@@ -33,3 +34,24 @@ virQEMUCapsProbeHostCPU(virArch hostArch G_GNUC_UNUSED,
 
     return testUtilsHostCpusGetDefForModel(model);
 }
+
+
+int
+virHostCPUGetMSRFromKVM(unsigned long index,
+                        uint64_t *result)
+{
+    if (index == 0x10a) {
+        /* Return some arbitrary bits in arch-capabilities MSR */
+        *result =
+            0x00000001 | /* rdctl-no */
+            0x00000008 | /* skip-l1dfl-vmentry */
+            0x00000020 | /* mds-no */
+            0x00000040 | /* pschange-mc-no */
+            0x04000000 | /* gds-no */
+            0x08000000;  /* rfds-no */
+        return 0;
+    }
+
+    errno = ENOTSUP;
+    return -1;
+}
-- 
2.54.0

Reply via email to