If ept_ad is not supported by the processor or has been turned off via kvm module param, test_ept_eptp() will incorrectly leave EPTP_AD_FLAG set in variable eptp causing the following failures of subsequent test_vmx_valid_controls calls: FAIL: Enable-EPT enabled; reserved bits [11:7] 0: vmlaunch succeeds FAIL: Enable-EPT enabled; reserved bits [63:N] 0: vmlaunch succeeds Use the saved EPTP to restore the EPTP after each sub-test instead of manually unwinding what was done by the sub-test, which is error prone and hard to follow. Signed-off-by: Cathy Avery <cavery@xxxxxxxxxx> --- x86/vmx_tests.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c index 617f9dd..1269829 100644 --- a/x86/vmx_tests.c +++ b/x86/vmx_tests.c @@ -4751,8 +4751,7 @@ static void test_ept_eptp(void) test_vmx_invalid_controls(); report_prefix_pop(); } - - eptp = (eptp & ~EPT_MEM_TYPE_MASK) | 6ul; + eptp = eptp_saved; /* * Page walk length (bits 5:3). Note, the value in VMCS.EPTP "is 1 @@ -4771,9 +4770,7 @@ static void test_ept_eptp(void) test_vmx_invalid_controls(); report_prefix_pop(); } - - eptp = (eptp & ~EPTP_PG_WALK_LEN_MASK) | - 3ul << EPTP_PG_WALK_LEN_SHIFT; + eptp = eptp_saved; /* * Accessed and dirty flag (bit 6) @@ -4793,6 +4790,7 @@ static void test_ept_eptp(void) eptp |= EPTP_AD_FLAG; test_eptp_ad_bit(eptp, false); } + eptp = eptp_saved; /* * Reserved bits [11:7] and [63:N] @@ -4811,8 +4809,7 @@ static void test_ept_eptp(void) test_vmx_invalid_controls(); report_prefix_pop(); } - - eptp = (eptp & ~(EPTP_RESERV_BITS_MASK << EPTP_RESERV_BITS_SHIFT)); + eptp = eptp_saved; maxphysaddr = cpuid_maxphyaddr(); for (i = 0; i < (63 - maxphysaddr + 1); i++) { @@ -4831,6 +4828,7 @@ static void test_ept_eptp(void) test_vmx_invalid_controls(); report_prefix_pop(); } + eptp = eptp_saved; secondary &= ~(CPU_EPT | CPU_URG); vmcs_write(CPU_EXEC_CTRL1, secondary); -- 2.31.1