Migrate to new vmx.h's EPT defs for access and dirty bits, which makes it easier to grok from one code base to another. No functional change intended. Signed-off-by: Jon Kohler --- x86/vmx.c | 20 +++++++++++--------- x86/vmx.h | 3 --- x86/vmx_tests.c | 43 ++++++++++++++++++++++++------------------- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index 6b7dca34..a3c6c60b 100644 --- a/x86/vmx.c +++ b/x86/vmx.c @@ -986,7 +986,7 @@ static void clear_ept_ad_pte(unsigned long *pml4, unsigned long guest_addr) for (l = EPT_PAGE_LEVEL; ; --l) { offset = (guest_addr >> EPT_LEVEL_SHIFT(l)) & EPT_PGDIR_MASK; - pt[offset] &= ~(EPT_ACCESS_FLAG|EPT_DIRTY_FLAG); + pt[offset] &= ~(VMX_EPT_ACCESS_BIT | VMX_EPT_DIRTY_BIT); pte = pt[offset]; if (l == 1 || (l < 4 && (pte & EPT_LARGE_PAGE))) break; @@ -1043,12 +1043,14 @@ void check_ept_ad(unsigned long *pml4, u64 guest_cr3, } if (!bad_pt_ad) { - bad_pt_ad |= (ept_pte & (EPT_ACCESS_FLAG|EPT_DIRTY_FLAG)) != expected_pt_ad; + bad_pt_ad |= + (ept_pte & (VMX_EPT_ACCESS_BIT | VMX_EPT_DIRTY_BIT)) != + expected_pt_ad; if (bad_pt_ad) report_fail("EPT - guest level %d page table A=%d/D=%d", l, - !!(expected_pt_ad & EPT_ACCESS_FLAG), - !!(expected_pt_ad & EPT_DIRTY_FLAG)); + !!(expected_pt_ad & VMX_EPT_ACCESS_BIT), + !!(expected_pt_ad & VMX_EPT_DIRTY_BIT)); } pte = pt[offset]; @@ -1061,8 +1063,8 @@ void check_ept_ad(unsigned long *pml4, u64 guest_cr3, if (!bad_pt_ad) report_pass("EPT - guest page table structures A=%d/D=%d", - !!(expected_pt_ad & EPT_ACCESS_FLAG), - !!(expected_pt_ad & EPT_DIRTY_FLAG)); + !!(expected_pt_ad & VMX_EPT_ACCESS_BIT), + !!(expected_pt_ad & VMX_EPT_DIRTY_BIT)); offset = (guest_addr >> EPT_LEVEL_SHIFT(l)) & EPT_PGDIR_MASK; offset_in_page = guest_addr & ((1 << EPT_LEVEL_SHIFT(l)) - 1); @@ -1072,10 +1074,10 @@ void check_ept_ad(unsigned long *pml4, u64 guest_cr3, report_fail("EPT - guest physical address is not mapped"); return; } - report((ept_pte & (EPT_ACCESS_FLAG | EPT_DIRTY_FLAG)) == expected_gpa_ad, + report((ept_pte & (VMX_EPT_ACCESS_BIT | VMX_EPT_DIRTY_BIT)) == expected_gpa_ad, "EPT - guest physical address A=%d/D=%d", - !!(expected_gpa_ad & EPT_ACCESS_FLAG), - !!(expected_gpa_ad & EPT_DIRTY_FLAG)); + !!(expected_gpa_ad & VMX_EPT_ACCESS_BIT), + !!(expected_gpa_ad & VMX_EPT_DIRTY_BIT)); } void set_ept_pte(unsigned long *pml4, unsigned long guest_addr, diff --git a/x86/vmx.h b/x86/vmx.h index 3f792d4a..65012e0e 100644 --- a/x86/vmx.h +++ b/x86/vmx.h @@ -570,7 +570,6 @@ enum Intr_type { #define EPTP_PG_WALK_LEN_MASK 0x38ul #define EPTP_RESERV_BITS_MASK 0x1ful #define EPTP_RESERV_BITS_SHIFT 0x7ul -#define EPTP_AD_FLAG (1ul << 6) #define EPT_MEM_TYPE_UC 0ul #define EPT_MEM_TYPE_WC 1ul @@ -578,8 +577,6 @@ enum Intr_type { #define EPT_MEM_TYPE_WP 5ul #define EPT_MEM_TYPE_WB 6ul -#define EPT_ACCESS_FLAG (1ul << 8) -#define EPT_DIRTY_FLAG (1ul << 9) #define EPT_LARGE_PAGE (1ul << 7) #define EPT_MEM_TYPE_SHIFT 3ul #define EPT_MEM_TYPE_MASK 0x7ul diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c index eda9e88a..f7ea411f 100644 --- a/x86/vmx_tests.c +++ b/x86/vmx_tests.c @@ -1066,7 +1066,7 @@ static int __setup_ept(u64 hpa, bool enable_ad) eptp |= (3 << EPTP_PG_WALK_LEN_SHIFT); eptp |= hpa; if (enable_ad) - eptp |= EPTP_AD_FLAG; + eptp |= VMX_EPTP_AD_ENABLE_BIT; vmcs_write(EPTP, eptp); vmcs_write(CPU_EXEC_CTRL0, vmcs_read(CPU_EXEC_CTRL0)| CPU_SECONDARY); @@ -1141,19 +1141,19 @@ static int enable_unrestricted_guest(bool need_valid_ept) static void ept_enable_ad_bits(void) { - eptp |= EPTP_AD_FLAG; + eptp |= VMX_EPTP_AD_ENABLE_BIT; vmcs_write(EPTP, eptp); } static void ept_disable_ad_bits(void) { - eptp &= ~EPTP_AD_FLAG; + eptp &= ~VMX_EPTP_AD_ENABLE_BIT; vmcs_write(EPTP, eptp); } static int ept_ad_enabled(void) { - return eptp & EPTP_AD_FLAG; + return eptp & VMX_EPTP_AD_ENABLE_BIT; } static void ept_enable_ad_bits_or_skip_test(void) @@ -1350,12 +1350,15 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad) case 0: check_ept_ad(pml4, guest_cr3, (unsigned long)data_page1, - have_ad ? EPT_ACCESS_FLAG : 0, - have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0); + have_ad ? VMX_EPT_ACCESS_BIT : 0, + have_ad ? VMX_EPT_ACCESS_BIT | + VMX_EPT_DIRTY_BIT : 0); check_ept_ad(pml4, guest_cr3, (unsigned long)data_page2, - have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0, - have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0); + have_ad ? VMX_EPT_ACCESS_BIT | + VMX_EPT_DIRTY_BIT : 0, + have_ad ? VMX_EPT_ACCESS_BIT | + VMX_EPT_DIRTY_BIT : 0); clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page1); clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page2); if (have_ad) @@ -1451,7 +1454,8 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad) switch(vmx_get_test_stage()) { case 3: check_ept_ad(pml4, guest_cr3, (unsigned long)data_page1, 0, - have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0); + have_ad ? VMX_EPT_ACCESS_BIT | + VMX_EPT_DIRTY_BIT : 0); clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page1); if (exit_qual == (EPT_VIOLATION_ACC_WRITE | EPT_VIOLATION_GVA_IS_VALID | @@ -1463,7 +1467,8 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad) break; case 4: check_ept_ad(pml4, guest_cr3, (unsigned long)data_page1, 0, - have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0); + have_ad ? VMX_EPT_ACCESS_BIT | + VMX_EPT_DIRTY_BIT : 0); clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page1); if (exit_qual == (EPT_VIOLATION_ACC_READ | (have_ad ? EPT_VIOLATION_ACC_WRITE : 0) | @@ -2517,11 +2522,11 @@ static void ept_access_paddr(unsigned long ept_access, unsigned long pte_ad, if (ept_ad_enabled()) { for (i = EPT_PAGE_LEVEL; i > 0; i--) { TEST_ASSERT(get_ept_pte(pml4, gpa, i, &epte)); - TEST_ASSERT(epte & EPT_ACCESS_FLAG); + TEST_ASSERT(epte & VMX_EPT_ACCESS_BIT); if (i == 1) - TEST_ASSERT(epte & EPT_DIRTY_FLAG); + TEST_ASSERT(epte & VMX_EPT_DIRTY_BIT); else - TEST_ASSERT_EQ(epte & EPT_DIRTY_FLAG, 0); + TEST_ASSERT_EQ(epte & VMX_EPT_DIRTY_BIT, 0); } } @@ -4783,7 +4788,7 @@ static void test_eptp_ad_bit(u64 eptp, bool is_ctrl_valid) { vmcs_write(EPTP, eptp); report_prefix_pushf("Enable-EPT enabled; EPT accessed and dirty flag %s", - (eptp & EPTP_AD_FLAG) ? "1": "0"); + (eptp & VMX_EPTP_AD_ENABLE_BIT) ? "1" : "0"); if (is_ctrl_valid) test_vmx_valid_controls(); else @@ -4872,20 +4877,20 @@ static void test_ept_eptp(void) */ if (ept_ad_bits_supported()) { report_info("Processor supports accessed and dirty flag"); - eptp &= ~EPTP_AD_FLAG; + eptp &= ~VMX_EPTP_AD_ENABLE_BIT; test_eptp_ad_bit(eptp, true); - eptp |= EPTP_AD_FLAG; + eptp |= VMX_EPTP_AD_ENABLE_BIT; test_eptp_ad_bit(eptp, true); } else { report_info("Processor does not supports accessed and dirty flag"); - eptp &= ~EPTP_AD_FLAG; + eptp &= ~VMX_EPTP_AD_ENABLE_BIT; test_eptp_ad_bit(eptp, true); - eptp |= EPTP_AD_FLAG; + eptp |= VMX_EPTP_AD_ENABLE_BIT; test_eptp_ad_bit(eptp, false); - eptp &= ~EPTP_AD_FLAG; + eptp &= ~VMX_EPTP_AD_ENABLE_BIT; } /* -- 2.43.0