x86: use pt_regs pointer in do_device_not_available()
The generic exception handler (error_code) passes in the pt_regs pointer and the error code (unused in this case). The commit "x86: fix math_emu register frame access" changed this to pass by value, which doesn't work correctly with stack protector enabled. Change it back to use the pt_regs pointer. Signed-off-by: Brian Gerst <brgerst@gmail.com> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
ebd9026d9f
commit
aa78bcfa01
|
@ -41,7 +41,7 @@ dotraplinkage void do_int3(struct pt_regs *, long);
|
||||||
dotraplinkage void do_overflow(struct pt_regs *, long);
|
dotraplinkage void do_overflow(struct pt_regs *, long);
|
||||||
dotraplinkage void do_bounds(struct pt_regs *, long);
|
dotraplinkage void do_bounds(struct pt_regs *, long);
|
||||||
dotraplinkage void do_invalid_op(struct pt_regs *, long);
|
dotraplinkage void do_invalid_op(struct pt_regs *, long);
|
||||||
dotraplinkage void do_device_not_available(struct pt_regs);
|
dotraplinkage void do_device_not_available(struct pt_regs *, long);
|
||||||
dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);
|
dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);
|
||||||
dotraplinkage void do_invalid_TSS(struct pt_regs *, long);
|
dotraplinkage void do_invalid_TSS(struct pt_regs *, long);
|
||||||
dotraplinkage void do_segment_not_present(struct pt_regs *, long);
|
dotraplinkage void do_segment_not_present(struct pt_regs *, long);
|
||||||
|
|
|
@ -905,19 +905,20 @@ void math_emulate(struct math_emu_info *info)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_MATH_EMULATION */
|
#endif /* CONFIG_MATH_EMULATION */
|
||||||
|
|
||||||
dotraplinkage void __kprobes do_device_not_available(struct pt_regs regs)
|
dotraplinkage void __kprobes
|
||||||
|
do_device_not_available(struct pt_regs *regs, long error_code)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
if (read_cr0() & X86_CR0_EM) {
|
if (read_cr0() & X86_CR0_EM) {
|
||||||
struct math_emu_info info = { };
|
struct math_emu_info info = { };
|
||||||
|
|
||||||
conditional_sti(®s);
|
conditional_sti(regs);
|
||||||
|
|
||||||
info.regs = ®s;
|
info.regs = regs;
|
||||||
math_emulate(&info);
|
math_emulate(&info);
|
||||||
} else {
|
} else {
|
||||||
math_state_restore(); /* interrupts still off */
|
math_state_restore(); /* interrupts still off */
|
||||||
conditional_sti(®s);
|
conditional_sti(regs);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
math_state_restore();
|
math_state_restore();
|
||||||
|
|
Loading…
Reference in New Issue