--- docs/formatdomain.html.in | 14 ++++++++++++-- docs/schemas/domain.rng | 3 +++ src/conf/domain_conf.c | 18 +++++++++++++++--- src/conf/domain_conf.h | 1 + 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 48f82ae..db0b762 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -109,8 +109,9 @@ to consider. The <code>boot</code> element can be repeated multiple times to setup a priority list of boot devices to try in turn. The <code>boot</code> element cannot be used if per-device boot elements - are used (see <a href="#elementsDisks">disks</a> and - <a href="#elementsNICS">network interfaces</a> sections below. + are used (see <a href="#elementsDisks">disks</a>, + <a href="#elementsNICS">network interfaces</a>, and + <a href="#elementsUSB">USB and PCI devices</a> sections below). <span class="since">Since 0.1.3, per-device boot since 0.8.8</span> </dd> <dt><code>bootmenu</code></dt> @@ -929,6 +930,7 @@ <vendor id='0x1234'/> <product id='0xbeef'/> </source> + <boot order='2'/> </hostdev> </devices> ...</pre> @@ -942,6 +944,7 @@ <source> <address bus='0x06' slot='0x02' function='0x0'/> </source> + <boot order='1'/> </hostdev> </devices> ...</pre> @@ -964,6 +967,13 @@ <code>id</code> attribute that specifies the USB vendor and product id. The ids can be given in decimal, hexadecimal (starting with 0x) or octal (starting with 0) form.</dd> + <dt><code>boot</code></dt> + <dd>Specifies that the device is bootable. The <code>order</code> + attribute determines the order in which devices will be tried during + boot sequence. The per-device <code>boot</code> elements cannot be + used together with general boot elements in + <a href="#elementsOSBIOS">BIOS bootloader</a> section. + <span class="since">Since 0.8.8</span></dd> <dt><code>address</code></dt> <dd>The <code>address</code> element for USB devices has a <code>bus</code> and <code>device</code> attribute to specify the diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index e4e7423..8a2e7c7 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -1693,6 +1693,9 @@ </element> </group> <optional> + <ref name="deviceBoot"/> + </optional> + <optional> <ref name="address"/> </optional> </element> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b1cc6c8..aba4223 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4247,7 +4247,9 @@ out: static virDomainHostdevDefPtr virDomainHostdevDefParseXML(const xmlNodePtr node, - int flags) { + virBitmapPtr bootMap, + int flags) +{ xmlNodePtr cur; virDomainHostdevDefPtr def; @@ -4308,6 +4310,10 @@ virDomainHostdevDefParseXML(const xmlNodePtr node, /* address is parsed as part of virDomainDeviceInfoParseXML */ } else if (xmlStrEqual(cur->name, BAD_CAST "alias")) { /* alias is parsed as part of virDomainDeviceInfoParseXML */ + } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) { + if (virDomainDeviceBootParseXML(cur, &def->bootIndex, + bootMap)) + goto error; } else { virDomainReportError(VIR_ERR_INTERNAL_ERROR, _("unknown node %s"), cur->name); @@ -4507,7 +4513,8 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps, goto error; } else if (xmlStrEqual(node->name, BAD_CAST "hostdev")) { dev->type = VIR_DOMAIN_DEVICE_HOSTDEV; - if (!(dev->data.hostdev = virDomainHostdevDefParseXML(node, flags))) + if (!(dev->data.hostdev = virDomainHostdevDefParseXML(node, NULL, + flags))) goto error; } else if (xmlStrEqual(node->name, BAD_CAST "controller")) { dev->type = VIR_DOMAIN_DEVICE_CONTROLLER; @@ -4767,7 +4774,8 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt, unsigned long deviceBoot; if (virXPathULong("count(./devices/disk[boot]" - "|./devices/interface[boot])", ctxt, &deviceBoot) < 0) { + "|./devices/interface[boot]" + "|./devices/hostdev[boot])", ctxt, &deviceBoot) < 0) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot count boot devices")); goto cleanup; @@ -5506,6 +5514,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, goto no_memory; for (i = 0 ; i < n ; i++) { virDomainHostdevDefPtr hostdev = virDomainHostdevDefParseXML(nodes[i], + bootMap, flags); if (!hostdev) goto error; @@ -7280,6 +7289,9 @@ virDomainHostdevDefFormat(virBufferPtr buf, virBufferAddLit(buf, " </source>\n"); + if (def->bootIndex) + virBufferVSprintf(buf, " <boot order='%d'/>\n", def->bootIndex); + if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) return -1; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 871fa9a..feae203 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -678,6 +678,7 @@ struct _virDomainHostdevDef { } caps; } source; char* target; + int bootIndex; virDomainDeviceInfo info; /* Guest address */ }; -- 1.7.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list