<features>
<pcihole64 size='0'/>
</features>
It can be used to adjust (or disable) the size of the 64-bit
PCI hole. The size attribute is in gigabytes, since it would
get rounded up to nearest GB by QEMU anyway.
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 | 8 +++++
docs/schemas/domaincommon.rng | 7 +++++
src/conf/domain_conf.c | 13 ++++++++-
src/conf/domain_conf.h | 2 ++
.../qemuxml2argv-pcihole64-none.xml | 24 +++++++++++++++
.../qemuxml2argv-pcihole64-q35.xml | 34 ++++++++++++++++++++++
tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml | 24 +++++++++++++++
tests/qemuxml2xmltest.c | 4 +++
8 files changed, 115 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 83d551a..acfebd4 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1248,6 +1248,14 @@
</tr>
</table>
</dd>
+ <dt><code>pcihole64</code></dt>
+ <dd>Adjust the 64-bit PCI hole size. There is a mandatory
+ attribute <code>size</code> in gigabytes specifying how big
+ the 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 set to 0.
+ <span class="since">Since 1.1.2 (QEMU only)</span>
+ </dd>
</dl>
<h3><a name="elementsTime">Time keeping</a></h3>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index ac807e6..15b877e 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3554,6 +3554,13 @@
<empty/>
</element>
</optional>
+ <optional>
+ <element name="pcihole64">
+ <attribute name="size">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </element>
+ </optional>
</interleave>
</element>
</optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7309877..0dd3986 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -142,7 +142,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
"hap",
"viridian",
"privnet",
- "hyperv")
+ "hyperv",
+ "pcihole64")
VIR_ENUM_IMPL(virDomainFeatureState, VIR_DOMAIN_FEATURE_STATE_LAST,
"default",
@@ -11304,6 +11305,14 @@ virDomainDefParseXML(xmlDocPtr xml,
def->apic_eoi = eoi;
VIR_FREE(tmp);
}
+ } else if (val == VIR_DOMAIN_FEATURE_PCI_HOLE64) {
+ if (virXPathUInt("string(./features/pcihole64/@size)", ctxt,
+ &def->pcihole64) < 0) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("invalid 'size' value for "
+ "64-bit PCI hole"));
+ goto error;
+ }
}
}
VIR_FREE(nodes);
@@ -16559,6 +16568,8 @@ virDomainDefFormatInternal(virDomainDefPtr def,
virBufferAsprintf(buf,
" eoi='%s'",
virDomainFeatureStateTypeToString(def->apic_eoi));
+ } else if (i == VIR_DOMAIN_FEATURE_PCI_HOLE64) {
+ virBufferAsprintf(buf, " size='%u'",
def->pcihole64);
}
virBufferAddLit(buf, "/>\n");
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 3e118d6..03f4f68 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1601,6 +1601,7 @@ enum virDomainFeature {
VIR_DOMAIN_FEATURE_VIRIDIAN,
VIR_DOMAIN_FEATURE_PRIVNET,
VIR_DOMAIN_FEATURE_HYPERV,
+ VIR_DOMAIN_FEATURE_PCI_HOLE64,
VIR_DOMAIN_FEATURE_LAST
};
@@ -1973,6 +1974,7 @@ struct _virDomainDef {
int features;
/* enum virDomainFeatureState */
int apic_eoi;
+ unsigned int pcihole64;
/* These options are of type virDomainFeatureState */
int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
unsigned int hyperv_spinlocks;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml
b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml
new file mode 100644
index 0000000..f1ffa12
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml
@@ -0,0 +1,24 @@
+<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>
+ <features>
+ <pcihole64 size='0'/>
+ </features>
+ <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'/>
+ <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
index 0000000..215ff5c
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.xml
@@ -0,0 +1,34 @@
+<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>
+ <features>
+ <pcihole64 size='1'/>
+ </features>
+ <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'/>
+ <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
index 0000000..b2bb0b4
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml
@@ -0,0 +1,24 @@
+<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>
+ <features>
+ <pcihole64 size='1'/>
+ </features>
+ <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'/>
+ <controller type='usb' index='0'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 5c6730d..96b94ac 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -309,6 +309,10 @@ mymain(void)
DO_TEST_DIFFERENT("s390-defaultconsole");
+ DO_TEST("pcihole64");
+ DO_TEST("pcihole64-none");
+ DO_TEST("pcihole64-q35");
+
virObjectUnref(driver.caps);
virObjectUnref(driver.xmlopt);
--
1.8.1.5