2006-01-26 18:39:51

by Chuck Ebbert

[permalink] [raw]
Subject: [patch 2.6.15] i386: allow disabling X86_FEATURE_SEP at boot

Allow the x86 "sep" feature to be disabled at bootup. This
forces use of the int80 vsyscall.

Signed-off-by: Chuck Ebbert <[email protected]>

Documentation/kernel-parameters.txt | 6 +++++-
arch/i386/kernel/cpu/common.c | 13 +++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)

--- 2.6.15a.orig/arch/i386/kernel/cpu/common.c
+++ 2.6.15a/arch/i386/kernel/cpu/common.c
@@ -27,6 +27,7 @@ EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
static int cachesize_override __devinitdata = -1;
static int disable_x86_fxsr __devinitdata = 0;
static int disable_x86_serial_nr __devinitdata = 1;
+static int disable_x86_sep __devinitdata = 0;

struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};

@@ -177,6 +178,14 @@ static int __init x86_fxsr_setup(char *
__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)
{
@@ -392,6 +401,10 @@ void __devinit identify_cpu(struct cpuin
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);

--- 2.6.15a.orig/Documentation/kernel-parameters.txt
+++ 2.6.15a/Documentation/kernel-parameters.txt
@@ -929,7 +929,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]

@@ -972,6 +974,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.
--
Chuck
Currently reading: _The Atrocity Archives_ by Charles Stross


2006-01-27 22:35:40

by Andrew Morton

[permalink] [raw]
Subject: Re: [patch 2.6.15] i386: allow disabling X86_FEATURE_SEP at boot

Chuck Ebbert <[email protected]> wrote:
>
> Allow the x86 "sep" feature to be disabled at bootup. This
> forces use of the int80 vsyscall.
>

Why is there a need to do this?

>
> Documentation/kernel-parameters.txt | 6 +++++-
> arch/i386/kernel/cpu/common.c | 13 +++++++++++++
> 2 files changed, 18 insertions(+), 1 deletion(-)
>
> --- 2.6.15a.orig/arch/i386/kernel/cpu/common.c
> +++ 2.6.15a/arch/i386/kernel/cpu/common.c
> @@ -27,6 +27,7 @@ EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
> static int cachesize_override __devinitdata = -1;
> static int disable_x86_fxsr __devinitdata = 0;
> static int disable_x86_serial_nr __devinitdata = 1;
> +static int disable_x86_sep __devinitdata = 0;
>

hm, I guess lots of things in there should be __cpuinit/__cpuinitdata.
__devinit is a superset of that, but we're being a little wasteful in the
case of CONFIG_HOTPLUG&&!CONFIG_HOTPLUG_CPU.

2006-01-28 06:08:42

by Chuck Ebbert

[permalink] [raw]
Subject: Re: [patch 2.6.15] i386: allow disabling X86_FEATURE_SEP at boot

In-Reply-To: <[email protected]>

On Fri, 27 Jan 2006 at 14:37:13 -0800, Andrew Morton wrote:

> Chuck Ebbert <[email protected]> wrote:
> >
> > Allow the x86 "sep" feature to be disabled at bootup. This
> > forces use of the int80 vsyscall.
> >
>
> Why is there a need to do this?

Mainly for testing or benchmarking the int80 vsyscall code.

> > --- 2.6.15a.orig/arch/i386/kernel/cpu/common.c
> > +++ 2.6.15a/arch/i386/kernel/cpu/common.c
> > @@ -27,6 +27,7 @@ EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
> > static int cachesize_override __devinitdata = -1;
> > static int disable_x86_fxsr __devinitdata = 0;
> > static int disable_x86_serial_nr __devinitdata = 1;
> > +static int disable_x86_sep __devinitdata = 0;
> >
>
> hm, I guess lots of things in there should be __cpuinit/__cpuinitdata.

I'll try to do that.

> __devinit is a superset of that, but we're being a little wasteful in the
> case of CONFIG_HOTPLUG&&!CONFIG_HOTPLUG_CPU.

--
Chuck