|
@@ -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);
|