From: Laine Stump
+ ... + <devices> + <interface type='network'> + <source network='default'/> + <target dev='vnet1'/> + <rom bar='off'/> + </interface> + </devices> + ...+ +
+ For hypervisors which support this, you can change how a PCI Network
+ device's ROM is presented to the guest. The bar
+ attribute can be set to "on" or "off", and determines whether
+ or not the device's ROM will be visible in the guest's memory
+ map. (In PCI documentation, the "rombar" setting controls the
+ presence of the Base Address Register for the ROM). If no rom
+ bar is specified, the qemu default will be used (older
+ versions of qemu used a default of "off", while newer qemus
+ have a default of "on"). Since
+ 0.9.10 (QEMU and KVM only)
+
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 2e53e146ef..7557641438 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1490,6 +1490,9 @@
+
+
+
@@ -2348,15 +2351,7 @@
-
-
-
- on
- off
-
-
-
-
+
@@ -2821,6 +2816,18 @@
+
+
+
+
+ on
+ off
+
+
+
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c4bf3e4ebb..b7f6913fe6 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3876,7 +3876,8 @@ virDomainNetDefParseXML(virCapsPtr caps,
def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
} else {
if (virDomainDeviceInfoParseXML(node, bootMap, &def->info,
- flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT) < 0)
+ flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
+ | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
goto error;
}
@@ -10506,7 +10507,8 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferAdjustIndent(buf, -6);
if (virDomainDeviceInfoFormat(buf, &def->info,
- flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT) < 0)
+ flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
+ | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
return -1;
virBufferAddLit(buf, " \n");
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 543c57ab22..3f60691b58 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1514,6 +1514,37 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
return 0;
}
+static int
+qemuBuildRomStr(virBufferPtr buf,
+ virDomainDeviceInfoPtr info,
+ virBitmapPtr qemuCaps)
+{
+ if (info->rombar) {
+ if (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ "%s", _("rombar is supported only for PCI devices"));
+ return -1;
+ }
+ if (!qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_ROMBAR)) {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ "%s", _("rombar not supported in this QEMU binary"));
+ return -1;
+ }
+
+ switch (info->rombar) {
+ case VIR_DOMAIN_PCI_ROMBAR_OFF:
+ virBufferAddLit(buf, ",rombar=0");
+ break;
+ case VIR_DOMAIN_PCI_ROMBAR_ON:
+ virBufferAddLit(buf, ",rombar=1");
+ break;
+ default:
+ break;
+ }
+ }
+ return 0;
+}
+
static int
qemuBuildIoEventFdStr(virBufferPtr buf,
enum virDomainIoEventFd use,
@@ -2502,6 +2533,8 @@ qemuBuildNicDevStr(virDomainNetDefPtr net,
net->mac[4], net->mac[5]);
if (qemuBuildDeviceAddressStr(&buf, &net->info, qemuCaps) < 0)
goto error;
+ if (qemuBuildRomStr(&buf, &net->info, qemuCaps) < 0)
+ goto error;
if (bootindex && qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX))
virBufferAsprintf(&buf, ",bootindex=%d", bootindex);
@@ -2853,25 +2886,8 @@ qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev, const char *configfd,
virBufferAsprintf(&buf, ",bootindex=%d", dev->info.bootIndex);
if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
goto error;
-
- if (dev->info.rombar) {
- if (!qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_ROMBAR)) {
- qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- "%s", _("rombar not supported in this QEMU binary"));
- goto error;
- }
-
- switch (dev->info.rombar) {
- case VIR_DOMAIN_PCI_ROMBAR_OFF:
- virBufferAddLit(&buf, ",rombar=0");
- break;
- case VIR_DOMAIN_PCI_ROMBAR_ON:
- virBufferAddLit(&buf, ",rombar=1");
- break;
- default:
- break;
- }
- }
+ if (qemuBuildRomStr(&buf, &dev->info, qemuCaps) < 0)
+ goto error;
if (virBufferError(&buf)) {
virReportOOMError();
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-rombar.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-rombar.args
deleted file mode 100644
index 1a8b14e83e..0000000000
--- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-rombar.args
+++ /dev/null
@@ -1,5 +0,0 @@
-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
-pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor \
-unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \
-/dev/HostVG/QEMUGuest2 -usb -device pci-assign,host=06:12.5,id=hostdev0,\
-bus=pci.0,addr=0x3,rombar=0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args
new file mode 100644
index 0000000000..1a46aa3c0e
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args
@@ -0,0 +1,11 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
+pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor \
+unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \
+/dev/HostVG/QEMUGuest2 \
+-device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:24:a5:9f,bus=pci.0,addr=0x3,rombar=1 \
+-net user,vlan=0,name=hostnet0 \
+-device virtio-net-pci,vlan=1,id=net1,mac=52:54:00:24:a5:9e,bus=pci.0,addr=0x4 \
+-net user,vlan=1,name=hostnet1 \
+-usb -device pci-assign,host=06:12.5,id=hostdev0,bus=pci.0,addr=0x5,rombar=0 \
+-device pci-assign,host=06:12.6,id=hostdev1,bus=pci.0,addr=0x6,rombar=1 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-rombar.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
similarity index 60%
rename from tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-rombar.xml
rename to tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
index bf17cc49d0..3f6b8deaf2 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-rombar.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
@@ -17,13 +17,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 63221aba08..23234f2a52 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -663,6 +663,9 @@ mymain(void)
DO_TEST("hostdev-pci-address", false, QEMU_CAPS_PCIDEVICE);
DO_TEST("hostdev-pci-address-device", false,
QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+ DO_TEST("pci-rom", false,
+ QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
+ QEMU_CAPS_PCI_ROMBAR);
DO_TEST_FULL("restore-v1", "stdio", 7, false, false,
QEMU_CAPS_MIGRATE_KVM_STDIO);
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 09628d874f..346e31093a 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -184,6 +184,7 @@ mymain(void)
DO_TEST("hostdev-usb-address");
DO_TEST("hostdev-pci-address");
+ DO_TEST("pci-rom");
DO_TEST("encrypted-disk");
DO_TEST("memtune");