Libvirt already has two types of panic devices - pvpanic and pSeries firmware.
This patch introduces the 'model' attribute and a new type of panic device.
'isa' model is for ISA pvpanic device.
'pseries' model is a default value for pSeries guests.
'hyperv' model is the new type. It's used for Hyper-V crash.
Schema and docs are updated for the new attribute.
---
v5: minor fixes
docs/formatdomain.html.in | 18 ++++++++++++++++--
docs/schemas/domaincommon.rng | 9 +++++++++
src/conf/domain_conf.c | 34 +++++++++++++++++++++++++++++++++-
src/conf/domain_conf.h | 11 +++++++++++
4 files changed, 69 insertions(+), 3 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index e5e0167..32b196d 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -6152,19 +6152,33 @@ qemu-kvm -net nic,model=? /dev/null
<pre>
...
<devices>
- <panic>
+ <panic model='isa'>
<address type='isa' iobase='0x505'/>
</panic>
</devices>
...
</pre>
<dl>
+ <dt><code>model</code></dt>
+ <dd>
+ <p>
+ The optional <code>model</code> attribute specifies what type
+ of panic device is provided. The panic model used when this attribute
+ is missing depends on the hypervisor and guest arch.
+ </p>
+ <ul>
+ <li>'isa' — for ISA pvpanic device</li>
+ <li>'pseries' — default and valid only for pSeries
guests.</li>
+ <li>'hyperv' — for Hyper-V crash CPU feature.
+ <span class="since">Since 1.3.0, QEMU and KVM
only</span></li>
+ </ul>
+ </dd>
<dt><code>address</code></dt>
<dd>
<p>
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 guests.
+ altogether for pseries and hyperv models.
</p>
</dd>
</dl>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 994face..9d21650 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -5361,6 +5361,15 @@
<define name="panic">
<element name="panic">
<optional>
+ <attribute name="model">
+ <choice>
+ <value>isa</value>
+ <value>pseries</value>
+ <value>hyperv</value>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
<ref name="address"/>
</optional>
</element>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a14dd77..b8738af 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -525,6 +525,12 @@ VIR_ENUM_IMPL(virDomainWatchdogAction,
VIR_DOMAIN_WATCHDOG_ACTION_LAST,
"none",
"inject-nmi")
+VIR_ENUM_IMPL(virDomainPanicModel, VIR_DOMAIN_PANIC_MODEL_LAST,
+ "default",
+ "isa",
+ "pseries",
+ "hyperv")
+
VIR_ENUM_IMPL(virDomainVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
"vga",
"cirrus",
@@ -10197,6 +10203,7 @@ static virDomainPanicDefPtr
virDomainPanicDefParseXML(xmlNodePtr node)
{
virDomainPanicDefPtr panic;
+ char *model = NULL;
if (VIR_ALLOC(panic) < 0)
return NULL;
@@ -10204,10 +10211,22 @@ virDomainPanicDefParseXML(xmlNodePtr node)
if (virDomainDeviceInfoParseXML(node, NULL, &panic->info, 0) < 0)
goto error;
+ model = virXMLPropString(node, "model");
+ if (model != NULL &&
+ (panic->model = virDomainPanicModelTypeFromString(model)) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown panic model '%s'"), model);
+ goto error;
+ }
+
+ cleanup:
+ VIR_FREE(model);
return panic;
+
error:
virDomainPanicDefFree(panic);
- return NULL;
+ panic = NULL;
+ goto cleanup;
}
/* Parse the XML definition for an input device */
@@ -17633,6 +17652,14 @@ virDomainPanicDefCheckABIStability(virDomainPanicDefPtr src,
return false;
}
+ if (src->model != dst->model) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target panic model '%s' does not match source
'%s'"),
+ virDomainPanicModelTypeToString(dst->model),
+ virDomainPanicModelTypeToString(src->model));
+ return false;
+ }
+
return virDomainDeviceInfoCheckABIStability(&src->info, &dst->info);
}
@@ -20619,6 +20646,11 @@ static int virDomainPanicDefFormat(virBufferPtr buf,
int indent = virBufferGetIndent(buf, false);
virBufferAddLit(buf, "<panic");
+
+ if (def->model)
+ virBufferAsprintf(buf, " model='%s'",
+ virDomainPanicModelTypeToString(def->model));
+
virBufferAdjustIndent(&childrenBuf, indent + 2);
if (virDomainDeviceInfoFormat(&childrenBuf, &def->info, 0) < 0)
return -1;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 8d43ee6..11d891f 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2045,7 +2045,17 @@ struct _virDomainIdMapDef {
};
+typedef enum {
+ VIR_DOMAIN_PANIC_MODEL_DEFAULT,
+ VIR_DOMAIN_PANIC_MODEL_ISA,
+ VIR_DOMAIN_PANIC_MODEL_PSERIES,
+ VIR_DOMAIN_PANIC_MODEL_HYPERV,
+
+ VIR_DOMAIN_PANIC_MODEL_LAST
+} virDomainPanicModel;
+
struct _virDomainPanicDef {
+ int model; /* virDomainPanicModel */
virDomainDeviceInfo info;
};
@@ -3060,6 +3070,7 @@ VIR_ENUM_DECL(virDomainMemballoonModel)
VIR_ENUM_DECL(virDomainSmbiosMode)
VIR_ENUM_DECL(virDomainWatchdogModel)
VIR_ENUM_DECL(virDomainWatchdogAction)
+VIR_ENUM_DECL(virDomainPanicModel)
VIR_ENUM_DECL(virDomainVideo)
VIR_ENUM_DECL(virDomainHostdevMode)
VIR_ENUM_DECL(virDomainHostdevSubsys)
--
1.8.3.1