diff options
Diffstat (limited to 'arch/i386/kernel/sysenter.c')
| -rw-r--r-- | arch/i386/kernel/sysenter.c | 12 | 
1 files changed, 7 insertions, 5 deletions
| diff --git a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c index 960d8bd137d0..0bada1870bdf 100644 --- a/arch/i386/kernel/sysenter.c +++ b/arch/i386/kernel/sysenter.c @@ -21,11 +21,16 @@  extern asmlinkage void sysenter_entry(void); -void enable_sep_cpu(void *info) +void enable_sep_cpu(void)  {  	int cpu = get_cpu();  	struct tss_struct *tss = &per_cpu(init_tss, cpu); +	if (!boot_cpu_has(X86_FEATURE_SEP)) { +		put_cpu(); +		return; +	} +  	tss->ss1 = __KERNEL_CS;  	tss->esp1 = sizeof(struct tss_struct) + (unsigned long) tss;  	wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); @@ -41,7 +46,7 @@ void enable_sep_cpu(void *info)  extern const char vsyscall_int80_start, vsyscall_int80_end;  extern const char vsyscall_sysenter_start, vsyscall_sysenter_end; -static int __init sysenter_setup(void) +int __init sysenter_setup(void)  {  	void *page = (void *)get_zeroed_page(GFP_ATOMIC); @@ -58,8 +63,5 @@ static int __init sysenter_setup(void)  	       &vsyscall_sysenter_start,  	       &vsyscall_sysenter_end - &vsyscall_sysenter_start); -	on_each_cpu(enable_sep_cpu, NULL, 1, 1);  	return 0;  } - -__initcall(sysenter_setup); | 
