x86/mm/32: Set NX in __supported_pte_mask before enabling paging
authorAndy Lutomirski <luto@kernel.org>
Tue, 19 Jan 2016 21:38:58 +0000 (13:38 -0800)
committerIngo Molnar <mingo@kernel.org>
Wed, 20 Jan 2016 10:39:14 +0000 (11:39 +0100)
There's a short window in which very early mappings can end up
with NX clear because they are created before we've noticed that
we have NX.

It turns out that we detect NX very early, so there's no need to
defer __supported_pte_mask setup.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephen Smalley <sds@tycho.nsa.gov>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/2b544627345f7110160545a3f47031eb45c3ad4f.1453239349.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/head_32.S
arch/x86/mm/setup_nx.c

index 6bc9ae24b6d2a74930701c0c6ea60fe090a3ebbc..57fc3f8c85fdfe64e0b6a22ab74c9c472c8a652c 100644 (file)
@@ -389,6 +389,12 @@ default_entry:
        /* Make changes effective */
        wrmsr
 
+       /*
+        * And make sure that all the mappings we set up have NX set from
+        * the beginning.
+        */
+       orl $(1 << (_PAGE_BIT_NX - 32)), pa(__supported_pte_mask + 4)
+
 enable_paging:
 
 /*
index 92e2eacb33216821e8b18821834c7ce972571f29..78f5d5907f98cb92946e16e64ea5fef7fd37dece 100644 (file)
@@ -31,9 +31,8 @@ early_param("noexec", noexec_setup);
 
 void x86_configure_nx(void)
 {
-       if (boot_cpu_has(X86_FEATURE_NX) && !disable_nx)
-               __supported_pte_mask |= _PAGE_NX;
-       else
+       /* If disable_nx is set, clear NX on all new mappings going forward. */
+       if (disable_nx)
                __supported_pte_mask &= ~_PAGE_NX;
 }