2009-09-22 00:40:42 +04:00
# include <linux/spinlock.h>
# include <linux/errno.h>
# include <linux/init.h>
# include <asm/pgtable.h>
2009-11-14 02:28:16 +03:00
# include <asm/proto.h>
2009-09-22 00:40:42 +04:00
static int disable_nx __cpuinitdata ;
/*
* noexec = on | off
*
* Control non - executable mappings for processes .
*
* on Enable
* off Disable
*/
static int __init noexec_setup ( char * str )
{
if ( ! str )
return - EINVAL ;
if ( ! strncmp ( str , " on " , 2 ) ) {
disable_nx = 0 ;
} else if ( ! strncmp ( str , " off " , 3 ) ) {
disable_nx = 1 ;
}
2009-11-14 02:28:16 +03:00
x86_configure_nx ( ) ;
2009-09-22 00:40:42 +04:00
return 0 ;
}
early_param ( " noexec " , noexec_setup ) ;
2009-11-14 02:28:16 +03:00
void __cpuinit x86_configure_nx ( void )
2009-09-22 00:40:42 +04:00
{
2009-11-14 02:28:16 +03:00
if ( cpu_has_nx & & ! disable_nx )
__supported_pte_mask | = _PAGE_NX ;
else
2009-09-22 00:40:42 +04:00
__supported_pte_mask & = ~ _PAGE_NX ;
}
2009-11-14 02:28:17 +03:00
void __init x86_report_nx ( void )
{
if ( ! cpu_has_nx ) {
printk ( KERN_NOTICE " Notice: NX (Execute Disable) protection "
2010-11-10 21:35:54 +03:00
" missing in CPU! \n " ) ;
2009-11-14 02:28:17 +03:00
} else {
# if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
if ( disable_nx ) {
printk ( KERN_INFO " NX (Execute Disable) protection: "
" disabled by kernel command line option \n " ) ;
} else {
printk ( KERN_INFO " NX (Execute Disable) protection: "
" active \n " ) ;
}
# else
/* 32bit non-PAE kernel, NX cannot be used */
printk ( KERN_NOTICE " Notice: NX (Execute Disable) protection "
" cannot be enabled: non-PAE kernel! \n " ) ;
# endif
}
}