From: Jiri Denemark Date: Mon, 25 May 2026 10:27:41 +0000 (+0200) Subject: util: Publish and mock virHostCPUGetMSRFromKVM X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3184289356bd97daa75f77bec189e5ce152ba5e6;p=thirdparty%2Flibvirt.git util: Publish and mock virHostCPUGetMSRFromKVM The function will later be called when probing QEMU capabilities. Signed-off-by: Jiri Denemark Reviewed-by: Peter Krempa --- diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fa448a2a1c..db59695a45 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2621,6 +2621,7 @@ virHostCPUGetKVMMaxVCPUs; virHostCPUGetMap; virHostCPUGetMicrocodeVersion; virHostCPUGetMSR; +virHostCPUGetMSRFromKVM; virHostCPUGetOnline; virHostCPUGetOnlineBitmap; virHostCPUGetPhysAddrSize; diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 60743765a4..1db096ba24 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -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) 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; +}