<cfpc value='workaround'/>
<sbbc value='workaround'/>
<ibs value='fixed-na'/>
+ <tcg>
+ <tb-cache unit='MiB'>128</tb-cache>
+ </tcg>
</features>
...
``fixed-na (fixed in hardware - no longer applicable)``. If the
attribute is not defined, the hypervisor default will be used. :since:`Since
6.3.0` (QEMU/KVM only)
+``tcg``
+ Various features to change the behavior of the TCG accelerator.
+
+ =========== ============================================== =================================================== ==============
+ Feature Description Value Since
+ =========== ============================================== =================================================== ==============
+ tb-cache The size of translation block cache size an integer :since:`8.0.0`
+ =========== ============================================== =================================================== ==============
:anchor:`<a id="elementsTime"/>`
</element>
</define>
<!--
- A set of optional features: PAE, APIC, ACPI, GIC,
+ A set of optional features: PAE, APIC, ACPI, GIC, TCG,
HyperV Enlightenment, KVM features, paravirtual spinlocks and HAP support
-->
<define name="features">
<optional>
<ref name="ibs"/>
</optional>
+ <optional>
+ <ref name="tcgfeatures"/>
+ </optional>
</interleave>
</element>
</optional>
</element>
</define>
+ <define name="tcgfeatures">
+ <element name="tcg">
+ <optional>
+ <element name="tb-cache">
+ <ref name="scaledInteger"/>
+ </element>
+ </optional>
+ </element>
+ </define>
+
<define name="address">
<element name="address">
<choice>
"cfpc",
"sbbc",
"ibs",
+ "tcg",
);
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
g_free(def->description);
g_free(def->title);
g_free(def->hyperv_vendor_id);
+ g_free(def->tcg_features);
virBlkioDeviceArrayClear(def->blkio.devices,
def->blkio.ndevices);
}
+static int
+virDomainFeaturesTCGDefParse(virDomainDef *def,
+ xmlXPathContextPtr ctxt,
+ xmlNodePtr node)
+{
+ g_autofree virDomainFeatureTCG *tcg = NULL;
+ VIR_XPATH_NODE_AUTORESTORE(ctxt);
+
+ tcg = g_new0(virDomainFeatureTCG, 1);
+ ctxt->node = node;
+
+ if (virDomainParseMemory("./tb-cache", "./tb-cache/@unit",
+ ctxt, &tcg->tb_cache, false, false) < 0)
+ return -1;
+
+ if (tcg->tb_cache == 0)
+ return 0;
+
+ def->features[VIR_DOMAIN_FEATURE_TCG] = VIR_TRISTATE_SWITCH_ON;
+ def->tcg_features = g_steal_pointer(&tcg);
+ return 0;
+}
+
+
static int
virDomainFeaturesDefParse(virDomainDef *def,
xmlXPathContextPtr ctxt)
break;
}
+ case VIR_DOMAIN_FEATURE_TCG:
+ if (virDomainFeaturesTCGDefParse(def, ctxt, nodes[i]) < 0)
+ return -1;
+ break;
+
case VIR_DOMAIN_FEATURE_LAST:
break;
}
break;
case VIR_DOMAIN_FEATURE_MSRS:
- break;
-
+ case VIR_DOMAIN_FEATURE_TCG:
case VIR_DOMAIN_FEATURE_LAST:
break;
}
}
+static void
+virDomainFeatureTCGFormat(virBuffer *buf,
+ const virDomainDef *def)
+{
+ g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
+
+ if (!def->tcg_features ||
+ def->features[VIR_DOMAIN_FEATURE_TCG] != VIR_TRISTATE_SWITCH_ON)
+ return;
+
+ if (def->tcg_features->tb_cache > 0) {
+ virBufferAsprintf(&childBuf,
+ "<tb-cache unit='KiB'>%lld</tb-cache>\n",
+ def->tcg_features->tb_cache);
+ }
+
+ virXMLFormatElement(buf, "tcg", NULL, &childBuf);
+}
+
+
static int
virDomainDefFormatFeatures(virBuffer *buf,
virDomainDef *def)
virDomainIBSTypeToString(def->features[i]));
break;
+ case VIR_DOMAIN_FEATURE_TCG:
+ virDomainFeatureTCGFormat(&childBuf, def);
+ break;
+
case VIR_DOMAIN_FEATURE_LAST:
break;
}
VIR_DOMAIN_FEATURE_CFPC,
VIR_DOMAIN_FEATURE_SBBC,
VIR_DOMAIN_FEATURE_IBS,
+ VIR_DOMAIN_FEATURE_TCG,
VIR_DOMAIN_FEATURE_LAST
} virDomainFeature;
VIR_ENUM_DECL(virDomainIBS);
+typedef struct _virDomainFeatureTCG virDomainFeatureTCG;
+struct _virDomainFeatureTCG {
+ unsigned long long tb_cache; /* Stored in KiB */
+};
+
/* Operating system configuration data & machine / arch */
struct _virDomainOSEnv {
char *name;
unsigned long long hpt_maxpagesize; /* Stored in KiB */
char *hyperv_vendor_id;
virTristateSwitch apic_eoi;
+ virDomainFeatureTCG *tcg_features;
bool tseg_specified;
unsigned long long tseg_size;
}
break;
+ case VIR_DOMAIN_FEATURE_TCG:
case VIR_DOMAIN_FEATURE_SMM:
case VIR_DOMAIN_FEATURE_KVM:
case VIR_DOMAIN_FEATURE_XEN:
--- /dev/null
+<domain type='qemu'>
+ <name>guest</name>
+ <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+ <memory unit='KiB'>4194304</memory>
+ <currentMemory unit='KiB'>4194304</currentMemory>
+ <vcpu placement='static'>4</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <acpi/>
+ <apic/>
+ <tcg>
+ <tb-cache unit='KiB'>102400</tb-cache>
+ </tcg>
+ </features>
+ <cpu mode='custom' match='exact' check='none'>
+ <model fallback='forbid'>qemu64</model>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <controller type='usb' index='0' model='qemu-xhci'>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+ </controller>
+ <controller type='sata' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pcie-root'/>
+ <controller type='pci' index='1' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='1' port='0x8'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
+ </controller>
+ <controller type='pci' index='2' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='2' port='0x9'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='3' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='3' port='0xa'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
--- /dev/null
+../qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
\ No newline at end of file
DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-pc-4.2", "x86_64");
DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-kvm-q35-4.2", "x86_64");
DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-q35-4.2", "x86_64");
+ DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-features", "x86_64");
DO_TEST_CAPS_LATEST("virtio-9p-multidevs");
DO_TEST_CAPS_LATEST("virtio-9p-createmode");