提交 ca6ddffe 编写于 作者: D Dmitry Andreev 提交者: Jiri Denemark

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
上级 5e8d2ebd
...@@ -7577,6 +7577,16 @@ qemuBuildCpuArgStr(virQEMUDriverPtr driver, ...@@ -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, ...@@ -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) {
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 model 'hyperv'"));
goto error;
}
break;
case VIR_DOMAIN_PANIC_MODEL_PSERIES:
/* For pSeries guests, the firmware provides the same /* For pSeries guests, the firmware provides the same
* functionality as the pvpanic device. The address * functionality as the pvpanic device. The address
* cannot be configured by the user */ * 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) { 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 'pseries'"));
goto error; goto error;
} }
} else { 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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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");
......
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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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);
......
<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 @@ ...@@ -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>
<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) ...@@ -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) ...@@ -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");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册