aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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}