mirror of https://gitee.com/openkylin/linux.git
sh: don't pass saved userspace state to exception handlers
The compiler is permitted to generate code which overwrites the parameters to a function. If those parameters include the only saved copy we have of userspace's registers, we're in trouble. Signed-off-by: Bobby Bingham <koorogi@koorogi.info> Cc: Paul Mundt <paul.mundt@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7caf62de25
commit
a3c195144e
|
@ -42,18 +42,10 @@ static inline void trigger_address_error(void)
|
|||
asmlinkage void do_address_error(struct pt_regs *regs,
|
||||
unsigned long writeaccess,
|
||||
unsigned long address);
|
||||
asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_divide_error(unsigned long r4);
|
||||
asmlinkage void do_reserved_inst(void);
|
||||
asmlinkage void do_illegal_slot_inst(void);
|
||||
asmlinkage void do_exception_error(void);
|
||||
|
||||
#define BUILD_TRAP_HANDLER(name) \
|
||||
asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
|
||||
|
|
|
@ -594,9 +594,7 @@ int is_dsp_inst(struct pt_regs *regs)
|
|||
#endif /* CONFIG_SH_DSP */
|
||||
|
||||
#ifdef CONFIG_CPU_SH2A
|
||||
asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_divide_error(unsigned long r4)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
|
@ -613,11 +611,9 @@ asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
|
|||
}
|
||||
#endif
|
||||
|
||||
asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_reserved_inst(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
unsigned long error_code;
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
|
@ -701,11 +697,9 @@ static int emulate_branch(unsigned short inst, struct pt_regs *regs)
|
|||
}
|
||||
#endif
|
||||
|
||||
asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_illegal_slot_inst(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
unsigned long inst;
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
|
@ -730,15 +724,12 @@ asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
|
|||
die_if_no_fixup("illegal slot instruction", regs, inst);
|
||||
}
|
||||
|
||||
asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_exception_error(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
long ex;
|
||||
|
||||
ex = lookup_exception_vector();
|
||||
die_if_kernel("exception", regs, ex);
|
||||
die_if_kernel("exception", current_pt_regs(), ex);
|
||||
}
|
||||
|
||||
void per_cpu_trap_init(void)
|
||||
|
|
Loading…
Reference in New Issue