Messages in this thread | | | Date | Mon, 9 Feb 2009 12:13:33 -0500 | Subject | Re: [PATCH 03/11] x86: fix math_emu register frame access | From | Brian Gerst <> |
| |
On Mon, Feb 9, 2009 at 8:39 AM, Tejun Heo <tj@kernel.org> wrote: > do_device_not_available() is the handler for #NM and it declares that > it takes a unsigned long and calls math_emu(), which takes a long > argument and surprisingly expects the stack frame starting at the zero > argument would match struct math_emu_info, which isn't true regardless > of configuration in the current code. > > This patch makes do_device_not_available() take struct pt_regs like > other exception handlers and initialize struct math_emu_info with > pointer to it and pass pointer to the math_emu_info to math_emulate() > like normal C functions do. This way, unless gcc makes a copy of > struct pt_regs in do_device_not_available(), the register frame is > correctly accessed regardless of kernel configuration or compiler > used. > > This doesn't fix all math_emu problems but it at least gets it > somewhat working. > > Signed-off-by: Tejun Heo <tj@kernel.org> > > diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c > index afb46c0..84bdf8f 100644 > --- a/arch/x86/kernel/traps.c > +++ b/arch/x86/kernel/traps.c > @@ -900,7 +900,7 @@ asmlinkage void math_state_restore(void) > EXPORT_SYMBOL_GPL(math_state_restore); > > #ifndef CONFIG_MATH_EMULATION > -asmlinkage void math_emulate(long arg) > +void math_emulate(struct math_emu_info *info)
You forgot to drop the asmlinkage from the prototype in traps.h.
> { > printk(KERN_EMERG > "math-emulation not enabled and no coprocessor found.\n"); > @@ -910,16 +910,19 @@ asmlinkage void math_emulate(long arg) > } > #endif /* CONFIG_MATH_EMULATION */ > > -dotraplinkage void __kprobes > -do_device_not_available(struct pt_regs *regs, long error) > +dotraplinkage void __kprobes do_device_not_available(struct pt_regs regs)
Why did you change this to pass by value? This is called from the generic trap handler (error_code), which already passes the pt_regs pointer in %eax.
-- Brian Gerst
| |