* [PATCH][kvm-unit-tests] nEPT: Fix test cases for 2M huge pages
@ 2013-10-23 13:38 Jan Kiszka
2013-10-28 13:10 ` Paolo Bonzini
0 siblings, 1 reply; 2+ messages in thread
From: Jan Kiszka @ 2013-10-23 13:38 UTC (permalink / raw)
To: Gleb Natapov, Paolo Bonzini
Cc: kvm, "李春奇 <Arthur Chunqi Li>"
If 2M pages are available with EPT, the test code creates its initial
identity map with such pages. But then it tries to remap two 4K pages in
that range which fails as their level 3 PTE is set up for huge pages.
Fix this up by ensuring that install_ept_entry always create non-large
page directory entries and by remapping the 2M area around those two
test pages in 4K chunks.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
x86/vmx.c | 3 ++-
x86/vmx.h | 3 ++-
x86/vmx_tests.c | 8 ++++++++
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/x86/vmx.c b/x86/vmx.c
index 9db4ef4..3e6fc37 100644
--- a/x86/vmx.c
+++ b/x86/vmx.c
@@ -173,7 +173,8 @@ void install_ept_entry(unsigned long *pml4,
memset(new_pt, 0, PAGE_SIZE);
pt[offset] = virt_to_phys(new_pt)
| EPT_RA | EPT_WA | EPT_EA;
- }
+ } else
+ pt[offset] &= ~EPT_LARGE_PAGE;
pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
}
offset = ((unsigned long)guest_addr >> ((level-1) *
diff --git a/x86/vmx.h b/x86/vmx.h
index dc1ebdf..7d967eb 100644
--- a/x86/vmx.h
+++ b/x86/vmx.h
@@ -485,7 +485,8 @@ enum Ctrl1 {
#define EPT_PAGE_LEVEL 4
#define EPT_PGDIR_WIDTH 9
#define EPT_PGDIR_MASK 511
-#define PAGE_MASK (~(PAGE_SIZE-1))
+#define PAGE_MASK (~(PAGE_SIZE-1))
+#define PAGE_MASK_2M (~(PAGE_SIZE_2M-1))
#define EPT_VLT_RD 1
#define EPT_VLT_WR (1 << 1)
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index 0759e10..a002a7a 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -915,6 +915,7 @@ static int setup_ept()
static void ept_init()
{
+ unsigned long base_addr1, base_addr2;
u32 ctrl_cpu[2];
init_fail = false;
@@ -934,6 +935,13 @@ static void ept_init()
memset(data_page2, 0x0, PAGE_SIZE);
*((u32 *)data_page1) = MAGIC_VAL_1;
*((u32 *)data_page2) = MAGIC_VAL_2;
+ base_addr1 = (unsigned long)data_page1 & PAGE_MASK_2M;
+ base_addr2 = (unsigned long)data_page2 & PAGE_MASK_2M;
+ if (setup_ept_range(pml4, base_addr1, base_addr1 + PAGE_SIZE_2M, 0, 0,
+ EPT_WA | EPT_RA | EPT_EA) ||
+ setup_ept_range(pml4, base_addr2, base_addr2 + PAGE_SIZE_2M, 0, 0,
+ EPT_WA | EPT_RA | EPT_EA))
+ init_fail = true;
install_ept(pml4, (unsigned long)data_page1, (unsigned long)data_page2,
EPT_RA | EPT_WA | EPT_EA);
}
--
1.8.1.1.298.ge7eed54
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH][kvm-unit-tests] nEPT: Fix test cases for 2M huge pages
2013-10-23 13:38 [PATCH][kvm-unit-tests] nEPT: Fix test cases for 2M huge pages Jan Kiszka
@ 2013-10-28 13:10 ` Paolo Bonzini
0 siblings, 0 replies; 2+ messages in thread
From: Paolo Bonzini @ 2013-10-28 13:10 UTC (permalink / raw)
To: Jan Kiszka
Cc: Gleb Natapov, kvm,
"李春奇 <Arthur Chunqi Li>"
Il 23/10/2013 15:38, Jan Kiszka ha scritto:
> If 2M pages are available with EPT, the test code creates its initial
> identity map with such pages. But then it tries to remap two 4K pages in
> that range which fails as their level 3 PTE is set up for huge pages.
>
> Fix this up by ensuring that install_ept_entry always create non-large
> page directory entries and by remapping the 2M area around those two
> test pages in 4K chunks.
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
> x86/vmx.c | 3 ++-
> x86/vmx.h | 3 ++-
> x86/vmx_tests.c | 8 ++++++++
> 3 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/x86/vmx.c b/x86/vmx.c
> index 9db4ef4..3e6fc37 100644
> --- a/x86/vmx.c
> +++ b/x86/vmx.c
> @@ -173,7 +173,8 @@ void install_ept_entry(unsigned long *pml4,
> memset(new_pt, 0, PAGE_SIZE);
> pt[offset] = virt_to_phys(new_pt)
> | EPT_RA | EPT_WA | EPT_EA;
> - }
> + } else
> + pt[offset] &= ~EPT_LARGE_PAGE;
> pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
> }
> offset = ((unsigned long)guest_addr >> ((level-1) *
> diff --git a/x86/vmx.h b/x86/vmx.h
> index dc1ebdf..7d967eb 100644
> --- a/x86/vmx.h
> +++ b/x86/vmx.h
> @@ -485,7 +485,8 @@ enum Ctrl1 {
> #define EPT_PAGE_LEVEL 4
> #define EPT_PGDIR_WIDTH 9
> #define EPT_PGDIR_MASK 511
> -#define PAGE_MASK (~(PAGE_SIZE-1))
> +#define PAGE_MASK (~(PAGE_SIZE-1))
> +#define PAGE_MASK_2M (~(PAGE_SIZE_2M-1))
>
> #define EPT_VLT_RD 1
> #define EPT_VLT_WR (1 << 1)
> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
> index 0759e10..a002a7a 100644
> --- a/x86/vmx_tests.c
> +++ b/x86/vmx_tests.c
> @@ -915,6 +915,7 @@ static int setup_ept()
>
> static void ept_init()
> {
> + unsigned long base_addr1, base_addr2;
> u32 ctrl_cpu[2];
>
> init_fail = false;
> @@ -934,6 +935,13 @@ static void ept_init()
> memset(data_page2, 0x0, PAGE_SIZE);
> *((u32 *)data_page1) = MAGIC_VAL_1;
> *((u32 *)data_page2) = MAGIC_VAL_2;
> + base_addr1 = (unsigned long)data_page1 & PAGE_MASK_2M;
> + base_addr2 = (unsigned long)data_page2 & PAGE_MASK_2M;
> + if (setup_ept_range(pml4, base_addr1, base_addr1 + PAGE_SIZE_2M, 0, 0,
> + EPT_WA | EPT_RA | EPT_EA) ||
> + setup_ept_range(pml4, base_addr2, base_addr2 + PAGE_SIZE_2M, 0, 0,
> + EPT_WA | EPT_RA | EPT_EA))
> + init_fail = true;
> install_ept(pml4, (unsigned long)data_page1, (unsigned long)data_page2,
> EPT_RA | EPT_WA | EPT_EA);
> }
>
Applied to kvm-unit-tests.git vmx.
Paolo
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-10-28 13:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-23 13:38 [PATCH][kvm-unit-tests] nEPT: Fix test cases for 2M huge pages Jan Kiszka
2013-10-28 13:10 ` 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).