]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: Publish and mock virHostCPUGetMSRFromKVM
authorJiri Denemark <jdenemar@redhat.com>
Mon, 25 May 2026 10:27:41 +0000 (12:27 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 2 Jun 2026 11:45:26 +0000 (13:45 +0200)
The function will later be called when probing QEMU capabilities.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/libvirt_private.syms
src/util/virhostcpu.c
src/util/virhostcpu.h
tests/qemucpumock.c

index fa448a2a1c133cbd1f30509a6cad7aac46b7f40b..db59695a45551a0f39176e39b47bffd1edfcadb7 100644 (file)
@@ -2621,6 +2621,7 @@ virHostCPUGetKVMMaxVCPUs;
 virHostCPUGetMap;
 virHostCPUGetMicrocodeVersion;
 virHostCPUGetMSR;
+virHostCPUGetMSRFromKVM;
 virHostCPUGetOnline;
 virHostCPUGetOnlineBitmap;
 virHostCPUGetPhysAddrSize;
index 60743765a4bf9414038e5bcf398c31ba31752bde..1db096ba24dfc6e361ce515011be76da6427cd59 100644 (file)
@@ -1376,7 +1376,18 @@ virHostCPUGetMicrocodeVersion(virArch hostArch G_GNUC_UNUSED)
 
 #if WITH_LINUX_KVM_H && defined(KVM_GET_MSRS) && \
     (defined(__i386__) || defined(__x86_64__))
-static int
+/**
+ * virHostCPUGetMSRFromKVM:
+ * @index: MSR to read
+ * @result: where to store the content of the @index register
+ *
+ * Reads the 64b content of the specified register via KVM_GET_MSRS ioctl.
+ *
+ * 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 +1624,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)
index 238054ed348c001cb26bcfb7932d1f33ef3da4e4..4df126dcc49495ea804a8133fe664c24e5e4d5ad 100644 (file)
@@ -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);
 
index c85721f448463ead490f169dad035e0739ca4eac..f8410912d4bbd526f110ed4bf0cb9d4dcc50a76b 100644 (file)
@@ -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;
+}