Commit 52b6179ac87d33c2eeaff5292786a10fe98cff64
1 parent
63bcff2a30
Exists in
master
and in
20 other branches
x86, smap: Turn on Supervisor Mode Access Prevention
If Supervisor Mode Access Prevention is available and not disabled by the user, turn it on. Also fix the expansion of SMEP (Supervisor Mode Execution Prevention.) Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Link: http://lkml.kernel.org/r/1348256595-29119-10-git-send-email-hpa@linux.intel.com
Showing 2 changed files with 31 additions and 1 deletions Side-by-side Diff
Documentation/kernel-parameters.txt
... | ... | @@ -1812,8 +1812,12 @@ |
1812 | 1812 | noexec=on: enable non-executable mappings (default) |
1813 | 1813 | noexec=off: disable non-executable mappings |
1814 | 1814 | |
1815 | + nosmap [X86] | |
1816 | + Disable SMAP (Supervisor Mode Access Prevention) | |
1817 | + even if it is supported by processor. | |
1818 | + | |
1815 | 1819 | nosmep [X86] |
1816 | - Disable SMEP (Supervisor Mode Execution Protection) | |
1820 | + Disable SMEP (Supervisor Mode Execution Prevention) | |
1817 | 1821 | even if it is supported by processor. |
1818 | 1822 | |
1819 | 1823 | noexec32 [X86-64] |
arch/x86/kernel/cpu/common.c
... | ... | @@ -278,6 +278,31 @@ |
278 | 278 | } |
279 | 279 | } |
280 | 280 | |
281 | +static int disable_smap __cpuinitdata; | |
282 | +static __init int setup_disable_smap(char *arg) | |
283 | +{ | |
284 | + disable_smap = 1; | |
285 | + return 1; | |
286 | +} | |
287 | +__setup("nosmap", setup_disable_smap); | |
288 | + | |
289 | +static __cpuinit void setup_smap(struct cpuinfo_x86 *c) | |
290 | +{ | |
291 | + if (cpu_has(c, X86_FEATURE_SMAP)) { | |
292 | + if (unlikely(disable_smap)) { | |
293 | + setup_clear_cpu_cap(X86_FEATURE_SMAP); | |
294 | + clear_in_cr4(X86_CR4_SMAP); | |
295 | + } else { | |
296 | + set_in_cr4(X86_CR4_SMAP); | |
297 | + /* | |
298 | + * Don't use clac() here since alternatives | |
299 | + * haven't run yet... | |
300 | + */ | |
301 | + asm volatile(__stringify(__ASM_CLAC) ::: "memory"); | |
302 | + } | |
303 | + } | |
304 | +} | |
305 | + | |
281 | 306 | /* |
282 | 307 | * Some CPU features depend on higher CPUID levels, which may not always |
283 | 308 | * be available due to CPUID level capping or broken virtualization |
... | ... | @@ -713,6 +738,7 @@ |
713 | 738 | filter_cpuid_features(c, false); |
714 | 739 | |
715 | 740 | setup_smep(c); |
741 | + setup_smap(c); | |
716 | 742 | |
717 | 743 | if (this_cpu->c_bsp_init) |
718 | 744 | this_cpu->c_bsp_init(c); |