<apic/>
<hap/>
<privnet/>
+ <hyperv>
+ <relaxed state='on'>
+ </hyperv>
+
</features>
...</pre>
This feature is only relevant for container based
virtualization drivers, such as LXC.
</dd>
+ <dt><code>hyperv</code></dt>
+ <dd>Enable various features improving behavior of guests
+ running Microsoft Windows.
+ <table class="top_table">
+ <tr>
+ <th>Feature</th>
+ <th>Description</th>
+ <th>Value</th>
+ </tr>
+ <tr>
+ <td>relaxed</td>
+ <td>Relax contstraints on timers</td>
+ <td> on, off</td>
+ </tr>
+ </table>
+ <span class="since">Since 1.0.0 (QEMU only)</span>
+ </dd>
</dl>
<h3><a name="elementsTime">Time keeping</a></h3>
</element>
</define>
<!--
- A set of optional features: PAE, APIC, ACPI, and HAP support
+ A set of optional features: PAE, APIC, ACPI,
+ HyperV Enlightenment and HAP support
-->
<define name="features">
<optional>
<empty/>
</element>
</optional>
+ <optional>
+ <ref name="hyperv"/>
+ </optional>
<optional>
<element name="viridian">
<empty/>
</element>
</define>
+ <!-- Optional HyperV Enlightenment features -->
+ <define name="hyperv">
+ <element name="hyperv">
+ <interleave>
+ <optional>
+ <element name="relaxed">
+ <ref name="hypervtristate"/>
+ </element>
+ </optional>
+ </interleave>
+ </element>
+ </define>
+
+ <define name="hypervtristate">
+ <attribute name="state">
+ <choice>
+ <value>on</value>
+ <value>off</value>
+ </choice>
+ </attribute>
+ </define>
+
<!--
Optional hypervisor extensions in their own namespace:
QEmu
"pae",
"hap",
"viridian",
- "privnet")
+ "privnet",
+ "hyperv")
VIR_ENUM_IMPL(virDomainFeatureState, VIR_DOMAIN_FEATURE_STATE_LAST,
"default",
"on",
"off")
+VIR_ENUM_IMPL(virDomainHyperv, VIR_DOMAIN_HYPERV_LAST,
+ "relaxed")
+
VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST,
"destroy",
"restart",
VIR_FREE(nodes);
}
+ if (def->features & (1 << VIR_DOMAIN_FEATURE_HYPERV)) {
+ int feature;
+ int value;
+ node = ctxt->node;
+ if ((n = virXPathNodeSet("./features/hyperv/*", ctxt, &nodes)) < 0)
+ goto error;
+
+ for (i = 0; i < n; i++) {
+ feature = virDomainHypervTypeFromString((const char *)nodes[i]->name);
+ if (feature < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("unsupported HyperV Enlightenment feature: %s"),
+ nodes[i]->name);
+ goto error;
+ }
+
+ ctxt->node = nodes[i];
+
+ switch ((enum virDomainHyperv) feature) {
+ case VIR_DOMAIN_HYPERV_RELAXED:
+ if (!(tmp = virXPathString("string(./@state)", ctxt))) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("missing 'state' attribute for "
+ "HyperV Enlightenment feature '%s'"),
+ nodes[i]->name);
+ goto error;
+ }
+
+ if ((value = virDomainFeatureStateTypeFromString(tmp)) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("invalid value of state argument "
+ "for HyperV Enlightenment feature '%s'"),
+ nodes[i]->name);
+ goto error;
+ }
+
+ def->hyperv_features[feature] = value;
+ break;
+
+ case VIR_DOMAIN_HYPERV_LAST:
+ break;
+ }
+ }
+ VIR_FREE(nodes);
+ ctxt->node = node;
+ }
+
if (virDomainEventActionParseXML(ctxt, "on_reboot",
"string(./on_reboot[1])",
&def->onReboot,
if (def->features) {
virBufferAddLit(buf, " <features>\n");
for (i = 0 ; i < VIR_DOMAIN_FEATURE_LAST ; i++) {
- if (def->features & (1 << i)) {
+ if (def->features & (1 << i) && i != VIR_DOMAIN_FEATURE_HYPERV) {
const char *name = virDomainFeatureTypeToString(i);
if (!name) {
virReportError(VIR_ERR_INTERNAL_ERROR,
virBufferAddLit(buf, "/>\n");
}
}
+
+ if (def->features & (1 << VIR_DOMAIN_FEATURE_HYPERV)) {
+ virBufferAddLit(buf, " <hyperv>\n");
+ for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) {
+ switch ((enum virDomainHyperv) i) {
+ case VIR_DOMAIN_HYPERV_RELAXED:
+ if (def->hyperv_features[i])
+ virBufferAsprintf(buf, " <%s state='%s'/>\n",
+ virDomainHypervTypeToString(i),
+ virDomainFeatureStateTypeToString(def->hyperv_features[i]));
+ break;
+
+ case VIR_DOMAIN_HYPERV_LAST:
+ break;
+ }
+ }
+ virBufferAddLit(buf, " </hyperv>\n");
+ }
+
virBufferAddLit(buf, " </features>\n");
}
VIR_DOMAIN_FEATURE_HAP,
VIR_DOMAIN_FEATURE_VIRIDIAN,
VIR_DOMAIN_FEATURE_PRIVNET,
+ VIR_DOMAIN_FEATURE_HYPERV,
VIR_DOMAIN_FEATURE_LAST
};
VIR_DOMAIN_FEATURE_STATE_LAST
};
+enum virDomainHyperv {
+ VIR_DOMAIN_HYPERV_RELAXED = 0,
+
+ VIR_DOMAIN_HYPERV_LAST
+};
+
enum virDomainLifecycleAction {
VIR_DOMAIN_LIFECYCLE_DESTROY,
VIR_DOMAIN_LIFECYCLE_RESTART,
int features;
/* enum virDomainFeatureState */
int apic_eoi;
+ /* These options are of type virDomainFeatureState */
+ int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
virDomainClockDef clock;
VIR_ENUM_DECL(virDomainGraphicsSpiceMouseMode)
VIR_ENUM_DECL(virDomainNumatuneMemMode)
VIR_ENUM_DECL(virDomainNumatuneMemPlacementMode)
+VIR_ENUM_DECL(virDomainHyperv)
/* from libvirt.h */
VIR_ENUM_DECL(virDomainState)
VIR_ENUM_DECL(virDomainNostateReason)