Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : #include <linux/spinlock.h> 3 : : #include <linux/errno.h> 4 : : #include <linux/init.h> 5 : : 6 : : #include <asm/pgtable.h> 7 : : #include <asm/proto.h> 8 : : #include <asm/cpufeature.h> 9 : : 10 : : static int disable_nx; 11 : : 12 : : /* 13 : : * noexec = on|off 14 : : * 15 : : * Control non-executable mappings for processes. 16 : : * 17 : : * on Enable 18 : : * off Disable 19 : : */ 20 : 0 : static int __init noexec_setup(char *str) 21 : : { 22 [ # # ]: 0 : if (!str) 23 : : return -EINVAL; 24 [ # # ]: 0 : if (!strncmp(str, "on", 2)) { 25 : 0 : disable_nx = 0; 26 [ # # ]: 0 : } else if (!strncmp(str, "off", 3)) { 27 : 0 : disable_nx = 1; 28 : : } 29 : 0 : x86_configure_nx(); 30 : 0 : return 0; 31 : : } 32 : : early_param("noexec", noexec_setup); 33 : : 34 : 78 : void x86_configure_nx(void) 35 : : { 36 [ + - + - ]: 78 : if (boot_cpu_has(X86_FEATURE_NX) && !disable_nx) 37 : 78 : __supported_pte_mask |= _PAGE_NX; 38 : : else 39 : 0 : __supported_pte_mask &= ~_PAGE_NX; 40 : 78 : } 41 : : 42 : 78 : void __init x86_report_nx(void) 43 : : { 44 [ - + ]: 78 : if (!boot_cpu_has(X86_FEATURE_NX)) { 45 : 0 : printk(KERN_NOTICE "Notice: NX (Execute Disable) protection " 46 : : "missing in CPU!\n"); 47 : : } else { 48 : : #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) 49 [ - + ]: 78 : if (disable_nx) { 50 : 0 : printk(KERN_INFO "NX (Execute Disable) protection: " 51 : : "disabled by kernel command line option\n"); 52 : : } else { 53 : 78 : printk(KERN_INFO "NX (Execute Disable) protection: " 54 : : "active\n"); 55 : : } 56 : : #else 57 : : /* 32bit non-PAE kernel, NX cannot be used */ 58 : : printk(KERN_NOTICE "Notice: NX (Execute Disable) protection " 59 : : "cannot be enabled: non-PAE kernel!\n"); 60 : : #endif 61 : : } 62 : 78 : }