]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add pcihole64 element to root PCI controllers
authorJán Tomko <jtomko@redhat.com>
Mon, 12 Aug 2013 11:39:04 +0000 (13:39 +0200)
committerJán Tomko <jtomko@redhat.com>
Tue, 27 Aug 2013 15:42:29 +0000 (17:42 +0200)
<controller type='pci' index='0' model='pci-root'>
  <pcihole64 unit='KiB'>1048576</pcihole64>
</controller>

It can be used to adjust (or disable) the size of the 64-bit
PCI hole. The size attribute is in kilobytes (different unit
can be specified on input), but it gets rounded up to
the nearest GB by QEMU.

Disabling it will be needed for guests that crash with the
64-bit PCI hole (like Windows XP), see:
https://bugzilla.redhat.com/show_bug.cgi?id=990418

docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-gib.xml [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.xml [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml [new file with mode: 0644]
tests/qemuxml2xmloutdata/qemuxml2xmlout-pcihole64-gib.xml [new file with mode: 0644]
tests/qemuxml2xmltest.c

index 7f057ec87dc050b2207f7144d4a09c946b3ac291..cce179d12b29585a404f25518801e19a40e0ad04 100644 (file)
       PCI controllers have an optional <code>model</code> attribute with
       possible values <code>pci-root</code>, <code>pcie-root</code>,
       <code>pci-bridge</code>, or <code>dmi-to-pci-bridge</code>.
+      The root controllers (<code>pci-root</code> and <code>pcie-root</code>)
+      have an optional <code>pcihole64</code> element specifying how big
+      (in kilobytes, or in the unit specified by <code>pcihole64</code>'s
+      <code>unit</code> attribute) the 64-bit PCI hole should be. Some guests (like
+      Windows XP or Windows Server 2003) might crash when QEMU and Seabios
+      are recent enough to support 64-bit PCI holes, unless this is disabled
+      (set to 0). <span class="since">Since 1.1.2 (QEMU only)</span>
+    </p>
+    <p>
       For machine types which provide an implicit PCI bus, the pci-root
       controller with index=0 is auto-added and required to use PCI devices.
       pci-root has no address.
index 3df61f696abfba66b617fb183f2169aef8aeccd0..6978dc74d31a07e2028bf9aaae5caea118e499e1 100644 (file)
             <attribute name="type">
               <value>pci</value>
             </attribute>
-            <attribute name="model">
-              <choice>
-                <value>pci-root</value>
-                <value>pcie-root</value>
-                <value>pci-bridge</value>
-                <value>dmi-to-pci-bridge</value>
-              </choice>
-            </attribute>
+            <!-- *-root controllers have an optional element "pcihole64"-->
+            <choice>
+              <group>
+                <attribute name="model">
+                  <choice>
+                    <value>pci-root</value>
+                    <value>pcie-root</value>
+                  </choice>
+                </attribute>
+                <optional>
+                  <element name="pcihole64">
+                    <ref name="scaledInteger"/>
+                  </element>
+                </optional>
+              </group>
+              <group>
+                <attribute name="model">
+                  <choice>
+                    <value>pci-bridge</value>
+                    <value>dmi-to-pci-bridge</value>
+                  </choice>
+                </attribute>
+              </group>
+            </choice>
           </group>
           <!-- virtio-serial has optional "ports" and "vectors" -->
           <group>
index 682b7e9677b430a89a4f48d065e80684961b7d9a..9b1387d62b1ed34d288676d5516b9f1b04cba34f 100644 (file)
@@ -5680,6 +5680,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
     char *model = NULL;
     char *queues = NULL;
     xmlNodePtr saved = ctxt->node;
+    int rc;
 
     ctxt->node = node;
 
@@ -5792,7 +5793,8 @@ virDomainControllerDefParseXML(xmlNodePtr node,
     case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
         switch (def->model) {
         case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
-        case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
+        case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: {
+            unsigned long long bytes;
             if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
                 virReportError(VIR_ERR_XML_ERROR, "%s",
                                _("pci-root and pcie-root controllers should not "
@@ -5805,7 +5807,15 @@ virDomainControllerDefParseXML(xmlNodePtr node,
                                  "should have index 0"));
                 goto error;
             }
+            if ((rc = virDomainParseScaledValue("./pcihole64", ctxt,
+                                                &bytes, 1024,
+                                                1024ULL * ULONG_MAX, false)) < 0)
+                goto error;
 
+            if (rc == 1)
+                def->opts.pciopts.pcihole64 = true;
+            def->opts.pciopts.pcihole64size = VIR_DIV_UP(bytes, 1024);
+        }
         }
 
     default:
@@ -14484,6 +14494,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
 {
     const char *type = virDomainControllerTypeToString(def->type);
     const char *model = NULL;
+    bool pcihole64 = false;
 
     if (!type) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -14521,11 +14532,17 @@ virDomainControllerDefFormat(virBufferPtr buf,
         }
         break;
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
+        if (def->opts.pciopts.pcihole64)
+            pcihole64 = true;
+        break;
+
     default:
         break;
     }
 
-    if (def->queues || virDomainDeviceInfoIsSet(&def->info, flags)) {
+    if (def->queues || virDomainDeviceInfoIsSet(&def->info, flags) ||
+        pcihole64) {
         virBufferAddLit(buf, ">\n");
 
         if (def->queues)
@@ -14535,6 +14552,11 @@ virDomainControllerDefFormat(virBufferPtr buf,
             virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
             return -1;
 
+        if (pcihole64) {
+            virBufferAsprintf(buf, "      <pcihole64 unit='KiB'>%lu</"
+                              "pcihole64>\n", def->opts.pciopts.pcihole64size);
+        }
+
         virBufferAddLit(buf, "    </controller>\n");
     } else {
         virBufferAddLit(buf, "/>\n");
index 6cb2d85b7171e98f4e1c67f4e0a01438b6474f9f..0ac576a82e2e7009cf9d103659c053b5c253c308 100644 (file)
@@ -814,6 +814,13 @@ struct _virDomainVirtioSerialOpts {
     int vectors; /* -1 == undef */
 };
 
+typedef struct _virDomainPciControllerOpts virDomainPciControllerOpts;
+typedef virDomainPciControllerOpts *virDomainPciControllerOptsPtr;
+struct _virDomainPciControllerOpts {
+    bool pcihole64;
+    unsigned long pcihole64size;
+};
+
 /* Stores the virtual disk controller configuration */
 struct _virDomainControllerDef {
     int type;
@@ -822,6 +829,7 @@ struct _virDomainControllerDef {
     unsigned int queues;
     union {
         virDomainVirtioSerialOpts vioserial;
+        virDomainPciControllerOpts pciopts;
     } opts;
     virDomainDeviceInfo info;
 };
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-gib.xml b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-gib.xml
new file mode 100644 (file)
index 0000000..13eb2dd
--- /dev/null
@@ -0,0 +1,23 @@
+<domain type='qemu'>
+  <name>foo</name>
+  <uuid>c84fc647-6198-4ff9-bf81-d65a1f8f5ec0</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>2097152</currentMemory>
+  <vcpu placement='static' cpuset='0-1'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc-1.2'>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/libexec/qemu-kvm</emulator>
+    <controller type='pci' index='0' model='pci-root'>
+      <pcihole64 unit='GiB'>1</pcihole64>
+    </controller>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml
new file mode 100644 (file)
index 0000000..a181d6c
--- /dev/null
@@ -0,0 +1,23 @@
+<domain type='qemu'>
+  <name>foo</name>
+  <uuid>c84fc647-6198-4ff9-bf81-d65a1f8f5ec0</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>2097152</currentMemory>
+  <vcpu placement='static' cpuset='0-1'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc-1.2'>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/libexec/qemu-kvm</emulator>
+    <controller type='pci' index='0' model='pci-root'>
+      <pcihole64 unit='KiB'>0</pcihole64>
+    </controller>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.xml b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.xml
new file mode 100644 (file)
index 0000000..ee151be
--- /dev/null
@@ -0,0 +1,33 @@
+<domain type='qemu'>
+  <name>q35-test</name>
+  <uuid>11dbdcdd-4c3b-482b-8903-9bdb8c0a2774</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>2097152</currentMemory>
+  <vcpu placement='static' cpuset='0-1'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='q35'>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/libexec/qemu-kvm</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='sda' bus='sata'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='pci' index='0' model='pcie-root'>
+      <pcihole64 unit='KiB'>1048576</pcihole64>
+    </controller>
+    <controller type='pci' index='1' model='dmi-to-pci-bridge'/>
+    <controller type='pci' index='2' model='pci-bridge'/>
+    <controller type='sata' index='0'/>
+    <video>
+      <model type='qxl' ram='65536' vram='18432' heads='1'/>
+    </video>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml
new file mode 100644 (file)
index 0000000..60da238
--- /dev/null
@@ -0,0 +1,23 @@
+<domain type='qemu'>
+  <name>foo</name>
+  <uuid>3c7c30b5-7866-4b05-8a29-efebccba52a0</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>2097152</currentMemory>
+  <vcpu placement='static' cpuset='0-1'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc-1.2'>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/libexec/qemu-kvm</emulator>
+    <controller type='pci' index='0' model='pci-root'>
+      <pcihole64 unit='KiB'>1048576</pcihole64>
+    </controller>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pcihole64-gib.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pcihole64-gib.xml
new file mode 100644 (file)
index 0000000..6d949ac
--- /dev/null
@@ -0,0 +1,23 @@
+<domain type='qemu'>
+  <name>foo</name>
+  <uuid>c84fc647-6198-4ff9-bf81-d65a1f8f5ec0</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>2097152</currentMemory>
+  <vcpu placement='static' cpuset='0-1'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc-1.2'>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/libexec/qemu-kvm</emulator>
+    <controller type='pci' index='0' model='pci-root'>
+      <pcihole64 unit='KiB'>1048576</pcihole64>
+    </controller>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
index 6eebc685f9d4ce1904afd786f1e9ad01746a10bb..c6615739b47011c81f35f122bb66535a5ba2c5f9 100644 (file)
@@ -311,6 +311,11 @@ mymain(void)
 
     DO_TEST_DIFFERENT("s390-defaultconsole");
 
+    DO_TEST("pcihole64");
+    DO_TEST_DIFFERENT("pcihole64-gib");
+    DO_TEST("pcihole64-none");
+    DO_TEST("pcihole64-q35");
+
     virObjectUnref(driver.caps);
     virObjectUnref(driver.xmlopt);