Skip to content

Commit

Permalink
x86/traps: Shift fill_trap_info() from DO_ERROR_INFO() to do_error_tr…
Browse files Browse the repository at this point in the history
…ap()

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>
  • Loading branch information
Oleg Nesterov committed May 14, 2014
1 parent 958d3d7 commit 1c326c4
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions arch/x86/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,16 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
return -1;
}

static void fill_trap_info(struct pt_regs *regs, int signr, int trapnr,
siginfo_t *info)
static siginfo_t *fill_trap_info(struct pt_regs *regs, int signr, int trapnr,
siginfo_t *info)
{
unsigned long siaddr;
int sicode;

switch (trapnr) {
default:
return SEND_SIG_PRIV;

case X86_TRAP_DE:
sicode = FPE_INTDIV;
siaddr = regs->ip;
Expand All @@ -161,6 +164,7 @@ static void fill_trap_info(struct pt_regs *regs, int signr, int trapnr,
info->si_errno = 0;
info->si_code = sicode;
info->si_addr = (void __user *)siaddr;
return info;
}

static void __kprobes
Expand Down Expand Up @@ -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,
unsigned long trapnr, int signr, siginfo_t *info)
unsigned long trapnr, int signr)
{
enum ctx_state prev_state = exception_enter();
siginfo_t info;

if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
NOTIFY_STOP) {
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);
Expand All @@ -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) \
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) \
dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
{ \
siginfo_t info; \
\
fill_trap_info(regs, signr, trapnr, &info); \
do_error_trap(regs, error_code, str, trapnr, signr, &info); \
do_error_trap(regs, error_code, str, trapnr, signr); \
}

DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error)
Expand Down

0 comments on commit 1c326c4

Please sign in to comment.