From 8da3ca8419b222c50d98e5b6b83ff58955112277 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Thu, 2 Feb 2017 20:12:38 +0100 Subject: [PATCH] cpu_x86: Introduce virCPUx86DataSetVendor The API is useful for creating virCPUData in a hypervisor driver from data we got by querying the hypervisor. Signed-off-by: Jiri Denemark --- src/cpu/cpu_x86.c | 45 +++++++++++++++++++++++++++++++--------- src/cpu/cpu_x86.h | 3 +++ src/libvirt_private.syms | 1 + 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index e3f860bc6a..ab5e5257db 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -478,6 +478,26 @@ x86DataToVendor(const virCPUx86Data *data, } +static int +virCPUx86VendorToCPUID(const char *vendor, + virCPUx86CPUID *cpuid) +{ + if (strlen(vendor) != VENDOR_STRING_LENGTH) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid CPU vendor string '%s'"), vendor); + return -1; + } + + cpuid->eax_in = 0; + cpuid->ecx_in = 0; + cpuid->ebx = virReadBufInt32LE(vendor); + cpuid->edx = virReadBufInt32LE(vendor + 4); + cpuid->ecx = virReadBufInt32LE(vendor + 8); + + return 0; +} + + static uint32_t x86MakeSignature(unsigned int family, unsigned int model) @@ -651,17 +671,9 @@ x86VendorParse(xmlXPathContextPtr ctxt, vendor->name); goto error; } - if (strlen(string) != VENDOR_STRING_LENGTH) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Invalid CPU vendor string '%s'"), string); - goto error; - } - vendor->cpuid.eax_in = 0; - vendor->cpuid.ecx_in = 0; - vendor->cpuid.ebx = virReadBufInt32LE(string); - vendor->cpuid.edx = virReadBufInt32LE(string + 4); - vendor->cpuid.ecx = virReadBufInt32LE(string + 8); + if (virCPUx86VendorToCPUID(string, &vendor->cpuid) < 0) + goto error; cleanup: VIR_FREE(string); @@ -2731,6 +2743,19 @@ virCPUx86DataSetSignature(virCPUDataPtr cpuData, } +int +virCPUx86DataSetVendor(virCPUDataPtr cpuData, + const char *vendor) +{ + virCPUx86CPUID cpuid = { 0 }; + + if (virCPUx86VendorToCPUID(vendor, &cpuid) < 0) + return -1; + + return virCPUx86DataAddCPUID(cpuData, &cpuid); +} + + struct cpuArchDriver cpuDriverX86 = { .name = "x86", .arch = archs, diff --git a/src/cpu/cpu_x86.h b/src/cpu/cpu_x86.h index ffbd064b46..ab53949149 100644 --- a/src/cpu/cpu_x86.h +++ b/src/cpu/cpu_x86.h @@ -36,4 +36,7 @@ int virCPUx86DataSetSignature(virCPUDataPtr cpuData, unsigned int family, unsigned int model); +int virCPUx86DataSetVendor(virCPUDataPtr cpuData, + const char *vendor); + #endif /* __VIR_CPU_X86_H__ */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f92cb31f8e..0dda65a2bc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1004,6 +1004,7 @@ virCPUUpdate; # cpu/cpu_x86.h virCPUx86DataAddCPUID; virCPUx86DataSetSignature; +virCPUx86DataSetVendor; # datatypes.h