Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Revert "x86/mm/32: Set NX in __supported_pte_mask before enabling paging"

This reverts commit 320d25b6a05f8b73c23fc21025d2906ecdd2d4fc.

This change was problematic for a couple of reasons:

1. It missed a some entry points (Xen things and 64-bit native).

2. The entry it changed can be executed more than once. This isn't
really a problem, but it conflated per-cpu state setup and global
state setup.

3. It broke 64-bit non-NX. 64-bit non-NX worked the other way around from
32-bit -- __supported_pte_mask had NX set initially and was *cleared*
in x86_configure_nx. With the patch applied, it never got cleared.

Reported-and-tested-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
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: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/59bd15f7f4b56b633a611b7f70876c6d2ad01a98.1461685884.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Andy Lutomirski and committed by
Ingo Molnar
e16d8a6c 707e59ba

+3 -8
-6
arch/x86/kernel/head_32.S
··· 389 389 /* Make changes effective */ 390 390 wrmsr 391 391 392 - /* 393 - * And make sure that all the mappings we set up have NX set from 394 - * the beginning. 395 - */ 396 - orl $(1 << (_PAGE_BIT_NX - 32)), pa(__supported_pte_mask + 4) 397 - 398 392 enable_paging: 399 393 400 394 /*
+3 -2
arch/x86/mm/setup_nx.c
··· 32 32 33 33 void x86_configure_nx(void) 34 34 { 35 - /* If disable_nx is set, clear NX on all new mappings going forward. */ 36 - if (disable_nx) 35 + if (boot_cpu_has(X86_FEATURE_NX) && !disable_nx) 36 + __supported_pte_mask |= _PAGE_NX; 37 + else 37 38 __supported_pte_mask &= ~_PAGE_NX; 38 39 } 39 40