qemu: add support for hv_crash feature as a panic device

Panic device type used depends on 'model' attribute.

If no model is specified then device type depends on hypervisor
and guest arch. 'pseries' model is used for pSeries guest and
'isa' model is used in other cases.

XML:
<devices>
  <panic model='hyperv'/>
</devices>

QEMU command line:
qemu -cpu <cpu_model>,hv_crash
This commit is contained in:
Dmitry Andreev 2015-11-24 15:26:33 +03:00 committed by Jiri Denemark
parent 5e8d2ebd7a
commit ca6ddffe2c
12 changed files with 154 additions and 11 deletions

View File

@ -7577,6 +7577,16 @@ qemuBuildCpuArgStr(virQEMUDriverPtr driver,
}
}
if (def->panic &&
def->panic->model == VIR_DOMAIN_PANIC_MODEL_HYPERV) {
if (!have_cpu) {
virBufferAdd(&buf, default_model, -1);
have_cpu = true;
}
virBufferAddLit(&buf, ",hv_crash");
}
if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON) {
if (!have_cpu) {
virBufferAdd(&buf, default_model, -1);
@ -11050,17 +11060,45 @@ qemuBuildCommandLine(virConnectPtr conn,
}
if (def->panic) {
if (ARCH_IS_PPC64(def->os.arch) && STRPREFIX(def->os.machine, "pseries")) {
/* For pSeries guests, the firmware provides the same
* functionality as the pvpanic device. The address
switch ((virDomainPanicModel) def->panic->model) {
case VIR_DOMAIN_PANIC_MODEL_HYPERV:
/* Panic with model 'hyperv' is not a device, it should
* be configured in cpu commandline. The address
* cannot be configured by the user */
if (!ARCH_IS_X86(def->os.arch)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("only i686 and x86_64 guests support "
"panic device of model 'hyperv'"));
goto error;
}
if (def->panic->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("setting the panic device address is not "
"supported for pSeries guests"));
"supported for model 'hyperv'"));
goto error;
}
} else {
break;
case VIR_DOMAIN_PANIC_MODEL_PSERIES:
/* For pSeries guests, the firmware provides the same
* functionality as the pvpanic device. The address
* cannot be configured by the user */
if (!ARCH_IS_PPC64(def->os.arch) ||
!STRPREFIX(def->os.machine, "pseries")) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("only pSeries guests support panic device "
"of model 'pseries'"));
goto error;
}
if (def->panic->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("setting the panic device address is not "
"supported for model 'pseries'"));
goto error;
}
break;
case VIR_DOMAIN_PANIC_MODEL_ISA:
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PANIC)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("the QEMU binary does not support the "
@ -11085,6 +11123,11 @@ qemuBuildCommandLine(virConnectPtr conn,
"with ISA address type"));
goto error;
}
/* default model value was changed before in post parse */
case VIR_DOMAIN_PANIC_MODEL_DEFAULT:
case VIR_DOMAIN_PANIC_MODEL_LAST:
break;
}
}
@ -12436,6 +12479,13 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
if (virCPUDefAddFeature(cpu, feature, policy) < 0)
goto cleanup;
}
} else if (STREQ(tokens[i], "hv_crash")) {
virDomainPanicDefPtr panic;
if (VIR_ALLOC(panic) < 0)
goto cleanup;
panic->model = VIR_DOMAIN_PANIC_MODEL_HYPERV;
dom->panic = panic;
} else if (STRPREFIX(tokens[i], "hv_")) {
const char *token = tokens[i] + 3; /* "hv_" */
const char *feature, *value;

View File

@ -1350,6 +1350,15 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
}
}
if (dev->type == VIR_DOMAIN_DEVICE_PANIC &&
dev->data.panic->model == VIR_DOMAIN_PANIC_MODEL_DEFAULT) {
if (ARCH_IS_PPC64(def->os.arch) &&
STRPREFIX(def->os.machine, "pseries"))
dev->data.panic->model = VIR_DOMAIN_PANIC_MODEL_PSERIES;
else
dev->data.panic->model = VIR_DOMAIN_PANIC_MODEL_ISA;
}
ret = 0;
cleanup:

View File

@ -261,6 +261,7 @@ mymain(void)
DO_TEST("smp");
DO_TEST("hyperv");
DO_TEST("hyperv-panic");
DO_TEST("kvm-features");

View File

@ -0,0 +1,21 @@
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu \
-name QEMUGuest1 \
-S \
-M pc \
-cpu qemu32,hv_crash \
-m 214 \
-smp 6 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-nographic \
-monitor unix:/tmp/test-monitor,server,nowait \
-boot n \
-usb \
-net none \
-serial none \
-parallel none

View File

@ -24,6 +24,6 @@
<controller type='ide' index='0'/>
<controller type='pci' index='0' model='pci-root'/>
<memballoon model='virtio'/>
<panic/>
<panic model='isa'/>
</devices>
</domain>

View File

@ -37,6 +37,6 @@
<model type='cirrus' vram='16384' heads='1'/>
</video>
<memballoon model='none'/>
<panic/>
<panic model='pseries'/>
</devices>
</domain>

View File

@ -20,6 +20,6 @@
<nvram>
<address type='spapr-vio' reg='0x4000'/>
</nvram>
<panic/>
<panic model='pseries'/>
</devices>
</domain>

View File

@ -692,6 +692,7 @@ mymain(void)
DO_TEST("hyperv", NONE);
DO_TEST("hyperv-off", NONE);
DO_TEST("hyperv-panic", NONE);
DO_TEST("kvm-features", NONE);
DO_TEST("kvm-features-off", NONE);

View File

@ -0,0 +1,31 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<currentMemory unit='KiB'>219136</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='i686' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu</emulator>
<disk type='block' device='disk'>
<source dev='/dev/HostVG/QEMUGuest1'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'/>
<controller type='fdc' index='0'/>
<controller type='ide' index='0'/>
<controller type='pci' index='0' model='pci-root'/>
<memballoon model='virtio'/>
<panic model='isa'>
<address type='isa' iobase='0x505'/>
</panic>
</devices>
</domain>

View File

@ -25,6 +25,6 @@
<address type='spapr-vio'/>
</console>
<memballoon model='none'/>
<panic/>
<panic model='pseries'/>
</devices>
</domain>

View File

@ -0,0 +1,30 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' index='0'/>
<controller type='pci' index='0' model='pci-root'/>
<serial type='pty'>
<target port='0'/>
<address type='spapr-vio'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
<address type='spapr-vio'/>
</console>
<memballoon model='none'/>
<panic model='pseries'/>
</devices>
</domain>

View File

@ -535,7 +535,7 @@ mymain(void)
DO_TEST("pseries-nvram");
DO_TEST_DIFFERENT("pseries-panic-missing");
DO_TEST("pseries-panic-no-address");
DO_TEST_DIFFERENT("pseries-panic-no-address");
/* These tests generate different XML */
DO_TEST_DIFFERENT("balloon-device-auto");
@ -591,7 +591,7 @@ mymain(void)
DO_TEST("pcihole64-none");
DO_TEST("pcihole64-q35");
DO_TEST("panic");
DO_TEST_DIFFERENT("panic");
DO_TEST("panic-isa");
DO_TEST("panic-pseries");
DO_TEST("panic-no-address");