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 <jdenemar@redhat.com>
This commit is contained in:
Jiri Denemark 2017-02-02 20:12:38 +01:00
parent f358a75ab3
commit 8da3ca8419
3 changed files with 39 additions and 10 deletions

View File

@ -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 static uint32_t
x86MakeSignature(unsigned int family, x86MakeSignature(unsigned int family,
unsigned int model) unsigned int model)
@ -651,17 +671,9 @@ x86VendorParse(xmlXPathContextPtr ctxt,
vendor->name); vendor->name);
goto error; 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; if (virCPUx86VendorToCPUID(string, &vendor->cpuid) < 0)
vendor->cpuid.ecx_in = 0; goto error;
vendor->cpuid.ebx = virReadBufInt32LE(string);
vendor->cpuid.edx = virReadBufInt32LE(string + 4);
vendor->cpuid.ecx = virReadBufInt32LE(string + 8);
cleanup: cleanup:
VIR_FREE(string); 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 = { struct cpuArchDriver cpuDriverX86 = {
.name = "x86", .name = "x86",
.arch = archs, .arch = archs,

View File

@ -36,4 +36,7 @@ int virCPUx86DataSetSignature(virCPUDataPtr cpuData,
unsigned int family, unsigned int family,
unsigned int model); unsigned int model);
int virCPUx86DataSetVendor(virCPUDataPtr cpuData,
const char *vendor);
#endif /* __VIR_CPU_X86_H__ */ #endif /* __VIR_CPU_X86_H__ */

View File

@ -1004,6 +1004,7 @@ virCPUUpdate;
# cpu/cpu_x86.h # cpu/cpu_x86.h
virCPUx86DataAddCPUID; virCPUx86DataAddCPUID;
virCPUx86DataSetSignature; virCPUx86DataSetSignature;
virCPUx86DataSetVendor;
# datatypes.h # datatypes.h