* [PATCH] x86: vmx: Fix "EPT violation - paging structure" test
@ 2020-03-21 5:05 Nadav Amit
2020-03-23 19:42 ` Nadav Amit
2020-03-31 17:01 ` Paolo Bonzini
0 siblings, 2 replies; 3+ messages in thread
From: Nadav Amit @ 2020-03-21 5:05 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kvm, Nadav Amit
Running the tests with more than 4GB of memory results in the following
failure:
FAIL: EPT violation - paging structure
It appears that the test mistakenly used get_ept_pte() to retrieve the
guest PTE, but this function is intended for accessing EPT and not the
guest page tables. Use get_pte_level() instead of get_ept_pte().
Tested on bare-metal only.
Signed-off-by: Nadav Amit <namit@vmware.com>
---
x86/vmx_tests.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index be5c952..1f97fe3 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -1312,12 +1312,14 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
u64 guest_cr3;
u32 insn_len;
u32 exit_qual;
- static unsigned long data_page1_pte, data_page1_pte_pte, memaddr_pte;
+ static unsigned long data_page1_pte, data_page1_pte_pte, memaddr_pte,
+ guest_pte_addr;
guest_rip = vmcs_read(GUEST_RIP);
guest_cr3 = vmcs_read(GUEST_CR3);
insn_len = vmcs_read(EXI_INST_LEN);
exit_qual = vmcs_read(EXI_QUALIFICATION);
+ pteval_t *ptep;
switch (exit_reason.basic) {
case VMX_VMCALL:
switch (vmx_get_test_stage()) {
@@ -1364,12 +1366,11 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
ept_sync(INVEPT_SINGLE, eptp);
break;
case 4:
- TEST_ASSERT(get_ept_pte(pml4, (unsigned long)data_page1,
- 2, &data_page1_pte));
- data_page1_pte &= PAGE_MASK;
- TEST_ASSERT(get_ept_pte(pml4, data_page1_pte,
- 2, &data_page1_pte_pte));
- set_ept_pte(pml4, data_page1_pte, 2,
+ ptep = get_pte_level((pgd_t *)guest_cr3, data_page1, /*level=*/2);
+ guest_pte_addr = virt_to_phys(ptep) & PAGE_MASK;
+
+ TEST_ASSERT(get_ept_pte(pml4, guest_pte_addr, 2, &data_page1_pte_pte));
+ set_ept_pte(pml4, guest_pte_addr, 2,
data_page1_pte_pte & ~EPT_PRESENT);
ept_sync(INVEPT_SINGLE, eptp);
break;
@@ -1437,7 +1438,7 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
(have_ad ? EPT_VLT_WR : 0) |
EPT_VLT_LADDR_VLD))
vmx_inc_test_stage();
- set_ept_pte(pml4, data_page1_pte, 2,
+ set_ept_pte(pml4, guest_pte_addr, 2,
data_page1_pte_pte | (EPT_PRESENT));
ept_sync(INVEPT_SINGLE, eptp);
break;
--
2.17.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] x86: vmx: Fix "EPT violation - paging structure" test
2020-03-21 5:05 [PATCH] x86: vmx: Fix "EPT violation - paging structure" test Nadav Amit
@ 2020-03-23 19:42 ` Nadav Amit
2020-03-31 17:01 ` Paolo Bonzini
1 sibling, 0 replies; 3+ messages in thread
From: Nadav Amit @ 2020-03-23 19:42 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kvm
I mistakenly forgot the kvm-unit-tests in the patch subject. Sorry for that.
> On Mar 20, 2020, at 10:05 PM, Nadav Amit <namit@vmware.com> wrote:
>
> Running the tests with more than 4GB of memory results in the following
> failure:
>
> FAIL: EPT violation - paging structure
>
> It appears that the test mistakenly used get_ept_pte() to retrieve the
> guest PTE, but this function is intended for accessing EPT and not the
> guest page tables. Use get_pte_level() instead of get_ept_pte().
>
> Tested on bare-metal only.
>
> Signed-off-by: Nadav Amit <namit@vmware.com>
> ---
> x86/vmx_tests.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
> index be5c952..1f97fe3 100644
> --- a/x86/vmx_tests.c
> +++ b/x86/vmx_tests.c
> @@ -1312,12 +1312,14 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
> u64 guest_cr3;
> u32 insn_len;
> u32 exit_qual;
> - static unsigned long data_page1_pte, data_page1_pte_pte, memaddr_pte;
> + static unsigned long data_page1_pte, data_page1_pte_pte, memaddr_pte,
> + guest_pte_addr;
>
> guest_rip = vmcs_read(GUEST_RIP);
> guest_cr3 = vmcs_read(GUEST_CR3);
> insn_len = vmcs_read(EXI_INST_LEN);
> exit_qual = vmcs_read(EXI_QUALIFICATION);
> + pteval_t *ptep;
> switch (exit_reason.basic) {
> case VMX_VMCALL:
> switch (vmx_get_test_stage()) {
> @@ -1364,12 +1366,11 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
> ept_sync(INVEPT_SINGLE, eptp);
> break;
> case 4:
> - TEST_ASSERT(get_ept_pte(pml4, (unsigned long)data_page1,
> - 2, &data_page1_pte));
> - data_page1_pte &= PAGE_MASK;
> - TEST_ASSERT(get_ept_pte(pml4, data_page1_pte,
> - 2, &data_page1_pte_pte));
> - set_ept_pte(pml4, data_page1_pte, 2,
> + ptep = get_pte_level((pgd_t *)guest_cr3, data_page1, /*level=*/2);
> + guest_pte_addr = virt_to_phys(ptep) & PAGE_MASK;
> +
> + TEST_ASSERT(get_ept_pte(pml4, guest_pte_addr, 2, &data_page1_pte_pte));
> + set_ept_pte(pml4, guest_pte_addr, 2,
> data_page1_pte_pte & ~EPT_PRESENT);
> ept_sync(INVEPT_SINGLE, eptp);
> break;
> @@ -1437,7 +1438,7 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
> (have_ad ? EPT_VLT_WR : 0) |
> EPT_VLT_LADDR_VLD))
> vmx_inc_test_stage();
> - set_ept_pte(pml4, data_page1_pte, 2,
> + set_ept_pte(pml4, guest_pte_addr, 2,
> data_page1_pte_pte | (EPT_PRESENT));
> ept_sync(INVEPT_SINGLE, eptp);
> break;
> —
> 2.17.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] x86: vmx: Fix "EPT violation - paging structure" test
2020-03-21 5:05 [PATCH] x86: vmx: Fix "EPT violation - paging structure" test Nadav Amit
2020-03-23 19:42 ` Nadav Amit
@ 2020-03-31 17:01 ` Paolo Bonzini
1 sibling, 0 replies; 3+ messages in thread
From: Paolo Bonzini @ 2020-03-31 17:01 UTC (permalink / raw)
To: Nadav Amit; +Cc: kvm
On 21/03/20 06:05, Nadav Amit wrote:
> Running the tests with more than 4GB of memory results in the following
> failure:
>
> FAIL: EPT violation - paging structure
>
> It appears that the test mistakenly used get_ept_pte() to retrieve the
> guest PTE, but this function is intended for accessing EPT and not the
> guest page tables. Use get_pte_level() instead of get_ept_pte().
>
> Tested on bare-metal only.
>
> Signed-off-by: Nadav Amit <namit@vmware.com>
> ---
> x86/vmx_tests.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
> index be5c952..1f97fe3 100644
> --- a/x86/vmx_tests.c
> +++ b/x86/vmx_tests.c
> @@ -1312,12 +1312,14 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
> u64 guest_cr3;
> u32 insn_len;
> u32 exit_qual;
> - static unsigned long data_page1_pte, data_page1_pte_pte, memaddr_pte;
> + static unsigned long data_page1_pte, data_page1_pte_pte, memaddr_pte,
> + guest_pte_addr;
>
> guest_rip = vmcs_read(GUEST_RIP);
> guest_cr3 = vmcs_read(GUEST_CR3);
> insn_len = vmcs_read(EXI_INST_LEN);
> exit_qual = vmcs_read(EXI_QUALIFICATION);
> + pteval_t *ptep;
> switch (exit_reason.basic) {
> case VMX_VMCALL:
> switch (vmx_get_test_stage()) {
> @@ -1364,12 +1366,11 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
> ept_sync(INVEPT_SINGLE, eptp);
> break;
> case 4:
> - TEST_ASSERT(get_ept_pte(pml4, (unsigned long)data_page1,
> - 2, &data_page1_pte));
> - data_page1_pte &= PAGE_MASK;
> - TEST_ASSERT(get_ept_pte(pml4, data_page1_pte,
> - 2, &data_page1_pte_pte));
> - set_ept_pte(pml4, data_page1_pte, 2,
> + ptep = get_pte_level((pgd_t *)guest_cr3, data_page1, /*level=*/2);
> + guest_pte_addr = virt_to_phys(ptep) & PAGE_MASK;
> +
> + TEST_ASSERT(get_ept_pte(pml4, guest_pte_addr, 2, &data_page1_pte_pte));
> + set_ept_pte(pml4, guest_pte_addr, 2,
> data_page1_pte_pte & ~EPT_PRESENT);
> ept_sync(INVEPT_SINGLE, eptp);
> break;
> @@ -1437,7 +1438,7 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
> (have_ad ? EPT_VLT_WR : 0) |
> EPT_VLT_LADDR_VLD))
> vmx_inc_test_stage();
> - set_ept_pte(pml4, data_page1_pte, 2,
> + set_ept_pte(pml4, guest_pte_addr, 2,
> data_page1_pte_pte | (EPT_PRESENT));
> ept_sync(INVEPT_SINGLE, eptp);
> break;
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-03-31 17:02 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-21 5:05 [PATCH] x86: vmx: Fix "EPT violation - paging structure" test Nadav Amit
2020-03-23 19:42 ` Nadav Amit
2020-03-31 17:01 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).