Browse Source

x86: clean up differences between 64-bit and 32-bit

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Ingo Molnar 17 years ago
parent
commit
674d67269e
1 changed files with 11 additions and 5 deletions
  1. 11 5
      arch/x86/mm/pageattr_64.c

+ 11 - 5
arch/x86/mm/pageattr_64.c

@@ -126,30 +126,36 @@ out_unlock:
 static int
 __change_page_attr(unsigned long address, struct page *page, pgprot_t prot)
 {
-	pgprot_t ref_prot2, oldprot;
 	struct page *kpte_page;
 	int level, err = 0;
 	pte_t *kpte;
 
+	BUG_ON(PageHighMem(page));
+
 repeat:
 	kpte = lookup_address(address, &level);
 	if (!kpte)
 		return 0;
 
 	kpte_page = virt_to_page(kpte);
-	oldprot = pte_pgprot(*kpte);
 	BUG_ON(PageLRU(kpte_page));
 	BUG_ON(PageCompound(kpte_page));
-	prot = canon_pgprot(prot);
+
+	/*
+	 * Better fail early if someone sets the kernel text to NX.
+	 * Does not cover __inittext
+	 */
+	BUG_ON(address >= (unsigned long)&_text &&
+		address < (unsigned long)&_etext &&
+	       (pgprot_val(prot) & _PAGE_NX));
 
 	if (level == 4) {
-		set_pte_atomic(kpte, mk_pte(page, prot));
+		set_pte_atomic(kpte, mk_pte(page, canon_pgprot(prot)));
 	} else {
 		err = split_large_page(kpte, address);
 		if (!err)
 			goto repeat;
 	}
-
 	return err;
 }