aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKees Cook <kees.cook@canonical.com>2009-11-13 18:28:17 -0500
committerH. Peter Anvin <hpa@zytor.com>2009-11-16 16:44:59 -0500
commit4b0f3b81eb33ef18283aa71440cccfede1753ae0 (patch)
tree024e05ffc845d0942dddeb8f0b760815ab0b3373
parent4763ed4d45522b876c97e1f7f4b659d211f75571 (diff)
x86, mm: Report state of NX protections during boot
It is possible for x86_64 systems to lack the NX bit either due to the hardware lacking support or the BIOS having turned off the CPU capability, so NX status should be reported. Additionally, anyone booting NX-capable CPUs in 32bit mode without PAE will lack NX functionality, so this change provides feedback for that case as well. Signed-off-by: Kees Cook <kees.cook@canonical.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com> LKML-Reference: <1258154897-6770-6-git-send-email-hpa@zytor.com>
-rw-r--r--arch/x86/include/asm/proto.h1
-rw-r--r--arch/x86/kernel/setup.c11
-rw-r--r--arch/x86/mm/init.c4
-rw-r--r--arch/x86/mm/setup_nx.c22
4 files changed, 29 insertions, 9 deletions
diff --git a/arch/x86/include/asm/proto.h b/arch/x86/include/asm/proto.h
index add7f18f17a7..450c56bcd4f8 100644
--- a/arch/x86/include/asm/proto.h
+++ b/arch/x86/include/asm/proto.h
@@ -17,6 +17,7 @@ extern void ia32_sysenter_target(void);
17extern void syscall32_cpu_init(void); 17extern void syscall32_cpu_init(void);
18 18
19extern void x86_configure_nx(void); 19extern void x86_configure_nx(void);
20extern void x86_report_nx(void);
20 21
21extern int reboot_force; 22extern int reboot_force;
22 23
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 23b7f46bf843..d2043a00abc1 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -788,16 +788,17 @@ void __init setup_arch(char **cmdline_p)
788 *cmdline_p = command_line; 788 *cmdline_p = command_line;
789 789
790 /* 790 /*
791 * Must call this twice: Once just to detect whether hardware doesn't 791 * x86_configure_nx() is called before parse_early_param() to detect
792 * support NX (so that the early EHCI debug console setup can safely 792 * whether hardware doesn't support NX (so that the early EHCI debug
793 * call set_fixmap(), and then again after parsing early parameters to 793 * console setup can safely call set_fixmap()). It may then be called
794 * honor the respective command line option. 794 * again from within noexec_setup() during parsing early parameters
795 * to honor the respective command line option.
795 */ 796 */
796 x86_configure_nx(); 797 x86_configure_nx();
797 798
798 parse_early_param(); 799 parse_early_param();
799 800
800 x86_configure_nx(); 801 x86_report_nx();
801 802
802 /* Must be before kernel pagetables are setup */ 803 /* Must be before kernel pagetables are setup */
803 vmi_activate(); 804 vmi_activate();
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index 27ec2c23fd47..d406c5239019 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -146,10 +146,6 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
146 use_gbpages = direct_gbpages; 146 use_gbpages = direct_gbpages;
147#endif 147#endif
148 148
149 /* XXX: replace this with Kees' improved messages */
150 if (__supported_pte_mask & _PAGE_NX)
151 printk(KERN_INFO "NX (Execute Disable) protection: active\n");
152
153 /* Enable PSE if available */ 149 /* Enable PSE if available */
154 if (cpu_has_pse) 150 if (cpu_has_pse)
155 set_in_cr4(X86_CR4_PSE); 151 set_in_cr4(X86_CR4_PSE);
diff --git a/arch/x86/mm/setup_nx.c b/arch/x86/mm/setup_nx.c
index 355818b087b5..a3250aa34086 100644
--- a/arch/x86/mm/setup_nx.c
+++ b/arch/x86/mm/setup_nx.c
@@ -36,3 +36,25 @@ void __cpuinit x86_configure_nx(void)
36 else 36 else
37 __supported_pte_mask &= ~_PAGE_NX; 37 __supported_pte_mask &= ~_PAGE_NX;
38} 38}
39
40void __init x86_report_nx(void)
41{
42 if (!cpu_has_nx) {
43 printk(KERN_NOTICE "Notice: NX (Execute Disable) protection "
44 "missing in CPU or disabled in BIOS!\n");
45 } else {
46#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
47 if (disable_nx) {
48 printk(KERN_INFO "NX (Execute Disable) protection: "
49 "disabled by kernel command line option\n");
50 } else {
51 printk(KERN_INFO "NX (Execute Disable) protection: "
52 "active\n");
53 }
54#else
55 /* 32bit non-PAE kernel, NX cannot be used */
56 printk(KERN_NOTICE "Notice: NX (Execute Disable) protection "
57 "cannot be enabled: non-PAE kernel!\n");
58#endif
59 }
60}