mirror of https://gitee.com/openkylin/libvirt.git
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 (!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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -261,6 +261,7 @@ mymain(void)
|
|||
DO_TEST("smp");
|
||||
|
||||
DO_TEST("hyperv");
|
||||
DO_TEST("hyperv-panic");
|
||||
|
||||
DO_TEST("kvm-features");
|
||||
|
||||
|
|
|
@ -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='pci' index='0' model='pci-root'/>
|
||||
<memballoon model='virtio'/>
|
||||
<panic/>
|
||||
<panic model='isa'/>
|
||||
</devices>
|
||||
</domain>
|
||||
|
|
|
@ -37,6 +37,6 @@
|
|||
<model type='cirrus' vram='16384' heads='1'/>
|
||||
</video>
|
||||
<memballoon model='none'/>
|
||||
<panic/>
|
||||
<panic model='pseries'/>
|
||||
</devices>
|
||||
</domain>
|
||||
|
|
|
@ -20,6 +20,6 @@
|
|||
<nvram>
|
||||
<address type='spapr-vio' reg='0x4000'/>
|
||||
</nvram>
|
||||
<panic/>
|
||||
<panic model='pseries'/>
|
||||
</devices>
|
||||
</domain>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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'/>
|
||||
</console>
|
||||
<memballoon model='none'/>
|
||||
<panic/>
|
||||
<panic model='pseries'/>
|
||||
</devices>
|
||||
</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_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");
|
||||
|
|
Loading…
Reference in New Issue