mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
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:
parent
5e8d2ebd7a
commit
ca6ddffe2c
@ -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 (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON) {
|
||||||
if (!have_cpu) {
|
if (!have_cpu) {
|
||||||
virBufferAdd(&buf, default_model, -1);
|
virBufferAdd(&buf, default_model, -1);
|
||||||
@ -11050,17 +11060,45 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (def->panic) {
|
if (def->panic) {
|
||||||
if (ARCH_IS_PPC64(def->os.arch) && STRPREFIX(def->os.machine, "pseries")) {
|
switch ((virDomainPanicModel) def->panic->model) {
|
||||||
/* For pSeries guests, the firmware provides the same
|
case VIR_DOMAIN_PANIC_MODEL_HYPERV:
|
||||||
* functionality as the pvpanic device. The address
|
/* Panic with model 'hyperv' is not a device, it should
|
||||||
|
* be configured in cpu commandline. The address
|
||||||
* cannot be configured by the user */
|
* 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) {
|
if (def->panic->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("setting the panic device address is not "
|
_("setting the panic device address is not "
|
||||||
"supported for pSeries guests"));
|
"supported for model 'hyperv'"));
|
||||||
goto error;
|
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)) {
|
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PANIC)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("the QEMU binary does not support the "
|
_("the QEMU binary does not support the "
|
||||||
@ -11085,6 +11123,11 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|||||||
"with ISA address type"));
|
"with ISA address type"));
|
||||||
goto error;
|
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)
|
if (virCPUDefAddFeature(cpu, feature, policy) < 0)
|
||||||
goto cleanup;
|
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_")) {
|
} else if (STRPREFIX(tokens[i], "hv_")) {
|
||||||
const char *token = tokens[i] + 3; /* "hv_" */
|
const char *token = tokens[i] + 3; /* "hv_" */
|
||||||
const char *feature, *value;
|
const char *feature, *value;
|
||||||
|
@ -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;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -261,6 +261,7 @@ mymain(void)
|
|||||||
DO_TEST("smp");
|
DO_TEST("smp");
|
||||||
|
|
||||||
DO_TEST("hyperv");
|
DO_TEST("hyperv");
|
||||||
|
DO_TEST("hyperv-panic");
|
||||||
|
|
||||||
DO_TEST("kvm-features");
|
DO_TEST("kvm-features");
|
||||||
|
|
||||||
|
21
tests/qemuxml2argvdata/qemuxml2argv-hyperv-panic.args
Normal file
21
tests/qemuxml2argvdata/qemuxml2argv-hyperv-panic.args
Normal 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
|
@ -24,6 +24,6 @@
|
|||||||
<controller type='ide' index='0'/>
|
<controller type='ide' index='0'/>
|
||||||
<controller type='pci' index='0' model='pci-root'/>
|
<controller type='pci' index='0' model='pci-root'/>
|
||||||
<memballoon model='virtio'/>
|
<memballoon model='virtio'/>
|
||||||
<panic/>
|
<panic model='isa'/>
|
||||||
</devices>
|
</devices>
|
||||||
</domain>
|
</domain>
|
||||||
|
@ -37,6 +37,6 @@
|
|||||||
<model type='cirrus' vram='16384' heads='1'/>
|
<model type='cirrus' vram='16384' heads='1'/>
|
||||||
</video>
|
</video>
|
||||||
<memballoon model='none'/>
|
<memballoon model='none'/>
|
||||||
<panic/>
|
<panic model='pseries'/>
|
||||||
</devices>
|
</devices>
|
||||||
</domain>
|
</domain>
|
||||||
|
@ -20,6 +20,6 @@
|
|||||||
<nvram>
|
<nvram>
|
||||||
<address type='spapr-vio' reg='0x4000'/>
|
<address type='spapr-vio' reg='0x4000'/>
|
||||||
</nvram>
|
</nvram>
|
||||||
<panic/>
|
<panic model='pseries'/>
|
||||||
</devices>
|
</devices>
|
||||||
</domain>
|
</domain>
|
||||||
|
@ -692,6 +692,7 @@ mymain(void)
|
|||||||
|
|
||||||
DO_TEST("hyperv", NONE);
|
DO_TEST("hyperv", NONE);
|
||||||
DO_TEST("hyperv-off", NONE);
|
DO_TEST("hyperv-off", NONE);
|
||||||
|
DO_TEST("hyperv-panic", NONE);
|
||||||
|
|
||||||
DO_TEST("kvm-features", NONE);
|
DO_TEST("kvm-features", NONE);
|
||||||
DO_TEST("kvm-features-off", NONE);
|
DO_TEST("kvm-features-off", NONE);
|
||||||
|
31
tests/qemuxml2xmloutdata/qemuxml2xmlout-panic.xml
Normal file
31
tests/qemuxml2xmloutdata/qemuxml2xmlout-panic.xml
Normal 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>
|
@ -25,6 +25,6 @@
|
|||||||
<address type='spapr-vio'/>
|
<address type='spapr-vio'/>
|
||||||
</console>
|
</console>
|
||||||
<memballoon model='none'/>
|
<memballoon model='none'/>
|
||||||
<panic/>
|
<panic model='pseries'/>
|
||||||
</devices>
|
</devices>
|
||||||
</domain>
|
</domain>
|
||||||
|
@ -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>
|
@ -535,7 +535,7 @@ mymain(void)
|
|||||||
|
|
||||||
DO_TEST("pseries-nvram");
|
DO_TEST("pseries-nvram");
|
||||||
DO_TEST_DIFFERENT("pseries-panic-missing");
|
DO_TEST_DIFFERENT("pseries-panic-missing");
|
||||||
DO_TEST("pseries-panic-no-address");
|
DO_TEST_DIFFERENT("pseries-panic-no-address");
|
||||||
|
|
||||||
/* These tests generate different XML */
|
/* These tests generate different XML */
|
||||||
DO_TEST_DIFFERENT("balloon-device-auto");
|
DO_TEST_DIFFERENT("balloon-device-auto");
|
||||||
@ -591,7 +591,7 @@ mymain(void)
|
|||||||
DO_TEST("pcihole64-none");
|
DO_TEST("pcihole64-none");
|
||||||
DO_TEST("pcihole64-q35");
|
DO_TEST("pcihole64-q35");
|
||||||
|
|
||||||
DO_TEST("panic");
|
DO_TEST_DIFFERENT("panic");
|
||||||
DO_TEST("panic-isa");
|
DO_TEST("panic-isa");
|
||||||
DO_TEST("panic-pseries");
|
DO_TEST("panic-pseries");
|
||||||
DO_TEST("panic-no-address");
|
DO_TEST("panic-no-address");
|
||||||
|
Loading…
Reference in New Issue
Block a user