mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
Add pcihole64 element to root PCI controllers
<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
This commit is contained in:
parent
4582bc2e78
commit
01cda91809
@ -2465,6 +2465,15 @@
|
||||
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.
|
||||
|
@ -1544,14 +1544,30 @@
|
||||
<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>
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
};
|
||||
|
23
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-gib.xml
Normal file
23
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-gib.xml
Normal file
@ -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>
|
23
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml
Normal file
23
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.xml
Normal file
@ -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>
|
33
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.xml
Normal file
33
tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.xml
Normal file
@ -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>
|
23
tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml
Normal file
23
tests/qemuxml2argvdata/qemuxml2argv-pcihole64.xml
Normal file
@ -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>
|
23
tests/qemuxml2xmloutdata/qemuxml2xmlout-pcihole64-gib.xml
Normal file
23
tests/qemuxml2xmloutdata/qemuxml2xmlout-pcihole64-gib.xml
Normal file
@ -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>
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user