diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index e5e0167262..32b196dd2b 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -6152,19 +6152,33 @@ qemu-kvm -net nic,model=? /dev/null
   ...
   <devices>
-    <panic>
+    <panic model='isa'>
       <address type='isa' iobase='0x505'/>
     </panic>
   </devices>
   ...
 
+
model
+
+

+ The optional model 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. +

+ +
address

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.

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 994faceec7..9d21650e8f 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5360,6 +5360,15 @@ + + + + isa + pseries + hyperv + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7f4c643a8a..58a2d18f43 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 */ @@ -17627,6 +17646,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); } @@ -20613,6 +20640,11 @@ static int virDomainPanicDefFormat(virBufferPtr buf, int indent = virBufferGetIndent(buf, false); virBufferAddLit(buf, "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 8d43ee65d8..11d891fb5e 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)