KVM, x86: add architectural support code for #VE
authorPaolo Bonzini <pbonzini@redhat.com>
Fri, 5 Apr 2024 17:43:29 +0000 (13:43 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 19 Apr 2024 16:15:20 +0000 (12:15 -0400)
Dump the contents of the #VE info data structure and assert that #VE does
not happen, but do not yet do anything with it.

No functional change intended, separated for clarity only.

Extracted from a patch by Isaku Yamahata <isaku.yamahata@intel.com>.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/vmx.h
arch/x86/kvm/vmx/vmx.c

index ac6da0a5f5e64d07b268714001ea07f731139fa8..d77a31039f241e0333a78c42fcbb1eacb0dc27f6 100644 (file)
@@ -71,6 +71,7 @@
 #define SECONDARY_EXEC_ENCLS_EXITING           VMCS_CONTROL_BIT(ENCLS_EXITING)
 #define SECONDARY_EXEC_RDSEED_EXITING          VMCS_CONTROL_BIT(RDSEED_EXITING)
 #define SECONDARY_EXEC_ENABLE_PML               VMCS_CONTROL_BIT(PAGE_MOD_LOGGING)
+#define SECONDARY_EXEC_EPT_VIOLATION_VE                VMCS_CONTROL_BIT(EPT_VIOLATION_VE)
 #define SECONDARY_EXEC_PT_CONCEAL_VMX          VMCS_CONTROL_BIT(PT_CONCEAL_VMX)
 #define SECONDARY_EXEC_ENABLE_XSAVES           VMCS_CONTROL_BIT(XSAVES)
 #define SECONDARY_EXEC_MODE_BASED_EPT_EXEC     VMCS_CONTROL_BIT(MODE_BASED_EPT_EXEC)
@@ -226,6 +227,8 @@ enum vmcs_field {
        VMREAD_BITMAP_HIGH              = 0x00002027,
        VMWRITE_BITMAP                  = 0x00002028,
        VMWRITE_BITMAP_HIGH             = 0x00002029,
+       VE_INFORMATION_ADDRESS          = 0x0000202A,
+       VE_INFORMATION_ADDRESS_HIGH     = 0x0000202B,
        XSS_EXIT_BITMAP                 = 0x0000202C,
        XSS_EXIT_BITMAP_HIGH            = 0x0000202D,
        ENCLS_EXITING_BITMAP            = 0x0000202E,
@@ -631,4 +634,13 @@ enum vmx_l1d_flush_state {
 
 extern enum vmx_l1d_flush_state l1tf_vmx_mitigation;
 
+struct vmx_ve_information {
+       u32 exit_reason;
+       u32 delivery;
+       u64 exit_qualification;
+       u64 guest_linear_address;
+       u64 guest_physical_address;
+       u16 eptp_index;
+};
+
 #endif
index 6780313914f86cef1cfad93f860afdd854632aee..d780eee9b6975ec34de898c53ba52e6fc995dffd 100644 (file)
@@ -6408,6 +6408,10 @@ void dump_vmcs(struct kvm_vcpu *vcpu)
        if (secondary_exec_control & SECONDARY_EXEC_ENABLE_VPID)
                pr_err("Virtual processor ID = 0x%04x\n",
                       vmcs_read16(VIRTUAL_PROCESSOR_ID));
+       if (secondary_exec_control & SECONDARY_EXEC_EPT_VIOLATION_VE) {
+               pr_err("VE info address = 0x%016llx\n",
+                      vmcs_read64(VE_INFORMATION_ADDRESS));
+       }
 }
 
 /*