diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index d18c41d752f349cfb37463973559833ed1073ab1..cbe8e9223bee9fa9d40759a5c3ad02b0e7a08a3c 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -130,8 +130,13 @@ static int split_large_page(pte_t *kpte, unsigned long address) set_pte(&pbase[i], pfn_pte(addr >> PAGE_SHIFT, ref_prot)); /* - * Install the new, split up pagetable: + * Install the new, split up pagetable. Important detail here: + * + * On Intel the NX bit of all levels must be cleared to make a + * page executable. See section 4.13.2 of Intel 64 and IA-32 + * Architectures Software Developer's Manual). */ + ref_prot = pte_pgprot(pte_mkexec(pte_clrhuge(*kpte))); __set_pmd_pte(kpte, address, mk_pte(base, ref_prot)); base = NULL;