d315760ffa
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> Signed-off-by: Ingo Molnar <mingo@elte.hu>
18 lines
425 B
C
18 lines
425 B
C
#ifndef _ASM_X86_MATH_EMU_H
|
|
#define _ASM_X86_MATH_EMU_H
|
|
|
|
#include <asm/ptrace.h>
|
|
#include <asm/vm86.h>
|
|
|
|
/* This structure matches the layout of the data saved to the stack
|
|
following a device-not-present interrupt, part of it saved
|
|
automatically by the 80386/80486.
|
|
*/
|
|
struct math_emu_info {
|
|
long ___orig_eip;
|
|
union {
|
|
struct pt_regs *regs;
|
|
struct kernel_vm86_regs *vm86;
|
|
};
|
|
};
|
|
#endif /* _ASM_X86_MATH_EMU_H */
|