]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
conf: add 'model' attribute for panic device with values isa, pseries, hyperv
authorDmitry Andreev <dandreev@virtuozzo.com>
Tue, 24 Nov 2015 12:26:31 +0000 (15:26 +0300)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 25 Nov 2015 11:19:55 +0000 (12:19 +0100)
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.

docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h

index e5e01672628181a7d2032d7d317783f7d4595026..32b196dd2b7a3dd0ffccfc2f1f52e3b1d5b68e03 100644 (file)
@@ -6152,19 +6152,33 @@ qemu-kvm -net nic,model=? /dev/null
 <pre>
   ...
   &lt;devices&gt;
-    &lt;panic&gt;
+    &lt;panic model='isa'&gt;
       &lt;address type='isa' iobase='0x505'/&gt;
     &lt;/panic&gt;
   &lt;/devices&gt;
   ...
 </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' &mdash; for ISA pvpanic device</li>
+          <li>'pseries' &mdash; default and valid only for pSeries guests.</li>
+          <li>'hyperv' &mdash; 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>
index 994faceec74066c6371d95b8c5ec77bcac938af5..9d21650e8f38ef73962fad30a3da1e00a0ccb837 100644 (file)
   </define>
   <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>
index 7f4c643a8ad89663733f5c3f43db106d97f7d961..58a2d18f43e522a6256550c886434455e87e1cb8 100644 (file)
@@ -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, "<panic");
+
+    if (def->model)
+        virBufferAsprintf(buf, " model='%s'",
+                          virDomainPanicModelTypeToString(def->model));
+
     virBufferAdjustIndent(&childrenBuf, indent + 2);
     if (virDomainDeviceInfoFormat(&childrenBuf, &def->info, 0) < 0)
         return -1;
index 8d43ee65d8b42f68fd82381aabaa2a1b66612c2d..11d891fb5e454e73ed26a97fd4a2434e6ce35ebc 100644 (file)
@@ -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)