qemu supports this enlightenment since version 7.10.
From the qemu commit:
Hyper-V specification allows to pass parameters for certain hypercalls
using XMM registers ("XMM Fast Hypercall Input"). When the feature is
in use, it allows for faster hypercalls processing as KVM can avoid
reading guest's memory.
Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
<ipi state='on'/>
<evmcs state='on'/>
<emsr_bitmap state='on'/>
+ <xmm_input state='on'/>
</hyperv>
<kvm>
<hidden state='on'/>
evmcs Enable Enlightened VMCS on, off :since:`4.10.0 (QEMU 3.1)`
avic Enable use Hyper-V SynIC with hardware APICv/AVIC on, off :since:`8.10.0 (QEMU 6.2)`
emsr_bitmap Avoid unnecessary updates to L2 MSR Bitmap upon vmexits. on, off :since:`10.7.0 (QEMU 7.1)`
+ xmm_input Enable XMM Fast Hypercall Input on, off :since:`10.7.0 (QEMU 7.1)`
=============== ====================================================================== ============================================ =======================================================
:since:`Since 8.0.0`, the hypervisor can be configured further by setting
"evmcs",
"avic",
"emsr_bitmap",
+ "xmm_input",
);
VIR_ENUM_IMPL(virDomainKVM,
case VIR_DOMAIN_HYPERV_EVMCS:
case VIR_DOMAIN_HYPERV_AVIC:
case VIR_DOMAIN_HYPERV_EMSR_BITMAP:
+ case VIR_DOMAIN_HYPERV_XMM_INPUT:
break;
case VIR_DOMAIN_HYPERV_STIMER:
case VIR_DOMAIN_HYPERV_EVMCS:
case VIR_DOMAIN_HYPERV_AVIC:
case VIR_DOMAIN_HYPERV_EMSR_BITMAP:
+ case VIR_DOMAIN_HYPERV_XMM_INPUT:
if (src->hyperv_features[i] != dst->hyperv_features[i]) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("State of HyperV enlightenment feature '%1$s' differs: source: '%2$s', destination: '%3$s'"),
case VIR_DOMAIN_HYPERV_EVMCS:
case VIR_DOMAIN_HYPERV_AVIC:
case VIR_DOMAIN_HYPERV_EMSR_BITMAP:
+ case VIR_DOMAIN_HYPERV_XMM_INPUT:
virBufferAddLit(&childBuf, "/>\n");
break;
VIR_DOMAIN_HYPERV_EVMCS,
VIR_DOMAIN_HYPERV_AVIC,
VIR_DOMAIN_HYPERV_EMSR_BITMAP,
+ VIR_DOMAIN_HYPERV_XMM_INPUT,
VIR_DOMAIN_HYPERV_LAST
} virDomainHyperv;
<ref name="featurestate"/>
</element>
</optional>
+ <optional>
+ <element name="xmm_input">
+ <ref name="featurestate"/>
+ </element>
+ </optional>
</interleave>
</group>
</choice>
0x40000003, 0x00000004, 0x0);
KVM_FEATURE_DEF(VIR_CPU_x86_HV_STIMER,
0x40000003, 0x00000008, 0x0);
+KVM_FEATURE_DEF(VIR_CPU_x86_HV_XMM_INPUT,
+ 0x40000003, 0x00000010, 0x0);
KVM_FEATURE_DEF(VIR_CPU_x86_HV_RELAXED,
0x40000003, 0x00000020, 0x0);
KVM_FEATURE_DEF(VIR_CPU_x86_HV_VAPIC,
KVM_FEATURE_DEF(VIR_CPU_x86_HV_EMSR_BITMAP,
0x4000000A, 0x00080000, 0x0);
-
static virCPUx86Feature x86_kvm_features[] =
{
KVM_FEATURE(VIR_CPU_x86_KVM_PV_UNHALT),
KVM_FEATURE(VIR_CPU_x86_HV_RUNTIME),
KVM_FEATURE(VIR_CPU_x86_HV_SYNIC),
KVM_FEATURE(VIR_CPU_x86_HV_STIMER),
+ KVM_FEATURE(VIR_CPU_x86_HV_XMM_INPUT),
KVM_FEATURE(VIR_CPU_x86_HV_RELAXED),
KVM_FEATURE(VIR_CPU_x86_HV_VAPIC),
KVM_FEATURE(VIR_CPU_x86_HV_VPINDEX),
#define VIR_CPU_x86_HV_RUNTIME "hv-runtime"
#define VIR_CPU_x86_HV_SYNIC "hv-synic"
#define VIR_CPU_x86_HV_STIMER "hv-stimer"
+#define VIR_CPU_x86_HV_XMM_INPUT "hv-xmm_input"
#define VIR_CPU_x86_HV_RELAXED "hv-relaxed"
#define VIR_CPU_x86_HV_SPINLOCKS "hv-spinlocks"
#define VIR_CPU_x86_HV_VAPIC "hv-vapic"
virBufferAsprintf(&buf, ",%s=on", "hv-emsr-bitmap");
break;
+ case VIR_DOMAIN_HYPERV_XMM_INPUT:
+ if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON)
+ virBufferAsprintf(&buf, ",%s=on", "hv-xmm-input");
+ break;
+
case VIR_DOMAIN_HYPERV_LAST:
break;
}
case VIR_DOMAIN_HYPERV_EVMCS:
case VIR_DOMAIN_HYPERV_AVIC:
case VIR_DOMAIN_HYPERV_EMSR_BITMAP:
+ case VIR_DOMAIN_HYPERV_XMM_INPUT:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("host doesn't support hyperv '%1$s' feature"),
virDomainHypervTypeToString(i));
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<value>ipi</value>
<value>avic</value>
<value>emsr_bitmap</value>
+ <value>xmm_input</value>
</enum>
</hyperv>
<launchSecurity supported='no'/>
<cap name='ipi'/>
<cap name='avic'/>
<cap name='emsr_bitmap'/>
+ <cap name='xmm_input'/>
</hypervCapabilities>
</qemuCaps>
<cap name='ipi'/>
<cap name='avic'/>
<cap name='emsr_bitmap'/>
+ <cap name='xmm_input'/>
</hypervCapabilities>
</qemuCaps>
<cap name='ipi'/>
<cap name='avic'/>
<cap name='emsr_bitmap'/>
+ <cap name='xmm_input'/>
</hypervCapabilities>
</qemuCaps>
<cap name='ipi'/>
<cap name='avic'/>
<cap name='emsr_bitmap'/>
+ <cap name='xmm_input'/>
</hypervCapabilities>
</qemuCaps>
<cap name='ipi'/>
<cap name='avic'/>
<cap name='emsr_bitmap'/>
+ <cap name='xmm_input'/>
</hypervCapabilities>
</qemuCaps>
<ipi state='off'/>
<evmcs state='off'/>
<emsr_bitmap state='off'/>
+ <xmm_input state='off'/>
</hyperv>
</features>
<cpu mode='custom' match='exact' check='none'>
<ipi state='off'/>
<evmcs state='off'/>
<emsr_bitmap state='off'/>
+ <xmm_input state='off'/>
</hyperv>
</features>
<clock offset='utc'/>
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=on \
-accel tcg \
--cpu 'qemu64,hv-relaxed=on,hv-vapic=on,hv-spinlocks=0x2fff,hv-vpindex=on,hv-runtime=on,hv-synic=on,hv-stimer=on,hv-reset=on,hv-vendor-id=KVM Hv,hv-frequencies=on,hv-reenlightenment=on,hv-tlbflush=on,hv-ipi=on,hv-evmcs=on,hv-avic=on,hv-emsr-bitmap=on' \
+-cpu 'qemu64,hv-relaxed=on,hv-vapic=on,hv-spinlocks=0x2fff,hv-vpindex=on,hv-runtime=on,hv-synic=on,hv-stimer=on,hv-reset=on,hv-vendor-id=KVM Hv,hv-frequencies=on,hv-reenlightenment=on,hv-tlbflush=on,hv-ipi=on,hv-evmcs=on,hv-avic=on,hv-emsr-bitmap=on,hv-xmm-input=on' \
-m size=219136k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
-overcommit mem-lock=off \
<evmcs state='on'/>
<avic state='on'/>
<emsr_bitmap state='on'/>
+ <xmm_input state='on'/>
</hyperv>
</features>
<cpu mode='custom' match='exact' check='none'>
<evmcs state='on'/>
<avic state='on'/>
<emsr_bitmap state='on'/>
+ <xmm_input state='on'/>
</hyperv>
</features>
<clock offset='utc'/>