| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 1 | #include <linux/spinlock.h> | 
 | 2 | #include <linux/errno.h> | 
 | 3 | #include <linux/init.h> | 
 | 4 |  | 
 | 5 | #include <asm/pgtable.h> | 
| H. Peter Anvin | 4763ed4 | 2009-11-13 15:28:16 -0800 | [diff] [blame] | 6 | #include <asm/proto.h> | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 7 |  | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 8 | static int disable_nx __cpuinitdata; | 
 | 9 |  | 
 | 10 | /* | 
 | 11 |  * noexec = on|off | 
 | 12 |  * | 
 | 13 |  * Control non-executable mappings for processes. | 
 | 14 |  * | 
 | 15 |  * on      Enable | 
 | 16 |  * off     Disable | 
 | 17 |  */ | 
 | 18 | static int __init noexec_setup(char *str) | 
 | 19 | { | 
 | 20 | 	if (!str) | 
 | 21 | 		return -EINVAL; | 
 | 22 | 	if (!strncmp(str, "on", 2)) { | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 23 | 		disable_nx = 0; | 
 | 24 | 	} else if (!strncmp(str, "off", 3)) { | 
 | 25 | 		disable_nx = 1; | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 26 | 	} | 
| H. Peter Anvin | 4763ed4 | 2009-11-13 15:28:16 -0800 | [diff] [blame] | 27 | 	x86_configure_nx(); | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 28 | 	return 0; | 
 | 29 | } | 
 | 30 | early_param("noexec", noexec_setup); | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 31 |  | 
| H. Peter Anvin | 4763ed4 | 2009-11-13 15:28:16 -0800 | [diff] [blame] | 32 | void __cpuinit x86_configure_nx(void) | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 33 | { | 
| H. Peter Anvin | 4763ed4 | 2009-11-13 15:28:16 -0800 | [diff] [blame] | 34 | 	if (cpu_has_nx && !disable_nx) | 
 | 35 | 		__supported_pte_mask |= _PAGE_NX; | 
 | 36 | 	else | 
| Jeremy Fitzhardinge | c44c9ec | 2009-09-21 13:40:42 -0700 | [diff] [blame] | 37 | 		__supported_pte_mask &= ~_PAGE_NX; | 
 | 38 | } | 
| Kees Cook | 4b0f3b8 | 2009-11-13 15:28:17 -0800 | [diff] [blame] | 39 |  | 
 | 40 | void __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 | } |