Commit c44c9ec0f38b939b3200436e3aa95c1aa83c41c7
1 parent
b75fe4e5b8
Exists in
master
and in
7 other branches
x86: split NX setup into separate file to limit unstack-protected code
Move the NX setup into a separate file so that it can be compiled without stack-protection while leaving the rest of the mm/init code protected. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Showing 4 changed files with 72 additions and 65 deletions Side-by-side Diff
arch/x86/include/asm/pgtable_types.h
arch/x86/mm/Makefile
1 | 1 | obj-y := init.o init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ |
2 | - pat.o pgtable.o physaddr.o gup.o | |
2 | + pat.o pgtable.o physaddr.o gup.o setup_nx.o | |
3 | 3 | |
4 | 4 | # Make sure __phys_addr has no stackprotector |
5 | 5 | nostackp := $(call cc-option, -fno-stack-protector) |
6 | 6 | CFLAGS_physaddr.o := $(nostackp) |
7 | -CFLAGS_init.o := $(nostackp) | |
7 | +CFLAGS_setup_nx.o := $(nostackp) | |
8 | 8 | |
9 | 9 | obj-$(CONFIG_SMP) += tlb.o |
10 | 10 |
arch/x86/mm/init.c
... | ... | @@ -28,69 +28,6 @@ |
28 | 28 | #endif |
29 | 29 | ; |
30 | 30 | |
31 | -int nx_enabled; | |
32 | - | |
33 | -#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) | |
34 | -static int disable_nx __cpuinitdata; | |
35 | - | |
36 | -/* | |
37 | - * noexec = on|off | |
38 | - * | |
39 | - * Control non-executable mappings for processes. | |
40 | - * | |
41 | - * on Enable | |
42 | - * off Disable | |
43 | - */ | |
44 | -static int __init noexec_setup(char *str) | |
45 | -{ | |
46 | - if (!str) | |
47 | - return -EINVAL; | |
48 | - if (!strncmp(str, "on", 2)) { | |
49 | - __supported_pte_mask |= _PAGE_NX; | |
50 | - disable_nx = 0; | |
51 | - } else if (!strncmp(str, "off", 3)) { | |
52 | - disable_nx = 1; | |
53 | - __supported_pte_mask &= ~_PAGE_NX; | |
54 | - } | |
55 | - return 0; | |
56 | -} | |
57 | -early_param("noexec", noexec_setup); | |
58 | -#endif | |
59 | - | |
60 | -#ifdef CONFIG_X86_PAE | |
61 | -static void __init set_nx(void) | |
62 | -{ | |
63 | - unsigned int v[4], l, h; | |
64 | - | |
65 | - if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) { | |
66 | - cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]); | |
67 | - | |
68 | - if ((v[3] & (1 << 20)) && !disable_nx) { | |
69 | - rdmsr(MSR_EFER, l, h); | |
70 | - l |= EFER_NX; | |
71 | - wrmsr(MSR_EFER, l, h); | |
72 | - nx_enabled = 1; | |
73 | - __supported_pte_mask |= _PAGE_NX; | |
74 | - } | |
75 | - } | |
76 | -} | |
77 | -#else | |
78 | -static inline void set_nx(void) | |
79 | -{ | |
80 | -} | |
81 | -#endif | |
82 | - | |
83 | -#ifdef CONFIG_X86_64 | |
84 | -void __cpuinit check_efer(void) | |
85 | -{ | |
86 | - unsigned long efer; | |
87 | - | |
88 | - rdmsrl(MSR_EFER, efer); | |
89 | - if (!(efer & EFER_NX) || disable_nx) | |
90 | - __supported_pte_mask &= ~_PAGE_NX; | |
91 | -} | |
92 | -#endif | |
93 | - | |
94 | 31 | static void __init find_early_table_space(unsigned long end, int use_pse, |
95 | 32 | int use_gbpages) |
96 | 33 | { |
arch/x86/mm/setup_nx.c
1 | +#include <linux/spinlock.h> | |
2 | +#include <linux/errno.h> | |
3 | +#include <linux/init.h> | |
4 | + | |
5 | +#include <asm/pgtable.h> | |
6 | + | |
7 | +int nx_enabled; | |
8 | + | |
9 | +#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) | |
10 | +static int disable_nx __cpuinitdata; | |
11 | + | |
12 | +/* | |
13 | + * noexec = on|off | |
14 | + * | |
15 | + * Control non-executable mappings for processes. | |
16 | + * | |
17 | + * on Enable | |
18 | + * off Disable | |
19 | + */ | |
20 | +static int __init noexec_setup(char *str) | |
21 | +{ | |
22 | + if (!str) | |
23 | + return -EINVAL; | |
24 | + if (!strncmp(str, "on", 2)) { | |
25 | + __supported_pte_mask |= _PAGE_NX; | |
26 | + disable_nx = 0; | |
27 | + } else if (!strncmp(str, "off", 3)) { | |
28 | + disable_nx = 1; | |
29 | + __supported_pte_mask &= ~_PAGE_NX; | |
30 | + } | |
31 | + return 0; | |
32 | +} | |
33 | +early_param("noexec", noexec_setup); | |
34 | +#endif | |
35 | + | |
36 | +#ifdef CONFIG_X86_PAE | |
37 | +void __init set_nx(void) | |
38 | +{ | |
39 | + unsigned int v[4], l, h; | |
40 | + | |
41 | + if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) { | |
42 | + cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]); | |
43 | + | |
44 | + if ((v[3] & (1 << 20)) && !disable_nx) { | |
45 | + rdmsr(MSR_EFER, l, h); | |
46 | + l |= EFER_NX; | |
47 | + wrmsr(MSR_EFER, l, h); | |
48 | + nx_enabled = 1; | |
49 | + __supported_pte_mask |= _PAGE_NX; | |
50 | + } | |
51 | + } | |
52 | +} | |
53 | +#else | |
54 | +void set_nx(void) | |
55 | +{ | |
56 | +} | |
57 | +#endif | |
58 | + | |
59 | +#ifdef CONFIG_X86_64 | |
60 | +void __cpuinit check_efer(void) | |
61 | +{ | |
62 | + unsigned long efer; | |
63 | + | |
64 | + rdmsrl(MSR_EFER, efer); | |
65 | + if (!(efer & EFER_NX) || disable_nx) | |
66 | + __supported_pte_mask &= ~_PAGE_NX; | |
67 | +} | |
68 | +#endif |