<feature name='rdtscp'/>
</model>
- <model name='Haswell'>
+ <model name='Haswell-noTSX'>
<model name='SandyBridge'/>
<feature name='fma'/>
<feature name='pcid'/>
<feature name='movbe'/>
<feature name='fsgsbase'/>
<feature name='bmi1'/>
- <feature name='hle'/>
<feature name='avx2'/>
<feature name='smep'/>
<feature name='bmi2'/>
<feature name='erms'/>
<feature name='invpcid'/>
+ </model>
+
+ <model name='Haswell'>
+ <model name='Haswell-noTSX'/>
+ <feature name='hle'/>
<feature name='rtm'/>
</model>
- <model name='Broadwell'>
- <model name='Haswell'/>
+ <model name='Broadwell-noTSX'>
+ <model name='Haswell-noTSX'/>
<feature name='3dnowprefetch'/>
<feature name='rdseed'/>
<feature name='adx'/>
<feature name='smap'/>
</model>
+ <model name='Broadwell'>
+ <model name='Broadwell-noTSX'/>
+ <feature name='hle'/>
+ <feature name='rtm'/>
+ </model>
+
<!-- AMD CPUs -->
<model name='athlon'>
<model name='pentiumpro'/>
goto cleanup;
n = virXPathNodeSet("/cpuTest/cpu", ctxt, &nodes);
- if (n <= 0 || (VIR_ALLOC_N(cpus, n) < 0))
+ if (n <= 0 || (VIR_ALLOC_N(cpus, n) < 0)) {
+ fprintf(stderr, "\nNo /cpuTest/cpu elements found in %s\n", xml);
goto cleanup;
+ }
for (i = 0; i < n; i++) {
ctxt->node = nodes[i];
static const char *model486[] = { "486" };
static const char *nomodel[] = { "nomodel" };
static const char *models[] = { "qemu64", "core2duo", "Nehalem" };
+static const char *haswell[] = { "SandyBridge", "Haswell" };
static const char *ppc_models[] = { "POWER7", "POWER7_v2.1", "POWER8_v1.0"};
static int
DO_TEST_BASELINE("x86", "5", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
DO_TEST_BASELINE("x86", "6", 0, 0);
DO_TEST_BASELINE("x86", "6", VIR_CONNECT_BASELINE_CPU_MIGRATABLE, 0);
+ DO_TEST_BASELINE("x86", "7", 0, 0);
+ DO_TEST_BASELINE("x86", "8", 0, 0);
DO_TEST_BASELINE("ppc64", "incompatible-vendors", 0, -1);
DO_TEST_BASELINE("ppc64", "no-vendor", 0, 0);
DO_TEST_GUESTDATA("x86", "host", "host+host-model", models, "Penryn", 0);
DO_TEST_GUESTDATA("x86", "host", "host+host-model-nofallback",
models, "Penryn", -1);
+ DO_TEST_GUESTDATA("x86", "host-Haswell-noTSX", "Haswell",
+ haswell, "Haswell", 0);
+ DO_TEST_GUESTDATA("x86", "host-Haswell-noTSX", "Haswell-noTSX",
+ haswell, "Haswell-noTSX", 0);
+ DO_TEST_GUESTDATA("x86", "host-Haswell-noTSX", "Haswell-noTSX-nofallback",
+ haswell, "Haswell-noTSX", -1);
+ DO_TEST_GUESTDATA("x86", "host-Haswell-noTSX", "Haswell-noTSX",
+ NULL, "Haswell-noTSX", 0);
DO_TEST_GUESTDATA("ppc64", "host", "guest", ppc_models, NULL, 0);
DO_TEST_GUESTDATA("ppc64", "host", "guest-nofallback", ppc_models, "POWER7_v2.1", -1);
--- /dev/null
+<cpu mode='custom' match='exact'>
+ <model fallback='forbid'>Haswell-noTSX</model>
+ <topology sockets='1' cores='2' threads='2'/>
+</cpu>
--- /dev/null
+<cpu mode='custom' match='exact'>
+ <model fallback='allow'>Haswell-noTSX</model>
+ <topology sockets='1' cores='2' threads='2'/>
+</cpu>
--- /dev/null
+<cpu match='exact'>
+ <model fallback='allow'>Haswell</model>
+ <topology sockets='1' cores='2' threads='2'/>
+ <feature name='rtm' policy='disable'/>
+ <feature name='hle' policy='disable'/>
+</cpu>
--- /dev/null
+<cpu mode='custom' match='exact'>
+ <model fallback='allow'>Haswell-noTSX</model>
+ <vendor>Intel</vendor>
+</cpu>
--- /dev/null
+<cpuTest>
+ <cpu>
+ <arch>x86_64</arch>
+ <model>SandyBridge</model>
+ <vendor>Intel</vendor>
+ <topology sockets='1' cores='2' threads='2'/>
+ <feature name='invpcid'/>
+ <feature name='erms'/>
+ <feature name='bmi2'/>
+ <feature name='smep'/>
+ <feature name='avx2'/>
+ <feature name='bmi1'/>
+ <feature name='fsgsbase'/>
+ <feature name='movbe'/>
+ <feature name='pcid'/>
+ <feature name='fma'/>
+ </cpu>
+ <cpu>
+ <arch>x86_64</arch>
+ <model>Haswell-noTSX</model>
+ <vendor>Intel</vendor>
+ <topology sockets='1' cores='2' threads='2'/>
+ </cpu>
+</cpuTest>
--- /dev/null
+<cpu mode='custom' match='exact'>
+ <model fallback='allow'>Broadwell-noTSX</model>
+ <vendor>Intel</vendor>
+</cpu>
--- /dev/null
+<cpuTest>
+ <cpu>
+ <arch>x86_64</arch>
+ <model>SandyBridge</model>
+ <vendor>Intel</vendor>
+ <topology sockets='1' cores='2' threads='2'/>
+ <feature name='invpcid'/>
+ <feature name='erms'/>
+ <feature name='bmi2'/>
+ <feature name='smep'/>
+ <feature name='avx2'/>
+ <feature name='bmi1'/>
+ <feature name='fsgsbase'/>
+ <feature name='movbe'/>
+ <feature name='pcid'/>
+ <feature name='fma'/>
+ <feature name='3dnowprefetch'/>
+ <feature name='rdseed'/>
+ <feature name='adx'/>
+ <feature name='smap'/>
+ </cpu>
+ <cpu>
+ <arch>x86_64</arch>
+ <model>Broadwell-noTSX</model>
+ <vendor>Intel</vendor>
+ <topology sockets='1' cores='2' threads='2'/>
+ </cpu>
+</cpuTest>
--- /dev/null
+<cpu mode='custom' match='exact'>
+ <arch>x86_64</arch>
+ <model fallback='allow'>Haswell</model>
+ <feature policy='disable' name='rtm'/>
+ <feature policy='disable' name='hle'/>
+</cpu>
--- /dev/null
+<cpu mode='custom' match='exact'>
+ <arch>x86_64</arch>
+ <model fallback='allow'>Haswell-noTSX</model>
+</cpu>
--- /dev/null
+<cpu mode='custom' match='exact'>
+ <arch>x86_64</arch>
+ <model fallback='allow'>Haswell</model>
+ <feature policy='disable' name='rtm'/>
+ <feature policy='disable' name='hle'/>
+</cpu>
--- /dev/null
+<cpu>
+ <arch>x86_64</arch>
+ <model>Haswell-noTSX</model>
+ <vendor>Intel</vendor>
+ <topology sockets='1' cores='2' threads='2'/>
+</cpu>
--- /dev/null
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-kvm -S -M pc -cpu Haswell-noTSX -m 214 -smp 6 \
+-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot n -usb -net \
+none -serial none -parallel none
--- /dev/null
+<domain type='kvm'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>6</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='network'/>
+ </os>
+ <cpu mode='custom' match='exact'>
+ <model fallback='forbid'>Haswell-noTSX</model>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-kvm</emulator>
+ </devices>
+</domain>
--- /dev/null
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-kvm -S -M pc -cpu Haswell -m 214 -smp 6 \
+-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot n -usb -net \
+none -serial none -parallel none
--- /dev/null
+<domain type='kvm'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>6</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='network'/>
+ </os>
+ <cpu mode='custom' match='exact'>
+ <model fallback='forbid'>Haswell</model>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-kvm</emulator>
+ </devices>
+</domain>
--- /dev/null
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-kvm -S -M pc -cpu Haswell,-rtm,-hle -m 214 -smp 6 \
+-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot n -usb -net \
+none -serial none -parallel none
--- /dev/null
+<domain type='kvm'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>6</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='network'/>
+ </os>
+ <cpu mode='custom' match='exact'>
+ <model fallback='forbid'>Haswell</model>
+ <feature policy='disable' name='rtm'/>
+ <feature policy='disable' name='hle'/>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-kvm</emulator>
+ </devices>
+</domain>
--- /dev/null
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-kvm -S -M pc -cpu Haswell -m 214 -smp 6 \
+-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot n -usb -net \
+none -serial none -parallel none
--- /dev/null
+<domain type='kvm'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>6</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='network'/>
+ </os>
+ <cpu mode='custom' match='exact'>
+ <model fallback='forbid'>Haswell</model>
+ <feature policy='require' name='rtm'/>
+ <feature policy='force' name='hle'/>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-kvm</emulator>
+ </devices>
+</domain>
const char *newModels[] = {
"Opteron_G3", "Opteron_G2", "Opteron_G1",
"Nehalem", "Penryn", "Conroe",
+ "Haswell-noTSX", "Haswell",
};
const char *legacyModels[] = {
"n270", "athlon", "pentium3", "pentium2", "pentium",
DO_TEST_FAILURE("cpu-qemu-host-passthrough",
QEMU_CAPS_KVM, QEMU_CAPS_CPU_HOST);
+ driver.caps->host.cpu = cpuHaswell;
+ DO_TEST("cpu-Haswell", QEMU_CAPS_KVM);
+ DO_TEST("cpu-Haswell2", QEMU_CAPS_KVM);
+ DO_TEST("cpu-Haswell3", QEMU_CAPS_KVM);
+ DO_TEST("cpu-Haswell-noTSX", QEMU_CAPS_KVM);
+ driver.caps->host.cpu = cpuDefault;
+
DO_TEST("memtune", QEMU_CAPS_NAME);
DO_TEST("memtune-unlimited", QEMU_CAPS_NAME);
DO_TEST("blkiotune", QEMU_CAPS_NAME);
# define VIR_FROM_THIS VIR_FROM_QEMU
+virCPUDefPtr cpuDefault;
+virCPUDefPtr cpuHaswell;
+
+static virCPUFeatureDef cpuDefaultFeatures[] = {
+ { (char *) "lahf_lm", -1 },
+ { (char *) "xtpr", -1 },
+ { (char *) "cx16", -1 },
+ { (char *) "tm2", -1 },
+ { (char *) "est", -1 },
+ { (char *) "vmx", -1 },
+ { (char *) "ds_cpl", -1 },
+ { (char *) "pbe", -1 },
+ { (char *) "tm", -1 },
+ { (char *) "ht", -1 },
+ { (char *) "ss", -1 },
+ { (char *) "acpi", -1 },
+ { (char *) "ds", -1 }
+};
+static virCPUDef cpuDefaultData = {
+ VIR_CPU_TYPE_HOST, /* type */
+ 0, /* mode */
+ 0, /* match */
+ VIR_ARCH_X86_64, /* arch */
+ (char *) "core2duo", /* model */
+ NULL, /* vendor_id */
+ 0, /* fallback */
+ (char *) "Intel", /* vendor */
+ 1, /* sockets */
+ 2, /* cores */
+ 1, /* threads */
+ ARRAY_CARDINALITY(cpuDefaultFeatures), /* nfeatures */
+ ARRAY_CARDINALITY(cpuDefaultFeatures), /* nfeatures_max */
+ cpuDefaultFeatures, /* features */
+};
+
+static virCPUFeatureDef cpuHaswellFeatures[] = {
+ { (char *) "lahf_lm", -1 },
+ { (char *) "invtsc", -1 },
+ { (char *) "abm", -1 },
+ { (char *) "pdpe1gb", -1 },
+ { (char *) "rdrand", -1 },
+ { (char *) "f16c", -1 },
+ { (char *) "osxsave", -1 },
+ { (char *) "pdcm", -1 },
+ { (char *) "xtpr", -1 },
+ { (char *) "tm2", -1 },
+ { (char *) "est", -1 },
+ { (char *) "smx", -1 },
+ { (char *) "vmx", -1 },
+ { (char *) "ds_cpl", -1 },
+ { (char *) "monitor", -1 },
+ { (char *) "dtes64", -1 },
+ { (char *) "pbe", -1 },
+ { (char *) "tm", -1 },
+ { (char *) "ht", -1 },
+ { (char *) "ss", -1 },
+ { (char *) "acpi", -1 },
+ { (char *) "ds", -1 },
+ { (char *) "vme", -1 },
+};
+static virCPUDef cpuHaswellData = {
+ VIR_CPU_TYPE_HOST, /* type */
+ 0, /* mode */
+ 0, /* match */
+ VIR_ARCH_X86_64, /* arch */
+ (char *) "Haswell", /* model */
+ NULL, /* vendor_id */
+ 0, /* fallback */
+ (char *) "Intel", /* vendor */
+ 1, /* sockets */
+ 2, /* cores */
+ 2, /* threads */
+ ARRAY_CARDINALITY(cpuHaswellFeatures), /* nfeatures */
+ ARRAY_CARDINALITY(cpuHaswellFeatures), /* nfeatures_max */
+ cpuHaswellFeatures, /* features */
+};
+
static virCapsGuestMachinePtr *testQemuAllocMachines(int *nmachines)
{
virCapsGuestMachinePtr *machines;
static const char *const xen_machines[] = {
"xenner"
};
- static virCPUFeatureDef host_cpu_features[] = {
- { (char *) "lahf_lm", -1 },
- { (char *) "xtpr", -1 },
- { (char *) "cx16", -1 },
- { (char *) "tm2", -1 },
- { (char *) "est", -1 },
- { (char *) "vmx", -1 },
- { (char *) "ds_cpl", -1 },
- { (char *) "pbe", -1 },
- { (char *) "tm", -1 },
- { (char *) "ht", -1 },
- { (char *) "ss", -1 },
- { (char *) "acpi", -1 },
- { (char *) "ds", -1 }
- };
- static virCPUDef host_cpu = {
- VIR_CPU_TYPE_HOST, /* type */
- 0, /* mode */
- 0, /* match */
- VIR_ARCH_X86_64, /* arch */
- (char *) "core2duo", /* model */
- NULL, /* vendor_id */
- 0, /* fallback */
- (char *) "Intel", /* vendor */
- 1, /* sockets */
- 2, /* cores */
- 1, /* threads */
- ARRAY_CARDINALITY(host_cpu_features), /* nfeatures */
- ARRAY_CARDINALITY(host_cpu_features), /* nfeatures_max */
- host_cpu_features, /* features */
- };
- if ((caps = virCapabilitiesNew(host_cpu.arch,
- false, false)) == NULL)
+ if (!(caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false)))
return NULL;
/* Add dummy 'none' security_driver. This is equal to setting
VIR_STRDUP(caps->host.secModels[0].doi, "0") < 0)
goto cleanup;
- if ((caps->host.cpu = virCPUDefCopy(&host_cpu)) == NULL ||
- (machines = testQemuAllocMachines(&nmachines)) == NULL)
+ if (!(cpuDefault = virCPUDefCopy(&cpuDefaultData)) ||
+ !(cpuHaswell = virCPUDefCopy(&cpuHaswellData)))
+ goto cleanup;
+
+ caps->host.cpu = cpuDefault;
+
+ if ((machines = testQemuAllocMachines(&nmachines)) == NULL)
goto cleanup;
if ((guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_I686,
cleanup:
virCapabilitiesFreeMachines(machines, nmachines);
+ if (caps->host.cpu != cpuDefault)
+ virCPUDefFree(cpuDefault);
+ if (caps->host.cpu != cpuHaswell)
+ virCPUDefFree(cpuHaswell);
virObjectUnref(caps);
return NULL;
}
extern qemuBuildCommandLineCallbacks testCallbacks;
virQEMUCapsPtr qemuTestParseCapabilities(const char *capsFile);
+
+extern virCPUDefPtr cpuDefault;
+extern virCPUDefPtr cpuHaswell;
+void testQemuCapsSetCPU(virCapsPtr caps,
+ virCPUDefPtr hostCPU);
+
#endif