From: Michal Privoznik Date: Tue, 16 Sep 2014 12:47:47 +0000 (+0200) Subject: domaincaps: Expose UEFI capability X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=4f76621c0edb895431a6fc30c026865dbf1c1316;p=libvirt.git domaincaps: Expose UEFI capability As of 542899168c38 we learned libvirt to use UEFI for domains. However, management applications may firstly query if libvirt supports it. And this is where virConnectGetDomainCapabilities() API comes handy. Signed-off-by: Michal Privoznik --- diff --git a/docs/formatdomaincaps.html.in b/docs/formatdomaincaps.html.in index 66b6017742..34d746dee8 100644 --- a/docs/formatdomaincaps.html.in +++ b/docs/formatdomaincaps.html.in @@ -93,6 +93,46 @@
The maximum number of supported virtual CPUs
+

BIOS bootloader

+ +

Sometimes users might want to tweak some BIOS knobs or use + UEFI. For cases like that, os + element exposes what values can be passed to its children.

+ +
+<domainCapabilities>
+  ...
+  <os supported='yes'>
+    <loader supported='yes'>
+      <enum name='type'>
+        <value>rom</value>
+        <value>pflash</value>
+      </enum>
+      <enum name='readonly'>
+        <value>yes</value>
+        <value>no</value>
+      </enum>
+    </loader>
+  </os>
+  ...
+<domainCapabilities>
+
+ +

For the loader element, the following can occur:

+ +
+
type
+
Whether loader is a typical BIOS (rom) or + an UEFI binary (pflash). This refers to + type attribute of the <loader/> + element.
+ +
readonly
+
Options for the readonly attribute of the + <loader/> element.
+
+

Devices

diff --git a/docs/schemas/domaincaps.rng b/docs/schemas/domaincaps.rng index 627b69998d..ad8d9664f8 100644 --- a/docs/schemas/domaincaps.rng +++ b/docs/schemas/domaincaps.rng @@ -25,6 +25,9 @@ + + + @@ -41,6 +44,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index df190eb108..5a3c8e7116 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -178,6 +178,32 @@ virDomainCapsEnumFormat(virBufferPtr buf, #capsEnum, valToStr); \ } while (0) + +static void +virDomainCapsLoaderFormat(virBufferPtr buf, + virDomainCapsLoaderPtr loader) +{ + FORMAT_PROLOGUE(loader); + + ENUM_PROCESS(loader, type, virDomainLoaderTypeToString); + ENUM_PROCESS(loader, readonly, virTristateBoolTypeToString); + + FORMAT_EPILOGUE(loader); +} + +static void +virDomainCapsOSFormat(virBufferPtr buf, + virDomainCapsOSPtr os) +{ + virDomainCapsLoaderPtr loader = &os->loader; + + FORMAT_PROLOGUE(os); + + virDomainCapsLoaderFormat(buf, loader); + + FORMAT_EPILOGUE(os); +} + static void virDomainCapsDeviceDiskFormat(virBufferPtr buf, virDomainCapsDeviceDiskPtr const disk) @@ -225,6 +251,8 @@ virDomainCapsFormatInternal(virBufferPtr buf, if (caps->maxvcpus) virBufferAsprintf(buf, "\n", caps->maxvcpus); + virDomainCapsOSFormat(buf, &caps->os); + virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 731e66f8a4..768646b2a8 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -43,6 +43,21 @@ struct _virDomainCapsDevice { bool supported; /* true if is supported by hypervisor */ }; +typedef struct _virDomainCapsLoader virDomainCapsLoader; +typedef virDomainCapsLoader *virDomainCapsLoaderPtr; +struct _virDomainCapsLoader { + virDomainCapsDevice device; + virDomainCapsEnum type; /* Info about virDomainLoader */ + virDomainCapsEnum readonly; /* Info about readonly:virTristateBool */ +}; + +typedef struct _virDomainCapsOS virDomainCapsOS; +typedef virDomainCapsOS *virDomainCapsOSPtr; +struct _virDomainCapsOS { + virDomainCapsDevice device; + virDomainCapsLoader loader; /* Info about virDomainLoaderDef */ +}; + typedef struct _virDomainCapsDeviceDisk virDomainCapsDeviceDisk; typedef virDomainCapsDeviceDisk *virDomainCapsDeviceDiskPtr; struct _virDomainCapsDeviceDisk { @@ -75,6 +90,7 @@ struct _virDomainCaps { /* Some machine specific info */ int maxvcpus; + virDomainCapsOS os; virDomainCapsDeviceDisk disk; virDomainCapsDeviceHostdev hostdev; /* add new domain devices here */ diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 81ada486f1..9f8868dd7e 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3608,6 +3608,42 @@ virQEMUCapsGetDefaultMachine(virQEMUCapsPtr qemuCaps) } +static void +virQEMUCapsFillDomainLoaderCaps(virQEMUCapsPtr qemuCaps, + virDomainCapsLoaderPtr loader, + virArch arch) +{ + loader->device.supported = true; + + VIR_DOMAIN_CAPS_ENUM_SET(loader->type, + VIR_DOMAIN_LOADER_TYPE_ROM); + + if (arch == VIR_ARCH_X86_64 && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE) && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_FORMAT)) + VIR_DOMAIN_CAPS_ENUM_SET(loader->type, + VIR_DOMAIN_LOADER_TYPE_PFLASH); + + + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY)) + VIR_DOMAIN_CAPS_ENUM_SET(loader->readonly, + VIR_TRISTATE_BOOL_YES, + VIR_TRISTATE_BOOL_NO); +} + + +static void +virQEMUCapsFillDomainOSCaps(virQEMUCapsPtr qemuCaps, + virDomainCapsOSPtr os, + virArch arch) +{ + virDomainCapsLoaderPtr loader = &os->loader; + + os->device.supported = true; + virQEMUCapsFillDomainLoaderCaps(qemuCaps, loader, arch); +} + + static void virQEMUCapsFillDomainDeviceDiskCaps(virQEMUCapsPtr qemuCaps, virDomainCapsDeviceDiskPtr disk) @@ -3686,12 +3722,14 @@ void virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps, virQEMUCapsPtr qemuCaps) { + virDomainCapsOSPtr os = &domCaps->os; virDomainCapsDeviceDiskPtr disk = &domCaps->disk; virDomainCapsDeviceHostdevPtr hostdev = &domCaps->hostdev; int maxvcpus = virQEMUCapsGetMachineMaxCpus(qemuCaps, domCaps->machine); domCaps->maxvcpus = maxvcpus; + virQEMUCapsFillDomainOSCaps(qemuCaps, os, domCaps->arch); virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, disk); virQEMUCapsFillDomainDeviceHostdevCaps(qemuCaps, hostdev); } diff --git a/tests/domaincapsschemadata/domaincaps-basic.xml b/tests/domaincapsschemadata/domaincaps-basic.xml index 99635199b4..6171393968 100644 --- a/tests/domaincapsschemadata/domaincaps-basic.xml +++ b/tests/domaincapsschemadata/domaincaps-basic.xml @@ -3,6 +3,7 @@ uml my-machine-type x86_64 + diff --git a/tests/domaincapsschemadata/domaincaps-full.xml b/tests/domaincapsschemadata/domaincaps-full.xml index 58dd4cbdb0..97227726e2 100644 --- a/tests/domaincapsschemadata/domaincaps-full.xml +++ b/tests/domaincapsschemadata/domaincaps-full.xml @@ -4,6 +4,19 @@ my-machine-type x86_64 + + + + rom + pflash + + + default + yes + no + + + diff --git a/tests/domaincapsschemadata/domaincaps-qemu_1.6.50-1.xml b/tests/domaincapsschemadata/domaincaps-qemu_1.6.50-1.xml index 8b63993e51..568cecbe9e 100644 --- a/tests/domaincapsschemadata/domaincaps-qemu_1.6.50-1.xml +++ b/tests/domaincapsschemadata/domaincaps-qemu_1.6.50-1.xml @@ -3,6 +3,18 @@ kvm pc-1.2 x86_64 + + + + rom + pflash + + + yes + no + + + diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 78197e2350..f240643f2c 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -38,10 +38,18 @@ static void fillAll(virDomainCapsPtr domCaps, void *opaque ATTRIBUTE_UNUSED) { + virDomainCapsOSPtr os = &domCaps->os; + virDomainCapsLoaderPtr loader = &os->loader; virDomainCapsDeviceDiskPtr disk = &domCaps->disk; virDomainCapsDeviceHostdevPtr hostdev = &domCaps->hostdev; domCaps->maxvcpus = 255; + os->device.supported = true; + + loader->device.supported = true; + SET_ALL_BITS(loader->type); + SET_ALL_BITS(loader->readonly); + disk->device.supported = true; SET_ALL_BITS(disk->diskDevice); SET_ALL_BITS(disk->bus);