]> xenbits.xensource.com Git - libvirt.git/commitdiff
hyperv: Support hv-xmm-input enlightenment
authorTim Wiederhake <twiederh@redhat.com>
Tue, 13 Aug 2024 17:18:01 +0000 (19:18 +0200)
committerTim Wiederhake <twiederh@redhat.com>
Mon, 26 Aug 2024 09:48:15 +0000 (11:48 +0200)
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>
33 files changed:
docs/formatdomain.rst
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/schemas/domaincommon.rng
src/cpu/cpu_x86.c
src/cpu/cpu_x86_data.h
src/qemu/qemu_command.c
src/qemu/qemu_process.c
tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml
tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_8.0.0.x86_64.xml
tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml
tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_8.1.0.x86_64.xml
tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml
tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_8.2.0.x86_64.xml
tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml
tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_9.0.0.x86_64.xml
tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml
tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_9.1.0.x86_64.xml
tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml
tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml
tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml
tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
tests/qemuxmlconfdata/hyperv-off.x86_64-latest.xml
tests/qemuxmlconfdata/hyperv-off.xml
tests/qemuxmlconfdata/hyperv.x86_64-latest.args
tests/qemuxmlconfdata/hyperv.x86_64-latest.xml
tests/qemuxmlconfdata/hyperv.xml

index f34688e1cad2a2efdca726e2b60bbf2e251a682c..47d3e2125e4522404c82a360b87d50da26b70ca2 100644 (file)
@@ -1990,6 +1990,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off.
        <ipi state='on'/>
        <evmcs state='on'/>
        <emsr_bitmap state='on'/>
+       <xmm_input state='on'/>
      </hyperv>
      <kvm>
        <hidden state='on'/>
@@ -2079,6 +2080,7 @@ are:
    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
index 8614a044c991aab75a1f10c0f234185e2408538c..5f0b35be5e68e538970dccf7da36b0e5458fe494 100644 (file)
@@ -213,6 +213,7 @@ VIR_ENUM_IMPL(virDomainHyperv,
               "evmcs",
               "avic",
               "emsr_bitmap",
+              "xmm_input",
 );
 
 VIR_ENUM_IMPL(virDomainKVM,
@@ -16577,6 +16578,7 @@ virDomainFeaturesHyperVDefParse(virDomainDef *def,
         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:
@@ -21026,6 +21028,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src,
             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'"),
@@ -27769,6 +27772,7 @@ virDomainDefFormatFeatures(virBuffer *buf,
                 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;
 
index 89675311edb4f61d827257f1c5c84b1cb740dc2c..659299bdd179c940d955adb6fc796498ff1a3f5a 100644 (file)
@@ -2205,6 +2205,7 @@ typedef enum {
     VIR_DOMAIN_HYPERV_EVMCS,
     VIR_DOMAIN_HYPERV_AVIC,
     VIR_DOMAIN_HYPERV_EMSR_BITMAP,
+    VIR_DOMAIN_HYPERV_XMM_INPUT,
 
     VIR_DOMAIN_HYPERV_LAST
 } virDomainHyperv;
index ff83cf8980646c658be5cee8be55307fe2018d57..efb5f00d77f3431568032fbd2c0a852dfc486608 100644 (file)
                 <ref name="featurestate"/>
               </element>
             </optional>
+            <optional>
+              <element name="xmm_input">
+                <ref name="featurestate"/>
+              </element>
+            </optional>
           </interleave>
         </group>
       </choice>
index 139ac48234202ff9bda6df35d2c4d023ffb64898..7cf158e25b59e7e42e380b4e18557d537958b615 100644 (file)
@@ -82,6 +82,8 @@ KVM_FEATURE_DEF(VIR_CPU_x86_HV_SYNIC,
                 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,
@@ -109,13 +111,13 @@ KVM_FEATURE_DEF(VIR_CPU_x86_HV_EVMCS,
 
 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),
index 414643fe8d8058d17d0409662912a7077ae68d7c..43ad2faeb16264846279bbe47007c283a792ae10 100644 (file)
@@ -51,6 +51,7 @@ struct _virCPUx86MSR {
 #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"
index 7610a6f043e2381c19010f20c4db918ff5b2fe7e..34a3baf4fb3834118367f08e18f4c7684219c3bc 100644 (file)
@@ -6528,6 +6528,11 @@ qemuBuildCpuCommandLine(virCommand *cmd,
                     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;
             }
index e2e55797c362f0dc9b88ea9d3c0aa647a2f4663d..242c93284ee602c72b6e26c055688bafb4102cfa 100644 (file)
@@ -4305,6 +4305,7 @@ qemuProcessVerifyHypervFeatures(virDomainDef *def,
         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));
index 1dfbf98248e5b434f92a76a209b76f2a0fce010e..aa7f0c877cfad6ac10fe06753f235b33d884a8e6 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 516eade95b54d9cfb6e305d9cfcd99d07ddce680..9892e2d6575b6e6ecdfe3ad9533bf4047a515155 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 96cfc5776e7259b60ca9e581aa75c78d8fb4e99d..9c9e8682e38e8c41117cb4c84e2eb52694eff775 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 5bb1299fb1710de90199783de18018cfcf1dd227..57f20132faa422a4ed0b414632d7d1957754f410 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 743a6e728be555aef3d2e102713297b94041d6dd..5dbe6e0b8153c81eca32dba0e6ed3617e9585231 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index fa635fd12b44336542a5a3ef18f14d138c190dda..4156a476cdc3847082f56b6fe4eabbbda57196e4 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 6c394ba3c4384606fbec9f2695621b54706af5e1..65987be79bdd1af598cf6e08a8fd716ae9014271 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 7ebd3ced3a8d33eb3b561cd05fb47db5983b5780..9ba857f660c3f85b2298bb8ae42071305a8ad8ea 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 1db706ef7e5dd9ec16c7e51498bb58d4cd698a80..01729e231e40c87c62c29835f10be964fd9a1e3a 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 4fb0ebc45f84479223992e77ed9cdd0c8c3d3b14..78b0e911711766678bc259d22a1265f409543675 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 43ff5c3d9f8e24bc4ceea9b7641c4de04074751d..88e2788cefed77740df8c58ee656cc53ac7018a5 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 86edbec0dd2acd80952fecad484254817dc9bd01..37b12be0b7d471c8ea0e594de8cc91445cd10ff3 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index c9bf0139b517a07767f91d84727ff831307339a7..08e4311c224ad3cae019a4f80d8275ea0830a82e 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 288047b38b952cfe803d94c0fdb91785b00a1a63..72bd641b6e0de7e9d46dbb8905282d96503be403 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index 4cae2f73ccd3cd3e775829b9a139976e7b23a901..d074a260b6142837ae90d98c237a6c3077e463d0 100644 (file)
         <value>ipi</value>
         <value>avic</value>
         <value>emsr_bitmap</value>
+        <value>xmm_input</value>
       </enum>
     </hyperv>
     <launchSecurity supported='no'/>
index a2e5c1cb95fdd5ecb9cad3e5fcdfa0159295a680..459d05bf43e2f46a939ec15153256aa0f24f5216 100644 (file)
     <cap name='ipi'/>
     <cap name='avic'/>
     <cap name='emsr_bitmap'/>
+    <cap name='xmm_input'/>
   </hypervCapabilities>
 </qemuCaps>
index 3813434206d145da17bc282bad1e62b685148679..289c87ff19f87c33e3b71e86f73fe6952efa3eb2 100644 (file)
     <cap name='ipi'/>
     <cap name='avic'/>
     <cap name='emsr_bitmap'/>
+    <cap name='xmm_input'/>
   </hypervCapabilities>
 </qemuCaps>
index 8e601db07fced9cae195f7202b48c7b11eb1b25e..e56d5dafa4a4b10f032b9552af29979040ad1016 100644 (file)
     <cap name='ipi'/>
     <cap name='avic'/>
     <cap name='emsr_bitmap'/>
+    <cap name='xmm_input'/>
   </hypervCapabilities>
 </qemuCaps>
index 0dc762ac7e381ee0c1b2c09b8792ccbd39698af6..3f1f518d227de3758c7aca4b02cbdc37e8bc591c 100644 (file)
     <cap name='ipi'/>
     <cap name='avic'/>
     <cap name='emsr_bitmap'/>
+    <cap name='xmm_input'/>
   </hypervCapabilities>
 </qemuCaps>
index 3d4d225ed54bde0e2080280a0e30bdf09a8415c6..408f60068cf831aba6a94ee9b075c10989da3bf4 100644 (file)
     <cap name='ipi'/>
     <cap name='avic'/>
     <cap name='emsr_bitmap'/>
+    <cap name='xmm_input'/>
   </hypervCapabilities>
 </qemuCaps>
index 2b5f3537a8f9a11c546ab6185717eab747ef46c9..29f2da03f10e1cdc756f697156ba572e66a629d1 100644 (file)
@@ -26,6 +26,7 @@
       <ipi state='off'/>
       <evmcs state='off'/>
       <emsr_bitmap state='off'/>
+      <xmm_input state='off'/>
     </hyperv>
   </features>
   <cpu mode='custom' match='exact' check='none'>
index f760a9676ba14b8f3c5c825c5b84e1661d8a435d..bec8780eea0a7c6916f5a7cd0fb758ff67bfa937 100644 (file)
@@ -26,6 +26,7 @@
       <ipi state='off'/>
       <evmcs state='off'/>
       <emsr_bitmap state='off'/>
+      <xmm_input state='off'/>
     </hyperv>
   </features>
   <clock offset='utc'/>
index 5046ec6ea068e4155f8c81cc123311d0e86e4a41..2aafafb340a6db3363d6634fd7b6c468662e7811 100644 (file)
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
 -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 \
index d5cb27bf1d81098fadc0d9ecf4e19e6b0902c73b..36d9161fa8118b0b40a30c92e14b63836866eabf 100644 (file)
@@ -27,6 +27,7 @@
       <evmcs state='on'/>
       <avic state='on'/>
       <emsr_bitmap state='on'/>
+      <xmm_input state='on'/>
     </hyperv>
   </features>
   <cpu mode='custom' match='exact' check='none'>
index db520e207403218a322a774b6f7cf5640ca90914..a1e3cbbdf8421a84cdba586fe6626626b20be49f 100644 (file)
@@ -27,6 +27,7 @@
       <evmcs state='on'/>
       <avic state='on'/>
       <emsr_bitmap state='on'/>
+      <xmm_input state='on'/>
     </hyperv>
   </features>
   <clock offset='utc'/>