x86/traps: Shift fill_trap_info() from DO_ERROR_INFO() to do_error_trap()
Move the callsite of fill_trap_info() into do_error_trap() and remove the "siginfo_t *info" argument. This obviously breaks DO_ERROR() which passed info == NULL, we simply change fill_trap_info() to return "siginfo_t *" and add the "default" case which returns SEND_SIG_PRIV. Signed-off-by: Oleg Nesterov <oleg@redhat.com>
This commit is contained in:
parent
958d3d7298
commit
1c326c4dfe
1 changed files with 12 additions and 9 deletions
|
@ -136,13 +136,16 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill_trap_info(struct pt_regs *regs, int signr, int trapnr,
|
static siginfo_t *fill_trap_info(struct pt_regs *regs, int signr, int trapnr,
|
||||||
siginfo_t *info)
|
siginfo_t *info)
|
||||||
{
|
{
|
||||||
unsigned long siaddr;
|
unsigned long siaddr;
|
||||||
int sicode;
|
int sicode;
|
||||||
|
|
||||||
switch (trapnr) {
|
switch (trapnr) {
|
||||||
|
default:
|
||||||
|
return SEND_SIG_PRIV;
|
||||||
|
|
||||||
case X86_TRAP_DE:
|
case X86_TRAP_DE:
|
||||||
sicode = FPE_INTDIV;
|
sicode = FPE_INTDIV;
|
||||||
siaddr = regs->ip;
|
siaddr = regs->ip;
|
||||||
|
@ -161,6 +164,7 @@ static void fill_trap_info(struct pt_regs *regs, int signr, int trapnr,
|
||||||
info->si_errno = 0;
|
info->si_errno = 0;
|
||||||
info->si_code = sicode;
|
info->si_code = sicode;
|
||||||
info->si_addr = (void __user *)siaddr;
|
info->si_addr = (void __user *)siaddr;
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __kprobes
|
static void __kprobes
|
||||||
|
@ -199,14 +203,16 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
|
static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
|
||||||
unsigned long trapnr, int signr, siginfo_t *info)
|
unsigned long trapnr, int signr)
|
||||||
{
|
{
|
||||||
enum ctx_state prev_state = exception_enter();
|
enum ctx_state prev_state = exception_enter();
|
||||||
|
siginfo_t info;
|
||||||
|
|
||||||
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
|
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
|
||||||
NOTIFY_STOP) {
|
NOTIFY_STOP) {
|
||||||
conditional_sti(regs);
|
conditional_sti(regs);
|
||||||
do_trap(trapnr, signr, str, regs, error_code, info);
|
do_trap(trapnr, signr, str, regs, error_code,
|
||||||
|
fill_trap_info(regs, signr, trapnr, &info));
|
||||||
}
|
}
|
||||||
|
|
||||||
exception_exit(prev_state);
|
exception_exit(prev_state);
|
||||||
|
@ -215,16 +221,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
|
||||||
#define DO_ERROR(trapnr, signr, str, name) \
|
#define DO_ERROR(trapnr, signr, str, name) \
|
||||||
dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
|
dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
|
||||||
{ \
|
{ \
|
||||||
do_error_trap(regs, error_code, str, trapnr, signr, NULL); \
|
do_error_trap(regs, error_code, str, trapnr, signr); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DO_ERROR_INFO(trapnr, signr, str, name) \
|
#define DO_ERROR_INFO(trapnr, signr, str, name) \
|
||||||
dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
|
dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
|
||||||
{ \
|
{ \
|
||||||
siginfo_t info; \
|
do_error_trap(regs, error_code, str, trapnr, signr); \
|
||||||
\
|
|
||||||
fill_trap_info(regs, signr, trapnr, &info); \
|
|
||||||
do_error_trap(regs, error_code, str, trapnr, signr, &info); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error)
|
DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error)
|
||||||
|
|
Loading…
Add table
Reference in a new issue