[PATCH] i386: allow disabling X86_FEATURE_SEP at boot
Chuck Ebbert [Thu, 23 Mar 2006 10:59:34 +0000 (02:59 -0800)]
Allow the x86 "sep" feature to be disabled at bootup.  This forces use of the
int80 vsyscall.  Mainly for testing or benchmarking the int80 vsyscall code.

Signed-off-by: Chuck Ebbert <76306.1226@compuserve.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Documentation/kernel-parameters.txt
arch/i386/kernel/cpu/common.c

index fc99075..880be3a 100644 (file)
@@ -1008,7 +1008,9 @@ running once the system is up.
                        noexec=on: enable non-executable mappings (default)
                        noexec=off: disable nn-executable mappings
 
-       nofxsr          [BUGS=IA-32]
+       nofxsr          [BUGS=IA-32] Disables x86 floating point extended
+                       register save and restore. The kernel will only save
+                       legacy floating-point registers on task switch.
 
        nohlt           [BUGS=ARM]
 
@@ -1053,6 +1055,8 @@ running once the system is up.
 
        nosbagart       [IA-64]
 
+       nosep           [BUGS=IA-32] Disables x86 SYSENTER/SYSEXIT support.
+
        nosmp           [SMP] Tells an SMP kernel to act as a UP kernel.
 
        nosync          [HW,M68K] Disables sync negotiation for all devices.
index f63dcfb..bbfc278 100644 (file)
@@ -26,8 +26,9 @@ DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]);
 EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
 
 static int cachesize_override __cpuinitdata = -1;
-static int disable_x86_fxsr __cpuinitdata = 0;
+static int disable_x86_fxsr __cpuinitdata;
 static int disable_x86_serial_nr __cpuinitdata = 1;
+static int disable_x86_sep __cpuinitdata;
 
 struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
 
@@ -187,6 +188,14 @@ static int __init x86_fxsr_setup(char * s)
 __setup("nofxsr", x86_fxsr_setup);
 
 
+static int __init x86_sep_setup(char * s)
+{
+       disable_x86_sep = 1;
+       return 1;
+}
+__setup("nosep", x86_sep_setup);
+
+
 /* Standard macro to see if a specific flag is changeable */
 static inline int flag_is_changeable_p(u32 flag)
 {
@@ -405,6 +414,10 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
                clear_bit(X86_FEATURE_XMM, c->x86_capability);
        }
 
+       /* SEP disabled? */
+       if (disable_x86_sep)
+               clear_bit(X86_FEATURE_SEP, c->x86_capability);
+
        if (disable_pse)
                clear_bit(X86_FEATURE_PSE, c->x86_capability);