<code>floppy</code>, or <code>lun</code>.</p>
<h4><a name="elementsDisks">Hard drives, floppy disks, CDROMs</a></h4>
- <p>Disk capabilities are exposed under <code>disk</code> element. For
+ <p>Disk capabilities are exposed under the <code>disk</code> element. For
instance:</p>
<pre>
element for a <disk/>.</dd>
</dl>
+
+ <h4><a name="elementsGraphics">Graphical framebuffers</a></h4>
+ <p>Graphics device capabilities are exposed under the
+ <code>graphics</code> element. For instance:</p>
+
+<pre>
+<domainCapabilities>
+ ...
+ <devices>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ <value>spice</value>
+ </enum>
+ </graphics>
+ ...
+ </devices>
+</domainCapabilities>
+</pre>
+
+ <dl>
+ <dt><code>type</code></dt>
+ <dd>Options for the <code>type</code> attribute of the <graphics/>
+ element.</dd>
+ </dl>
+
+
<h4><a name="elementsHostDev">Host device assignment</a></h4>
<p>Some host devices can be passed through to a guest (e.g. USB, PCI and
SCSI). Well, only if the following is enabled:</p>
<element name='devices'>
<interleave>
<ref name='disk'/>
+ <ref name='graphics'/>
<ref name='hostdev'/>
</interleave>
</element>
</element>
</define>
+ <define name='graphics'>
+ <element name='graphics'>
+ <ref name='supported'/>
+ <ref name='enum'/>
+ </element>
+ </define>
+
<define name='hostdev'>
<element name='hostdev'>
<ref name='supported'/>
}
+static void
+virDomainCapsDeviceGraphicsFormat(virBufferPtr buf,
+ virDomainCapsDeviceGraphicsPtr const graphics)
+{
+ FORMAT_PROLOGUE(graphics);
+
+ ENUM_PROCESS(graphics, type, virDomainGraphicsTypeToString);
+
+ FORMAT_EPILOGUE(graphics);
+}
+
+
static void
virDomainCapsDeviceHostdevFormat(virBufferPtr buf,
virDomainCapsDeviceHostdevPtr const hostdev)
virBufferAdjustIndent(buf, 2);
virDomainCapsDeviceDiskFormat(buf, &caps->disk);
+ virDomainCapsDeviceGraphicsFormat(buf, &caps->graphics);
virDomainCapsDeviceHostdevFormat(buf, &caps->hostdev);
virBufferAdjustIndent(buf, -2);
/* add new fields here */
};
+typedef struct _virDomainCapsDeviceGraphics virDomainCapsDeviceGraphics;
+typedef virDomainCapsDeviceGraphics *virDomainCapsDeviceGraphicsPtr;
+struct _virDomainCapsDeviceGraphics {
+ bool supported;
+ virDomainCapsEnum type; /* virDomainGraphicsType */
+};
+
typedef struct _virDomainCapsDeviceHostdev virDomainCapsDeviceHostdev;
typedef virDomainCapsDeviceHostdev *virDomainCapsDeviceHostdevPtr;
struct _virDomainCapsDeviceHostdev {
virDomainCapsOS os;
virDomainCapsDeviceDisk disk;
+ virDomainCapsDeviceGraphics graphics;
virDomainCapsDeviceHostdev hostdev;
/* add new domain devices here */
}
+static int
+virQEMUCapsFillDomainDeviceGraphicsCaps(virQEMUCapsPtr qemuCaps,
+ virDomainCapsDeviceGraphicsPtr dev)
+{
+ dev->supported = true;
+
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SDL))
+ VIR_DOMAIN_CAPS_ENUM_SET(dev->type, VIR_DOMAIN_GRAPHICS_TYPE_SDL);
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VNC))
+ VIR_DOMAIN_CAPS_ENUM_SET(dev->type, VIR_DOMAIN_GRAPHICS_TYPE_VNC);
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE))
+ VIR_DOMAIN_CAPS_ENUM_SET(dev->type, VIR_DOMAIN_GRAPHICS_TYPE_SPICE);
+
+ return 0;
+}
+
+
static int
virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
virDomainCapsDeviceHostdevPtr hostdev)
virDomainCapsOSPtr os = &domCaps->os;
virDomainCapsDeviceDiskPtr disk = &domCaps->disk;
virDomainCapsDeviceHostdevPtr hostdev = &domCaps->hostdev;
+ virDomainCapsDeviceGraphicsPtr graphics = &domCaps->graphics;
int maxvcpus = virQEMUCapsGetMachineMaxCpus(qemuCaps, domCaps->machine);
domCaps->maxvcpus = maxvcpus;
if (virQEMUCapsFillDomainOSCaps(qemuCaps, os,
loader, nloader) < 0 ||
- virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk) < 0 ||
+ virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps,
+ domCaps->machine, disk) < 0 ||
+ virQEMUCapsFillDomainDeviceGraphicsCaps(qemuCaps, graphics) < 0 ||
virQEMUCapsFillDomainDeviceHostdevCaps(qemuCaps, hostdev) < 0 ||
virQEMUCapsFillDomainFeatureGICCaps(qemuCaps, domCaps) < 0)
return -1;
<os supported='no'/>
<devices>
<disk supported='no'/>
+ <graphics supported='no'/>
<hostdev supported='no'/>
</devices>
<features>
<value>sd</value>
</enum>
</disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ <value>rdp</value>
+ <value>desktop</value>
+ <value>spice</value>
+ </enum>
+ </graphics>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
<value>usb</value>
</enum>
</disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ <value>spice</value>
+ </enum>
+ </graphics>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
<value>usb</value>
</enum>
</disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ <value>spice</value>
+ </enum>
+ </graphics>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
<value>usb</value>
</enum>
</disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ </enum>
+ </graphics>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
<value>usb</value>
</enum>
</disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ </enum>
+ </graphics>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
<value>usb</value>
</enum>
</disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ </enum>
+ </graphics>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
<value>usb</value>
</enum>
</disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ </enum>
+ </graphics>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
virDomainCapsOSPtr os = &domCaps->os;
virDomainCapsLoaderPtr loader = &os->loader;
virDomainCapsDeviceDiskPtr disk = &domCaps->disk;
+ virDomainCapsDeviceGraphicsPtr graphics = &domCaps->graphics;
virDomainCapsDeviceHostdevPtr hostdev = &domCaps->hostdev;
domCaps->maxvcpus = 255;
SET_ALL_BITS(disk->diskDevice);
SET_ALL_BITS(disk->bus);
+ graphics->supported = true;
+ SET_ALL_BITS(graphics->type);
+
hostdev->supported = true;
SET_ALL_BITS(hostdev->mode);
SET_ALL_BITS(hostdev->startupPolicy);