__supported_pte_mask has not been correctly configured at this point
and Xen prevents us from using the NX bit if the hardware does not
support it. Some BIOSes seem to offer the option to disable NX.
Signed-off-by: Ian Campbell <ian.campbell(a)citrix.com>
Cc: Mark McLoughlin <markmc(a)redhat.com>
Cc: Jon Swanson <jswanson(a)valuecommerce.co.jp>
Cc: fedora-virt(a)redhat.com
Cc: Jeremy Fitzhardinge <jeremy(a)goop.org>
Cc: Ingo Molnar <mingo(a)elte.hu>
---
arch/x86/xen/enlighten.c | 24 +++++++++++++-----------
1 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index bea2152..e705bdf 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -53,6 +53,8 @@
#include "mmu.h"
#include "multicalls.h"
+#define _KERNPG_TABLE_RO __pgprot(_KERNPG_TABLE & ~_PAGE_RW)
+
EXPORT_SYMBOL_GPL(hypercall_page);
DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu);
@@ -1487,9 +1489,9 @@ static __init void xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn)
}
for (pteidx = 0; pteidx < ident_pte; pteidx += PTRS_PER_PTE)
- set_page_prot(&level1_ident_pgt[pteidx], PAGE_KERNEL_RO);
+ set_page_prot(&level1_ident_pgt[pteidx], _KERNPG_TABLE_RO);
- set_page_prot(pmd, PAGE_KERNEL_RO);
+ set_page_prot(pmd, _KERNPG_TABLE_RO);
}
#ifdef CONFIG_X86_64
@@ -1543,12 +1545,12 @@ static __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd,
xen_map_identity_early(level2_ident_pgt, max_pfn);
/* Make pagetable pieces RO */
- set_page_prot(init_level4_pgt, PAGE_KERNEL_RO);
- set_page_prot(level3_ident_pgt, PAGE_KERNEL_RO);
- set_page_prot(level3_kernel_pgt, PAGE_KERNEL_RO);
- set_page_prot(level3_user_vsyscall, PAGE_KERNEL_RO);
- set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO);
- set_page_prot(level2_fixmap_pgt, PAGE_KERNEL_RO);
+ set_page_prot(init_level4_pgt, _KERNPG_TABLE_RO);
+ set_page_prot(level3_ident_pgt, _KERNPG_TABLE_RO);
+ set_page_prot(level3_kernel_pgt, _KERNPG_TABLE_RO);
+ set_page_prot(level3_user_vsyscall, _KERNPG_TABLE_RO);
+ set_page_prot(level2_kernel_pgt, _KERNPG_TABLE_RO);
+ set_page_prot(level2_fixmap_pgt, _KERNPG_TABLE_RO);
/* Pin down new L4 */
pin_pagetable_pfn(MMUEXT_PIN_L4_TABLE,
@@ -1597,9 +1599,9 @@ static __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd,
set_pgd(&swapper_pg_dir[KERNEL_PGD_BOUNDARY],
__pgd(__pa(level2_kernel_pgt) | _PAGE_PRESENT));
- set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO);
- set_page_prot(swapper_pg_dir, PAGE_KERNEL_RO);
- set_page_prot(empty_zero_page, PAGE_KERNEL_RO);
+ set_page_prot(level2_kernel_pgt, _KERNPG_TABLE_RO);
+ set_page_prot(swapper_pg_dir, _KERNPG_TABLE_RO);
+ set_page_prot(empty_zero_page, _KERNPG_TABLE_RO);
pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, PFN_DOWN(__pa(pgd)));
--
1.5.6.5