diff options
68 files changed, 158 insertions, 24 deletions
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 2e02aef5a334..f5f154942aab 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
| @@ -881,6 +881,7 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer, | |||
| 881 | if (fex & IEEE_TRAP_ENABLE_DZE) si_code = FPE_FLTDIV; | 881 | if (fex & IEEE_TRAP_ENABLE_DZE) si_code = FPE_FLTDIV; |
| 882 | if (fex & IEEE_TRAP_ENABLE_INV) si_code = FPE_FLTINV; | 882 | if (fex & IEEE_TRAP_ENABLE_INV) si_code = FPE_FLTINV; |
| 883 | 883 | ||
| 884 | clear_siginfo(&info); | ||
| 884 | info.si_signo = SIGFPE; | 885 | info.si_signo = SIGFPE; |
| 885 | info.si_errno = 0; | 886 | info.si_errno = 0; |
| 886 | info.si_code = si_code; | 887 | info.si_code = si_code; |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 9ebb3bcbc626..cd306e602313 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -221,6 +221,7 @@ do_sigreturn(struct sigcontext __user *sc) | |||
| 221 | if (ptrace_cancel_bpt (current)) { | 221 | if (ptrace_cancel_bpt (current)) { |
| 222 | siginfo_t info; | 222 | siginfo_t info; |
| 223 | 223 | ||
| 224 | clear_siginfo(&info); | ||
| 224 | info.si_signo = SIGTRAP; | 225 | info.si_signo = SIGTRAP; |
| 225 | info.si_errno = 0; | 226 | info.si_errno = 0; |
| 226 | info.si_code = TRAP_BRKPT; | 227 | info.si_code = TRAP_BRKPT; |
| @@ -255,6 +256,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame) | |||
| 255 | if (ptrace_cancel_bpt (current)) { | 256 | if (ptrace_cancel_bpt (current)) { |
| 256 | siginfo_t info; | 257 | siginfo_t info; |
| 257 | 258 | ||
| 259 | clear_siginfo(&info); | ||
| 258 | info.si_signo = SIGTRAP; | 260 | info.si_signo = SIGTRAP; |
| 259 | info.si_errno = 0; | 261 | info.si_errno = 0; |
| 260 | info.si_code = TRAP_BRKPT; | 262 | info.si_code = TRAP_BRKPT; |
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index f43bd05dede2..91636765dd6d 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c | |||
| @@ -228,6 +228,7 @@ do_entArith(unsigned long summary, unsigned long write_mask, | |||
| 228 | } | 228 | } |
| 229 | die_if_kernel("Arithmetic fault", regs, 0, NULL); | 229 | die_if_kernel("Arithmetic fault", regs, 0, NULL); |
| 230 | 230 | ||
| 231 | clear_siginfo(&info); | ||
| 231 | info.si_signo = SIGFPE; | 232 | info.si_signo = SIGFPE; |
| 232 | info.si_errno = 0; | 233 | info.si_errno = 0; |
| 233 | info.si_code = si_code; | 234 | info.si_code = si_code; |
| @@ -241,6 +242,7 @@ do_entIF(unsigned long type, struct pt_regs *regs) | |||
| 241 | siginfo_t info; | 242 | siginfo_t info; |
| 242 | int signo, code; | 243 | int signo, code; |
| 243 | 244 | ||
| 245 | clear_siginfo(&info); | ||
| 244 | if ((regs->ps & ~IPL_MAX) == 0) { | 246 | if ((regs->ps & ~IPL_MAX) == 0) { |
| 245 | if (type == 1) { | 247 | if (type == 1) { |
| 246 | const unsigned int *data | 248 | const unsigned int *data |
| @@ -430,6 +432,7 @@ do_entDbg(struct pt_regs *regs) | |||
| 430 | 432 | ||
| 431 | die_if_kernel("Instruction fault", regs, 0, NULL); | 433 | die_if_kernel("Instruction fault", regs, 0, NULL); |
| 432 | 434 | ||
| 435 | clear_siginfo(&info); | ||
| 433 | info.si_signo = SIGILL; | 436 | info.si_signo = SIGILL; |
| 434 | info.si_errno = 0; | 437 | info.si_errno = 0; |
| 435 | info.si_code = ILL_ILLOPC; | 438 | info.si_code = ILL_ILLOPC; |
| @@ -761,6 +764,8 @@ do_entUnaUser(void __user * va, unsigned long opcode, | |||
| 761 | siginfo_t info; | 764 | siginfo_t info; |
| 762 | long error; | 765 | long error; |
| 763 | 766 | ||
| 767 | clear_siginfo(&info); | ||
| 768 | |||
| 764 | /* Check the UAC bits to decide what the user wants us to do | 769 | /* Check the UAC bits to decide what the user wants us to do |
| 765 | with the unaliged access. */ | 770 | with the unaliged access. */ |
| 766 | 771 | ||
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index cd3c572ee912..7f2202a9f50a 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c | |||
| @@ -91,6 +91,8 @@ do_page_fault(unsigned long address, unsigned long mmcsr, | |||
| 91 | siginfo_t info; | 91 | siginfo_t info; |
| 92 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 92 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| 93 | 93 | ||
| 94 | clear_siginfo(&info); | ||
| 95 | |||
| 94 | /* As of EV6, a load into $31/$f31 is a prefetch, and never faults | 96 | /* As of EV6, a load into $31/$f31 is a prefetch, and never faults |
| 95 | (or is suppressed by the PALcode). Support that for older CPUs | 97 | (or is suppressed by the PALcode). Support that for older CPUs |
| 96 | by ignoring such an instruction. */ | 98 | by ignoring such an instruction. */ |
diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index a0b7bd6d030d..b884bbd6f354 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c | |||
| @@ -70,6 +70,8 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) | |||
| 70 | int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ | 70 | int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ |
| 71 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 71 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| 72 | 72 | ||
| 73 | clear_siginfo(&info); | ||
| 74 | |||
| 73 | /* | 75 | /* |
| 74 | * We fault-in kernel-space virtual memory on-demand. The | 76 | * We fault-in kernel-space virtual memory on-demand. The |
| 75 | * 'reference' page table is init_mm.pgd. | 77 | * 'reference' page table is init_mm.pgd. |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 7724b0f661b3..36718a424358 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
| @@ -205,6 +205,7 @@ void ptrace_break(struct task_struct *tsk, struct pt_regs *regs) | |||
| 205 | { | 205 | { |
| 206 | siginfo_t info; | 206 | siginfo_t info; |
| 207 | 207 | ||
| 208 | clear_siginfo(&info); | ||
| 208 | info.si_signo = SIGTRAP; | 209 | info.si_signo = SIGTRAP; |
| 209 | info.si_errno = 0; | 210 | info.si_errno = 0; |
| 210 | info.si_code = TRAP_BRKPT; | 211 | info.si_code = TRAP_BRKPT; |
diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c index 3bda08bee674..dfcb456afadd 100644 --- a/arch/arm/kernel/swp_emulate.c +++ b/arch/arm/kernel/swp_emulate.c | |||
| @@ -112,6 +112,7 @@ static void set_segfault(struct pt_regs *regs, unsigned long addr) | |||
| 112 | { | 112 | { |
| 113 | siginfo_t info; | 113 | siginfo_t info; |
| 114 | 114 | ||
| 115 | clear_siginfo(&info); | ||
| 115 | down_read(¤t->mm->mmap_sem); | 116 | down_read(¤t->mm->mmap_sem); |
| 116 | if (find_vma(current->mm, addr) == NULL) | 117 | if (find_vma(current->mm, addr) == NULL) |
| 117 | info.si_code = SEGV_MAPERR; | 118 | info.si_code = SEGV_MAPERR; |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 5e3633c24e63..2584f9066da3 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -439,6 +439,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs) | |||
| 439 | siginfo_t info; | 439 | siginfo_t info; |
| 440 | void __user *pc; | 440 | void __user *pc; |
| 441 | 441 | ||
| 442 | clear_siginfo(&info); | ||
| 442 | pc = (void __user *)instruction_pointer(regs); | 443 | pc = (void __user *)instruction_pointer(regs); |
| 443 | 444 | ||
| 444 | if (processor_mode(regs) == SVC_MODE) { | 445 | if (processor_mode(regs) == SVC_MODE) { |
| @@ -537,6 +538,7 @@ static int bad_syscall(int n, struct pt_regs *regs) | |||
| 537 | { | 538 | { |
| 538 | siginfo_t info; | 539 | siginfo_t info; |
| 539 | 540 | ||
| 541 | clear_siginfo(&info); | ||
| 540 | if ((current->personality & PER_MASK) != PER_LINUX) { | 542 | if ((current->personality & PER_MASK) != PER_LINUX) { |
| 541 | send_sig(SIGSEGV, current, 1); | 543 | send_sig(SIGSEGV, current, 1); |
| 542 | return regs->ARM_r0; | 544 | return regs->ARM_r0; |
| @@ -604,6 +606,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) | |||
| 604 | { | 606 | { |
| 605 | siginfo_t info; | 607 | siginfo_t info; |
| 606 | 608 | ||
| 609 | clear_siginfo(&info); | ||
| 607 | if ((no >> 16) != (__ARM_NR_BASE>> 16)) | 610 | if ((no >> 16) != (__ARM_NR_BASE>> 16)) |
| 608 | return bad_syscall(no, regs); | 611 | return bad_syscall(no, regs); |
| 609 | 612 | ||
| @@ -740,6 +743,8 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs) | |||
| 740 | unsigned long addr = instruction_pointer(regs); | 743 | unsigned long addr = instruction_pointer(regs); |
| 741 | siginfo_t info; | 744 | siginfo_t info; |
| 742 | 745 | ||
| 746 | clear_siginfo(&info); | ||
| 747 | |||
| 743 | #ifdef CONFIG_DEBUG_USER | 748 | #ifdef CONFIG_DEBUG_USER |
| 744 | if (user_debug & UDBG_BADABORT) { | 749 | if (user_debug & UDBG_BADABORT) { |
| 745 | pr_err("[%d] %s: bad data abort: code %d instr 0x%08lx\n", | 750 | pr_err("[%d] %s: bad data abort: code %d instr 0x%08lx\n", |
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 2c96190e018b..bd2c739d8083 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
| @@ -950,6 +950,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
| 950 | if (ai_usermode & UM_SIGNAL) { | 950 | if (ai_usermode & UM_SIGNAL) { |
| 951 | siginfo_t si; | 951 | siginfo_t si; |
| 952 | 952 | ||
| 953 | clear_siginfo(&si); | ||
| 953 | si.si_signo = SIGBUS; | 954 | si.si_signo = SIGBUS; |
| 954 | si.si_errno = 0; | 955 | si.si_errno = 0; |
| 955 | si.si_code = BUS_ADRALN; | 956 | si.si_code = BUS_ADRALN; |
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index b75eada23d0a..32034543f49c 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c | |||
| @@ -163,6 +163,8 @@ __do_user_fault(struct task_struct *tsk, unsigned long addr, | |||
| 163 | { | 163 | { |
| 164 | struct siginfo si; | 164 | struct siginfo si; |
| 165 | 165 | ||
| 166 | clear_siginfo(&si); | ||
| 167 | |||
| 166 | #ifdef CONFIG_DEBUG_USER | 168 | #ifdef CONFIG_DEBUG_USER |
| 167 | if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) || | 169 | if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) || |
| 168 | ((user_debug & UDBG_BUS) && (sig == SIGBUS))) { | 170 | ((user_debug & UDBG_BUS) && (sig == SIGBUS))) { |
| @@ -557,6 +559,7 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
| 557 | inf->name, fsr, addr); | 559 | inf->name, fsr, addr); |
| 558 | show_pte(current->mm, addr); | 560 | show_pte(current->mm, addr); |
| 559 | 561 | ||
| 562 | clear_siginfo(&info); | ||
| 560 | info.si_signo = inf->sig; | 563 | info.si_signo = inf->sig; |
| 561 | info.si_errno = 0; | 564 | info.si_errno = 0; |
| 562 | info.si_code = inf->code; | 565 | info.si_code = inf->code; |
| @@ -589,6 +592,7 @@ do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs) | |||
| 589 | pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", | 592 | pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", |
| 590 | inf->name, ifsr, addr); | 593 | inf->name, ifsr, addr); |
| 591 | 594 | ||
| 595 | clear_siginfo(&info); | ||
| 592 | info.si_signo = inf->sig; | 596 | info.si_signo = inf->sig; |
| 593 | info.si_errno = 0; | 597 | info.si_errno = 0; |
| 594 | info.si_code = inf->code; | 598 | info.si_code = inf->code; |
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 4c375e11ae95..adda3fc2dde8 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
| @@ -218,8 +218,7 @@ static void vfp_raise_sigfpe(unsigned int sicode, struct pt_regs *regs) | |||
| 218 | { | 218 | { |
| 219 | siginfo_t info; | 219 | siginfo_t info; |
| 220 | 220 | ||
| 221 | memset(&info, 0, sizeof(info)); | 221 | clear_siginfo(&info); |
| 222 | |||
| 223 | info.si_signo = SIGFPE; | 222 | info.si_signo = SIGFPE; |
| 224 | info.si_code = sicode; | 223 | info.si_code = sicode; |
| 225 | info.si_addr = (void __user *)(instruction_pointer(regs) - 4); | 224 | info.si_addr = (void __user *)(instruction_pointer(regs) - 4); |
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 87a35364e750..4bcdd0318729 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c | |||
| @@ -882,7 +882,7 @@ asmlinkage void do_fpsimd_exc(unsigned int esr, struct pt_regs *regs) | |||
| 882 | si_code = FPE_FLTRES; | 882 | si_code = FPE_FLTRES; |
| 883 | } | 883 | } |
| 884 | 884 | ||
| 885 | memset(&info, 0, sizeof(info)); | 885 | clear_siginfo(&info); |
| 886 | info.si_signo = SIGFPE; | 886 | info.si_signo = SIGFPE; |
| 887 | info.si_code = si_code; | 887 | info.si_code = si_code; |
| 888 | info.si_addr = (void __user *)instruction_pointer(regs); | 888 | info.si_addr = (void __user *)instruction_pointer(regs); |
diff --git a/arch/arm64/kernel/sys_compat.c b/arch/arm64/kernel/sys_compat.c index 93ab57dcfc14..a6109825eeb9 100644 --- a/arch/arm64/kernel/sys_compat.c +++ b/arch/arm64/kernel/sys_compat.c | |||
| @@ -112,6 +112,7 @@ long compat_arm_syscall(struct pt_regs *regs) | |||
| 112 | break; | 112 | break; |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | clear_siginfo(&info); | ||
| 115 | info.si_signo = SIGILL; | 116 | info.si_signo = SIGILL; |
| 116 | info.si_errno = 0; | 117 | info.si_errno = 0; |
| 117 | info.si_code = ILL_ILLTRP; | 118 | info.si_code = ILL_ILLTRP; |
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index ba964da31a25..7f476586cacc 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c | |||
| @@ -634,6 +634,7 @@ asmlinkage void bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr) | |||
| 634 | siginfo_t info; | 634 | siginfo_t info; |
| 635 | void __user *pc = (void __user *)instruction_pointer(regs); | 635 | void __user *pc = (void __user *)instruction_pointer(regs); |
| 636 | 636 | ||
| 637 | clear_siginfo(&info); | ||
| 637 | info.si_signo = SIGILL; | 638 | info.si_signo = SIGILL; |
| 638 | info.si_errno = 0; | 639 | info.si_errno = 0; |
| 639 | info.si_code = ILL_ILLOPC; | 640 | info.si_code = ILL_ILLOPC; |
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 4165485e8b6e..91c53a7d2575 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c | |||
| @@ -305,11 +305,12 @@ static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *re | |||
| 305 | */ | 305 | */ |
| 306 | if (user_mode(regs)) { | 306 | if (user_mode(regs)) { |
| 307 | const struct fault_info *inf = esr_to_fault_info(esr); | 307 | const struct fault_info *inf = esr_to_fault_info(esr); |
| 308 | struct siginfo si = { | 308 | struct siginfo si; |
| 309 | .si_signo = inf->sig, | 309 | |
| 310 | .si_code = inf->code, | 310 | clear_siginfo(&si); |
| 311 | .si_addr = (void __user *)addr, | 311 | si.si_signo = inf->sig; |
| 312 | }; | 312 | si.si_code = inf->code; |
| 313 | si.si_addr = (void __user *)addr; | ||
| 313 | 314 | ||
| 314 | __do_user_fault(&si, esr); | 315 | __do_user_fault(&si, esr); |
| 315 | } else { | 316 | } else { |
| @@ -583,6 +584,7 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) | |||
| 583 | nmi_exit(); | 584 | nmi_exit(); |
| 584 | } | 585 | } |
| 585 | 586 | ||
| 587 | clear_siginfo(&info); | ||
| 586 | info.si_signo = inf->sig; | 588 | info.si_signo = inf->sig; |
| 587 | info.si_errno = 0; | 589 | info.si_errno = 0; |
| 588 | info.si_code = inf->code; | 590 | info.si_code = inf->code; |
| @@ -687,6 +689,7 @@ asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr, | |||
| 687 | show_pte(addr); | 689 | show_pte(addr); |
| 688 | } | 690 | } |
| 689 | 691 | ||
| 692 | clear_siginfo(&info); | ||
| 690 | info.si_signo = inf->sig; | 693 | info.si_signo = inf->sig; |
| 691 | info.si_errno = 0; | 694 | info.si_errno = 0; |
| 692 | info.si_code = inf->code; | 695 | info.si_code = inf->code; |
| @@ -729,6 +732,7 @@ asmlinkage void __exception do_sp_pc_abort(unsigned long addr, | |||
| 729 | local_irq_enable(); | 732 | local_irq_enable(); |
| 730 | } | 733 | } |
| 731 | 734 | ||
| 735 | clear_siginfo(&info); | ||
| 732 | info.si_signo = SIGBUS; | 736 | info.si_signo = SIGBUS; |
| 733 | info.si_errno = 0; | 737 | info.si_errno = 0; |
| 734 | info.si_code = BUS_ADRALN; | 738 | info.si_code = BUS_ADRALN; |
| @@ -772,7 +776,6 @@ asmlinkage int __exception do_debug_exception(unsigned long addr, | |||
| 772 | struct pt_regs *regs) | 776 | struct pt_regs *regs) |
| 773 | { | 777 | { |
| 774 | const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr); | 778 | const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr); |
| 775 | struct siginfo info; | ||
| 776 | int rv; | 779 | int rv; |
| 777 | 780 | ||
| 778 | /* | 781 | /* |
| @@ -788,6 +791,9 @@ asmlinkage int __exception do_debug_exception(unsigned long addr, | |||
| 788 | if (!inf->fn(addr, esr, regs)) { | 791 | if (!inf->fn(addr, esr, regs)) { |
| 789 | rv = 1; | 792 | rv = 1; |
| 790 | } else { | 793 | } else { |
| 794 | struct siginfo info; | ||
| 795 | |||
| 796 | clear_siginfo(&info); | ||
| 791 | info.si_signo = inf->sig; | 797 | info.si_signo = inf->sig; |
| 792 | info.si_errno = 0; | 798 | info.si_errno = 0; |
| 793 | info.si_code = inf->code; | 799 | info.si_code = inf->code; |
diff --git a/arch/c6x/kernel/traps.c b/arch/c6x/kernel/traps.c index 4c1d4b84dd2b..c5feee4542b0 100644 --- a/arch/c6x/kernel/traps.c +++ b/arch/c6x/kernel/traps.c | |||
| @@ -246,6 +246,7 @@ static void do_trap(struct exception_info *except_info, struct pt_regs *regs) | |||
| 246 | unsigned long addr = instruction_pointer(regs); | 246 | unsigned long addr = instruction_pointer(regs); |
| 247 | siginfo_t info; | 247 | siginfo_t info; |
| 248 | 248 | ||
| 249 | clear_siginfo(&info); | ||
| 249 | if (except_info->code != TRAP_BRKPT) | 250 | if (except_info->code != TRAP_BRKPT) |
| 250 | pr_err("TRAP: %s PC[0x%lx] signo[%d] code[%d]\n", | 251 | pr_err("TRAP: %s PC[0x%lx] signo[%d] code[%d]\n", |
| 251 | except_info->kernel_str, regs->pc, | 252 | except_info->kernel_str, regs->pc, |
diff --git a/arch/hexagon/kernel/traps.c b/arch/hexagon/kernel/traps.c index 2942a9204a9a..1ff6a6a7b97c 100644 --- a/arch/hexagon/kernel/traps.c +++ b/arch/hexagon/kernel/traps.c | |||
| @@ -414,6 +414,7 @@ void do_trap0(struct pt_regs *regs) | |||
| 414 | if (user_mode(regs)) { | 414 | if (user_mode(regs)) { |
| 415 | struct siginfo info; | 415 | struct siginfo info; |
| 416 | 416 | ||
| 417 | clear_siginfo(&info); | ||
| 417 | info.si_signo = SIGTRAP; | 418 | info.si_signo = SIGTRAP; |
| 418 | info.si_errno = 0; | 419 | info.si_errno = 0; |
| 419 | /* | 420 | /* |
diff --git a/arch/hexagon/mm/vm_fault.c b/arch/hexagon/mm/vm_fault.c index 3eec33c5cfd7..2ad92edc877c 100644 --- a/arch/hexagon/mm/vm_fault.c +++ b/arch/hexagon/mm/vm_fault.c | |||
| @@ -56,6 +56,7 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs) | |||
| 56 | const struct exception_table_entry *fixup; | 56 | const struct exception_table_entry *fixup; |
| 57 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 57 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| 58 | 58 | ||
| 59 | clear_siginfo(&info); | ||
| 59 | /* | 60 | /* |
| 60 | * If we're in an interrupt or have no user context, | 61 | * If we're in an interrupt or have no user context, |
| 61 | * then must not take the fault. | 62 | * then must not take the fault. |
diff --git a/arch/ia64/kernel/brl_emu.c b/arch/ia64/kernel/brl_emu.c index 9bcc908bc85e..a61f6c6a36f8 100644 --- a/arch/ia64/kernel/brl_emu.c +++ b/arch/ia64/kernel/brl_emu.c | |||
| @@ -62,6 +62,7 @@ ia64_emulate_brl (struct pt_regs *regs, unsigned long ar_ec) | |||
| 62 | struct illegal_op_return rv; | 62 | struct illegal_op_return rv; |
| 63 | long tmp_taken, unimplemented_address; | 63 | long tmp_taken, unimplemented_address; |
| 64 | 64 | ||
| 65 | clear_siginfo(&siginfo); | ||
| 65 | rv.fkt = (unsigned long) -1; | 66 | rv.fkt = (unsigned long) -1; |
| 66 | 67 | ||
| 67 | /* | 68 | /* |
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c index 54547c7cf8a2..d1234a5ba4c5 100644 --- a/arch/ia64/kernel/signal.c +++ b/arch/ia64/kernel/signal.c | |||
| @@ -153,6 +153,7 @@ ia64_rt_sigreturn (struct sigscratch *scr) | |||
| 153 | return retval; | 153 | return retval; |
| 154 | 154 | ||
| 155 | give_sigsegv: | 155 | give_sigsegv: |
| 156 | clear_siginfo(&si); | ||
| 156 | si.si_signo = SIGSEGV; | 157 | si.si_signo = SIGSEGV; |
| 157 | si.si_errno = 0; | 158 | si.si_errno = 0; |
| 158 | si.si_code = SI_KERNEL; | 159 | si.si_code = SI_KERNEL; |
| @@ -236,6 +237,7 @@ force_sigsegv_info (int sig, void __user *addr) | |||
| 236 | unsigned long flags; | 237 | unsigned long flags; |
| 237 | struct siginfo si; | 238 | struct siginfo si; |
| 238 | 239 | ||
| 240 | clear_siginfo(&si); | ||
| 239 | if (sig == SIGSEGV) { | 241 | if (sig == SIGSEGV) { |
| 240 | /* | 242 | /* |
| 241 | * Acquiring siglock around the sa_handler-update is almost | 243 | * Acquiring siglock around the sa_handler-update is almost |
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index 6d4e76a4267f..972873ed1ae5 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c | |||
| @@ -104,6 +104,7 @@ __kprobes ia64_bad_break (unsigned long break_num, struct pt_regs *regs) | |||
| 104 | int sig, code; | 104 | int sig, code; |
| 105 | 105 | ||
| 106 | /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */ | 106 | /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */ |
| 107 | clear_siginfo(&siginfo); | ||
| 107 | siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); | 108 | siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); |
| 108 | siginfo.si_imm = break_num; | 109 | siginfo.si_imm = break_num; |
| 109 | siginfo.si_flags = 0; /* clear __ISR_VALID */ | 110 | siginfo.si_flags = 0; /* clear __ISR_VALID */ |
| @@ -293,7 +294,6 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr) | |||
| 293 | { | 294 | { |
| 294 | long exception, bundle[2]; | 295 | long exception, bundle[2]; |
| 295 | unsigned long fault_ip; | 296 | unsigned long fault_ip; |
| 296 | struct siginfo siginfo; | ||
| 297 | 297 | ||
| 298 | fault_ip = regs->cr_iip; | 298 | fault_ip = regs->cr_iip; |
| 299 | if (!fp_fault && (ia64_psr(regs)->ri == 0)) | 299 | if (!fp_fault && (ia64_psr(regs)->ri == 0)) |
| @@ -344,10 +344,13 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr) | |||
| 344 | printk(KERN_ERR "handle_fpu_swa: fp_emulate() returned -1\n"); | 344 | printk(KERN_ERR "handle_fpu_swa: fp_emulate() returned -1\n"); |
| 345 | return -1; | 345 | return -1; |
| 346 | } else { | 346 | } else { |
| 347 | struct siginfo siginfo; | ||
| 348 | |||
| 347 | /* is next instruction a trap? */ | 349 | /* is next instruction a trap? */ |
| 348 | if (exception & 2) { | 350 | if (exception & 2) { |
| 349 | ia64_increment_ip(regs); | 351 | ia64_increment_ip(regs); |
| 350 | } | 352 | } |
| 353 | clear_siginfo(&siginfo); | ||
| 351 | siginfo.si_signo = SIGFPE; | 354 | siginfo.si_signo = SIGFPE; |
| 352 | siginfo.si_errno = 0; | 355 | siginfo.si_errno = 0; |
| 353 | siginfo.si_code = FPE_FIXME; /* default code */ | 356 | siginfo.si_code = FPE_FIXME; /* default code */ |
| @@ -372,6 +375,9 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr) | |||
| 372 | return -1; | 375 | return -1; |
| 373 | } else if (exception != 0) { | 376 | } else if (exception != 0) { |
| 374 | /* raise exception */ | 377 | /* raise exception */ |
| 378 | struct siginfo siginfo; | ||
| 379 | |||
| 380 | clear_siginfo(&siginfo); | ||
| 375 | siginfo.si_signo = SIGFPE; | 381 | siginfo.si_signo = SIGFPE; |
| 376 | siginfo.si_errno = 0; | 382 | siginfo.si_errno = 0; |
| 377 | siginfo.si_code = FPE_FIXME; /* default code */ | 383 | siginfo.si_code = FPE_FIXME; /* default code */ |
| @@ -420,7 +426,7 @@ ia64_illegal_op_fault (unsigned long ec, long arg1, long arg2, long arg3, | |||
| 420 | if (die_if_kernel(buf, ®s, 0)) | 426 | if (die_if_kernel(buf, ®s, 0)) |
| 421 | return rv; | 427 | return rv; |
| 422 | 428 | ||
| 423 | memset(&si, 0, sizeof(si)); | 429 | clear_siginfo(&si); |
| 424 | si.si_signo = SIGILL; | 430 | si.si_signo = SIGILL; |
| 425 | si.si_code = ILL_ILLOPC; | 431 | si.si_code = ILL_ILLOPC; |
| 426 | si.si_addr = (void __user *) (regs.cr_iip + ia64_psr(®s)->ri); | 432 | si.si_addr = (void __user *) (regs.cr_iip + ia64_psr(®s)->ri); |
| @@ -434,7 +440,6 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa, | |||
| 434 | long arg7, struct pt_regs regs) | 440 | long arg7, struct pt_regs regs) |
| 435 | { | 441 | { |
| 436 | unsigned long code, error = isr, iip; | 442 | unsigned long code, error = isr, iip; |
| 437 | struct siginfo siginfo; | ||
| 438 | char buf[128]; | 443 | char buf[128]; |
| 439 | int result, sig; | 444 | int result, sig; |
| 440 | static const char *reason[] = { | 445 | static const char *reason[] = { |
| @@ -485,6 +490,7 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa, | |||
| 485 | 490 | ||
| 486 | case 26: /* NaT Consumption */ | 491 | case 26: /* NaT Consumption */ |
| 487 | if (user_mode(®s)) { | 492 | if (user_mode(®s)) { |
| 493 | struct siginfo siginfo; | ||
| 488 | void __user *addr; | 494 | void __user *addr; |
| 489 | 495 | ||
| 490 | if (((isr >> 4) & 0xf) == 2) { | 496 | if (((isr >> 4) & 0xf) == 2) { |
| @@ -499,6 +505,7 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa, | |||
| 499 | addr = (void __user *) (regs.cr_iip | 505 | addr = (void __user *) (regs.cr_iip |
| 500 | + ia64_psr(®s)->ri); | 506 | + ia64_psr(®s)->ri); |
| 501 | } | 507 | } |
| 508 | clear_siginfo(&siginfo); | ||
| 502 | siginfo.si_signo = sig; | 509 | siginfo.si_signo = sig; |
| 503 | siginfo.si_code = code; | 510 | siginfo.si_code = code; |
| 504 | siginfo.si_errno = 0; | 511 | siginfo.si_errno = 0; |
| @@ -515,6 +522,9 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa, | |||
| 515 | 522 | ||
| 516 | case 31: /* Unsupported Data Reference */ | 523 | case 31: /* Unsupported Data Reference */ |
| 517 | if (user_mode(®s)) { | 524 | if (user_mode(®s)) { |
| 525 | struct siginfo siginfo; | ||
| 526 | |||
| 527 | clear_siginfo(&siginfo); | ||
| 518 | siginfo.si_signo = SIGILL; | 528 | siginfo.si_signo = SIGILL; |
| 519 | siginfo.si_code = ILL_ILLOPN; | 529 | siginfo.si_code = ILL_ILLOPN; |
| 520 | siginfo.si_errno = 0; | 530 | siginfo.si_errno = 0; |
| @@ -531,6 +541,10 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa, | |||
| 531 | case 29: /* Debug */ | 541 | case 29: /* Debug */ |
| 532 | case 35: /* Taken Branch Trap */ | 542 | case 35: /* Taken Branch Trap */ |
| 533 | case 36: /* Single Step Trap */ | 543 | case 36: /* Single Step Trap */ |
| 544 | { | ||
| 545 | struct siginfo siginfo; | ||
| 546 | |||
| 547 | clear_siginfo(&siginfo); | ||
| 534 | if (fsys_mode(current, ®s)) { | 548 | if (fsys_mode(current, ®s)) { |
| 535 | extern char __kernel_syscall_via_break[]; | 549 | extern char __kernel_syscall_via_break[]; |
| 536 | /* | 550 | /* |
| @@ -578,11 +592,15 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa, | |||
| 578 | siginfo.si_isr = isr; | 592 | siginfo.si_isr = isr; |
| 579 | force_sig_info(SIGTRAP, &siginfo, current); | 593 | force_sig_info(SIGTRAP, &siginfo, current); |
| 580 | return; | 594 | return; |
| 595 | } | ||
| 581 | 596 | ||
| 582 | case 32: /* fp fault */ | 597 | case 32: /* fp fault */ |
| 583 | case 33: /* fp trap */ | 598 | case 33: /* fp trap */ |
| 584 | result = handle_fpu_swa((vector == 32) ? 1 : 0, ®s, isr); | 599 | result = handle_fpu_swa((vector == 32) ? 1 : 0, ®s, isr); |
| 585 | if ((result < 0) || (current->thread.flags & IA64_THREAD_FPEMU_SIGFPE)) { | 600 | if ((result < 0) || (current->thread.flags & IA64_THREAD_FPEMU_SIGFPE)) { |
| 601 | struct siginfo siginfo; | ||
| 602 | |||
| 603 | clear_siginfo(&siginfo); | ||
| 586 | siginfo.si_signo = SIGFPE; | 604 | siginfo.si_signo = SIGFPE; |
| 587 | siginfo.si_errno = 0; | 605 | siginfo.si_errno = 0; |
| 588 | siginfo.si_code = FPE_FLTINV; | 606 | siginfo.si_code = FPE_FLTINV; |
| @@ -616,6 +634,9 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa, | |||
| 616 | } else { | 634 | } else { |
| 617 | /* Unimplemented Instr. Address Trap */ | 635 | /* Unimplemented Instr. Address Trap */ |
| 618 | if (user_mode(®s)) { | 636 | if (user_mode(®s)) { |
| 637 | struct siginfo siginfo; | ||
| 638 | |||
| 639 | clear_siginfo(&siginfo); | ||
| 619 | siginfo.si_signo = SIGILL; | 640 | siginfo.si_signo = SIGILL; |
| 620 | siginfo.si_code = ILL_BADIADDR; | 641 | siginfo.si_code = ILL_BADIADDR; |
| 621 | siginfo.si_errno = 0; | 642 | siginfo.si_errno = 0; |
diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c index 72e9b4242564..e309f9859acc 100644 --- a/arch/ia64/kernel/unaligned.c +++ b/arch/ia64/kernel/unaligned.c | |||
| @@ -1537,6 +1537,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) | |||
| 1537 | /* NOT_REACHED */ | 1537 | /* NOT_REACHED */ |
| 1538 | } | 1538 | } |
| 1539 | force_sigbus: | 1539 | force_sigbus: |
| 1540 | clear_siginfo(&si); | ||
| 1540 | si.si_signo = SIGBUS; | 1541 | si.si_signo = SIGBUS; |
| 1541 | si.si_errno = 0; | 1542 | si.si_errno = 0; |
| 1542 | si.si_code = BUS_ADRALN; | 1543 | si.si_code = BUS_ADRALN; |
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index dfdc152d6737..817fa120645f 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c | |||
| @@ -85,7 +85,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | |||
| 85 | int signal = SIGSEGV, code = SEGV_MAPERR; | 85 | int signal = SIGSEGV, code = SEGV_MAPERR; |
| 86 | struct vm_area_struct *vma, *prev_vma; | 86 | struct vm_area_struct *vma, *prev_vma; |
| 87 | struct mm_struct *mm = current->mm; | 87 | struct mm_struct *mm = current->mm; |
| 88 | struct siginfo si; | ||
| 89 | unsigned long mask; | 88 | unsigned long mask; |
| 90 | int fault; | 89 | int fault; |
| 91 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 90 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| @@ -249,6 +248,9 @@ retry: | |||
| 249 | return; | 248 | return; |
| 250 | } | 249 | } |
| 251 | if (user_mode(regs)) { | 250 | if (user_mode(regs)) { |
| 251 | struct siginfo si; | ||
| 252 | |||
| 253 | clear_siginfo(&si); | ||
| 252 | si.si_signo = signal; | 254 | si.si_signo = signal; |
| 253 | si.si_errno = 0; | 255 | si.si_errno = 0; |
| 254 | si.si_code = code; | 256 | si.si_code = code; |
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index c1cc4e99aa94..0a00b476236d 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c | |||
| @@ -1011,6 +1011,7 @@ asmlinkage void trap_c(struct frame *fp) | |||
| 1011 | int vector = (fp->ptregs.vector >> 2) & 0xff; | 1011 | int vector = (fp->ptregs.vector >> 2) & 0xff; |
| 1012 | siginfo_t info; | 1012 | siginfo_t info; |
| 1013 | 1013 | ||
| 1014 | clear_siginfo(&info); | ||
| 1014 | if (fp->ptregs.sr & PS_S) { | 1015 | if (fp->ptregs.sr & PS_S) { |
| 1015 | if (vector == VEC_TRACE) { | 1016 | if (vector == VEC_TRACE) { |
| 1016 | /* traced a trapping instruction on a 68020/30, | 1017 | /* traced a trapping instruction on a 68020/30, |
| @@ -1163,6 +1164,7 @@ asmlinkage void fpemu_signal(int signal, int code, void *addr) | |||
| 1163 | { | 1164 | { |
| 1164 | siginfo_t info; | 1165 | siginfo_t info; |
| 1165 | 1166 | ||
| 1167 | clear_siginfo(&info); | ||
| 1166 | info.si_signo = signal; | 1168 | info.si_signo = signal; |
| 1167 | info.si_errno = 0; | 1169 | info.si_errno = 0; |
| 1168 | info.si_code = code; | 1170 | info.si_code = code; |
diff --git a/arch/microblaze/kernel/exceptions.c b/arch/microblaze/kernel/exceptions.c index e6f338d0496b..443ec1feacb4 100644 --- a/arch/microblaze/kernel/exceptions.c +++ b/arch/microblaze/kernel/exceptions.c | |||
| @@ -65,6 +65,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) | |||
| 65 | if (kernel_mode(regs)) | 65 | if (kernel_mode(regs)) |
| 66 | die("Exception in kernel mode", regs, signr); | 66 | die("Exception in kernel mode", regs, signr); |
| 67 | 67 | ||
| 68 | clear_siginfo(&info); | ||
| 68 | info.si_signo = signr; | 69 | info.si_signo = signr; |
| 69 | info.si_errno = 0; | 70 | info.si_errno = 0; |
| 70 | info.si_code = code; | 71 | info.si_code = code; |
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c index f91b30f8aaa8..43d92167012a 100644 --- a/arch/microblaze/mm/fault.c +++ b/arch/microblaze/mm/fault.c | |||
| @@ -88,7 +88,6 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, | |||
| 88 | { | 88 | { |
| 89 | struct vm_area_struct *vma; | 89 | struct vm_area_struct *vma; |
| 90 | struct mm_struct *mm = current->mm; | 90 | struct mm_struct *mm = current->mm; |
| 91 | siginfo_t info; | ||
| 92 | int code = SEGV_MAPERR; | 91 | int code = SEGV_MAPERR; |
| 93 | int is_write = error_code & ESR_S; | 92 | int is_write = error_code & ESR_S; |
| 94 | int fault; | 93 | int fault; |
| @@ -295,6 +294,9 @@ out_of_memory: | |||
| 295 | do_sigbus: | 294 | do_sigbus: |
| 296 | up_read(&mm->mmap_sem); | 295 | up_read(&mm->mmap_sem); |
| 297 | if (user_mode(regs)) { | 296 | if (user_mode(regs)) { |
| 297 | siginfo_t info; | ||
| 298 | |||
| 299 | clear_siginfo(&info); | ||
| 298 | info.si_signo = SIGBUS; | 300 | info.si_signo = SIGBUS; |
| 299 | info.si_errno = 0; | 301 | info.si_errno = 0; |
| 300 | info.si_code = BUS_ADRERR; | 302 | info.si_code = BUS_ADRERR; |
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index 4f8f5bf46977..75392becd933 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
| @@ -63,6 +63,7 @@ static void __kprobes __do_page_fault(struct pt_regs *regs, unsigned long write, | |||
| 63 | return; | 63 | return; |
| 64 | #endif | 64 | #endif |
| 65 | 65 | ||
| 66 | clear_siginfo(&info); | ||
| 66 | info.si_code = SEGV_MAPERR; | 67 | info.si_code = SEGV_MAPERR; |
| 67 | 68 | ||
| 68 | /* | 69 | /* |
diff --git a/arch/nds32/kernel/traps.c b/arch/nds32/kernel/traps.c index 8e9a5b1f6234..46911768f4b5 100644 --- a/arch/nds32/kernel/traps.c +++ b/arch/nds32/kernel/traps.c | |||
| @@ -229,6 +229,7 @@ int bad_syscall(int n, struct pt_regs *regs) | |||
| 229 | return regs->uregs[0]; | 229 | return regs->uregs[0]; |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | clear_siginfo(&info); | ||
| 232 | info.si_signo = SIGILL; | 233 | info.si_signo = SIGILL; |
| 233 | info.si_errno = 0; | 234 | info.si_errno = 0; |
| 234 | info.si_code = ILL_ILLTRP; | 235 | info.si_code = ILL_ILLTRP; |
| @@ -292,7 +293,7 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, | |||
| 292 | tsk->thread.trap_no = ENTRY_DEBUG_RELATED; | 293 | tsk->thread.trap_no = ENTRY_DEBUG_RELATED; |
| 293 | tsk->thread.error_code = error_code; | 294 | tsk->thread.error_code = error_code; |
| 294 | 295 | ||
| 295 | memset(&info, 0, sizeof(info)); | 296 | clear_siginfo(&info); |
| 296 | info.si_signo = SIGTRAP; | 297 | info.si_signo = SIGTRAP; |
| 297 | info.si_code = si_code; | 298 | info.si_code = si_code; |
| 298 | info.si_addr = (void __user *)instruction_pointer(regs); | 299 | info.si_addr = (void __user *)instruction_pointer(regs); |
diff --git a/arch/nds32/mm/fault.c b/arch/nds32/mm/fault.c index 3a246fb8098c..876ee01ff80a 100644 --- a/arch/nds32/mm/fault.c +++ b/arch/nds32/mm/fault.c | |||
| @@ -77,6 +77,7 @@ void do_page_fault(unsigned long entry, unsigned long addr, | |||
| 77 | unsigned int mask = VM_READ | VM_WRITE | VM_EXEC; | 77 | unsigned int mask = VM_READ | VM_WRITE | VM_EXEC; |
| 78 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 78 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| 79 | 79 | ||
| 80 | clear_siginfo(&info); | ||
| 80 | error_code = error_code & (ITYPE_mskINST | ITYPE_mskETYPE); | 81 | error_code = error_code & (ITYPE_mskINST | ITYPE_mskETYPE); |
| 81 | tsk = current; | 82 | tsk = current; |
| 82 | mm = tsk->mm; | 83 | mm = tsk->mm; |
diff --git a/arch/nios2/kernel/traps.c b/arch/nios2/kernel/traps.c index 8184e7d6b385..a69861d3e1a3 100644 --- a/arch/nios2/kernel/traps.c +++ b/arch/nios2/kernel/traps.c | |||
| @@ -28,6 +28,7 @@ static void _send_sig(int signo, int code, unsigned long addr) | |||
| 28 | { | 28 | { |
| 29 | siginfo_t info; | 29 | siginfo_t info; |
| 30 | 30 | ||
| 31 | clear_siginfo(&info); | ||
| 31 | info.si_signo = signo; | 32 | info.si_signo = signo; |
| 32 | info.si_errno = 0; | 33 | info.si_errno = 0; |
| 33 | info.si_code = code; | 34 | info.si_code = code; |
diff --git a/arch/openrisc/kernel/traps.c b/arch/openrisc/kernel/traps.c index 113c175fe469..1610b1d65a11 100644 --- a/arch/openrisc/kernel/traps.c +++ b/arch/openrisc/kernel/traps.c | |||
| @@ -251,7 +251,7 @@ void __init trap_init(void) | |||
| 251 | asmlinkage void do_trap(struct pt_regs *regs, unsigned long address) | 251 | asmlinkage void do_trap(struct pt_regs *regs, unsigned long address) |
| 252 | { | 252 | { |
| 253 | siginfo_t info; | 253 | siginfo_t info; |
| 254 | memset(&info, 0, sizeof(info)); | 254 | clear_siginfo(&info); |
| 255 | info.si_signo = SIGTRAP; | 255 | info.si_signo = SIGTRAP; |
| 256 | info.si_code = TRAP_TRACE; | 256 | info.si_code = TRAP_TRACE; |
| 257 | info.si_addr = (void *)address; | 257 | info.si_addr = (void *)address; |
| @@ -266,6 +266,7 @@ asmlinkage void do_unaligned_access(struct pt_regs *regs, unsigned long address) | |||
| 266 | 266 | ||
| 267 | if (user_mode(regs)) { | 267 | if (user_mode(regs)) { |
| 268 | /* Send a SIGBUS */ | 268 | /* Send a SIGBUS */ |
| 269 | clear_siginfo(&info); | ||
| 269 | info.si_signo = SIGBUS; | 270 | info.si_signo = SIGBUS; |
| 270 | info.si_errno = 0; | 271 | info.si_errno = 0; |
| 271 | info.si_code = BUS_ADRALN; | 272 | info.si_code = BUS_ADRALN; |
| @@ -285,6 +286,7 @@ asmlinkage void do_bus_fault(struct pt_regs *regs, unsigned long address) | |||
| 285 | 286 | ||
| 286 | if (user_mode(regs)) { | 287 | if (user_mode(regs)) { |
| 287 | /* Send a SIGBUS */ | 288 | /* Send a SIGBUS */ |
| 289 | clear_siginfo(&info); | ||
| 288 | info.si_signo = SIGBUS; | 290 | info.si_signo = SIGBUS; |
| 289 | info.si_errno = 0; | 291 | info.si_errno = 0; |
| 290 | info.si_code = BUS_ADRERR; | 292 | info.si_code = BUS_ADRERR; |
| @@ -485,6 +487,7 @@ asmlinkage void do_illegal_instruction(struct pt_regs *regs, | |||
| 485 | 487 | ||
| 486 | if (user_mode(regs)) { | 488 | if (user_mode(regs)) { |
| 487 | /* Send a SIGILL */ | 489 | /* Send a SIGILL */ |
| 490 | clear_siginfo(&info); | ||
| 488 | info.si_signo = SIGILL; | 491 | info.si_signo = SIGILL; |
| 489 | info.si_errno = 0; | 492 | info.si_errno = 0; |
| 490 | info.si_code = ILL_ILLOPC; | 493 | info.si_code = ILL_ILLOPC; |
diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c index d0021dfae20a..68be33e4ae17 100644 --- a/arch/openrisc/mm/fault.c +++ b/arch/openrisc/mm/fault.c | |||
| @@ -56,6 +56,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address, | |||
| 56 | int fault; | 56 | int fault; |
| 57 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 57 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| 58 | 58 | ||
| 59 | clear_siginfo(&info); | ||
| 59 | tsk = current; | 60 | tsk = current; |
| 60 | 61 | ||
| 61 | /* | 62 | /* |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 1a2be6e639b5..b1c12ceb1c88 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
| @@ -90,6 +90,7 @@ void user_enable_single_step(struct task_struct *task) | |||
| 90 | ptrace_disable(task); | 90 | ptrace_disable(task); |
| 91 | /* Don't wake up the task, but let the | 91 | /* Don't wake up the task, but let the |
| 92 | parent know something happened. */ | 92 | parent know something happened. */ |
| 93 | clear_siginfo(&si); | ||
| 93 | si.si_code = TRAP_TRACE; | 94 | si.si_code = TRAP_TRACE; |
| 94 | si.si_addr = (void __user *) (task_regs(task)->iaoq[0] & ~3); | 95 | si.si_addr = (void __user *) (task_regs(task)->iaoq[0] & ~3); |
| 95 | si.si_signo = SIGTRAP; | 96 | si.si_signo = SIGTRAP; |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 68e671a11987..98f9f2f85940 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
| @@ -299,6 +299,7 @@ static void handle_gdb_break(struct pt_regs *regs, int wot) | |||
| 299 | { | 299 | { |
| 300 | struct siginfo si; | 300 | struct siginfo si; |
| 301 | 301 | ||
| 302 | clear_siginfo(&si); | ||
| 302 | si.si_signo = SIGTRAP; | 303 | si.si_signo = SIGTRAP; |
| 303 | si.si_errno = 0; | 304 | si.si_errno = 0; |
| 304 | si.si_code = wot; | 305 | si.si_code = wot; |
| @@ -489,6 +490,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs) | |||
| 489 | unsigned long fault_space = 0; | 490 | unsigned long fault_space = 0; |
| 490 | struct siginfo si; | 491 | struct siginfo si; |
| 491 | 492 | ||
| 493 | clear_siginfo(&si); | ||
| 492 | if (code == 1) | 494 | if (code == 1) |
| 493 | pdc_console_restart(); /* switch back to pdc if HPMC */ | 495 | pdc_console_restart(); /* switch back to pdc if HPMC */ |
| 494 | else | 496 | else |
diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index e36f7b75ab07..30b7c7f6c471 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c | |||
| @@ -455,6 +455,7 @@ void handle_unaligned(struct pt_regs *regs) | |||
| 455 | struct siginfo si; | 455 | struct siginfo si; |
| 456 | register int flop=0; /* true if this is a flop */ | 456 | register int flop=0; /* true if this is a flop */ |
| 457 | 457 | ||
| 458 | clear_siginfo(&si); | ||
| 458 | __inc_irq_stat(irq_unaligned_count); | 459 | __inc_irq_stat(irq_unaligned_count); |
| 459 | 460 | ||
| 460 | /* log a message with pacing */ | 461 | /* log a message with pacing */ |
diff --git a/arch/parisc/math-emu/driver.c b/arch/parisc/math-emu/driver.c index 2fb59d2e2b29..0d10efb53361 100644 --- a/arch/parisc/math-emu/driver.c +++ b/arch/parisc/math-emu/driver.c | |||
| @@ -93,6 +93,7 @@ handle_fpe(struct pt_regs *regs) | |||
| 93 | */ | 93 | */ |
| 94 | __u64 frcopy[36]; | 94 | __u64 frcopy[36]; |
| 95 | 95 | ||
| 96 | clear_siginfo(&si); | ||
| 96 | memcpy(frcopy, regs->fr, sizeof regs->fr); | 97 | memcpy(frcopy, regs->fr, sizeof regs->fr); |
| 97 | frcopy[32] = 0; | 98 | frcopy[32] = 0; |
| 98 | 99 | ||
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index e247edbca68e..657b35096bd8 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
| @@ -356,6 +356,7 @@ bad_area: | |||
| 356 | struct siginfo si; | 356 | struct siginfo si; |
| 357 | unsigned int lsb = 0; | 357 | unsigned int lsb = 0; |
| 358 | 358 | ||
| 359 | clear_siginfo(&si); | ||
| 359 | switch (code) { | 360 | switch (code) { |
| 360 | case 15: /* Data TLB miss fault/Data page fault */ | 361 | case 15: /* Data TLB miss fault/Data page fault */ |
| 361 | /* send SIGSEGV when outside of vma */ | 362 | /* send SIGSEGV when outside of vma */ |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 1237f13fed51..26ea9793d290 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -632,6 +632,7 @@ void do_break (struct pt_regs *regs, unsigned long address, | |||
| 632 | hw_breakpoint_disable(); | 632 | hw_breakpoint_disable(); |
| 633 | 633 | ||
| 634 | /* Deliver the signal to userspace */ | 634 | /* Deliver the signal to userspace */ |
| 635 | clear_siginfo(&info); | ||
| 635 | info.si_signo = SIGTRAP; | 636 | info.si_signo = SIGTRAP; |
| 636 | info.si_errno = 0; | 637 | info.si_errno = 0; |
| 637 | info.si_code = TRAP_HWBKPT; | 638 | info.si_code = TRAP_HWBKPT; |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 0904492e7032..087855caf6a9 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
| @@ -296,7 +296,6 @@ NOKPROBE_SYMBOL(die); | |||
| 296 | void user_single_step_siginfo(struct task_struct *tsk, | 296 | void user_single_step_siginfo(struct task_struct *tsk, |
| 297 | struct pt_regs *regs, siginfo_t *info) | 297 | struct pt_regs *regs, siginfo_t *info) |
| 298 | { | 298 | { |
| 299 | memset(info, 0, sizeof(*info)); | ||
| 300 | info->si_signo = SIGTRAP; | 299 | info->si_signo = SIGTRAP; |
| 301 | info->si_code = TRAP_TRACE; | 300 | info->si_code = TRAP_TRACE; |
| 302 | info->si_addr = (void __user *)regs->nip; | 301 | info->si_addr = (void __user *)regs->nip; |
| @@ -334,7 +333,7 @@ void _exception_pkey(int signr, struct pt_regs *regs, int code, | |||
| 334 | */ | 333 | */ |
| 335 | thread_pkey_regs_save(¤t->thread); | 334 | thread_pkey_regs_save(¤t->thread); |
| 336 | 335 | ||
| 337 | memset(&info, 0, sizeof(info)); | 336 | clear_siginfo(&info); |
| 338 | info.si_signo = signr; | 337 | info.si_signo = signr; |
| 339 | info.si_code = code; | 338 | info.si_code = code; |
| 340 | info.si_addr = (void __user *) addr; | 339 | info.si_addr = (void __user *) addr; |
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index c01d627e687a..ef268d5d9db7 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
| @@ -168,6 +168,7 @@ static int do_sigbus(struct pt_regs *regs, unsigned long address, | |||
| 168 | return SIGBUS; | 168 | return SIGBUS; |
| 169 | 169 | ||
| 170 | current->thread.trap_nr = BUS_ADRERR; | 170 | current->thread.trap_nr = BUS_ADRERR; |
| 171 | clear_siginfo(&info); | ||
| 171 | info.si_signo = SIGBUS; | 172 | info.si_signo = SIGBUS; |
| 172 | info.si_errno = 0; | 173 | info.si_errno = 0; |
| 173 | info.si_code = BUS_ADRERR; | 174 | info.si_code = BUS_ADRERR; |
diff --git a/arch/powerpc/platforms/cell/spufs/fault.c b/arch/powerpc/platforms/cell/spufs/fault.c index 870c0a82d560..1e002e94d0f6 100644 --- a/arch/powerpc/platforms/cell/spufs/fault.c +++ b/arch/powerpc/platforms/cell/spufs/fault.c | |||
| @@ -44,7 +44,7 @@ static void spufs_handle_event(struct spu_context *ctx, | |||
| 44 | return; | 44 | return; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | memset(&info, 0, sizeof(info)); | 47 | clear_siginfo(&info); |
| 48 | 48 | ||
| 49 | switch (type) { | 49 | switch (type) { |
| 50 | case SPE_EVENT_INVALID_DMA: | 50 | case SPE_EVENT_INVALID_DMA: |
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index 93132cb59184..48aa6471cede 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c | |||
| @@ -68,6 +68,7 @@ static inline void do_trap_siginfo(int signo, int code, | |||
| 68 | { | 68 | { |
| 69 | siginfo_t info; | 69 | siginfo_t info; |
| 70 | 70 | ||
| 71 | clear_siginfo(&info); | ||
| 71 | info.si_signo = signo; | 72 | info.si_signo = signo; |
| 72 | info.si_errno = 0; | 73 | info.si_errno = 0; |
| 73 | info.si_code = code; | 74 | info.si_code = code; |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index a5297a22bc1e..3ba649d8aa5a 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
| @@ -47,6 +47,7 @@ void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str) | |||
| 47 | siginfo_t info; | 47 | siginfo_t info; |
| 48 | 48 | ||
| 49 | if (user_mode(regs)) { | 49 | if (user_mode(regs)) { |
| 50 | clear_siginfo(&info); | ||
| 50 | info.si_signo = si_signo; | 51 | info.si_signo = si_signo; |
| 51 | info.si_errno = 0; | 52 | info.si_errno = 0; |
| 52 | info.si_code = si_code; | 53 | info.si_code = si_code; |
| @@ -86,6 +87,7 @@ void do_per_trap(struct pt_regs *regs) | |||
| 86 | return; | 87 | return; |
| 87 | if (!current->ptrace) | 88 | if (!current->ptrace) |
| 88 | return; | 89 | return; |
| 90 | clear_siginfo(&info); | ||
| 89 | info.si_signo = SIGTRAP; | 91 | info.si_signo = SIGTRAP; |
| 90 | info.si_errno = 0; | 92 | info.si_errno = 0; |
| 91 | info.si_code = TRAP_HWBKPT; | 93 | info.si_code = TRAP_HWBKPT; |
| @@ -165,7 +167,6 @@ void translation_exception(struct pt_regs *regs) | |||
| 165 | 167 | ||
| 166 | void illegal_op(struct pt_regs *regs) | 168 | void illegal_op(struct pt_regs *regs) |
| 167 | { | 169 | { |
| 168 | siginfo_t info; | ||
| 169 | __u8 opcode[6]; | 170 | __u8 opcode[6]; |
| 170 | __u16 __user *location; | 171 | __u16 __user *location; |
| 171 | int is_uprobe_insn = 0; | 172 | int is_uprobe_insn = 0; |
| @@ -178,6 +179,8 @@ void illegal_op(struct pt_regs *regs) | |||
| 178 | return; | 179 | return; |
| 179 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { | 180 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { |
| 180 | if (current->ptrace) { | 181 | if (current->ptrace) { |
| 182 | siginfo_t info; | ||
| 183 | clear_siginfo(&info); | ||
| 181 | info.si_signo = SIGTRAP; | 184 | info.si_signo = SIGTRAP; |
| 182 | info.si_errno = 0; | 185 | info.si_errno = 0; |
| 183 | info.si_code = TRAP_BRKPT; | 186 | info.si_code = TRAP_BRKPT; |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 93faeca52284..b3ff0e8e5860 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -268,6 +268,7 @@ static noinline void do_sigsegv(struct pt_regs *regs, int si_code) | |||
| 268 | struct siginfo si; | 268 | struct siginfo si; |
| 269 | 269 | ||
| 270 | report_user_fault(regs, SIGSEGV, 1); | 270 | report_user_fault(regs, SIGSEGV, 1); |
| 271 | clear_siginfo(&si); | ||
| 271 | si.si_signo = SIGSEGV; | 272 | si.si_signo = SIGSEGV; |
| 272 | si.si_errno = 0; | 273 | si.si_errno = 0; |
| 273 | si.si_code = si_code; | 274 | si.si_code = si_code; |
| @@ -323,6 +324,7 @@ static noinline void do_sigbus(struct pt_regs *regs) | |||
| 323 | * Send a sigbus, regardless of whether we were in kernel | 324 | * Send a sigbus, regardless of whether we were in kernel |
| 324 | * or user mode. | 325 | * or user mode. |
| 325 | */ | 326 | */ |
| 327 | clear_siginfo(&si); | ||
| 326 | si.si_signo = SIGBUS; | 328 | si.si_signo = SIGBUS; |
| 327 | si.si_errno = 0; | 329 | si.si_errno = 0; |
| 328 | si.si_code = BUS_ADRERR; | 330 | si.si_code = BUS_ADRERR; |
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index b3770bb26211..e85e59c3d6df 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c | |||
| @@ -537,6 +537,7 @@ uspace_segv: | |||
| 537 | "access (PC %lx PR %lx)\n", current->comm, regs->pc, | 537 | "access (PC %lx PR %lx)\n", current->comm, regs->pc, |
| 538 | regs->pr); | 538 | regs->pr); |
| 539 | 539 | ||
| 540 | clear_siginfo(&info); | ||
| 540 | info.si_signo = SIGBUS; | 541 | info.si_signo = SIGBUS; |
| 541 | info.si_errno = 0; | 542 | info.si_errno = 0; |
| 542 | info.si_code = si_code; | 543 | info.si_code = si_code; |
| @@ -600,6 +601,7 @@ asmlinkage void do_divide_error(unsigned long r4) | |||
| 600 | { | 601 | { |
| 601 | siginfo_t info; | 602 | siginfo_t info; |
| 602 | 603 | ||
| 604 | clear_siginfo(&info); | ||
| 603 | switch (r4) { | 605 | switch (r4) { |
| 604 | case TRAP_DIVZERO_ERROR: | 606 | case TRAP_DIVZERO_ERROR: |
| 605 | info.si_code = FPE_INTDIV; | 607 | info.si_code = FPE_INTDIV; |
diff --git a/arch/sh/math-emu/math.c b/arch/sh/math-emu/math.c index c86f4360c6ce..d6d2213df078 100644 --- a/arch/sh/math-emu/math.c +++ b/arch/sh/math-emu/math.c | |||
| @@ -560,6 +560,7 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
| 560 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); | 560 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); |
| 561 | task_thread_info(tsk)->status |= TS_USEDFPU; | 561 | task_thread_info(tsk)->status |= TS_USEDFPU; |
| 562 | } else { | 562 | } else { |
| 563 | clear_siginfo(&info); | ||
| 563 | info.si_signo = SIGFPE; | 564 | info.si_signo = SIGFPE; |
| 564 | info.si_errno = 0; | 565 | info.si_errno = 0; |
| 565 | info.si_code = FPE_FLTINV; | 566 | info.si_code = FPE_FLTINV; |
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c index 6fd1bf7481c7..4c98b6f20e02 100644 --- a/arch/sh/mm/fault.c +++ b/arch/sh/mm/fault.c | |||
| @@ -44,6 +44,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address, | |||
| 44 | { | 44 | { |
| 45 | siginfo_t info; | 45 | siginfo_t info; |
| 46 | 46 | ||
| 47 | clear_siginfo(&info); | ||
| 47 | info.si_signo = si_signo; | 48 | info.si_signo = si_signo; |
| 48 | info.si_errno = 0; | 49 | info.si_errno = 0; |
| 49 | info.si_code = si_code; | 50 | info.si_code = si_code; |
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c index 454a8af28f13..2219e55206b4 100644 --- a/arch/sparc/kernel/process_64.c +++ b/arch/sparc/kernel/process_64.c | |||
| @@ -520,6 +520,7 @@ static void stack_unaligned(unsigned long sp) | |||
| 520 | { | 520 | { |
| 521 | siginfo_t info; | 521 | siginfo_t info; |
| 522 | 522 | ||
| 523 | clear_siginfo(&info); | ||
| 523 | info.si_signo = SIGBUS; | 524 | info.si_signo = SIGBUS; |
| 524 | info.si_errno = 0; | 525 | info.si_errno = 0; |
| 525 | info.si_code = BUS_ADRALN; | 526 | info.si_code = BUS_ADRALN; |
diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index e8c3cb6b6d08..00f6353fe435 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c | |||
| @@ -152,6 +152,7 @@ sparc_breakpoint (struct pt_regs *regs) | |||
| 152 | #ifdef DEBUG_SPARC_BREAKPOINT | 152 | #ifdef DEBUG_SPARC_BREAKPOINT |
| 153 | printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs->pc, regs->npc); | 153 | printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs->pc, regs->npc); |
| 154 | #endif | 154 | #endif |
| 155 | clear_siginfo(&info); | ||
| 155 | info.si_signo = SIGTRAP; | 156 | info.si_signo = SIGTRAP; |
| 156 | info.si_errno = 0; | 157 | info.si_errno = 0; |
| 157 | info.si_code = TRAP_BRKPT; | 158 | info.si_code = TRAP_BRKPT; |
diff --git a/arch/sparc/kernel/traps_32.c b/arch/sparc/kernel/traps_32.c index 33cd35bf3dc8..03e522274b8b 100644 --- a/arch/sparc/kernel/traps_32.c +++ b/arch/sparc/kernel/traps_32.c | |||
| @@ -104,6 +104,7 @@ void do_hw_interrupt(struct pt_regs *regs, unsigned long type) | |||
| 104 | if(regs->psr & PSR_PS) | 104 | if(regs->psr & PSR_PS) |
| 105 | die_if_kernel("Kernel bad trap", regs); | 105 | die_if_kernel("Kernel bad trap", regs); |
| 106 | 106 | ||
| 107 | clear_siginfo(&info); | ||
| 107 | info.si_signo = SIGILL; | 108 | info.si_signo = SIGILL; |
| 108 | info.si_errno = 0; | 109 | info.si_errno = 0; |
| 109 | info.si_code = ILL_ILLTRP; | 110 | info.si_code = ILL_ILLTRP; |
| @@ -124,6 +125,7 @@ void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, unsigned lon | |||
| 124 | regs->pc, *(unsigned long *)regs->pc); | 125 | regs->pc, *(unsigned long *)regs->pc); |
| 125 | #endif | 126 | #endif |
| 126 | 127 | ||
| 128 | clear_siginfo(&info); | ||
| 127 | info.si_signo = SIGILL; | 129 | info.si_signo = SIGILL; |
| 128 | info.si_errno = 0; | 130 | info.si_errno = 0; |
| 129 | info.si_code = ILL_ILLOPC; | 131 | info.si_code = ILL_ILLOPC; |
| @@ -139,6 +141,7 @@ void do_priv_instruction(struct pt_regs *regs, unsigned long pc, unsigned long n | |||
| 139 | 141 | ||
| 140 | if(psr & PSR_PS) | 142 | if(psr & PSR_PS) |
| 141 | die_if_kernel("Penguin instruction from Penguin mode??!?!", regs); | 143 | die_if_kernel("Penguin instruction from Penguin mode??!?!", regs); |
| 144 | clear_siginfo(&info); | ||
| 142 | info.si_signo = SIGILL; | 145 | info.si_signo = SIGILL; |
| 143 | info.si_errno = 0; | 146 | info.si_errno = 0; |
| 144 | info.si_code = ILL_PRVOPC; | 147 | info.si_code = ILL_PRVOPC; |
| @@ -165,6 +168,7 @@ void do_memaccess_unaligned(struct pt_regs *regs, unsigned long pc, unsigned lon | |||
| 165 | instruction_dump ((unsigned long *) regs->pc); | 168 | instruction_dump ((unsigned long *) regs->pc); |
| 166 | printk ("do_MNA!\n"); | 169 | printk ("do_MNA!\n"); |
| 167 | #endif | 170 | #endif |
| 171 | clear_siginfo(&info); | ||
| 168 | info.si_signo = SIGBUS; | 172 | info.si_signo = SIGBUS; |
| 169 | info.si_errno = 0; | 173 | info.si_errno = 0; |
| 170 | info.si_code = BUS_ADRALN; | 174 | info.si_code = BUS_ADRALN; |
| @@ -303,6 +307,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc, | |||
| 303 | } | 307 | } |
| 304 | 308 | ||
| 305 | fsr = fpt->thread.fsr; | 309 | fsr = fpt->thread.fsr; |
| 310 | clear_siginfo(&info); | ||
| 306 | info.si_signo = SIGFPE; | 311 | info.si_signo = SIGFPE; |
| 307 | info.si_errno = 0; | 312 | info.si_errno = 0; |
| 308 | info.si_addr = (void __user *)pc; | 313 | info.si_addr = (void __user *)pc; |
| @@ -336,6 +341,7 @@ void handle_tag_overflow(struct pt_regs *regs, unsigned long pc, unsigned long n | |||
| 336 | 341 | ||
| 337 | if(psr & PSR_PS) | 342 | if(psr & PSR_PS) |
| 338 | die_if_kernel("Penguin overflow trap from kernel mode", regs); | 343 | die_if_kernel("Penguin overflow trap from kernel mode", regs); |
| 344 | clear_siginfo(&info); | ||
| 339 | info.si_signo = SIGEMT; | 345 | info.si_signo = SIGEMT; |
| 340 | info.si_errno = 0; | 346 | info.si_errno = 0; |
| 341 | info.si_code = EMT_TAGOVF; | 347 | info.si_code = EMT_TAGOVF; |
| @@ -365,6 +371,7 @@ void handle_reg_access(struct pt_regs *regs, unsigned long pc, unsigned long npc | |||
| 365 | printk("Register Access Exception at PC %08lx NPC %08lx PSR %08lx\n", | 371 | printk("Register Access Exception at PC %08lx NPC %08lx PSR %08lx\n", |
| 366 | pc, npc, psr); | 372 | pc, npc, psr); |
| 367 | #endif | 373 | #endif |
| 374 | clear_siginfo(&info); | ||
| 368 | info.si_signo = SIGBUS; | 375 | info.si_signo = SIGBUS; |
| 369 | info.si_errno = 0; | 376 | info.si_errno = 0; |
| 370 | info.si_code = BUS_OBJERR; | 377 | info.si_code = BUS_OBJERR; |
| @@ -378,6 +385,7 @@ void handle_cp_disabled(struct pt_regs *regs, unsigned long pc, unsigned long np | |||
| 378 | { | 385 | { |
| 379 | siginfo_t info; | 386 | siginfo_t info; |
| 380 | 387 | ||
| 388 | clear_siginfo(&info); | ||
| 381 | info.si_signo = SIGILL; | 389 | info.si_signo = SIGILL; |
| 382 | info.si_errno = 0; | 390 | info.si_errno = 0; |
| 383 | info.si_code = ILL_COPROC; | 391 | info.si_code = ILL_COPROC; |
| @@ -395,6 +403,7 @@ void handle_cp_exception(struct pt_regs *regs, unsigned long pc, unsigned long n | |||
| 395 | printk("Co-Processor Exception at PC %08lx NPC %08lx PSR %08lx\n", | 403 | printk("Co-Processor Exception at PC %08lx NPC %08lx PSR %08lx\n", |
| 396 | pc, npc, psr); | 404 | pc, npc, psr); |
| 397 | #endif | 405 | #endif |
| 406 | clear_siginfo(&info); | ||
| 398 | info.si_signo = SIGILL; | 407 | info.si_signo = SIGILL; |
| 399 | info.si_errno = 0; | 408 | info.si_errno = 0; |
| 400 | info.si_code = ILL_COPROC; | 409 | info.si_code = ILL_COPROC; |
| @@ -408,6 +417,7 @@ void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, unsigned long npc | |||
| 408 | { | 417 | { |
| 409 | siginfo_t info; | 418 | siginfo_t info; |
| 410 | 419 | ||
| 420 | clear_siginfo(&info); | ||
| 411 | info.si_signo = SIGFPE; | 421 | info.si_signo = SIGFPE; |
| 412 | info.si_errno = 0; | 422 | info.si_errno = 0; |
| 413 | info.si_code = FPE_INTDIV; | 423 | info.si_code = FPE_INTDIV; |
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index e81072ac52c3..b485b49b87a8 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c | |||
| @@ -107,6 +107,7 @@ void bad_trap(struct pt_regs *regs, long lvl) | |||
| 107 | regs->tpc &= 0xffffffff; | 107 | regs->tpc &= 0xffffffff; |
| 108 | regs->tnpc &= 0xffffffff; | 108 | regs->tnpc &= 0xffffffff; |
| 109 | } | 109 | } |
| 110 | clear_siginfo(&info); | ||
| 110 | info.si_signo = SIGILL; | 111 | info.si_signo = SIGILL; |
| 111 | info.si_errno = 0; | 112 | info.si_errno = 0; |
| 112 | info.si_code = ILL_ILLTRP; | 113 | info.si_code = ILL_ILLTRP; |
| @@ -206,6 +207,7 @@ void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, un | |||
| 206 | regs->tpc &= 0xffffffff; | 207 | regs->tpc &= 0xffffffff; |
| 207 | regs->tnpc &= 0xffffffff; | 208 | regs->tnpc &= 0xffffffff; |
| 208 | } | 209 | } |
| 210 | clear_siginfo(&info); | ||
| 209 | info.si_signo = SIGSEGV; | 211 | info.si_signo = SIGSEGV; |
| 210 | info.si_errno = 0; | 212 | info.si_errno = 0; |
| 211 | info.si_code = SEGV_MAPERR; | 213 | info.si_code = SEGV_MAPERR; |
| @@ -247,6 +249,7 @@ void sun4v_insn_access_exception(struct pt_regs *regs, unsigned long addr, unsig | |||
| 247 | regs->tpc &= 0xffffffff; | 249 | regs->tpc &= 0xffffffff; |
| 248 | regs->tnpc &= 0xffffffff; | 250 | regs->tnpc &= 0xffffffff; |
| 249 | } | 251 | } |
| 252 | clear_siginfo(&info); | ||
| 250 | info.si_signo = SIGSEGV; | 253 | info.si_signo = SIGSEGV; |
| 251 | info.si_errno = 0; | 254 | info.si_errno = 0; |
| 252 | info.si_code = SEGV_MAPERR; | 255 | info.si_code = SEGV_MAPERR; |
| @@ -338,6 +341,7 @@ void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, un | |||
| 338 | if (is_no_fault_exception(regs)) | 341 | if (is_no_fault_exception(regs)) |
| 339 | return; | 342 | return; |
| 340 | 343 | ||
| 344 | clear_siginfo(&info); | ||
| 341 | info.si_signo = SIGSEGV; | 345 | info.si_signo = SIGSEGV; |
| 342 | info.si_errno = 0; | 346 | info.si_errno = 0; |
| 343 | info.si_code = SEGV_MAPERR; | 347 | info.si_code = SEGV_MAPERR; |
| @@ -595,6 +599,7 @@ static void spitfire_ue_log(unsigned long afsr, unsigned long afar, unsigned lon | |||
| 595 | regs->tpc &= 0xffffffff; | 599 | regs->tpc &= 0xffffffff; |
| 596 | regs->tnpc &= 0xffffffff; | 600 | regs->tnpc &= 0xffffffff; |
| 597 | } | 601 | } |
| 602 | clear_siginfo(&info); | ||
| 598 | info.si_signo = SIGBUS; | 603 | info.si_signo = SIGBUS; |
| 599 | info.si_errno = 0; | 604 | info.si_errno = 0; |
| 600 | info.si_code = BUS_OBJERR; | 605 | info.si_code = BUS_OBJERR; |
| @@ -2211,6 +2216,7 @@ bool sun4v_nonresum_error_user_handled(struct pt_regs *regs, | |||
| 2211 | addr += PAGE_SIZE; | 2216 | addr += PAGE_SIZE; |
| 2212 | } | 2217 | } |
| 2213 | } | 2218 | } |
| 2219 | clear_siginfo(&info); | ||
| 2214 | info.si_signo = SIGKILL; | 2220 | info.si_signo = SIGKILL; |
| 2215 | info.si_errno = 0; | 2221 | info.si_errno = 0; |
| 2216 | info.si_trapno = 0; | 2222 | info.si_trapno = 0; |
| @@ -2221,6 +2227,7 @@ bool sun4v_nonresum_error_user_handled(struct pt_regs *regs, | |||
| 2221 | if (attrs & SUN4V_ERR_ATTRS_PIO) { | 2227 | if (attrs & SUN4V_ERR_ATTRS_PIO) { |
| 2222 | siginfo_t info; | 2228 | siginfo_t info; |
| 2223 | 2229 | ||
| 2230 | clear_siginfo(&info); | ||
| 2224 | info.si_signo = SIGBUS; | 2231 | info.si_signo = SIGBUS; |
| 2225 | info.si_code = BUS_ADRERR; | 2232 | info.si_code = BUS_ADRERR; |
| 2226 | info.si_addr = (void __user *)sun4v_get_vaddr(regs); | 2233 | info.si_addr = (void __user *)sun4v_get_vaddr(regs); |
| @@ -2368,6 +2375,7 @@ static void do_fpe_common(struct pt_regs *regs) | |||
| 2368 | regs->tpc &= 0xffffffff; | 2375 | regs->tpc &= 0xffffffff; |
| 2369 | regs->tnpc &= 0xffffffff; | 2376 | regs->tnpc &= 0xffffffff; |
| 2370 | } | 2377 | } |
| 2378 | clear_siginfo(&info); | ||
| 2371 | info.si_signo = SIGFPE; | 2379 | info.si_signo = SIGFPE; |
| 2372 | info.si_errno = 0; | 2380 | info.si_errno = 0; |
| 2373 | info.si_addr = (void __user *)regs->tpc; | 2381 | info.si_addr = (void __user *)regs->tpc; |
| @@ -2440,6 +2448,7 @@ void do_tof(struct pt_regs *regs) | |||
| 2440 | regs->tpc &= 0xffffffff; | 2448 | regs->tpc &= 0xffffffff; |
| 2441 | regs->tnpc &= 0xffffffff; | 2449 | regs->tnpc &= 0xffffffff; |
| 2442 | } | 2450 | } |
| 2451 | clear_siginfo(&info); | ||
| 2443 | info.si_signo = SIGEMT; | 2452 | info.si_signo = SIGEMT; |
| 2444 | info.si_errno = 0; | 2453 | info.si_errno = 0; |
| 2445 | info.si_code = EMT_TAGOVF; | 2454 | info.si_code = EMT_TAGOVF; |
| @@ -2465,6 +2474,7 @@ void do_div0(struct pt_regs *regs) | |||
| 2465 | regs->tpc &= 0xffffffff; | 2474 | regs->tpc &= 0xffffffff; |
| 2466 | regs->tnpc &= 0xffffffff; | 2475 | regs->tnpc &= 0xffffffff; |
| 2467 | } | 2476 | } |
| 2477 | clear_siginfo(&info); | ||
| 2468 | info.si_signo = SIGFPE; | 2478 | info.si_signo = SIGFPE; |
| 2469 | info.si_errno = 0; | 2479 | info.si_errno = 0; |
| 2470 | info.si_code = FPE_INTDIV; | 2480 | info.si_code = FPE_INTDIV; |
| @@ -2666,6 +2676,7 @@ void do_illegal_instruction(struct pt_regs *regs) | |||
| 2666 | } | 2676 | } |
| 2667 | } | 2677 | } |
| 2668 | } | 2678 | } |
| 2679 | clear_siginfo(&info); | ||
| 2669 | info.si_signo = SIGILL; | 2680 | info.si_signo = SIGILL; |
| 2670 | info.si_errno = 0; | 2681 | info.si_errno = 0; |
| 2671 | info.si_code = ILL_ILLOPC; | 2682 | info.si_code = ILL_ILLOPC; |
| @@ -2692,6 +2703,7 @@ void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned lo | |||
| 2692 | if (is_no_fault_exception(regs)) | 2703 | if (is_no_fault_exception(regs)) |
| 2693 | return; | 2704 | return; |
| 2694 | 2705 | ||
| 2706 | clear_siginfo(&info); | ||
| 2695 | info.si_signo = SIGBUS; | 2707 | info.si_signo = SIGBUS; |
| 2696 | info.si_errno = 0; | 2708 | info.si_errno = 0; |
| 2697 | info.si_code = BUS_ADRALN; | 2709 | info.si_code = BUS_ADRALN; |
| @@ -2717,6 +2729,7 @@ void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_c | |||
| 2717 | if (is_no_fault_exception(regs)) | 2729 | if (is_no_fault_exception(regs)) |
| 2718 | return; | 2730 | return; |
| 2719 | 2731 | ||
| 2732 | clear_siginfo(&info); | ||
| 2720 | info.si_signo = SIGBUS; | 2733 | info.si_signo = SIGBUS; |
| 2721 | info.si_errno = 0; | 2734 | info.si_errno = 0; |
| 2722 | info.si_code = BUS_ADRALN; | 2735 | info.si_code = BUS_ADRALN; |
| @@ -2785,6 +2798,7 @@ void do_privop(struct pt_regs *regs) | |||
| 2785 | regs->tpc &= 0xffffffff; | 2798 | regs->tpc &= 0xffffffff; |
| 2786 | regs->tnpc &= 0xffffffff; | 2799 | regs->tnpc &= 0xffffffff; |
| 2787 | } | 2800 | } |
| 2801 | clear_siginfo(&info); | ||
| 2788 | info.si_signo = SIGILL; | 2802 | info.si_signo = SIGILL; |
| 2789 | info.si_errno = 0; | 2803 | info.si_errno = 0; |
| 2790 | info.si_code = ILL_PRVOPC; | 2804 | info.si_code = ILL_PRVOPC; |
diff --git a/arch/sparc/kernel/unaligned_32.c b/arch/sparc/kernel/unaligned_32.c index 7642d7e4f0d9..0e4cf7217413 100644 --- a/arch/sparc/kernel/unaligned_32.c +++ b/arch/sparc/kernel/unaligned_32.c | |||
| @@ -313,6 +313,7 @@ static void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) | |||
| 313 | { | 313 | { |
| 314 | siginfo_t info; | 314 | siginfo_t info; |
| 315 | 315 | ||
| 316 | clear_siginfo(&info); | ||
| 316 | info.si_signo = SIGBUS; | 317 | info.si_signo = SIGBUS; |
| 317 | info.si_errno = 0; | 318 | info.si_errno = 0; |
| 318 | info.si_code = BUS_ADRALN; | 319 | info.si_code = BUS_ADRALN; |
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index a8103a84b4ac..2deb586665b9 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
| @@ -129,6 +129,7 @@ static void __do_fault_siginfo(int code, int sig, struct pt_regs *regs, | |||
| 129 | { | 129 | { |
| 130 | siginfo_t info; | 130 | siginfo_t info; |
| 131 | 131 | ||
| 132 | clear_siginfo(&info); | ||
| 132 | info.si_signo = sig; | 133 | info.si_signo = sig; |
| 133 | info.si_code = code; | 134 | info.si_code = code; |
| 134 | info.si_errno = 0; | 135 | info.si_errno = 0; |
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 41363f46797b..46ccff95d10e 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c | |||
| @@ -172,6 +172,7 @@ static void do_fault_siginfo(int code, int sig, struct pt_regs *regs, | |||
| 172 | unsigned long addr; | 172 | unsigned long addr; |
| 173 | siginfo_t info; | 173 | siginfo_t info; |
| 174 | 174 | ||
| 175 | clear_siginfo(&info); | ||
| 175 | info.si_code = code; | 176 | info.si_code = code; |
| 176 | info.si_signo = sig; | 177 | info.si_signo = sig; |
| 177 | info.si_errno = 0; | 178 | info.si_errno = 0; |
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index b2b02df9896e..d4d38520c4c6 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c | |||
| @@ -164,6 +164,7 @@ static void bad_segv(struct faultinfo fi, unsigned long ip) | |||
| 164 | { | 164 | { |
| 165 | struct siginfo si; | 165 | struct siginfo si; |
| 166 | 166 | ||
| 167 | clear_siginfo(&si); | ||
| 167 | si.si_signo = SIGSEGV; | 168 | si.si_signo = SIGSEGV; |
| 168 | si.si_code = SEGV_ACCERR; | 169 | si.si_code = SEGV_ACCERR; |
| 169 | si.si_addr = (void __user *) FAULT_ADDRESS(fi); | 170 | si.si_addr = (void __user *) FAULT_ADDRESS(fi); |
| @@ -220,6 +221,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, | |||
| 220 | int is_write = FAULT_WRITE(fi); | 221 | int is_write = FAULT_WRITE(fi); |
| 221 | unsigned long address = FAULT_ADDRESS(fi); | 222 | unsigned long address = FAULT_ADDRESS(fi); |
| 222 | 223 | ||
| 224 | clear_siginfo(&si); | ||
| 223 | if (!is_user && regs) | 225 | if (!is_user && regs) |
| 224 | current->thread.segv_regs = container_of(regs, struct pt_regs, regs); | 226 | current->thread.segv_regs = container_of(regs, struct pt_regs, regs); |
| 225 | 227 | ||
diff --git a/arch/unicore32/kernel/fpu-ucf64.c b/arch/unicore32/kernel/fpu-ucf64.c index 12c8c9527b8e..d785955e1c29 100644 --- a/arch/unicore32/kernel/fpu-ucf64.c +++ b/arch/unicore32/kernel/fpu-ucf64.c | |||
| @@ -56,7 +56,7 @@ void ucf64_raise_sigfpe(unsigned int sicode, struct pt_regs *regs) | |||
| 56 | { | 56 | { |
| 57 | siginfo_t info; | 57 | siginfo_t info; |
| 58 | 58 | ||
| 59 | memset(&info, 0, sizeof(info)); | 59 | clear_siginfo(&info); |
| 60 | 60 | ||
| 61 | info.si_signo = SIGFPE; | 61 | info.si_signo = SIGFPE; |
| 62 | info.si_code = sicode; | 62 | info.si_code = sicode; |
diff --git a/arch/unicore32/mm/fault.c b/arch/unicore32/mm/fault.c index bbefcc46a45e..381473412937 100644 --- a/arch/unicore32/mm/fault.c +++ b/arch/unicore32/mm/fault.c | |||
| @@ -125,6 +125,7 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr, | |||
| 125 | tsk->thread.address = addr; | 125 | tsk->thread.address = addr; |
| 126 | tsk->thread.error_code = fsr; | 126 | tsk->thread.error_code = fsr; |
| 127 | tsk->thread.trap_no = 14; | 127 | tsk->thread.trap_no = 14; |
| 128 | clear_siginfo(&si); | ||
| 128 | si.si_signo = sig; | 129 | si.si_signo = sig; |
| 129 | si.si_errno = 0; | 130 | si.si_errno = 0; |
| 130 | si.si_code = code; | 131 | si.si_code = code; |
| @@ -472,6 +473,7 @@ asmlinkage void do_DataAbort(unsigned long addr, unsigned int fsr, | |||
| 472 | printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n", | 473 | printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n", |
| 473 | inf->name, fsr, addr); | 474 | inf->name, fsr, addr); |
| 474 | 475 | ||
| 476 | clear_siginfo(&info); | ||
| 475 | info.si_signo = inf->sig; | 477 | info.si_signo = inf->sig; |
| 476 | info.si_errno = 0; | 478 | info.si_errno = 0; |
| 477 | info.si_code = inf->code; | 479 | info.si_code = inf->code; |
| @@ -491,6 +493,7 @@ asmlinkage void do_PrefetchAbort(unsigned long addr, | |||
| 491 | printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", | 493 | printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", |
| 492 | inf->name, ifsr, addr); | 494 | inf->name, ifsr, addr); |
| 493 | 495 | ||
| 496 | clear_siginfo(&info); | ||
| 494 | info.si_signo = inf->sig; | 497 | info.si_signo = inf->sig; |
| 495 | info.si_errno = 0; | 498 | info.si_errno = 0; |
| 496 | info.si_code = inf->code; | 499 | info.si_code = inf->code; |
diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c index 70b7845434cb..7782cdbcd67d 100644 --- a/arch/x86/entry/vsyscall/vsyscall_64.c +++ b/arch/x86/entry/vsyscall/vsyscall_64.c | |||
| @@ -107,7 +107,7 @@ static bool write_ok_or_segv(unsigned long ptr, size_t size) | |||
| 107 | thread->cr2 = ptr; | 107 | thread->cr2 = ptr; |
| 108 | thread->trap_nr = X86_TRAP_PF; | 108 | thread->trap_nr = X86_TRAP_PF; |
| 109 | 109 | ||
| 110 | memset(&info, 0, sizeof(info)); | 110 | clear_siginfo(&info); |
| 111 | info.si_signo = SIGSEGV; | 111 | info.si_signo = SIGSEGV; |
| 112 | info.si_errno = 0; | 112 | info.si_errno = 0; |
| 113 | info.si_code = SEGV_MAPERR; | 113 | info.si_code = SEGV_MAPERR; |
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index ed5c4cdf0a34..e2ee403865eb 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
| @@ -1377,7 +1377,6 @@ static void fill_sigtrap_info(struct task_struct *tsk, | |||
| 1377 | tsk->thread.trap_nr = X86_TRAP_DB; | 1377 | tsk->thread.trap_nr = X86_TRAP_DB; |
| 1378 | tsk->thread.error_code = error_code; | 1378 | tsk->thread.error_code = error_code; |
| 1379 | 1379 | ||
| 1380 | memset(info, 0, sizeof(*info)); | ||
| 1381 | info->si_signo = SIGTRAP; | 1380 | info->si_signo = SIGTRAP; |
| 1382 | info->si_code = si_code; | 1381 | info->si_code = si_code; |
| 1383 | info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL; | 1382 | info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL; |
| @@ -1395,6 +1394,7 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, | |||
| 1395 | { | 1394 | { |
| 1396 | struct siginfo info; | 1395 | struct siginfo info; |
| 1397 | 1396 | ||
| 1397 | clear_siginfo(&info); | ||
| 1398 | fill_sigtrap_info(tsk, regs, error_code, si_code, &info); | 1398 | fill_sigtrap_info(tsk, regs, error_code, si_code, &info); |
| 1399 | /* Send us the fake SIGTRAP */ | 1399 | /* Send us the fake SIGTRAP */ |
| 1400 | force_sig_info(SIGTRAP, &info, tsk); | 1400 | force_sig_info(SIGTRAP, &info, tsk); |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 03f3d7695dac..a535dd64de63 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -299,6 +299,7 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str, | |||
| 299 | if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != | 299 | if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != |
| 300 | NOTIFY_STOP) { | 300 | NOTIFY_STOP) { |
| 301 | cond_local_irq_enable(regs); | 301 | cond_local_irq_enable(regs); |
| 302 | clear_siginfo(&info); | ||
| 302 | do_trap(trapnr, signr, str, regs, error_code, | 303 | do_trap(trapnr, signr, str, regs, error_code, |
| 303 | fill_trap_info(regs, signr, trapnr, &info)); | 304 | fill_trap_info(regs, signr, trapnr, &info)); |
| 304 | } | 305 | } |
| @@ -854,6 +855,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr) | |||
| 854 | 855 | ||
| 855 | task->thread.trap_nr = trapnr; | 856 | task->thread.trap_nr = trapnr; |
| 856 | task->thread.error_code = error_code; | 857 | task->thread.error_code = error_code; |
| 858 | clear_siginfo(&info); | ||
| 857 | info.si_signo = SIGFPE; | 859 | info.si_signo = SIGFPE; |
| 858 | info.si_errno = 0; | 860 | info.si_errno = 0; |
| 859 | info.si_addr = (void __user *)uprobe_get_trap_addr(regs); | 861 | info.si_addr = (void __user *)uprobe_get_trap_addr(regs); |
| @@ -929,6 +931,7 @@ dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code) | |||
| 929 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); | 931 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); |
| 930 | local_irq_enable(); | 932 | local_irq_enable(); |
| 931 | 933 | ||
| 934 | clear_siginfo(&info); | ||
| 932 | info.si_signo = SIGILL; | 935 | info.si_signo = SIGILL; |
| 933 | info.si_errno = 0; | 936 | info.si_errno = 0; |
| 934 | info.si_code = ILL_BADSTK; | 937 | info.si_code = ILL_BADSTK; |
diff --git a/arch/x86/kernel/umip.c b/arch/x86/kernel/umip.c index f44ce0fb3583..ff20b35e98dd 100644 --- a/arch/x86/kernel/umip.c +++ b/arch/x86/kernel/umip.c | |||
| @@ -278,6 +278,7 @@ static void force_sig_info_umip_fault(void __user *addr, struct pt_regs *regs) | |||
| 278 | tsk->thread.error_code = X86_PF_USER | X86_PF_WRITE; | 278 | tsk->thread.error_code = X86_PF_USER | X86_PF_WRITE; |
| 279 | tsk->thread.trap_nr = X86_TRAP_PF; | 279 | tsk->thread.trap_nr = X86_TRAP_PF; |
| 280 | 280 | ||
| 281 | clear_siginfo(&info); | ||
| 281 | info.si_signo = SIGSEGV; | 282 | info.si_signo = SIGSEGV; |
| 282 | info.si_errno = 0; | 283 | info.si_errno = 0; |
| 283 | info.si_code = SEGV_MAPERR; | 284 | info.si_code = SEGV_MAPERR; |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 8494dbae41b9..d634f0332c0f 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -3007,6 +3007,7 @@ static void kvm_send_hwpoison_signal(unsigned long address, struct task_struct * | |||
| 3007 | { | 3007 | { |
| 3008 | siginfo_t info; | 3008 | siginfo_t info; |
| 3009 | 3009 | ||
| 3010 | clear_siginfo(&info); | ||
| 3010 | info.si_signo = SIGBUS; | 3011 | info.si_signo = SIGBUS; |
| 3011 | info.si_errno = 0; | 3012 | info.si_errno = 0; |
| 3012 | info.si_code = BUS_MCEERR_AR; | 3013 | info.si_code = BUS_MCEERR_AR; |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 73bd8c95ac71..2a5a2920203d 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -209,6 +209,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address, | |||
| 209 | unsigned lsb = 0; | 209 | unsigned lsb = 0; |
| 210 | siginfo_t info; | 210 | siginfo_t info; |
| 211 | 211 | ||
| 212 | clear_siginfo(&info); | ||
| 212 | info.si_signo = si_signo; | 213 | info.si_signo = si_signo; |
| 213 | info.si_errno = 0; | 214 | info.si_errno = 0; |
| 214 | info.si_code = si_code; | 215 | info.si_code = si_code; |
diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c index 32c5207f1226..51771929f341 100644 --- a/arch/xtensa/kernel/traps.c +++ b/arch/xtensa/kernel/traps.c | |||
| @@ -334,6 +334,7 @@ do_unaligned_user (struct pt_regs *regs) | |||
| 334 | "(pid = %d, pc = %#010lx)\n", | 334 | "(pid = %d, pc = %#010lx)\n", |
| 335 | regs->excvaddr, current->comm, | 335 | regs->excvaddr, current->comm, |
| 336 | task_pid_nr(current), regs->pc); | 336 | task_pid_nr(current), regs->pc); |
| 337 | clear_siginfo(&info); | ||
| 337 | info.si_signo = SIGBUS; | 338 | info.si_signo = SIGBUS; |
| 338 | info.si_errno = 0; | 339 | info.si_errno = 0; |
| 339 | info.si_code = BUS_ADRALN; | 340 | info.si_code = BUS_ADRALN; |
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c index 8b9b6f44bb06..f9323a3e61ce 100644 --- a/arch/xtensa/mm/fault.c +++ b/arch/xtensa/mm/fault.c | |||
| @@ -45,6 +45,7 @@ void do_page_fault(struct pt_regs *regs) | |||
| 45 | int fault; | 45 | int fault; |
| 46 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 46 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| 47 | 47 | ||
| 48 | clear_siginfo(&info); | ||
| 48 | info.si_code = SEGV_MAPERR; | 49 | info.si_code = SEGV_MAPERR; |
| 49 | 50 | ||
| 50 | /* We fault-in kernel-space virtual memory on-demand. The | 51 | /* We fault-in kernel-space virtual memory on-demand. The |
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 919b2a0b0307..037bf0ef1ae9 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h | |||
| @@ -345,7 +345,6 @@ extern void user_single_step_siginfo(struct task_struct *tsk, | |||
| 345 | static inline void user_single_step_siginfo(struct task_struct *tsk, | 345 | static inline void user_single_step_siginfo(struct task_struct *tsk, |
| 346 | struct pt_regs *regs, siginfo_t *info) | 346 | struct pt_regs *regs, siginfo_t *info) |
| 347 | { | 347 | { |
| 348 | memset(info, 0, sizeof(*info)); | ||
| 349 | info->si_signo = SIGTRAP; | 348 | info->si_signo = SIGTRAP; |
| 350 | } | 349 | } |
| 351 | #endif | 350 | #endif |
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h index 26c152122a42..4a8841963c2e 100644 --- a/include/linux/tracehook.h +++ b/include/linux/tracehook.h | |||
| @@ -124,6 +124,7 @@ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step) | |||
| 124 | { | 124 | { |
| 125 | if (step) { | 125 | if (step) { |
| 126 | siginfo_t info; | 126 | siginfo_t info; |
| 127 | clear_siginfo(&info); | ||
| 127 | user_single_step_siginfo(current, regs, &info); | 128 | user_single_step_siginfo(current, regs, &info); |
| 128 | force_sig_info(SIGTRAP, &info, current); | 129 | force_sig_info(SIGTRAP, &info, current); |
| 129 | return; | 130 | return; |
diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 7f6a944db23d..8d90de213ce9 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c | |||
| @@ -1401,6 +1401,7 @@ static void kvm_send_hwpoison_signal(unsigned long address, | |||
| 1401 | { | 1401 | { |
| 1402 | siginfo_t info; | 1402 | siginfo_t info; |
| 1403 | 1403 | ||
| 1404 | clear_siginfo(&info); | ||
| 1404 | info.si_signo = SIGBUS; | 1405 | info.si_signo = SIGBUS; |
| 1405 | info.si_errno = 0; | 1406 | info.si_errno = 0; |
| 1406 | info.si_code = BUS_MCEERR_AR; | 1407 | info.si_code = BUS_MCEERR_AR; |
