From d855465452e978c3efe94d85ab107c066b40045d Mon Sep 17 00:00:00 2001 From: Boris Fiuczynski Date: Fri, 29 Apr 2016 15:23:41 +0200 Subject: [PATCH] qemu: add panic device support for S390 If a panic device is being defined without a model in a domain the default value is always overwritten with model ISA. An ISA bus does not exist on S390 and therefore specifying a panic device results in an unsupported configuration. Since the S390 architecture inherently provides a crash detection capability the panic device should be defined in the domain xml. This patch adds an s390 panic device model and prevents setting a device address on it. Signed-off-by: Boris Fiuczynski Reviewed-by: Cornelia Huck --- docs/formatdomain.html.in | 16 ++++++++++++---- docs/schemas/domaincommon.rng | 1 + src/conf/domain_conf.c | 3 ++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 19 +++++++++++++++++++ src/qemu/qemu_domain.c | 2 ++ 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 3e72dae2dc..bead624606 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -6355,9 +6355,15 @@ qemu-kvm -net nic,model=? /dev/null Since 1.2.1, QEMU and KVM only

- For pSeries guests, this feature is always enabled since it's - implemented by the guest firmware, thus libvirt automatically - adds the panic element to the domain XML. + This feature is always enabled for: +

+
    +
  • pSeries guests, since it's implemented by the guest firmware
  • +
  • S390 guests, since it's an integral part of the S390 architecture
  • +
+

+ For the guest types listed above, libvirt automatically adds a + panic element to the domain XML.

Example: usage of panic configuration @@ -6385,6 +6391,8 @@ qemu-kvm -net nic,model=? /dev/null

  • 'pseries' — default and valid only for pSeries guests.
  • 'hyperv' — for Hyper-V crash CPU feature. Since 1.3.0, QEMU and KVM only
  • +
  • 's390' — default for S390 guests. + Since 1.3.5
  • address
    @@ -6392,7 +6400,7 @@ qemu-kvm -net nic,model=? /dev/null

    address of panic. The default ioport is 0x505. Most users don't need to specify an address, and doing so is forbidden - altogether for pseries and hyperv models. + altogether for s390, pseries and hyperv models.

    diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index f143bf05bb..b82f8c856e 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5518,6 +5518,7 @@ isa pseries hyperv + s390 diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 033aa8eae1..a8b517382a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -525,7 +525,8 @@ VIR_ENUM_IMPL(virDomainPanicModel, VIR_DOMAIN_PANIC_MODEL_LAST, "default", "isa", "pseries", - "hyperv") + "hyperv", + "s390") VIR_ENUM_IMPL(virDomainVideo, VIR_DOMAIN_VIDEO_TYPE_LAST, "vga", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9f880b89e3..c2fa3b8100 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2083,6 +2083,7 @@ typedef enum { VIR_DOMAIN_PANIC_MODEL_ISA, VIR_DOMAIN_PANIC_MODEL_PSERIES, VIR_DOMAIN_PANIC_MODEL_HYPERV, + VIR_DOMAIN_PANIC_MODEL_S390, VIR_DOMAIN_PANIC_MODEL_LAST } virDomainPanicModel; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f015ea49ed..bd564db5bd 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9001,6 +9001,25 @@ qemuBuildPanicCommandLine(virCommandPtr cmd, for (i = 0; i < def->npanics; i++) { switch ((virDomainPanicModel) def->panics[i]->model) { + case VIR_DOMAIN_PANIC_MODEL_S390: + /* For s390 guests, the hardware provides the same + * functionality as the pvpanic device. The address + * cannot be configured by the user */ + if (!ARCH_IS_S390(def->os.arch)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("only S390 guests support " + "panic device of model 's390'")); + return -1; + } + if (def->panics[i]->info.type != + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("setting the panic device address is not " + "supported for model 's390'")); + return -1; + } + break; + case VIR_DOMAIN_PANIC_MODEL_HYPERV: /* Panic with model 'hyperv' is not a device, it should * be configured in cpu commandline. The address diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b71c655ec8..a485cf0f89 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2196,6 +2196,8 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, if (ARCH_IS_PPC64(def->os.arch) && STRPREFIX(def->os.machine, "pseries")) dev->data.panic->model = VIR_DOMAIN_PANIC_MODEL_PSERIES; + else if (ARCH_IS_S390(def->os.arch)) + dev->data.panic->model = VIR_DOMAIN_PANIC_MODEL_S390; else dev->data.panic->model = VIR_DOMAIN_PANIC_MODEL_ISA; }