x86: setup_smep needs to be __cpuinit
The setup_smep function gets calle at resume time too, and is thus not a pure __init function. When marked as __init, it gets thrown out after the kernel has initialized, and when the kernel is suspended and resumed, the code will no longer be around, and we'll get a nice "kernel tried to execute NX-protected page" oops because the page is no longer marked executable. Reported-and-tested-by: Parag Warudkar <parag.lkml@gmail.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: "H. Peter Anvin" <hpa@linux.intel.com> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@@ -254,7 +254,7 @@ static inline void squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int disable_smep __initdata;
|
static int disable_smep __cpuinitdata;
|
||||||
static __init int setup_disable_smep(char *arg)
|
static __init int setup_disable_smep(char *arg)
|
||||||
{
|
{
|
||||||
disable_smep = 1;
|
disable_smep = 1;
|
||||||
@@ -262,7 +262,7 @@ static __init int setup_disable_smep(char *arg)
|
|||||||
}
|
}
|
||||||
__setup("nosmep", setup_disable_smep);
|
__setup("nosmep", setup_disable_smep);
|
||||||
|
|
||||||
static __init void setup_smep(struct cpuinfo_x86 *c)
|
static __cpuinit void setup_smep(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
if (cpu_has(c, X86_FEATURE_SMEP)) {
|
if (cpu_has(c, X86_FEATURE_SMEP)) {
|
||||||
if (unlikely(disable_smep)) {
|
if (unlikely(disable_smep)) {
|
||||||
|
Reference in New Issue
Block a user