From: Jiri Denemark <[email protected]> The function will later be called when probing QEMU capabilities.
Signed-off-by: Jiri Denemark <[email protected]> --- 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 2391f01bc7..3653459ef1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2619,6 +2619,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
