Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'siginfo-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace

Pull siginfo updates from Eric Biederman:
"This set of changes close the known issues with setting si_code to an
invalid value, and with not fully initializing struct siginfo. There
remains work to do on nds32, arc, unicore32, powerpc, arm, arm64, ia64
and x86 to get the code that generates siginfo into a simpler and more
maintainable state. Most of that work involves refactoring the signal
handling code and thus careful code review.

Also not included is the work to shrink the in kernel version of
struct siginfo. That depends on getting the number of places that
directly manipulate struct siginfo under control, as it requires the
introduction of struct kernel_siginfo for the in kernel things.

Overall this set of changes looks like it is making good progress, and
with a little luck I will be wrapping up the siginfo work next
development cycle"

* 'siginfo-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: (46 commits)
signal/sh: Stop gcc warning about an impossible case in do_divide_error
signal/mips: Report FPE_FLTUNK for undiagnosed floating point exceptions
signal/um: More carefully relay signals in relay_signal.
signal: Extend siginfo_layout with SIL_FAULT_{MCEERR|BNDERR|PKUERR}
signal: Remove unncessary #ifdef SEGV_PKUERR in 32bit compat code
signal/signalfd: Add support for SIGSYS
signal/signalfd: Remove __put_user from signalfd_copyinfo
signal/xtensa: Use force_sig_fault where appropriate
signal/xtensa: Consistenly use SIGBUS in do_unaligned_user
signal/um: Use force_sig_fault where appropriate
signal/sparc: Use force_sig_fault where appropriate
signal/sparc: Use send_sig_fault where appropriate
signal/sh: Use force_sig_fault where appropriate
signal/s390: Use force_sig_fault where appropriate
signal/riscv: Replace do_trap_siginfo with force_sig_fault
signal/riscv: Use force_sig_fault where appropriate
signal/parisc: Use force_sig_fault where appropriate
signal/parisc: Use force_sig_mceerr where appropriate
signal/openrisc: Use force_sig_fault where appropriate
signal/nios2: Use force_sig_fault where appropriate
...

+493 -1066
-14
arch/alpha/include/uapi/asm/siginfo.h
··· 7 7 8 8 #include <asm-generic/siginfo.h> 9 9 10 - /* 11 - * SIGFPE si_codes 12 - */ 13 - #ifdef __KERNEL__ 14 - #define FPE_FIXME 0 /* Broken dup of SI_USER */ 15 - #endif /* __KERNEL__ */ 16 - 17 - /* 18 - * SIGTRAP si_codes 19 - */ 20 - #ifdef __KERNEL__ 21 - #define TRAP_FIXME 0 /* Broken dup of SI_USER */ 22 - #endif /* __KERNEL__ */ 23 - 24 10 #endif
+4 -7
arch/alpha/kernel/osf_sys.c
··· 871 871 send a signal. Old exceptions are not signaled. */ 872 872 fex = (exc >> IEEE_STATUS_TO_EXCSUM_SHIFT) & swcr; 873 873 if (fex) { 874 - siginfo_t info; 875 - int si_code = 0; 874 + int si_code = FPE_FLTUNK; 876 875 877 876 if (fex & IEEE_TRAP_ENABLE_DNO) si_code = FPE_FLTUND; 878 877 if (fex & IEEE_TRAP_ENABLE_INE) si_code = FPE_FLTRES; ··· 880 881 if (fex & IEEE_TRAP_ENABLE_DZE) si_code = FPE_FLTDIV; 881 882 if (fex & IEEE_TRAP_ENABLE_INV) si_code = FPE_FLTINV; 882 883 883 - info.si_signo = SIGFPE; 884 - info.si_errno = 0; 885 - info.si_code = si_code; 886 - info.si_addr = NULL; /* FIXME */ 887 - send_sig_info(SIGFPE, &info, current); 884 + send_sig_fault(SIGFPE, si_code, 885 + (void __user *)NULL, /* FIXME */ 886 + 0, current); 888 887 } 889 888 return 0; 890 889 }
+4 -16
arch/alpha/kernel/signal.c
··· 219 219 220 220 /* Send SIGTRAP if we're single-stepping: */ 221 221 if (ptrace_cancel_bpt (current)) { 222 - siginfo_t info; 223 - 224 - info.si_signo = SIGTRAP; 225 - info.si_errno = 0; 226 - info.si_code = TRAP_BRKPT; 227 - info.si_addr = (void __user *) regs->pc; 228 - info.si_trapno = 0; 229 - send_sig_info(SIGTRAP, &info, current); 222 + send_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *) regs->pc, 0, 223 + current); 230 224 } 231 225 return; 232 226 ··· 247 253 248 254 /* Send SIGTRAP if we're single-stepping: */ 249 255 if (ptrace_cancel_bpt (current)) { 250 - siginfo_t info; 251 - 252 - info.si_signo = SIGTRAP; 253 - info.si_errno = 0; 254 - info.si_code = TRAP_BRKPT; 255 - info.si_addr = (void __user *) regs->pc; 256 - info.si_trapno = 0; 257 - send_sig_info(SIGTRAP, &info, current); 256 + send_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *) regs->pc, 0, 257 + current); 258 258 } 259 259 return; 260 260
+20 -59
arch/alpha/kernel/traps.c
··· 213 213 struct pt_regs *regs) 214 214 { 215 215 long si_code = FPE_FLTINV; 216 - siginfo_t info; 217 216 218 217 if (summary & 1) { 219 218 /* Software-completion summary bit is set, so try to ··· 227 228 } 228 229 die_if_kernel("Arithmetic fault", regs, 0, NULL); 229 230 230 - info.si_signo = SIGFPE; 231 - info.si_errno = 0; 232 - info.si_code = si_code; 233 - info.si_addr = (void __user *) regs->pc; 234 - send_sig_info(SIGFPE, &info, current); 231 + send_sig_fault(SIGFPE, si_code, (void __user *) regs->pc, 0, current); 235 232 } 236 233 237 234 asmlinkage void 238 235 do_entIF(unsigned long type, struct pt_regs *regs) 239 236 { 240 - siginfo_t info; 241 237 int signo, code; 242 238 243 239 if ((regs->ps & ~IPL_MAX) == 0) { ··· 264 270 265 271 switch (type) { 266 272 case 0: /* breakpoint */ 267 - info.si_signo = SIGTRAP; 268 - info.si_errno = 0; 269 - info.si_code = TRAP_BRKPT; 270 - info.si_trapno = 0; 271 - info.si_addr = (void __user *) regs->pc; 272 - 273 273 if (ptrace_cancel_bpt(current)) { 274 274 regs->pc -= 4; /* make pc point to former bpt */ 275 275 } 276 276 277 - send_sig_info(SIGTRAP, &info, current); 277 + send_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->pc, 0, 278 + current); 278 279 return; 279 280 280 281 case 1: /* bugcheck */ 281 - info.si_signo = SIGTRAP; 282 - info.si_errno = 0; 283 - info.si_code = TRAP_FIXME; 284 - info.si_addr = (void __user *) regs->pc; 285 - info.si_trapno = 0; 286 - send_sig_info(SIGTRAP, &info, current); 282 + send_sig_fault(SIGTRAP, TRAP_UNK, (void __user *) regs->pc, 0, 283 + current); 287 284 return; 288 285 289 286 case 2: /* gentrap */ 290 - info.si_addr = (void __user *) regs->pc; 291 - info.si_trapno = regs->r16; 292 287 switch ((long) regs->r16) { 293 288 case GEN_INTOVF: 294 289 signo = SIGFPE; ··· 309 326 break; 310 327 case GEN_ROPRAND: 311 328 signo = SIGFPE; 312 - code = FPE_FIXME; 329 + code = FPE_FLTUNK; 313 330 break; 314 331 315 332 case GEN_DECOVF: ··· 331 348 case GEN_SUBRNG7: 332 349 default: 333 350 signo = SIGTRAP; 334 - code = TRAP_FIXME; 351 + code = TRAP_UNK; 335 352 break; 336 353 } 337 354 338 - info.si_signo = signo; 339 - info.si_errno = 0; 340 - info.si_code = code; 341 - info.si_addr = (void __user *) regs->pc; 342 - send_sig_info(signo, &info, current); 355 + send_sig_fault(signo, code, (void __user *) regs->pc, regs->r16, 356 + current); 343 357 return; 344 358 345 359 case 4: /* opDEC */ ··· 360 380 if (si_code == 0) 361 381 return; 362 382 if (si_code > 0) { 363 - info.si_signo = SIGFPE; 364 - info.si_errno = 0; 365 - info.si_code = si_code; 366 - info.si_addr = (void __user *) regs->pc; 367 - send_sig_info(SIGFPE, &info, current); 383 + send_sig_fault(SIGFPE, si_code, 384 + (void __user *) regs->pc, 0, 385 + current); 368 386 return; 369 387 } 370 388 } ··· 387 409 ; 388 410 } 389 411 390 - info.si_signo = SIGILL; 391 - info.si_errno = 0; 392 - info.si_code = ILL_ILLOPC; 393 - info.si_addr = (void __user *) regs->pc; 394 - send_sig_info(SIGILL, &info, current); 412 + send_sig_fault(SIGILL, ILL_ILLOPC, (void __user *)regs->pc, 0, current); 395 413 } 396 414 397 415 /* There is an ifdef in the PALcode in MILO that enables a ··· 400 426 asmlinkage void 401 427 do_entDbg(struct pt_regs *regs) 402 428 { 403 - siginfo_t info; 404 - 405 429 die_if_kernel("Instruction fault", regs, 0, NULL); 406 430 407 - info.si_signo = SIGILL; 408 - info.si_errno = 0; 409 - info.si_code = ILL_ILLOPC; 410 - info.si_addr = (void __user *) regs->pc; 411 - force_sig_info(SIGILL, &info, current); 431 + force_sig_fault(SIGILL, ILL_ILLOPC, (void __user *)regs->pc, 0, current); 412 432 } 413 433 414 434 ··· 726 758 727 759 unsigned long tmp1, tmp2, tmp3, tmp4; 728 760 unsigned long fake_reg, *reg_addr = &fake_reg; 729 - siginfo_t info; 761 + int si_code; 730 762 long error; 731 763 732 764 /* Check the UAC bits to decide what the user wants us to do ··· 949 981 950 982 give_sigsegv: 951 983 regs->pc -= 4; /* make pc point to faulting insn */ 952 - info.si_signo = SIGSEGV; 953 - info.si_errno = 0; 954 984 955 985 /* We need to replicate some of the logic in mm/fault.c, 956 986 since we don't have access to the fault code in the 957 987 exception handling return path. */ 958 988 if ((unsigned long)va >= TASK_SIZE) 959 - info.si_code = SEGV_ACCERR; 989 + si_code = SEGV_ACCERR; 960 990 else { 961 991 struct mm_struct *mm = current->mm; 962 992 down_read(&mm->mmap_sem); 963 993 if (find_vma(mm, (unsigned long)va)) 964 - info.si_code = SEGV_ACCERR; 994 + si_code = SEGV_ACCERR; 965 995 else 966 - info.si_code = SEGV_MAPERR; 996 + si_code = SEGV_MAPERR; 967 997 up_read(&mm->mmap_sem); 968 998 } 969 - info.si_addr = va; 970 - send_sig_info(SIGSEGV, &info, current); 999 + send_sig_fault(SIGSEGV, si_code, va, 0, current); 971 1000 return; 972 1001 973 1002 give_sigbus: 974 1003 regs->pc -= 4; 975 - info.si_signo = SIGBUS; 976 - info.si_errno = 0; 977 - info.si_code = BUS_ADRALN; 978 - info.si_addr = va; 979 - send_sig_info(SIGBUS, &info, current); 1004 + send_sig_fault(SIGBUS, BUS_ADRALN, va, 0, current); 980 1005 return; 981 1006 } 982 1007
+2 -11
arch/alpha/mm/fault.c
··· 88 88 struct mm_struct *mm = current->mm; 89 89 const struct exception_table_entry *fixup; 90 90 int fault, si_code = SEGV_MAPERR; 91 - siginfo_t info; 92 91 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 93 92 94 93 /* As of EV6, a load into $31/$f31 is a prefetch, and never faults ··· 220 221 up_read(&mm->mmap_sem); 221 222 /* Send a sigbus, regardless of whether we were in kernel 222 223 or user mode. */ 223 - info.si_signo = SIGBUS; 224 - info.si_errno = 0; 225 - info.si_code = BUS_ADRERR; 226 - info.si_addr = (void __user *) address; 227 - force_sig_info(SIGBUS, &info, current); 224 + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *) address, 0, current); 228 225 if (!user_mode(regs)) 229 226 goto no_context; 230 227 return; 231 228 232 229 do_sigsegv: 233 - info.si_signo = SIGSEGV; 234 - info.si_errno = 0; 235 - info.si_code = si_code; 236 - info.si_addr = (void __user *) address; 237 - force_sig_info(SIGSEGV, &info, current); 230 + force_sig_fault(SIGSEGV, si_code, (void __user *) address, 0, current); 238 231 return; 239 232 240 233 #ifdef CONFIG_ALPHA_LARGE_VMALLOC
+2
arch/arc/mm/fault.c
··· 70 70 int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ 71 71 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 72 72 73 + clear_siginfo(&info); 74 + 73 75 /* 74 76 * We fault-in kernel-space virtual memory on-demand. The 75 77 * 'reference' page table is init_mm.pgd.
+1
arch/arm/kernel/ptrace.c
··· 205 205 { 206 206 siginfo_t info; 207 207 208 + clear_siginfo(&info); 208 209 info.si_signo = SIGTRAP; 209 210 info.si_errno = 0; 210 211 info.si_code = TRAP_BRKPT;
+1
arch/arm/kernel/swp_emulate.c
··· 100 100 { 101 101 siginfo_t info; 102 102 103 + clear_siginfo(&info); 103 104 down_read(&current->mm->mmap_sem); 104 105 if (find_vma(current->mm, addr) == NULL) 105 106 info.si_code = SEGV_MAPERR;
+5
arch/arm/kernel/traps.c
··· 441 441 siginfo_t info; 442 442 void __user *pc; 443 443 444 + clear_siginfo(&info); 444 445 pc = (void __user *)instruction_pointer(regs); 445 446 446 447 if (processor_mode(regs) == SVC_MODE) { ··· 541 540 { 542 541 siginfo_t info; 543 542 543 + clear_siginfo(&info); 544 544 if ((current->personality & PER_MASK) != PER_LINUX) { 545 545 send_sig(SIGSEGV, current, 1); 546 546 return regs->ARM_r0; ··· 609 607 { 610 608 siginfo_t info; 611 609 610 + clear_siginfo(&info); 612 611 if ((no >> 16) != (__ARM_NR_BASE>> 16)) 613 612 return bad_syscall(no, regs); 614 613 ··· 745 742 { 746 743 unsigned long addr = instruction_pointer(regs); 747 744 siginfo_t info; 745 + 746 + clear_siginfo(&info); 748 747 749 748 #ifdef CONFIG_DEBUG_USER 750 749 if (user_debug & UDBG_BADABORT) {
+1
arch/arm/mm/alignment.c
··· 950 950 if (ai_usermode & UM_SIGNAL) { 951 951 siginfo_t si; 952 952 953 + clear_siginfo(&si); 953 954 si.si_signo = SIGBUS; 954 955 si.si_errno = 0; 955 956 si.si_code = BUS_ADRALN;
+4
arch/arm/mm/fault.c
··· 163 163 { 164 164 struct siginfo si; 165 165 166 + clear_siginfo(&si); 167 + 166 168 #ifdef CONFIG_DEBUG_USER 167 169 if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) || 168 170 ((user_debug & UDBG_BUS) && (sig == SIGBUS))) { ··· 559 557 inf->name, fsr, addr); 560 558 show_pte(current->mm, addr); 561 559 560 + clear_siginfo(&info); 562 561 info.si_signo = inf->sig; 563 562 info.si_errno = 0; 564 563 info.si_code = inf->code; ··· 592 589 pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", 593 590 inf->name, ifsr, addr); 594 591 592 + clear_siginfo(&info); 595 593 info.si_signo = inf->sig; 596 594 info.si_errno = 0; 597 595 info.si_code = inf->code;
+1 -2
arch/arm/vfp/vfpmodule.c
··· 218 218 { 219 219 siginfo_t info; 220 220 221 - memset(&info, 0, sizeof(info)); 222 - 221 + clear_siginfo(&info); 223 222 info.si_signo = SIGFPE; 224 223 info.si_code = sicode; 225 224 info.si_addr = (void __user *)(instruction_pointer(regs) - 4);
+1 -1
arch/arm64/kernel/fpsimd.c
··· 882 882 si_code = FPE_FLTRES; 883 883 } 884 884 885 - memset(&info, 0, sizeof(info)); 885 + clear_siginfo(&info); 886 886 info.si_signo = SIGFPE; 887 887 info.si_code = si_code; 888 888 info.si_addr = (void __user *)instruction_pointer(regs);
+1
arch/arm64/kernel/sys_compat.c
··· 112 112 break; 113 113 } 114 114 115 + clear_siginfo(&info); 115 116 info.si_signo = SIGILL; 116 117 info.si_errno = 0; 117 118 info.si_code = ILL_ILLTRP;
+1
arch/arm64/kernel/traps.c
··· 635 635 siginfo_t info; 636 636 void __user *pc = (void __user *)instruction_pointer(regs); 637 637 638 + clear_siginfo(&info); 638 639 info.si_signo = SIGILL; 639 640 info.si_errno = 0; 640 641 info.si_code = ILL_ILLOPC;
+12 -6
arch/arm64/mm/fault.c
··· 356 356 */ 357 357 if (user_mode(regs)) { 358 358 const struct fault_info *inf = esr_to_fault_info(esr); 359 - struct siginfo si = { 360 - .si_signo = inf->sig, 361 - .si_code = inf->code, 362 - .si_addr = (void __user *)addr, 363 - }; 359 + struct siginfo si; 360 + 361 + clear_siginfo(&si); 362 + si.si_signo = inf->sig; 363 + si.si_code = inf->code; 364 + si.si_addr = (void __user *)addr; 364 365 365 366 __do_user_fault(&si, esr); 366 367 } else { ··· 635 634 nmi_exit(); 636 635 } 637 636 637 + clear_siginfo(&info); 638 638 info.si_signo = inf->sig; 639 639 info.si_errno = 0; 640 640 info.si_code = inf->code; ··· 740 738 show_pte(addr); 741 739 } 742 740 741 + clear_siginfo(&info); 743 742 info.si_signo = inf->sig; 744 743 info.si_errno = 0; 745 744 info.si_code = inf->code; ··· 783 780 local_irq_enable(); 784 781 } 785 782 783 + clear_siginfo(&info); 786 784 info.si_signo = SIGBUS; 787 785 info.si_errno = 0; 788 786 info.si_code = BUS_ADRALN; ··· 827 823 struct pt_regs *regs) 828 824 { 829 825 const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr); 830 - struct siginfo info; 831 826 int rv; 832 827 833 828 /* ··· 842 839 if (!inf->fn(addr, esr, regs)) { 843 840 rv = 1; 844 841 } else { 842 + struct siginfo info; 843 + 844 + clear_siginfo(&info); 845 845 info.si_signo = inf->sig; 846 846 info.si_errno = 0; 847 847 info.si_code = inf->code;
+2 -7
arch/c6x/kernel/traps.c
··· 244 244 static void do_trap(struct exception_info *except_info, struct pt_regs *regs) 245 245 { 246 246 unsigned long addr = instruction_pointer(regs); 247 - siginfo_t info; 248 247 249 248 if (except_info->code != TRAP_BRKPT) 250 249 pr_err("TRAP: %s PC[0x%lx] signo[%d] code[%d]\n", ··· 252 253 253 254 die_if_kernel(except_info->kernel_str, regs, addr); 254 255 255 - info.si_signo = except_info->signo; 256 - info.si_errno = 0; 257 - info.si_code = except_info->code; 258 - info.si_addr = (void __user *)addr; 259 - 260 - force_sig_info(except_info->signo, &info, current); 256 + force_sig_fault(except_info->signo, except_info->code, 257 + (void __user *)addr, current); 261 258 } 262 259 263 260 /*
+2 -7
arch/hexagon/kernel/traps.c
··· 412 412 case TRAP_DEBUG: 413 413 /* Trap0 0xdb is debug breakpoint */ 414 414 if (user_mode(regs)) { 415 - struct siginfo info; 416 - 417 - info.si_signo = SIGTRAP; 418 - info.si_errno = 0; 419 415 /* 420 416 * Some architecures add some per-thread state 421 417 * to distinguish between breakpoint traps and ··· 419 423 * set the si_code value appropriately, or we 420 424 * may want to use a different trap0 flavor. 421 425 */ 422 - info.si_code = TRAP_BRKPT; 423 - info.si_addr = (void __user *) pt_elr(regs); 424 - force_sig_info(SIGTRAP, &info, current); 426 + force_sig_fault(SIGTRAP, TRAP_BRKPT, 427 + (void __user *) pt_elr(regs), current); 425 428 } else { 426 429 #ifdef CONFIG_KGDB 427 430 kgdb_handle_exception(pt_cause(regs), SIGTRAP,
+7 -13
arch/hexagon/mm/vm_fault.c
··· 50 50 { 51 51 struct vm_area_struct *vma; 52 52 struct mm_struct *mm = current->mm; 53 - siginfo_t info; 53 + int si_signo; 54 54 int si_code = SEGV_MAPERR; 55 55 int fault; 56 56 const struct exception_table_entry *fixup; ··· 140 140 * unable to fix up the page fault. 141 141 */ 142 142 if (fault & VM_FAULT_SIGBUS) { 143 - info.si_signo = SIGBUS; 144 - info.si_code = BUS_ADRERR; 143 + si_signo = SIGBUS; 144 + si_code = BUS_ADRERR; 145 145 } 146 146 /* Address is not in the memory map */ 147 147 else { 148 - info.si_signo = SIGSEGV; 149 - info.si_code = SEGV_ACCERR; 148 + si_signo = SIGSEGV; 149 + si_code = SEGV_ACCERR; 150 150 } 151 - info.si_errno = 0; 152 - info.si_addr = (void __user *)address; 153 - force_sig_info(info.si_signo, &info, current); 151 + force_sig_fault(si_signo, si_code, (void __user *)address, current); 154 152 return; 155 153 156 154 bad_area: 157 155 up_read(&mm->mmap_sem); 158 156 159 157 if (user_mode(regs)) { 160 - info.si_signo = SIGSEGV; 161 - info.si_errno = 0; 162 - info.si_code = si_code; 163 - info.si_addr = (void *)address; 164 - force_sig_info(info.si_signo, &info, current); 158 + force_sig_fault(SIGSEGV, si_code, (void __user *)address, current); 165 159 return; 166 160 } 167 161 /* Kernel-mode fault falls through */
-7
arch/ia64/include/uapi/asm/siginfo.h
··· 27 27 #define __ISR_VALID_BIT 0 28 28 #define __ISR_VALID (1 << __ISR_VALID_BIT) 29 29 30 - /* 31 - * SIGFPE si_codes 32 - */ 33 - #ifdef __KERNEL__ 34 - #define FPE_FIXME 0 /* Broken dup of SI_USER */ 35 - #endif /* __KERNEL__ */ 36 - 37 30 #endif /* _UAPI_ASM_IA64_SIGINFO_H */
+1
arch/ia64/kernel/brl_emu.c
··· 62 62 struct illegal_op_return rv; 63 63 long tmp_taken, unimplemented_address; 64 64 65 + clear_siginfo(&siginfo); 65 66 rv.fkt = (unsigned long) -1; 66 67 67 68 /*
+2
arch/ia64/kernel/signal.c
··· 153 153 return retval; 154 154 155 155 give_sigsegv: 156 + clear_siginfo(&si); 156 157 si.si_signo = SIGSEGV; 157 158 si.si_errno = 0; 158 159 si.si_code = SI_KERNEL; ··· 237 236 unsigned long flags; 238 237 struct siginfo si; 239 238 239 + clear_siginfo(&si); 240 240 if (sig == SIGSEGV) { 241 241 /* 242 242 * Acquiring siglock around the sa_handler-update is almost
+26 -5
arch/ia64/kernel/traps.c
··· 104 104 int sig, code; 105 105 106 106 /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */ 107 + clear_siginfo(&siginfo); 107 108 siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); 108 109 siginfo.si_imm = break_num; 109 110 siginfo.si_flags = 0; /* clear __ISR_VALID */ ··· 294 293 { 295 294 long exception, bundle[2]; 296 295 unsigned long fault_ip; 297 - struct siginfo siginfo; 298 296 299 297 fault_ip = regs->cr_iip; 300 298 if (!fp_fault && (ia64_psr(regs)->ri == 0)) ··· 344 344 printk(KERN_ERR "handle_fpu_swa: fp_emulate() returned -1\n"); 345 345 return -1; 346 346 } else { 347 + struct siginfo siginfo; 348 + 347 349 /* is next instruction a trap? */ 348 350 if (exception & 2) { 349 351 ia64_increment_ip(regs); 350 352 } 353 + clear_siginfo(&siginfo); 351 354 siginfo.si_signo = SIGFPE; 352 355 siginfo.si_errno = 0; 353 - siginfo.si_code = FPE_FIXME; /* default code */ 356 + siginfo.si_code = FPE_FLTUNK; /* default code */ 354 357 siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); 355 358 if (isr & 0x11) { 356 359 siginfo.si_code = FPE_FLTINV; ··· 375 372 return -1; 376 373 } else if (exception != 0) { 377 374 /* raise exception */ 375 + struct siginfo siginfo; 376 + 377 + clear_siginfo(&siginfo); 378 378 siginfo.si_signo = SIGFPE; 379 379 siginfo.si_errno = 0; 380 - siginfo.si_code = FPE_FIXME; /* default code */ 380 + siginfo.si_code = FPE_FLTUNK; /* default code */ 381 381 siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); 382 382 if (isr & 0x880) { 383 383 siginfo.si_code = FPE_FLTOVF; ··· 426 420 if (die_if_kernel(buf, &regs, 0)) 427 421 return rv; 428 422 429 - memset(&si, 0, sizeof(si)); 423 + clear_siginfo(&si); 430 424 si.si_signo = SIGILL; 431 425 si.si_code = ILL_ILLOPC; 432 426 si.si_addr = (void __user *) (regs.cr_iip + ia64_psr(&regs)->ri); ··· 440 434 long arg7, struct pt_regs regs) 441 435 { 442 436 unsigned long code, error = isr, iip; 443 - struct siginfo siginfo; 444 437 char buf[128]; 445 438 int result, sig; 446 439 static const char *reason[] = { ··· 490 485 491 486 case 26: /* NaT Consumption */ 492 487 if (user_mode(&regs)) { 488 + struct siginfo siginfo; 493 489 void __user *addr; 494 490 495 491 if (((isr >> 4) & 0xf) == 2) { ··· 505 499 addr = (void __user *) (regs.cr_iip 506 500 + ia64_psr(&regs)->ri); 507 501 } 502 + clear_siginfo(&siginfo); 508 503 siginfo.si_signo = sig; 509 504 siginfo.si_code = code; 510 505 siginfo.si_errno = 0; ··· 522 515 523 516 case 31: /* Unsupported Data Reference */ 524 517 if (user_mode(&regs)) { 518 + struct siginfo siginfo; 519 + 520 + clear_siginfo(&siginfo); 525 521 siginfo.si_signo = SIGILL; 526 522 siginfo.si_code = ILL_ILLOPN; 527 523 siginfo.si_errno = 0; ··· 541 531 case 29: /* Debug */ 542 532 case 35: /* Taken Branch Trap */ 543 533 case 36: /* Single Step Trap */ 534 + { 535 + struct siginfo siginfo; 536 + 537 + clear_siginfo(&siginfo); 544 538 if (fsys_mode(current, &regs)) { 545 539 extern char __kernel_syscall_via_break[]; 546 540 /* ··· 592 578 siginfo.si_isr = isr; 593 579 force_sig_info(SIGTRAP, &siginfo, current); 594 580 return; 581 + } 595 582 596 583 case 32: /* fp fault */ 597 584 case 33: /* fp trap */ 598 585 result = handle_fpu_swa((vector == 32) ? 1 : 0, &regs, isr); 599 586 if ((result < 0) || (current->thread.flags & IA64_THREAD_FPEMU_SIGFPE)) { 587 + struct siginfo siginfo; 588 + 589 + clear_siginfo(&siginfo); 600 590 siginfo.si_signo = SIGFPE; 601 591 siginfo.si_errno = 0; 602 592 siginfo.si_code = FPE_FLTINV; ··· 634 616 } else { 635 617 /* Unimplemented Instr. Address Trap */ 636 618 if (user_mode(&regs)) { 619 + struct siginfo siginfo; 620 + 621 + clear_siginfo(&siginfo); 637 622 siginfo.si_signo = SIGILL; 638 623 siginfo.si_code = ILL_BADIADDR; 639 624 siginfo.si_errno = 0;
+1
arch/ia64/kernel/unaligned.c
··· 1537 1537 /* NOT_REACHED */ 1538 1538 } 1539 1539 force_sigbus: 1540 + clear_siginfo(&si); 1540 1541 si.si_signo = SIGBUS; 1541 1542 si.si_errno = 0; 1542 1543 si.si_code = BUS_ADRALN;
+3 -1
arch/ia64/mm/fault.c
··· 85 85 int signal = SIGSEGV, code = SEGV_MAPERR; 86 86 struct vm_area_struct *vma, *prev_vma; 87 87 struct mm_struct *mm = current->mm; 88 - struct siginfo si; 89 88 unsigned long mask; 90 89 int fault; 91 90 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; ··· 248 249 return; 249 250 } 250 251 if (user_mode(regs)) { 252 + struct siginfo si; 253 + 254 + clear_siginfo(&si); 251 255 si.si_signo = signal; 252 256 si.si_errno = 0; 253 257 si.si_code = code;
+25 -33
arch/m68k/kernel/traps.c
··· 1007 1007 1008 1008 asmlinkage void trap_c(struct frame *fp) 1009 1009 { 1010 - int sig; 1010 + int sig, si_code; 1011 + void __user *addr; 1011 1012 int vector = (fp->ptregs.vector >> 2) & 0xff; 1012 - siginfo_t info; 1013 1013 1014 1014 if (fp->ptregs.sr & PS_S) { 1015 1015 if (vector == VEC_TRACE) { ··· 1029 1029 /* send the appropriate signal to the user program */ 1030 1030 switch (vector) { 1031 1031 case VEC_ADDRERR: 1032 - info.si_code = BUS_ADRALN; 1032 + si_code = BUS_ADRALN; 1033 1033 sig = SIGBUS; 1034 1034 break; 1035 1035 case VEC_ILLEGAL: 1036 1036 case VEC_LINE10: 1037 1037 case VEC_LINE11: 1038 - info.si_code = ILL_ILLOPC; 1038 + si_code = ILL_ILLOPC; 1039 1039 sig = SIGILL; 1040 1040 break; 1041 1041 case VEC_PRIV: 1042 - info.si_code = ILL_PRVOPC; 1042 + si_code = ILL_PRVOPC; 1043 1043 sig = SIGILL; 1044 1044 break; 1045 1045 case VEC_COPROC: 1046 - info.si_code = ILL_COPROC; 1046 + si_code = ILL_COPROC; 1047 1047 sig = SIGILL; 1048 1048 break; 1049 1049 case VEC_TRAP1: ··· 1060 1060 case VEC_TRAP12: 1061 1061 case VEC_TRAP13: 1062 1062 case VEC_TRAP14: 1063 - info.si_code = ILL_ILLTRP; 1063 + si_code = ILL_ILLTRP; 1064 1064 sig = SIGILL; 1065 1065 break; 1066 1066 case VEC_FPBRUC: 1067 1067 case VEC_FPOE: 1068 1068 case VEC_FPNAN: 1069 - info.si_code = FPE_FLTINV; 1069 + si_code = FPE_FLTINV; 1070 1070 sig = SIGFPE; 1071 1071 break; 1072 1072 case VEC_FPIR: 1073 - info.si_code = FPE_FLTRES; 1073 + si_code = FPE_FLTRES; 1074 1074 sig = SIGFPE; 1075 1075 break; 1076 1076 case VEC_FPDIVZ: 1077 - info.si_code = FPE_FLTDIV; 1077 + si_code = FPE_FLTDIV; 1078 1078 sig = SIGFPE; 1079 1079 break; 1080 1080 case VEC_FPUNDER: 1081 - info.si_code = FPE_FLTUND; 1081 + si_code = FPE_FLTUND; 1082 1082 sig = SIGFPE; 1083 1083 break; 1084 1084 case VEC_FPOVER: 1085 - info.si_code = FPE_FLTOVF; 1085 + si_code = FPE_FLTOVF; 1086 1086 sig = SIGFPE; 1087 1087 break; 1088 1088 case VEC_ZERODIV: 1089 - info.si_code = FPE_INTDIV; 1089 + si_code = FPE_INTDIV; 1090 1090 sig = SIGFPE; 1091 1091 break; 1092 1092 case VEC_CHK: 1093 1093 case VEC_TRAP: 1094 - info.si_code = FPE_INTOVF; 1094 + si_code = FPE_INTOVF; 1095 1095 sig = SIGFPE; 1096 1096 break; 1097 1097 case VEC_TRACE: /* ptrace single step */ 1098 - info.si_code = TRAP_TRACE; 1098 + si_code = TRAP_TRACE; 1099 1099 sig = SIGTRAP; 1100 1100 break; 1101 1101 case VEC_TRAP15: /* breakpoint */ 1102 - info.si_code = TRAP_BRKPT; 1102 + si_code = TRAP_BRKPT; 1103 1103 sig = SIGTRAP; 1104 1104 break; 1105 1105 default: 1106 - info.si_code = ILL_ILLOPC; 1106 + si_code = ILL_ILLOPC; 1107 1107 sig = SIGILL; 1108 1108 break; 1109 1109 } 1110 - info.si_signo = sig; 1111 - info.si_errno = 0; 1112 1110 switch (fp->ptregs.format) { 1113 1111 default: 1114 - info.si_addr = (void *) fp->ptregs.pc; 1112 + addr = (void __user *) fp->ptregs.pc; 1115 1113 break; 1116 1114 case 2: 1117 - info.si_addr = (void *) fp->un.fmt2.iaddr; 1115 + addr = (void __user *) fp->un.fmt2.iaddr; 1118 1116 break; 1119 1117 case 7: 1120 - info.si_addr = (void *) fp->un.fmt7.effaddr; 1118 + addr = (void __user *) fp->un.fmt7.effaddr; 1121 1119 break; 1122 1120 case 9: 1123 - info.si_addr = (void *) fp->un.fmt9.iaddr; 1121 + addr = (void __user *) fp->un.fmt9.iaddr; 1124 1122 break; 1125 1123 case 10: 1126 - info.si_addr = (void *) fp->un.fmta.daddr; 1124 + addr = (void __user *) fp->un.fmta.daddr; 1127 1125 break; 1128 1126 case 11: 1129 - info.si_addr = (void *) fp->un.fmtb.daddr; 1127 + addr = (void __user*) fp->un.fmtb.daddr; 1130 1128 break; 1131 1129 } 1132 - force_sig_info (sig, &info, current); 1130 + force_sig_fault(sig, si_code, addr, current); 1133 1131 } 1134 1132 1135 1133 void die_if_kernel (char *str, struct pt_regs *fp, int nr) ··· 1159 1161 #ifdef CONFIG_M68KFPU_EMU 1160 1162 asmlinkage void fpemu_signal(int signal, int code, void *addr) 1161 1163 { 1162 - siginfo_t info; 1163 - 1164 - info.si_signo = signal; 1165 - info.si_errno = 0; 1166 - info.si_code = code; 1167 - info.si_addr = addr; 1168 - force_sig_info(signal, &info, current); 1164 + force_sig_fault(signal, code, addr, current); 1169 1165 } 1170 1166 #endif
+11 -14
arch/m68k/mm/fault.c
··· 21 21 22 22 int send_fault_sig(struct pt_regs *regs) 23 23 { 24 - siginfo_t siginfo; 24 + int signo, si_code; 25 + void __user *addr; 25 26 26 - clear_siginfo(&siginfo); 27 - siginfo.si_signo = current->thread.signo; 28 - siginfo.si_code = current->thread.code; 29 - siginfo.si_addr = (void *)current->thread.faddr; 30 - pr_debug("send_fault_sig: %p,%d,%d\n", siginfo.si_addr, 31 - siginfo.si_signo, siginfo.si_code); 27 + signo = current->thread.signo; 28 + si_code = current->thread.code; 29 + addr = (void __user *)current->thread.faddr; 30 + pr_debug("send_fault_sig: %p,%d,%d\n", addr, signo, si_code); 32 31 33 32 if (user_mode(regs)) { 34 - force_sig_info(siginfo.si_signo, 35 - &siginfo, current); 33 + force_sig_fault(signo, si_code, addr, current); 36 34 } else { 37 35 if (fixup_exception(regs)) 38 36 return -1; 39 37 40 - //if (siginfo.si_signo == SIGBUS) 41 - // force_sig_info(siginfo.si_signo, 42 - // &siginfo, current); 38 + //if (signo == SIGBUS) 39 + // force_sig_fault(si_signo, si_code, addr, current); 43 40 44 41 /* 45 42 * Oops. The kernel tried to access some bad page. We'll have to 46 43 * terminate things with extreme prejudice. 47 44 */ 48 - if ((unsigned long)siginfo.si_addr < PAGE_SIZE) 45 + if ((unsigned long)addr < PAGE_SIZE) 49 46 pr_alert("Unable to handle kernel NULL pointer dereference"); 50 47 else 51 48 pr_alert("Unable to handle kernel access"); 52 - pr_cont(" at virtual address %p\n", siginfo.si_addr); 49 + pr_cont(" at virtual address %p\n", addr); 53 50 die_if_kernel("Oops", regs, 0 /*error_code*/); 54 51 do_exit(SIGKILL); 55 52 }
+1 -7
arch/microblaze/kernel/exceptions.c
··· 60 60 61 61 void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) 62 62 { 63 - siginfo_t info; 64 - 65 63 if (kernel_mode(regs)) 66 64 die("Exception in kernel mode", regs, signr); 67 65 68 - info.si_signo = signr; 69 - info.si_errno = 0; 70 - info.si_code = code; 71 - info.si_addr = (void __user *) addr; 72 - force_sig_info(signr, &info, current); 66 + force_sig_fault(signr, code, (void __user *)addr, current); 73 67 } 74 68 75 69 asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,
+1 -11
arch/microblaze/mm/fault.c
··· 88 88 { 89 89 struct vm_area_struct *vma; 90 90 struct mm_struct *mm = current->mm; 91 - siginfo_t info; 92 91 int code = SEGV_MAPERR; 93 92 int is_write = error_code & ESR_S; 94 93 int fault; ··· 268 269 /* User mode accesses cause a SIGSEGV */ 269 270 if (user_mode(regs)) { 270 271 _exception(SIGSEGV, regs, code, address); 271 - /* info.si_signo = SIGSEGV; 272 - info.si_errno = 0; 273 - info.si_code = code; 274 - info.si_addr = (void *) address; 275 - force_sig_info(SIGSEGV, &info, current);*/ 276 272 return; 277 273 } 278 274 ··· 289 295 do_sigbus: 290 296 up_read(&mm->mmap_sem); 291 297 if (user_mode(regs)) { 292 - info.si_signo = SIGBUS; 293 - info.si_errno = 0; 294 - info.si_code = BUS_ADRERR; 295 - info.si_addr = (void __user *)address; 296 - force_sig_info(SIGBUS, &info, current); 298 + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, current); 297 299 return; 298 300 } 299 301 bad_page_fault(regs, address, SIGBUS);
+18 -47
arch/mips/kernel/traps.c
··· 699 699 asmlinkage void do_ov(struct pt_regs *regs) 700 700 { 701 701 enum ctx_state prev_state; 702 - siginfo_t info; 703 - 704 - clear_siginfo(&info); 705 - info.si_signo = SIGFPE; 706 - info.si_code = FPE_INTOVF; 707 - info.si_addr = (void __user *)regs->cp0_epc; 708 702 709 703 prev_state = exception_enter(); 710 704 die_if_kernel("Integer overflow", regs); 711 705 712 - force_sig_info(SIGFPE, &info, current); 706 + force_sig_fault(SIGFPE, FPE_INTOVF, (void __user *)regs->cp0_epc, current); 713 707 exception_exit(prev_state); 714 708 } 715 709 ··· 716 722 void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr, 717 723 struct task_struct *tsk) 718 724 { 719 - struct siginfo si; 720 - 721 - clear_siginfo(&si); 722 - si.si_addr = fault_addr; 723 - si.si_signo = SIGFPE; 725 + int si_code = FPE_FLTUNK; 724 726 725 727 if (fcr31 & FPU_CSR_INV_X) 726 - si.si_code = FPE_FLTINV; 728 + si_code = FPE_FLTINV; 727 729 else if (fcr31 & FPU_CSR_DIV_X) 728 - si.si_code = FPE_FLTDIV; 730 + si_code = FPE_FLTDIV; 729 731 else if (fcr31 & FPU_CSR_OVF_X) 730 - si.si_code = FPE_FLTOVF; 732 + si_code = FPE_FLTOVF; 731 733 else if (fcr31 & FPU_CSR_UDF_X) 732 - si.si_code = FPE_FLTUND; 734 + si_code = FPE_FLTUND; 733 735 else if (fcr31 & FPU_CSR_INE_X) 734 - si.si_code = FPE_FLTRES; 736 + si_code = FPE_FLTRES; 735 737 736 - force_sig_info(SIGFPE, &si, tsk); 738 + force_sig_fault(SIGFPE, si_code, fault_addr, tsk); 737 739 } 738 740 739 741 int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31) 740 742 { 741 - struct siginfo si; 743 + int si_code; 742 744 struct vm_area_struct *vma; 743 745 744 - clear_siginfo(&si); 745 746 switch (sig) { 746 747 case 0: 747 748 return 0; ··· 746 757 return 1; 747 758 748 759 case SIGBUS: 749 - si.si_addr = fault_addr; 750 - si.si_signo = sig; 751 - si.si_code = BUS_ADRERR; 752 - force_sig_info(sig, &si, current); 760 + force_sig_fault(SIGBUS, BUS_ADRERR, fault_addr, current); 753 761 return 1; 754 762 755 763 case SIGSEGV: 756 - si.si_addr = fault_addr; 757 - si.si_signo = sig; 758 764 down_read(&current->mm->mmap_sem); 759 765 vma = find_vma(current->mm, (unsigned long)fault_addr); 760 766 if (vma && (vma->vm_start <= (unsigned long)fault_addr)) 761 - si.si_code = SEGV_ACCERR; 767 + si_code = SEGV_ACCERR; 762 768 else 763 - si.si_code = SEGV_MAPERR; 769 + si_code = SEGV_MAPERR; 764 770 up_read(&current->mm->mmap_sem); 765 - force_sig_info(sig, &si, current); 771 + force_sig_fault(SIGSEGV, si_code, fault_addr, current); 766 772 return 1; 767 773 768 774 default: ··· 880 896 void do_trap_or_bp(struct pt_regs *regs, unsigned int code, int si_code, 881 897 const char *str) 882 898 { 883 - siginfo_t info; 884 899 char b[40]; 885 900 886 - clear_siginfo(&info); 887 901 #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP 888 902 if (kgdb_ll_trap(DIE_TRAP, str, regs, code, current->thread.trap_nr, 889 903 SIGTRAP) == NOTIFY_STOP) ··· 903 921 case BRK_DIVZERO: 904 922 scnprintf(b, sizeof(b), "%s instruction in kernel code", str); 905 923 die_if_kernel(b, regs); 906 - if (code == BRK_DIVZERO) 907 - info.si_code = FPE_INTDIV; 908 - else 909 - info.si_code = FPE_INTOVF; 910 - info.si_signo = SIGFPE; 911 - info.si_addr = (void __user *) regs->cp0_epc; 912 - force_sig_info(SIGFPE, &info, current); 924 + force_sig_fault(SIGFPE, 925 + code == BRK_DIVZERO ? FPE_INTDIV : FPE_INTOVF, 926 + (void __user *) regs->cp0_epc, current); 913 927 break; 914 928 case BRK_BUG: 915 929 die_if_kernel("Kernel bug detected", regs); ··· 930 952 scnprintf(b, sizeof(b), "%s instruction in kernel code", str); 931 953 die_if_kernel(b, regs); 932 954 if (si_code) { 933 - info.si_signo = SIGTRAP; 934 - info.si_code = si_code; 935 - force_sig_info(SIGTRAP, &info, current); 955 + force_sig_fault(SIGTRAP, si_code, NULL, current); 936 956 } else { 937 957 force_sig(SIGTRAP, current); 938 958 } ··· 1482 1506 */ 1483 1507 asmlinkage void do_watch(struct pt_regs *regs) 1484 1508 { 1485 - siginfo_t info; 1486 1509 enum ctx_state prev_state; 1487 - 1488 - clear_siginfo(&info); 1489 - info.si_signo = SIGTRAP; 1490 - info.si_code = TRAP_HWBKPT; 1491 1510 1492 1511 prev_state = exception_enter(); 1493 1512 /* ··· 1499 1528 if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) { 1500 1529 mips_read_watch_registers(); 1501 1530 local_irq_enable(); 1502 - force_sig_info(SIGTRAP, &info, current); 1531 + force_sig_fault(SIGTRAP, TRAP_HWBKPT, NULL, current); 1503 1532 } else { 1504 1533 mips_clear_watch_registers(); 1505 1534 local_irq_enable();
+5 -13
arch/mips/mm/fault.c
··· 42 42 struct task_struct *tsk = current; 43 43 struct mm_struct *mm = tsk->mm; 44 44 const int field = sizeof(unsigned long) * 2; 45 - siginfo_t info; 45 + int si_code; 46 46 int fault; 47 47 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 48 48 ··· 63 63 return; 64 64 #endif 65 65 66 - info.si_code = SEGV_MAPERR; 66 + si_code = SEGV_MAPERR; 67 67 68 68 /* 69 69 * We fault-in kernel-space virtual memory on-demand. The ··· 112 112 * we can handle it.. 113 113 */ 114 114 good_area: 115 - info.si_code = SEGV_ACCERR; 115 + si_code = SEGV_ACCERR; 116 116 117 117 if (write) { 118 118 if (!(vma->vm_flags & VM_WRITE)) ··· 223 223 pr_cont("\n"); 224 224 } 225 225 current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f; 226 - info.si_signo = SIGSEGV; 227 - info.si_errno = 0; 228 - /* info.si_code has been set above */ 229 - info.si_addr = (void __user *) address; 230 - force_sig_info(SIGSEGV, &info, tsk); 226 + force_sig_fault(SIGSEGV, si_code, (void __user *)address, tsk); 231 227 return; 232 228 } 233 229 ··· 279 283 #endif 280 284 current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f; 281 285 tsk->thread.cp0_badvaddr = address; 282 - info.si_signo = SIGBUS; 283 - info.si_errno = 0; 284 - info.si_code = BUS_ADRERR; 285 - info.si_addr = (void __user *) address; 286 - force_sig_info(SIGBUS, &info, tsk); 286 + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, tsk); 287 287 288 288 return; 289 289 #ifndef CONFIG_64BIT
+7 -28
arch/nds32/kernel/traps.c
··· 222 222 223 223 int bad_syscall(int n, struct pt_regs *regs) 224 224 { 225 - siginfo_t info; 226 - 227 225 if (current->personality != PER_LINUX) { 228 226 send_sig(SIGSEGV, current, 1); 229 227 return regs->uregs[0]; 230 228 } 231 229 232 - info.si_signo = SIGILL; 233 - info.si_errno = 0; 234 - info.si_code = ILL_ILLTRP; 235 - info.si_addr = (void __user *)instruction_pointer(regs) - 4; 236 - 237 - force_sig_info(SIGILL, &info, current); 230 + force_sig_fault(SIGILL, ILL_ILLTRP, 231 + (void __user *)instruction_pointer(regs) - 4, current); 238 232 die_if_kernel("Oops - bad syscall", regs, n); 239 233 return regs->uregs[0]; 240 234 } ··· 281 287 void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, 282 288 int error_code, int si_code) 283 289 { 284 - struct siginfo info; 285 - 286 290 tsk->thread.trap_no = ENTRY_DEBUG_RELATED; 287 291 tsk->thread.error_code = error_code; 288 292 289 - memset(&info, 0, sizeof(info)); 290 - info.si_signo = SIGTRAP; 291 - info.si_code = si_code; 292 - info.si_addr = (void __user *)instruction_pointer(regs); 293 - force_sig_info(SIGTRAP, &info, tsk); 293 + force_sig_fault(SIGTRAP, si_code, 294 + (void __user *)instruction_pointer(regs), tsk); 294 295 } 295 296 296 297 void do_debug_trap(unsigned long entry, unsigned long addr, ··· 307 318 308 319 void unhandled_interruption(struct pt_regs *regs) 309 320 { 310 - siginfo_t si; 311 321 pr_emerg("unhandled_interruption\n"); 312 322 show_regs(regs); 313 323 if (!user_mode(regs)) 314 324 do_exit(SIGKILL); 315 - si.si_signo = SIGKILL; 316 - si.si_errno = 0; 317 - force_sig_info(SIGKILL, &si, current); 325 + force_sig(SIGKILL, current); 318 326 } 319 327 320 328 void unhandled_exceptions(unsigned long entry, unsigned long addr, 321 329 unsigned long type, struct pt_regs *regs) 322 330 { 323 - siginfo_t si; 324 331 pr_emerg("Unhandled Exception: entry: %lx addr:%lx itype:%lx\n", entry, 325 332 addr, type); 326 333 show_regs(regs); 327 334 if (!user_mode(regs)) 328 335 do_exit(SIGKILL); 329 - si.si_signo = SIGKILL; 330 - si.si_errno = 0; 331 - si.si_addr = (void *)addr; 332 - force_sig_info(SIGKILL, &si, current); 336 + force_sig(SIGKILL, current); 333 337 } 334 338 335 339 extern int do_page_fault(unsigned long entry, unsigned long addr, ··· 345 363 346 364 void do_revinsn(struct pt_regs *regs) 347 365 { 348 - siginfo_t si; 349 366 pr_emerg("Reserved Instruction\n"); 350 367 show_regs(regs); 351 368 if (!user_mode(regs)) 352 369 do_exit(SIGILL); 353 - si.si_signo = SIGILL; 354 - si.si_errno = 0; 355 - force_sig_info(SIGILL, &si, current); 370 + force_sig(SIGILL, current); 356 371 } 357 372 358 373 #ifdef CONFIG_ALIGNMENT_TRAP
+5 -13
arch/nds32/mm/fault.c
··· 72 72 struct task_struct *tsk; 73 73 struct mm_struct *mm; 74 74 struct vm_area_struct *vma; 75 - siginfo_t info; 75 + int si_code; 76 76 int fault; 77 77 unsigned int mask = VM_READ | VM_WRITE | VM_EXEC; 78 78 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; ··· 80 80 error_code = error_code & (ITYPE_mskINST | ITYPE_mskETYPE); 81 81 tsk = current; 82 82 mm = tsk->mm; 83 - info.si_code = SEGV_MAPERR; 83 + si_code = SEGV_MAPERR; 84 84 /* 85 85 * We fault-in kernel-space virtual memory on-demand. The 86 86 * 'reference' page table is init_mm.pgd. ··· 161 161 */ 162 162 163 163 good_area: 164 - info.si_code = SEGV_ACCERR; 164 + si_code = SEGV_ACCERR; 165 165 166 166 /* first do some preliminary protection checks */ 167 167 if (entry == ENTRY_PTE_NOT_PRESENT) { ··· 266 266 tsk->thread.address = addr; 267 267 tsk->thread.error_code = error_code; 268 268 tsk->thread.trap_no = entry; 269 - info.si_signo = SIGSEGV; 270 - info.si_errno = 0; 271 - /* info.si_code has been set above */ 272 - info.si_addr = (void *)addr; 273 - force_sig_info(SIGSEGV, &info, tsk); 269 + force_sig_fault(SIGSEGV, si_code, (void __user *)addr, tsk); 274 270 return; 275 271 } 276 272 ··· 335 339 tsk->thread.address = addr; 336 340 tsk->thread.error_code = error_code; 337 341 tsk->thread.trap_no = entry; 338 - info.si_signo = SIGBUS; 339 - info.si_errno = 0; 340 - info.si_code = BUS_ADRERR; 341 - info.si_addr = (void *)addr; 342 - force_sig_info(SIGBUS, &info, tsk); 342 + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)addr, tsk); 343 343 344 344 return; 345 345
+1 -7
arch/nios2/kernel/traps.c
··· 26 26 27 27 static void _send_sig(int signo, int code, unsigned long addr) 28 28 { 29 - siginfo_t info; 30 - 31 - info.si_signo = signo; 32 - info.si_errno = 0; 33 - info.si_code = code; 34 - info.si_addr = (void __user *) addr; 35 - force_sig_info(signo, &info, current); 29 + force_sig_fault(signo, code, (void __user *) addr, current); 36 30 } 37 31 38 32 void die(const char *str, struct pt_regs *regs, long err)
+4 -26
arch/openrisc/kernel/traps.c
··· 250 250 251 251 asmlinkage void do_trap(struct pt_regs *regs, unsigned long address) 252 252 { 253 - siginfo_t info; 254 - memset(&info, 0, sizeof(info)); 255 - info.si_signo = SIGTRAP; 256 - info.si_code = TRAP_TRACE; 257 - info.si_addr = (void *)address; 258 - force_sig_info(SIGTRAP, &info, current); 253 + force_sig_fault(SIGTRAP, TRAP_TRACE, (void __user *)address, current); 259 254 260 255 regs->pc += 4; 261 256 } 262 257 263 258 asmlinkage void do_unaligned_access(struct pt_regs *regs, unsigned long address) 264 259 { 265 - siginfo_t info; 266 - 267 260 if (user_mode(regs)) { 268 261 /* Send a SIGBUS */ 269 - info.si_signo = SIGBUS; 270 - info.si_errno = 0; 271 - info.si_code = BUS_ADRALN; 272 - info.si_addr = (void __user *)address; 273 - force_sig_info(SIGBUS, &info, current); 262 + force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)address, current); 274 263 } else { 275 264 printk("KERNEL: Unaligned Access 0x%.8lx\n", address); 276 265 show_registers(regs); ··· 270 281 271 282 asmlinkage void do_bus_fault(struct pt_regs *regs, unsigned long address) 272 283 { 273 - siginfo_t info; 274 - 275 284 if (user_mode(regs)) { 276 285 /* Send a SIGBUS */ 277 - info.si_signo = SIGBUS; 278 - info.si_errno = 0; 279 - info.si_code = BUS_ADRERR; 280 - info.si_addr = (void *)address; 281 - force_sig_info(SIGBUS, &info, current); 286 + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, current); 282 287 } else { /* Kernel mode */ 283 288 printk("KERNEL: Bus error (SIGBUS) 0x%.8lx\n", address); 284 289 show_registers(regs); ··· 447 464 asmlinkage void do_illegal_instruction(struct pt_regs *regs, 448 465 unsigned long address) 449 466 { 450 - siginfo_t info; 451 467 unsigned int op; 452 468 unsigned int insn = *((unsigned int *)address); 453 469 ··· 467 485 468 486 if (user_mode(regs)) { 469 487 /* Send a SIGILL */ 470 - info.si_signo = SIGILL; 471 - info.si_errno = 0; 472 - info.si_code = ILL_ILLOPC; 473 - info.si_addr = (void *)address; 474 - force_sig_info(SIGBUS, &info, current); 488 + force_sig_fault(SIGILL, ILL_ILLOPC, (void __user *)address, current); 475 489 } else { /* Kernel mode */ 476 490 printk("KERNEL: Illegal instruction (SIGILL) 0x%.8lx\n", 477 491 address);
+5 -13
arch/openrisc/mm/fault.c
··· 52 52 struct task_struct *tsk; 53 53 struct mm_struct *mm; 54 54 struct vm_area_struct *vma; 55 - siginfo_t info; 55 + int si_code; 56 56 int fault; 57 57 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 58 58 ··· 97 97 } 98 98 99 99 mm = tsk->mm; 100 - info.si_code = SEGV_MAPERR; 100 + si_code = SEGV_MAPERR; 101 101 102 102 /* 103 103 * If we're in an interrupt or have no user ··· 139 139 */ 140 140 141 141 good_area: 142 - info.si_code = SEGV_ACCERR; 142 + si_code = SEGV_ACCERR; 143 143 144 144 /* first do some preliminary protection checks */ 145 145 ··· 213 213 /* User mode accesses just cause a SIGSEGV */ 214 214 215 215 if (user_mode(regs)) { 216 - info.si_signo = SIGSEGV; 217 - info.si_errno = 0; 218 - /* info.si_code has been set above */ 219 - info.si_addr = (void *)address; 220 - force_sig_info(SIGSEGV, &info, tsk); 216 + force_sig_fault(SIGSEGV, si_code, (void __user *)address, tsk); 221 217 return; 222 218 } 223 219 ··· 278 282 * Send a sigbus, regardless of whether we were in kernel 279 283 * or user mode. 280 284 */ 281 - info.si_signo = SIGBUS; 282 - info.si_errno = 0; 283 - info.si_code = BUS_ADRERR; 284 - info.si_addr = (void *)address; 285 - force_sig_info(SIGBUS, &info, tsk); 285 + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, tsk); 286 286 287 287 /* Kernel mode? Handle exceptions or die */ 288 288 if (!user_mode(regs))
+3 -7
arch/parisc/kernel/ptrace.c
··· 76 76 set_tsk_thread_flag(task, TIF_SINGLESTEP); 77 77 78 78 if (pa_psw(task)->n) { 79 - struct siginfo si; 80 - 81 79 /* Nullified, just crank over the queue. */ 82 80 task_regs(task)->iaoq[0] = task_regs(task)->iaoq[1]; 83 81 task_regs(task)->iasq[0] = task_regs(task)->iasq[1]; ··· 88 90 ptrace_disable(task); 89 91 /* Don't wake up the task, but let the 90 92 parent know something happened. */ 91 - si.si_code = TRAP_TRACE; 92 - si.si_addr = (void __user *) (task_regs(task)->iaoq[0] & ~3); 93 - si.si_signo = SIGTRAP; 94 - si.si_errno = 0; 95 - force_sig_info(SIGTRAP, &si, task); 93 + force_sig_fault(SIGTRAP, TRAP_TRACE, 94 + (void __user *) (task_regs(task)->iaoq[0] & ~3), 95 + task); 96 96 /* notify_parent(task, SIGCHLD); */ 97 97 return; 98 98 }
+20 -41
arch/parisc/kernel/traps.c
··· 297 297 #define GDB_BREAK_INSN 0x10004 298 298 static void handle_gdb_break(struct pt_regs *regs, int wot) 299 299 { 300 - struct siginfo si; 301 - 302 - si.si_signo = SIGTRAP; 303 - si.si_errno = 0; 304 - si.si_code = wot; 305 - si.si_addr = (void __user *) (regs->iaoq[0] & ~3); 306 - force_sig_info(SIGTRAP, &si, current); 300 + force_sig_fault(SIGTRAP, wot, 301 + (void __user *) (regs->iaoq[0] & ~3), current); 307 302 } 308 303 309 304 static void handle_break(struct pt_regs *regs) ··· 482 487 { 483 488 unsigned long fault_address = 0; 484 489 unsigned long fault_space = 0; 485 - struct siginfo si; 490 + int si_code; 486 491 487 492 if (code == 1) 488 493 pdc_console_restart(); /* switch back to pdc if HPMC */ ··· 566 571 case 8: 567 572 /* Illegal instruction trap */ 568 573 die_if_kernel("Illegal instruction", regs, code); 569 - si.si_code = ILL_ILLOPC; 574 + si_code = ILL_ILLOPC; 570 575 goto give_sigill; 571 576 572 577 case 9: ··· 577 582 case 10: 578 583 /* Privileged operation trap */ 579 584 die_if_kernel("Privileged operation", regs, code); 580 - si.si_code = ILL_PRVOPC; 585 + si_code = ILL_PRVOPC; 581 586 goto give_sigill; 582 587 583 588 case 11: ··· 600 605 } 601 606 602 607 die_if_kernel("Privileged register usage", regs, code); 603 - si.si_code = ILL_PRVREG; 608 + si_code = ILL_PRVREG; 604 609 give_sigill: 605 - si.si_signo = SIGILL; 606 - si.si_errno = 0; 607 - si.si_addr = (void __user *) regs->iaoq[0]; 608 - force_sig_info(SIGILL, &si, current); 610 + force_sig_fault(SIGILL, si_code, 611 + (void __user *) regs->iaoq[0], current); 609 612 return; 610 613 611 614 case 12: 612 615 /* Overflow Trap, let the userland signal handler do the cleanup */ 613 - si.si_signo = SIGFPE; 614 - si.si_code = FPE_INTOVF; 615 - si.si_addr = (void __user *) regs->iaoq[0]; 616 - force_sig_info(SIGFPE, &si, current); 616 + force_sig_fault(SIGFPE, FPE_INTOVF, 617 + (void __user *) regs->iaoq[0], current); 617 618 return; 618 619 619 620 case 13: ··· 617 626 The condition succeeds in an instruction which traps 618 627 on condition */ 619 628 if(user_mode(regs)){ 620 - si.si_signo = SIGFPE; 621 629 /* Let userspace app figure it out from the insn pointed 622 630 * to by si_addr. 623 631 */ 624 - si.si_code = FPE_CONDTRAP; 625 - si.si_addr = (void __user *) regs->iaoq[0]; 626 - force_sig_info(SIGFPE, &si, current); 632 + force_sig_fault(SIGFPE, FPE_CONDTRAP, 633 + (void __user *) regs->iaoq[0], current); 627 634 return; 628 635 } 629 636 /* The kernel doesn't want to handle condition codes */ ··· 730 741 return; 731 742 732 743 die_if_kernel("Protection id trap", regs, code); 733 - si.si_code = SEGV_MAPERR; 734 - si.si_signo = SIGSEGV; 735 - si.si_errno = 0; 736 - if (code == 7) 737 - si.si_addr = (void __user *) regs->iaoq[0]; 738 - else 739 - si.si_addr = (void __user *) regs->ior; 740 - force_sig_info(SIGSEGV, &si, current); 744 + force_sig_fault(SIGSEGV, SEGV_MAPERR, 745 + (code == 7)? 746 + ((void __user *) regs->iaoq[0]) : 747 + ((void __user *) regs->ior), current); 741 748 return; 742 749 743 750 case 28: ··· 747 762 "handle_interruption() pid=%d command='%s'\n", 748 763 task_pid_nr(current), current->comm); 749 764 /* SIGBUS, for lack of a better one. */ 750 - si.si_signo = SIGBUS; 751 - si.si_code = BUS_OBJERR; 752 - si.si_errno = 0; 753 - si.si_addr = (void __user *) regs->ior; 754 - force_sig_info(SIGBUS, &si, current); 765 + force_sig_fault(SIGBUS, BUS_OBJERR, 766 + (void __user *)regs->ior, current); 755 767 return; 756 768 } 757 769 pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC); ··· 763 781 "User fault %d on space 0x%08lx, pid=%d command='%s'\n", 764 782 code, fault_space, 765 783 task_pid_nr(current), current->comm); 766 - si.si_signo = SIGSEGV; 767 - si.si_errno = 0; 768 - si.si_code = SEGV_MAPERR; 769 - si.si_addr = (void __user *) regs->ior; 770 - force_sig_info(SIGSEGV, &si, current); 784 + force_sig_fault(SIGSEGV, SEGV_MAPERR, 785 + (void __user *)regs->ior, current); 771 786 return; 772 787 } 773 788 }
+4 -11
arch/parisc/kernel/unaligned.c
··· 452 452 unsigned long newbase = R1(regs->iir)?regs->gr[R1(regs->iir)]:0; 453 453 int modify = 0; 454 454 int ret = ERR_NOTHANDLED; 455 - struct siginfo si; 456 455 register int flop=0; /* true if this is a flop */ 457 456 458 457 __inc_irq_stat(irq_unaligned_count); ··· 689 690 690 691 if (ret == ERR_PAGEFAULT) 691 692 { 692 - si.si_signo = SIGSEGV; 693 - si.si_errno = 0; 694 - si.si_code = SEGV_MAPERR; 695 - si.si_addr = (void __user *)regs->ior; 696 - force_sig_info(SIGSEGV, &si, current); 693 + force_sig_fault(SIGSEGV, SEGV_MAPERR, 694 + (void __user *)regs->ior, current); 697 695 } 698 696 else 699 697 { 700 698 force_sigbus: 701 699 /* couldn't handle it ... */ 702 - si.si_signo = SIGBUS; 703 - si.si_errno = 0; 704 - si.si_code = BUS_ADRALN; 705 - si.si_addr = (void __user *)regs->ior; 706 - force_sig_info(SIGBUS, &si, current); 700 + force_sig_fault(SIGBUS, BUS_ADRALN, 701 + (void __user *)regs->ior, current); 707 702 } 708 703 709 704 return;
+2 -6
arch/parisc/math-emu/driver.c
··· 81 81 handle_fpe(struct pt_regs *regs) 82 82 { 83 83 extern void printbinary(unsigned long x, int nbits); 84 - struct siginfo si; 85 84 unsigned int orig_sw, sw; 86 85 int signalcode; 87 86 /* need an intermediate copy of float regs because FPU emulation ··· 116 117 117 118 memcpy(regs->fr, frcopy, sizeof regs->fr); 118 119 if (signalcode != 0) { 119 - si.si_signo = signalcode >> 24; 120 - si.si_errno = 0; 121 - si.si_code = signalcode & 0xffffff; 122 - si.si_addr = (void __user *) regs->iaoq[0]; 123 - force_sig_info(si.si_signo, &si, current); 120 + force_sig_fault(signalcode >> 24, signalcode & 0xffffff, 121 + (void __user *) regs->iaoq[0], current); 124 122 return -1; 125 123 } 126 124
+25 -29
arch/parisc/mm/fault.c
··· 353 353 up_read(&mm->mmap_sem); 354 354 355 355 if (user_mode(regs)) { 356 - struct siginfo si; 357 - unsigned int lsb = 0; 356 + int signo, si_code; 358 357 359 358 switch (code) { 360 359 case 15: /* Data TLB miss fault/Data page fault */ 361 360 /* send SIGSEGV when outside of vma */ 362 361 if (!vma || 363 362 address < vma->vm_start || address >= vma->vm_end) { 364 - si.si_signo = SIGSEGV; 365 - si.si_code = SEGV_MAPERR; 363 + signo = SIGSEGV; 364 + si_code = SEGV_MAPERR; 366 365 break; 367 366 } 368 367 369 368 /* send SIGSEGV for wrong permissions */ 370 369 if ((vma->vm_flags & acc_type) != acc_type) { 371 - si.si_signo = SIGSEGV; 372 - si.si_code = SEGV_ACCERR; 370 + signo = SIGSEGV; 371 + si_code = SEGV_ACCERR; 373 372 break; 374 373 } 375 374 ··· 376 377 /* fall through */ 377 378 case 17: /* NA data TLB miss / page fault */ 378 379 case 18: /* Unaligned access - PCXS only */ 379 - si.si_signo = SIGBUS; 380 - si.si_code = (code == 18) ? BUS_ADRALN : BUS_ADRERR; 380 + signo = SIGBUS; 381 + si_code = (code == 18) ? BUS_ADRALN : BUS_ADRERR; 381 382 break; 382 383 case 16: /* Non-access instruction TLB miss fault */ 383 384 case 26: /* PCXL: Data memory access rights trap */ 384 385 default: 385 - si.si_signo = SIGSEGV; 386 - si.si_code = (code == 26) ? SEGV_ACCERR : SEGV_MAPERR; 386 + signo = SIGSEGV; 387 + si_code = (code == 26) ? SEGV_ACCERR : SEGV_MAPERR; 387 388 break; 388 389 } 389 - 390 390 #ifdef CONFIG_MEMORY_FAILURE 391 391 if (fault & (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE)) { 392 + unsigned int lsb = 0; 392 393 printk(KERN_ERR 393 394 "MCE: Killing %s:%d due to hardware memory corruption fault at %08lx\n", 394 395 tsk->comm, tsk->pid, address); 395 - si.si_signo = SIGBUS; 396 - si.si_code = BUS_MCEERR_AR; 396 + /* 397 + * Either small page or large page may be poisoned. 398 + * In other words, VM_FAULT_HWPOISON_LARGE and 399 + * VM_FAULT_HWPOISON are mutually exclusive. 400 + */ 401 + if (fault & VM_FAULT_HWPOISON_LARGE) 402 + lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault)); 403 + else if (fault & VM_FAULT_HWPOISON) 404 + lsb = PAGE_SHIFT; 405 + 406 + force_sig_mceerr(BUS_MCEERR_AR, (void __user *) address, 407 + lsb, current); 408 + return; 397 409 } 398 410 #endif 411 + show_signal_msg(regs, code, address, tsk, vma); 399 412 400 - /* 401 - * Either small page or large page may be poisoned. 402 - * In other words, VM_FAULT_HWPOISON_LARGE and 403 - * VM_FAULT_HWPOISON are mutually exclusive. 404 - */ 405 - if (fault & VM_FAULT_HWPOISON_LARGE) 406 - lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault)); 407 - else if (fault & VM_FAULT_HWPOISON) 408 - lsb = PAGE_SHIFT; 409 - else 410 - show_signal_msg(regs, code, address, tsk, vma); 411 - si.si_addr_lsb = lsb; 412 - 413 - si.si_errno = 0; 414 - si.si_addr = (void __user *) address; 415 - force_sig_info(si.si_signo, &si, current); 413 + force_sig_fault(signo, si_code, (void __user *) address, current); 416 414 return; 417 415 } 418 416
-15
arch/powerpc/include/uapi/asm/siginfo.h
··· 15 15 16 16 #include <asm-generic/siginfo.h> 17 17 18 - /* 19 - * SIGFPE si_codes 20 - */ 21 - #ifdef __KERNEL__ 22 - #define FPE_FIXME 0 /* Broken dup of SI_USER */ 23 - #endif /* __KERNEL__ */ 24 - 25 - /* 26 - * SIGTRAP si_codes 27 - */ 28 - #ifdef __KERNEL__ 29 - #define TRAP_FIXME 0 /* Broken dup of SI_USER */ 30 - #endif /* __KERNEL__ */ 31 - 32 - 33 18 #endif /* _ASM_POWERPC_SIGINFO_H */
+1
arch/powerpc/kernel/process.c
··· 632 632 hw_breakpoint_disable(); 633 633 634 634 /* Deliver the signal to userspace */ 635 + clear_siginfo(&info); 635 636 info.si_signo = SIGTRAP; 636 637 info.si_errno = 0; 637 638 info.si_code = TRAP_HWBKPT;
+6 -7
arch/powerpc/kernel/traps.c
··· 296 296 void user_single_step_siginfo(struct task_struct *tsk, 297 297 struct pt_regs *regs, siginfo_t *info) 298 298 { 299 - memset(info, 0, sizeof(*info)); 300 299 info->si_signo = SIGTRAP; 301 300 info->si_code = TRAP_TRACE; 302 301 info->si_addr = (void __user *)regs->nip; ··· 333 334 */ 334 335 thread_pkey_regs_save(&current->thread); 335 336 336 - memset(&info, 0, sizeof(info)); 337 + clear_siginfo(&info); 337 338 info.si_signo = signr; 338 339 info.si_code = code; 339 340 info.si_addr = (void __user *) addr; ··· 969 970 printk("Bad trap at PC: %lx, SR: %lx, vector=%lx\n", 970 971 regs->nip, regs->msr, regs->trap); 971 972 972 - _exception(SIGTRAP, regs, TRAP_FIXME, 0); 973 + _exception(SIGTRAP, regs, TRAP_UNK, 0); 973 974 974 975 exception_exit(prev_state); 975 976 } ··· 991 992 992 993 void RunModeException(struct pt_regs *regs) 993 994 { 994 - _exception(SIGTRAP, regs, TRAP_FIXME, 0); 995 + _exception(SIGTRAP, regs, TRAP_UNK, 0); 995 996 } 996 997 997 998 void single_step_exception(struct pt_regs *regs) ··· 1031 1032 1032 1033 static inline int __parse_fpscr(unsigned long fpscr) 1033 1034 { 1034 - int ret = FPE_FIXME; 1035 + int ret = FPE_FLTUNK; 1035 1036 1036 1037 /* Invalid operation */ 1037 1038 if ((fpscr & FPSCR_VE) && (fpscr & FPSCR_VX)) ··· 1972 1973 extern int do_spe_mathemu(struct pt_regs *regs); 1973 1974 unsigned long spefscr; 1974 1975 int fpexc_mode; 1975 - int code = FPE_FIXME; 1976 + int code = FPE_FLTUNK; 1976 1977 int err; 1977 1978 1978 1979 flush_spe_to_thread(current); ··· 2041 2042 printk(KERN_ERR "unrecognized spe instruction " 2042 2043 "in %s at %lx\n", current->comm, regs->nip); 2043 2044 } else { 2044 - _exception(SIGFPE, regs, FPE_FIXME, regs->nip); 2045 + _exception(SIGFPE, regs, FPE_FLTUNK, regs->nip); 2045 2046 return; 2046 2047 } 2047 2048 }
+1
arch/powerpc/mm/fault.c
··· 168 168 return SIGBUS; 169 169 170 170 current->thread.trap_nr = BUS_ADRERR; 171 + clear_siginfo(&info); 171 172 info.si_signo = SIGBUS; 172 173 info.si_errno = 0; 173 174 info.si_code = BUS_ADRERR;
+1 -1
arch/powerpc/platforms/cell/spufs/fault.c
··· 44 44 return; 45 45 } 46 46 47 - memset(&info, 0, sizeof(info)); 47 + clear_siginfo(&info); 48 48 49 49 switch (type) { 50 50 case SPE_EVENT_INVALID_DMA:
+2 -14
arch/riscv/kernel/traps.c
··· 63 63 do_exit(SIGSEGV); 64 64 } 65 65 66 - static inline void do_trap_siginfo(int signo, int code, 67 - unsigned long addr, struct task_struct *tsk) 68 - { 69 - siginfo_t info; 70 - 71 - info.si_signo = signo; 72 - info.si_errno = 0; 73 - info.si_code = code; 74 - info.si_addr = (void __user *)addr; 75 - force_sig_info(signo, &info, tsk); 76 - } 77 - 78 66 void do_trap(struct pt_regs *regs, int signo, int code, 79 67 unsigned long addr, struct task_struct *tsk) 80 68 { ··· 75 87 show_regs(regs); 76 88 } 77 89 78 - do_trap_siginfo(signo, code, addr, tsk); 90 + force_sig_fault(signo, code, (void __user *)addr, tsk); 79 91 } 80 92 81 93 static void do_trap_error(struct pt_regs *regs, int signo, int code, ··· 137 149 } 138 150 #endif /* CONFIG_GENERIC_BUG */ 139 151 140 - do_trap_siginfo(SIGTRAP, TRAP_BRKPT, regs->sepc, current); 152 + force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)(regs->sepc), current); 141 153 regs->sepc += 0x4; 142 154 } 143 155
+6 -23
arch/s390/kernel/traps.c
··· 44 44 45 45 void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str) 46 46 { 47 - siginfo_t info; 48 - 49 47 if (user_mode(regs)) { 50 - info.si_signo = si_signo; 51 - info.si_errno = 0; 52 - info.si_code = si_code; 53 - info.si_addr = get_trap_ip(regs); 54 - force_sig_info(si_signo, &info, current); 48 + force_sig_fault(si_signo, si_code, get_trap_ip(regs), current); 55 49 report_user_fault(regs, si_signo, 0); 56 50 } else { 57 51 const struct exception_table_entry *fixup; ··· 74 80 75 81 void do_per_trap(struct pt_regs *regs) 76 82 { 77 - siginfo_t info; 78 - 79 83 if (notify_die(DIE_SSTEP, "sstep", regs, 0, 0, SIGTRAP) == NOTIFY_STOP) 80 84 return; 81 85 if (!current->ptrace) 82 86 return; 83 - info.si_signo = SIGTRAP; 84 - info.si_errno = 0; 85 - info.si_code = TRAP_HWBKPT; 86 - info.si_addr = 87 - (void __force __user *) current->thread.per_event.address; 88 - force_sig_info(SIGTRAP, &info, current); 87 + force_sig_fault(SIGTRAP, TRAP_HWBKPT, 88 + (void __force __user *) current->thread.per_event.address, current); 89 89 } 90 90 NOKPROBE_SYMBOL(do_per_trap); 91 91 ··· 153 165 154 166 void illegal_op(struct pt_regs *regs) 155 167 { 156 - siginfo_t info; 157 168 __u8 opcode[6]; 158 169 __u16 __user *location; 159 170 int is_uprobe_insn = 0; ··· 164 177 if (get_user(*((__u16 *) opcode), (__u16 __user *) location)) 165 178 return; 166 179 if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { 167 - if (current->ptrace) { 168 - info.si_signo = SIGTRAP; 169 - info.si_errno = 0; 170 - info.si_code = TRAP_BRKPT; 171 - info.si_addr = location; 172 - force_sig_info(SIGTRAP, &info, current); 173 - } else 180 + if (current->ptrace) 181 + force_sig_fault(SIGTRAP, TRAP_BRKPT, location, current); 182 + else 174 183 signal = SIGILL; 175 184 #ifdef CONFIG_UPROBES 176 185 } else if (*((__u16 *) opcode) == UPROBE_SWBP_INSN) {
+6 -15
arch/s390/mm/fault.c
··· 265 265 */ 266 266 static noinline void do_sigsegv(struct pt_regs *regs, int si_code) 267 267 { 268 - struct siginfo si; 269 - 270 268 report_user_fault(regs, SIGSEGV, 1); 271 - si.si_signo = SIGSEGV; 272 - si.si_errno = 0; 273 - si.si_code = si_code; 274 - si.si_addr = (void __user *)(regs->int_parm_long & __FAIL_ADDR_MASK); 275 - force_sig_info(SIGSEGV, &si, current); 269 + force_sig_fault(SIGSEGV, si_code, 270 + (void __user *)(regs->int_parm_long & __FAIL_ADDR_MASK), 271 + current); 276 272 } 277 273 278 274 static noinline void do_no_context(struct pt_regs *regs) ··· 312 316 313 317 static noinline void do_sigbus(struct pt_regs *regs) 314 318 { 315 - struct task_struct *tsk = current; 316 - struct siginfo si; 317 - 318 319 /* 319 320 * Send a sigbus, regardless of whether we were in kernel 320 321 * or user mode. 321 322 */ 322 - si.si_signo = SIGBUS; 323 - si.si_errno = 0; 324 - si.si_code = BUS_ADRERR; 325 - si.si_addr = (void __user *)(regs->int_parm_long & __FAIL_ADDR_MASK); 326 - force_sig_info(SIGBUS, &si, tsk); 323 + force_sig_fault(SIGBUS, BUS_ADRERR, 324 + (void __user *)(regs->int_parm_long & __FAIL_ADDR_MASK), 325 + current); 327 326 } 328 327 329 328 static noinline int signal_return(struct pt_regs *regs)
+2 -7
arch/sh/kernel/hw_breakpoint.c
··· 347 347 348 348 /* Deliver the signal to userspace */ 349 349 if (!arch_check_bp_in_kernelspace(bp)) { 350 - siginfo_t info; 351 - 352 - info.si_signo = args->signr; 353 - info.si_errno = notifier_to_errno(rc); 354 - info.si_code = TRAP_HWBKPT; 355 - 356 - force_sig_info(args->signr, &info, current); 350 + force_sig_fault(SIGTRAP, TRAP_HWBKPT, 351 + (void __user *)NULL, current); 357 352 } 358 353 359 354 rcu_read_unlock();
+8 -12
arch/sh/kernel/traps_32.c
··· 477 477 { 478 478 unsigned long error_code = 0; 479 479 mm_segment_t oldfs; 480 - siginfo_t info; 481 480 insn_size_t instruction; 482 481 int tmp; 483 482 ··· 536 537 "access (PC %lx PR %lx)\n", current->comm, regs->pc, 537 538 regs->pr); 538 539 539 - info.si_signo = SIGBUS; 540 - info.si_errno = 0; 541 - info.si_code = si_code; 542 - info.si_addr = (void __user *)address; 543 - force_sig_info(SIGBUS, &info, current); 540 + force_sig_fault(SIGBUS, si_code, (void __user *)address, current); 544 541 } else { 545 542 inc_unaligned_kernel_access(); 546 543 ··· 593 598 #ifdef CONFIG_CPU_SH2A 594 599 asmlinkage void do_divide_error(unsigned long r4) 595 600 { 596 - siginfo_t info; 601 + int code; 597 602 598 603 switch (r4) { 599 604 case TRAP_DIVZERO_ERROR: 600 - info.si_code = FPE_INTDIV; 605 + code = FPE_INTDIV; 601 606 break; 602 607 case TRAP_DIVOVF_ERROR: 603 - info.si_code = FPE_INTOVF; 608 + code = FPE_INTOVF; 604 609 break; 610 + default: 611 + /* Let gcc know unhandled cases don't make it past here */ 612 + return; 605 613 } 606 - 607 - info.si_signo = SIGFPE; 608 - force_sig_info(info.si_signo, &info, current); 614 + force_sig_fault(SIGFPE, code, NULL, current); 609 615 } 610 616 #endif 611 617
+2 -6
arch/sh/math-emu/math.c
··· 507 507 unsigned short insn = *(unsigned short *)regs->pc; 508 508 unsigned short finsn; 509 509 unsigned long nextpc; 510 - siginfo_t info; 511 510 int nib[4] = { 512 511 (insn >> 12) & 0xf, 513 512 (insn >> 8) & 0xf, ··· 559 560 ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); 560 561 task_thread_info(tsk)->status |= TS_USEDFPU; 561 562 } else { 562 - info.si_signo = SIGFPE; 563 - info.si_errno = 0; 564 - info.si_code = FPE_FLTINV; 565 - info.si_addr = (void __user *)regs->pc; 566 - force_sig_info(SIGFPE, &info, tsk); 563 + force_sig_fault(SIGFPE, FPE_FLTINV, 564 + (void __user *)regs->pc, tsk); 567 565 } 568 566 569 567 regs->pc = nextpc;
+1 -8
arch/sh/mm/fault.c
··· 42 42 force_sig_info_fault(int si_signo, int si_code, unsigned long address, 43 43 struct task_struct *tsk) 44 44 { 45 - siginfo_t info; 46 - 47 - info.si_signo = si_signo; 48 - info.si_errno = 0; 49 - info.si_code = si_code; 50 - info.si_addr = (void __user *)address; 51 - 52 - force_sig_info(si_signo, &info, tsk); 45 + force_sig_fault(si_signo, si_code, (void __user *)address, tsk); 53 46 } 54 47 55 48 /*
-7
arch/sparc/include/uapi/asm/siginfo.h
··· 18 18 #define SI_NOINFO 32767 /* no information in siginfo_t */ 19 19 20 20 /* 21 - * SIGFPE si_codes 22 - */ 23 - #ifdef __KERNEL__ 24 - #define FPE_FIXME 0 /* Broken dup of SI_USER */ 25 - #endif /* __KERNEL__ */ 26 - 27 - /* 28 21 * SIGEMT si_codes 29 22 */ 30 23 #define EMT_TAGOVF 1 /* tag overflow */
+1 -8
arch/sparc/kernel/process_64.c
··· 518 518 519 519 static void stack_unaligned(unsigned long sp) 520 520 { 521 - siginfo_t info; 522 - 523 - info.si_signo = SIGBUS; 524 - info.si_errno = 0; 525 - info.si_code = BUS_ADRALN; 526 - info.si_addr = (void __user *) sp; 527 - info.si_trapno = 0; 528 - force_sig_info(SIGBUS, &info, current); 521 + force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *) sp, 0, current); 529 522 } 530 523 531 524 void fault_in_user_windows(void)
+1 -7
arch/sparc/kernel/sys_sparc_32.c
··· 147 147 asmlinkage void 148 148 sparc_breakpoint (struct pt_regs *regs) 149 149 { 150 - siginfo_t info; 151 150 152 151 #ifdef DEBUG_SPARC_BREAKPOINT 153 152 printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs->pc, regs->npc); 154 153 #endif 155 - info.si_signo = SIGTRAP; 156 - info.si_errno = 0; 157 - info.si_code = TRAP_BRKPT; 158 - info.si_addr = (void __user *)regs->pc; 159 - info.si_trapno = 0; 160 - force_sig_info(SIGTRAP, &info, current); 154 + force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->pc, 0, current); 161 155 162 156 #ifdef DEBUG_SPARC_BREAKPOINT 163 157 printk ("TRAP: Returning to space: PC=%x nPC=%x\n", regs->pc, regs->npc);
+1 -7
arch/sparc/kernel/sys_sparc_64.c
··· 502 502 asmlinkage void sparc_breakpoint(struct pt_regs *regs) 503 503 { 504 504 enum ctx_state prev_state = exception_enter(); 505 - siginfo_t info; 506 505 507 506 if (test_thread_flag(TIF_32BIT)) { 508 507 regs->tpc &= 0xffffffff; ··· 510 511 #ifdef DEBUG_SPARC_BREAKPOINT 511 512 printk ("TRAP: Entering kernel PC=%lx, nPC=%lx\n", regs->tpc, regs->tnpc); 512 513 #endif 513 - info.si_signo = SIGTRAP; 514 - info.si_errno = 0; 515 - info.si_code = TRAP_BRKPT; 516 - info.si_addr = (void __user *)regs->tpc; 517 - info.si_trapno = 0; 518 - force_sig_info(SIGTRAP, &info, current); 514 + force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->tpc, 0, current); 519 515 #ifdef DEBUG_SPARC_BREAKPOINT 520 516 printk ("TRAP: Returning to space: PC=%lx nPC=%lx\n", regs->tpc, regs->tnpc); 521 517 #endif
+20 -84
arch/sparc/kernel/traps_32.c
··· 93 93 94 94 void do_hw_interrupt(struct pt_regs *regs, unsigned long type) 95 95 { 96 - siginfo_t info; 97 - 98 96 if(type < 0x80) { 99 97 /* Sun OS's puke from bad traps, Linux survives! */ 100 98 printk("Unimplemented Sparc TRAP, type = %02lx\n", type); ··· 102 104 if(regs->psr & PSR_PS) 103 105 die_if_kernel("Kernel bad trap", regs); 104 106 105 - info.si_signo = SIGILL; 106 - info.si_errno = 0; 107 - info.si_code = ILL_ILLTRP; 108 - info.si_addr = (void __user *)regs->pc; 109 - info.si_trapno = type - 0x80; 110 - force_sig_info(SIGILL, &info, current); 107 + force_sig_fault(SIGILL, ILL_ILLTRP, 108 + (void __user *)regs->pc, type - 0x80, current); 111 109 } 112 110 113 111 void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, unsigned long npc, 114 112 unsigned long psr) 115 113 { 116 - siginfo_t info; 117 - 118 114 if(psr & PSR_PS) 119 115 die_if_kernel("Kernel illegal instruction", regs); 120 116 #ifdef TRAP_DEBUG ··· 116 124 regs->pc, *(unsigned long *)regs->pc); 117 125 #endif 118 126 119 - info.si_signo = SIGILL; 120 - info.si_errno = 0; 121 - info.si_code = ILL_ILLOPC; 122 - info.si_addr = (void __user *)pc; 123 - info.si_trapno = 0; 124 - send_sig_info(SIGILL, &info, current); 127 + send_sig_fault(SIGILL, ILL_ILLOPC, (void __user *)pc, 0, current); 125 128 } 126 129 127 130 void do_priv_instruction(struct pt_regs *regs, unsigned long pc, unsigned long npc, 128 131 unsigned long psr) 129 132 { 130 - siginfo_t info; 131 - 132 133 if(psr & PSR_PS) 133 134 die_if_kernel("Penguin instruction from Penguin mode??!?!", regs); 134 - info.si_signo = SIGILL; 135 - info.si_errno = 0; 136 - info.si_code = ILL_PRVOPC; 137 - info.si_addr = (void __user *)pc; 138 - info.si_trapno = 0; 139 - send_sig_info(SIGILL, &info, current); 135 + send_sig_fault(SIGILL, ILL_PRVOPC, (void __user *)pc, 0, current); 140 136 } 141 137 142 138 /* XXX User may want to be allowed to do this. XXX */ ··· 132 152 void do_memaccess_unaligned(struct pt_regs *regs, unsigned long pc, unsigned long npc, 133 153 unsigned long psr) 134 154 { 135 - siginfo_t info; 136 - 137 155 if(regs->psr & PSR_PS) { 138 156 printk("KERNEL MNA at pc %08lx npc %08lx called by %08lx\n", pc, npc, 139 157 regs->u_regs[UREG_RETPC]); ··· 143 165 instruction_dump ((unsigned long *) regs->pc); 144 166 printk ("do_MNA!\n"); 145 167 #endif 146 - info.si_signo = SIGBUS; 147 - info.si_errno = 0; 148 - info.si_code = BUS_ADRALN; 149 - info.si_addr = /* FIXME: Should dig out mna address */ (void *)0; 150 - info.si_trapno = 0; 151 - send_sig_info(SIGBUS, &info, current); 168 + send_sig_fault(SIGBUS, BUS_ADRALN, 169 + /* FIXME: Should dig out mna address */ (void *)0, 170 + 0, current); 152 171 } 153 172 154 173 static unsigned long init_fsr = 0x0UL; ··· 201 226 unsigned long psr) 202 227 { 203 228 static int calls; 204 - siginfo_t info; 205 229 unsigned long fsr; 206 230 int ret = 0; 231 + int code; 207 232 #ifndef CONFIG_SMP 208 233 struct task_struct *fpt = last_task_used_math; 209 234 #else ··· 278 303 } 279 304 280 305 fsr = fpt->thread.fsr; 281 - info.si_signo = SIGFPE; 282 - info.si_errno = 0; 283 - info.si_addr = (void __user *)pc; 284 - info.si_trapno = 0; 285 - info.si_code = FPE_FIXME; 306 + code = FPE_FLTUNK; 286 307 if ((fsr & 0x1c000) == (1 << 14)) { 287 308 if (fsr & 0x10) 288 - info.si_code = FPE_FLTINV; 309 + code = FPE_FLTINV; 289 310 else if (fsr & 0x08) 290 - info.si_code = FPE_FLTOVF; 311 + code = FPE_FLTOVF; 291 312 else if (fsr & 0x04) 292 - info.si_code = FPE_FLTUND; 313 + code = FPE_FLTUND; 293 314 else if (fsr & 0x02) 294 - info.si_code = FPE_FLTDIV; 315 + code = FPE_FLTDIV; 295 316 else if (fsr & 0x01) 296 - info.si_code = FPE_FLTRES; 317 + code = FPE_FLTRES; 297 318 } 298 - send_sig_info(SIGFPE, &info, fpt); 319 + send_sig_fault(SIGFPE, code, (void __user *)pc, 0, fpt); 299 320 #ifndef CONFIG_SMP 300 321 last_task_used_math = NULL; 301 322 #endif ··· 303 332 void handle_tag_overflow(struct pt_regs *regs, unsigned long pc, unsigned long npc, 304 333 unsigned long psr) 305 334 { 306 - siginfo_t info; 307 - 308 335 if(psr & PSR_PS) 309 336 die_if_kernel("Penguin overflow trap from kernel mode", regs); 310 - info.si_signo = SIGEMT; 311 - info.si_errno = 0; 312 - info.si_code = EMT_TAGOVF; 313 - info.si_addr = (void __user *)pc; 314 - info.si_trapno = 0; 315 - send_sig_info(SIGEMT, &info, current); 337 + send_sig_fault(SIGEMT, EMT_TAGOVF, (void __user *)pc, 0, current); 316 338 } 317 339 318 340 void handle_watchpoint(struct pt_regs *regs, unsigned long pc, unsigned long npc, ··· 323 359 void handle_reg_access(struct pt_regs *regs, unsigned long pc, unsigned long npc, 324 360 unsigned long psr) 325 361 { 326 - siginfo_t info; 327 - 328 362 #ifdef TRAP_DEBUG 329 363 printk("Register Access Exception at PC %08lx NPC %08lx PSR %08lx\n", 330 364 pc, npc, psr); 331 365 #endif 332 - info.si_signo = SIGBUS; 333 - info.si_errno = 0; 334 - info.si_code = BUS_OBJERR; 335 - info.si_addr = (void __user *)pc; 336 - info.si_trapno = 0; 337 - force_sig_info(SIGBUS, &info, current); 366 + force_sig_fault(SIGBUS, BUS_OBJERR, (void __user *)pc, 0, current); 338 367 } 339 368 340 369 void handle_cp_disabled(struct pt_regs *regs, unsigned long pc, unsigned long npc, 341 370 unsigned long psr) 342 371 { 343 - siginfo_t info; 344 - 345 - info.si_signo = SIGILL; 346 - info.si_errno = 0; 347 - info.si_code = ILL_COPROC; 348 - info.si_addr = (void __user *)pc; 349 - info.si_trapno = 0; 350 - send_sig_info(SIGILL, &info, current); 372 + send_sig_fault(SIGILL, ILL_COPROC, (void __user *)pc, 0, current); 351 373 } 352 374 353 375 void handle_cp_exception(struct pt_regs *regs, unsigned long pc, unsigned long npc, 354 376 unsigned long psr) 355 377 { 356 - siginfo_t info; 357 - 358 378 #ifdef TRAP_DEBUG 359 379 printk("Co-Processor Exception at PC %08lx NPC %08lx PSR %08lx\n", 360 380 pc, npc, psr); 361 381 #endif 362 - info.si_signo = SIGILL; 363 - info.si_errno = 0; 364 - info.si_code = ILL_COPROC; 365 - info.si_addr = (void __user *)pc; 366 - info.si_trapno = 0; 367 - send_sig_info(SIGILL, &info, current); 382 + send_sig_fault(SIGILL, ILL_COPROC, (void __user *)pc, 0, current); 368 383 } 369 384 370 385 void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, unsigned long npc, 371 386 unsigned long psr) 372 387 { 373 - siginfo_t info; 374 - 375 - info.si_signo = SIGFPE; 376 - info.si_errno = 0; 377 - info.si_code = FPE_INTDIV; 378 - info.si_addr = (void __user *)pc; 379 - info.si_trapno = 0; 380 - send_sig_info(SIGFPE, &info, current); 388 + send_sig_fault(SIGFPE, FPE_INTDIV, (void __user *)pc, 0, current); 381 389 } 382 390 383 391 #ifdef CONFIG_DEBUG_BUGVERBOSE
+28 -103
arch/sparc/kernel/traps_64.c
··· 87 87 void bad_trap(struct pt_regs *regs, long lvl) 88 88 { 89 89 char buffer[36]; 90 - siginfo_t info; 91 90 92 91 if (notify_die(DIE_TRAP, "bad trap", regs, 93 92 0, lvl, SIGTRAP) == NOTIFY_STOP) ··· 106 107 regs->tpc &= 0xffffffff; 107 108 regs->tnpc &= 0xffffffff; 108 109 } 109 - info.si_signo = SIGILL; 110 - info.si_errno = 0; 111 - info.si_code = ILL_ILLTRP; 112 - info.si_addr = (void __user *)regs->tpc; 113 - info.si_trapno = lvl; 114 - force_sig_info(SIGILL, &info, current); 110 + force_sig_fault(SIGILL, ILL_ILLTRP, 111 + (void __user *)regs->tpc, lvl, current); 115 112 } 116 113 117 114 void bad_trap_tl1(struct pt_regs *regs, long lvl) ··· 186 191 void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar) 187 192 { 188 193 enum ctx_state prev_state = exception_enter(); 189 - siginfo_t info; 190 194 191 195 if (notify_die(DIE_TRAP, "instruction access exception", regs, 192 196 0, 0x8, SIGTRAP) == NOTIFY_STOP) ··· 200 206 regs->tpc &= 0xffffffff; 201 207 regs->tnpc &= 0xffffffff; 202 208 } 203 - info.si_signo = SIGSEGV; 204 - info.si_errno = 0; 205 - info.si_code = SEGV_MAPERR; 206 - info.si_addr = (void __user *)regs->tpc; 207 - info.si_trapno = 0; 208 - force_sig_info(SIGSEGV, &info, current); 209 + force_sig_fault(SIGSEGV, SEGV_MAPERR, 210 + (void __user *)regs->tpc, 0, current); 209 211 out: 210 212 exception_exit(prev_state); 211 213 } ··· 220 230 { 221 231 unsigned short type = (type_ctx >> 16); 222 232 unsigned short ctx = (type_ctx & 0xffff); 223 - siginfo_t info; 224 233 225 234 if (notify_die(DIE_TRAP, "instruction access exception", regs, 226 235 0, 0x8, SIGTRAP) == NOTIFY_STOP) ··· 236 247 regs->tpc &= 0xffffffff; 237 248 regs->tnpc &= 0xffffffff; 238 249 } 239 - info.si_signo = SIGSEGV; 240 - info.si_errno = 0; 241 - info.si_code = SEGV_MAPERR; 242 - info.si_addr = (void __user *) addr; 243 - info.si_trapno = 0; 244 - force_sig_info(SIGSEGV, &info, current); 250 + force_sig_fault(SIGSEGV, SEGV_MAPERR, (void __user *) addr, 0, current); 245 251 } 246 252 247 253 void sun4v_insn_access_exception_tl1(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx) ··· 291 307 void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar) 292 308 { 293 309 enum ctx_state prev_state = exception_enter(); 294 - siginfo_t info; 295 310 296 311 if (notify_die(DIE_TRAP, "data access exception", regs, 297 312 0, 0x30, SIGTRAP) == NOTIFY_STOP) ··· 321 338 if (is_no_fault_exception(regs)) 322 339 return; 323 340 324 - info.si_signo = SIGSEGV; 325 - info.si_errno = 0; 326 - info.si_code = SEGV_MAPERR; 327 - info.si_addr = (void __user *)sfar; 328 - info.si_trapno = 0; 329 - force_sig_info(SIGSEGV, &info, current); 341 + force_sig_fault(SIGSEGV, SEGV_MAPERR, (void __user *)sfar, 0, current); 330 342 out: 331 343 exception_exit(prev_state); 332 344 } ··· 537 559 538 560 static void spitfire_ue_log(unsigned long afsr, unsigned long afar, unsigned long udbh, unsigned long udbl, unsigned long tt, int tl1, struct pt_regs *regs) 539 561 { 540 - siginfo_t info; 541 - 542 562 printk(KERN_WARNING "CPU[%d]: Uncorrectable Error AFSR[%lx] " 543 563 "AFAR[%lx] UDBL[%lx] UDBH[%ld] TT[%lx] TL>1[%d]\n", 544 564 smp_processor_id(), afsr, afar, udbl, udbh, tt, tl1); ··· 571 595 regs->tpc &= 0xffffffff; 572 596 regs->tnpc &= 0xffffffff; 573 597 } 574 - info.si_signo = SIGBUS; 575 - info.si_errno = 0; 576 - info.si_code = BUS_OBJERR; 577 - info.si_addr = (void *)0; 578 - info.si_trapno = 0; 579 - force_sig_info(SIGBUS, &info, current); 598 + force_sig_fault(SIGBUS, BUS_OBJERR, (void *)0, 0, current); 580 599 } 581 600 582 601 void spitfire_access_error(struct pt_regs *regs, unsigned long status_encoded, unsigned long afar) ··· 2161 2190 2162 2191 if (attrs & SUN4V_ERR_ATTRS_MEMORY) { 2163 2192 unsigned long addr = ent->err_raddr; 2164 - siginfo_t info; 2165 2193 2166 2194 if (addr == ~(u64)0) { 2167 2195 /* This seems highly unlikely to ever occur */ ··· 2181 2211 addr += PAGE_SIZE; 2182 2212 } 2183 2213 } 2184 - info.si_signo = SIGKILL; 2185 - info.si_errno = 0; 2186 - info.si_trapno = 0; 2187 - force_sig_info(info.si_signo, &info, current); 2214 + force_sig(SIGKILL, current); 2188 2215 2189 2216 return true; 2190 2217 } 2191 2218 if (attrs & SUN4V_ERR_ATTRS_PIO) { 2192 - siginfo_t info; 2193 - 2194 - info.si_signo = SIGBUS; 2195 - info.si_code = BUS_ADRERR; 2196 - info.si_addr = (void __user *)sun4v_get_vaddr(regs); 2197 - force_sig_info(info.si_signo, &info, current); 2198 - 2219 + force_sig_fault(SIGBUS, BUS_ADRERR, 2220 + (void __user *)sun4v_get_vaddr(regs), 0, current); 2199 2221 return true; 2200 2222 } 2201 2223 ··· 2324 2362 regs->tnpc += 4; 2325 2363 } else { 2326 2364 unsigned long fsr = current_thread_info()->xfsr[0]; 2327 - siginfo_t info; 2365 + int code; 2328 2366 2329 2367 if (test_thread_flag(TIF_32BIT)) { 2330 2368 regs->tpc &= 0xffffffff; 2331 2369 regs->tnpc &= 0xffffffff; 2332 2370 } 2333 - info.si_signo = SIGFPE; 2334 - info.si_errno = 0; 2335 - info.si_addr = (void __user *)regs->tpc; 2336 - info.si_trapno = 0; 2337 - info.si_code = FPE_FIXME; 2371 + code = FPE_FLTUNK; 2338 2372 if ((fsr & 0x1c000) == (1 << 14)) { 2339 2373 if (fsr & 0x10) 2340 - info.si_code = FPE_FLTINV; 2374 + code = FPE_FLTINV; 2341 2375 else if (fsr & 0x08) 2342 - info.si_code = FPE_FLTOVF; 2376 + code = FPE_FLTOVF; 2343 2377 else if (fsr & 0x04) 2344 - info.si_code = FPE_FLTUND; 2378 + code = FPE_FLTUND; 2345 2379 else if (fsr & 0x02) 2346 - info.si_code = FPE_FLTDIV; 2380 + code = FPE_FLTDIV; 2347 2381 else if (fsr & 0x01) 2348 - info.si_code = FPE_FLTRES; 2382 + code = FPE_FLTRES; 2349 2383 } 2350 - force_sig_info(SIGFPE, &info, current); 2384 + force_sig_fault(SIGFPE, code, 2385 + (void __user *)regs->tpc, 0, current); 2351 2386 } 2352 2387 } 2353 2388 ··· 2387 2428 void do_tof(struct pt_regs *regs) 2388 2429 { 2389 2430 enum ctx_state prev_state = exception_enter(); 2390 - siginfo_t info; 2391 2431 2392 2432 if (notify_die(DIE_TRAP, "tagged arithmetic overflow", regs, 2393 2433 0, 0x26, SIGEMT) == NOTIFY_STOP) ··· 2398 2440 regs->tpc &= 0xffffffff; 2399 2441 regs->tnpc &= 0xffffffff; 2400 2442 } 2401 - info.si_signo = SIGEMT; 2402 - info.si_errno = 0; 2403 - info.si_code = EMT_TAGOVF; 2404 - info.si_addr = (void __user *)regs->tpc; 2405 - info.si_trapno = 0; 2406 - force_sig_info(SIGEMT, &info, current); 2443 + force_sig_fault(SIGEMT, EMT_TAGOVF, 2444 + (void __user *)regs->tpc, 0, current); 2407 2445 out: 2408 2446 exception_exit(prev_state); 2409 2447 } ··· 2407 2453 void do_div0(struct pt_regs *regs) 2408 2454 { 2409 2455 enum ctx_state prev_state = exception_enter(); 2410 - siginfo_t info; 2411 2456 2412 2457 if (notify_die(DIE_TRAP, "integer division by zero", regs, 2413 2458 0, 0x28, SIGFPE) == NOTIFY_STOP) ··· 2418 2465 regs->tpc &= 0xffffffff; 2419 2466 regs->tnpc &= 0xffffffff; 2420 2467 } 2421 - info.si_signo = SIGFPE; 2422 - info.si_errno = 0; 2423 - info.si_code = FPE_INTDIV; 2424 - info.si_addr = (void __user *)regs->tpc; 2425 - info.si_trapno = 0; 2426 - force_sig_info(SIGFPE, &info, current); 2468 + force_sig_fault(SIGFPE, FPE_INTDIV, 2469 + (void __user *)regs->tpc, 0, current); 2427 2470 out: 2428 2471 exception_exit(prev_state); 2429 2472 } ··· 2581 2632 unsigned long pc = regs->tpc; 2582 2633 unsigned long tstate = regs->tstate; 2583 2634 u32 insn; 2584 - siginfo_t info; 2585 2635 2586 2636 if (notify_die(DIE_TRAP, "illegal instruction", regs, 2587 2637 0, 0x10, SIGILL) == NOTIFY_STOP) ··· 2614 2666 } 2615 2667 } 2616 2668 } 2617 - info.si_signo = SIGILL; 2618 - info.si_errno = 0; 2619 - info.si_code = ILL_ILLOPC; 2620 - info.si_addr = (void __user *)pc; 2621 - info.si_trapno = 0; 2622 - force_sig_info(SIGILL, &info, current); 2669 + force_sig_fault(SIGILL, ILL_ILLOPC, (void __user *)pc, 0, current); 2623 2670 out: 2624 2671 exception_exit(prev_state); 2625 2672 } ··· 2622 2679 void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr) 2623 2680 { 2624 2681 enum ctx_state prev_state = exception_enter(); 2625 - siginfo_t info; 2626 2682 2627 2683 if (notify_die(DIE_TRAP, "memory address unaligned", regs, 2628 2684 0, 0x34, SIGSEGV) == NOTIFY_STOP) ··· 2634 2692 if (is_no_fault_exception(regs)) 2635 2693 return; 2636 2694 2637 - info.si_signo = SIGBUS; 2638 - info.si_errno = 0; 2639 - info.si_code = BUS_ADRALN; 2640 - info.si_addr = (void __user *)sfar; 2641 - info.si_trapno = 0; 2642 - force_sig_info(SIGBUS, &info, current); 2695 + force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)sfar, 0, current); 2643 2696 out: 2644 2697 exception_exit(prev_state); 2645 2698 } 2646 2699 2647 2700 void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx) 2648 2701 { 2649 - siginfo_t info; 2650 - 2651 2702 if (notify_die(DIE_TRAP, "memory address unaligned", regs, 2652 2703 0, 0x34, SIGSEGV) == NOTIFY_STOP) 2653 2704 return; ··· 2652 2717 if (is_no_fault_exception(regs)) 2653 2718 return; 2654 2719 2655 - info.si_signo = SIGBUS; 2656 - info.si_errno = 0; 2657 - info.si_code = BUS_ADRALN; 2658 - info.si_addr = (void __user *) addr; 2659 - info.si_trapno = 0; 2660 - force_sig_info(SIGBUS, &info, current); 2720 + force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *) addr, 0, current); 2661 2721 } 2662 2722 2663 2723 /* sun4v_mem_corrupt_detect_precise() - Handle precise exception on an ADI ··· 2705 2775 void do_privop(struct pt_regs *regs) 2706 2776 { 2707 2777 enum ctx_state prev_state = exception_enter(); 2708 - siginfo_t info; 2709 2778 2710 2779 if (notify_die(DIE_TRAP, "privileged operation", regs, 2711 2780 0, 0x11, SIGILL) == NOTIFY_STOP) ··· 2714 2785 regs->tpc &= 0xffffffff; 2715 2786 regs->tnpc &= 0xffffffff; 2716 2787 } 2717 - info.si_signo = SIGILL; 2718 - info.si_errno = 0; 2719 - info.si_code = ILL_PRVOPC; 2720 - info.si_addr = (void __user *)regs->tpc; 2721 - info.si_trapno = 0; 2722 - force_sig_info(SIGILL, &info, current); 2788 + force_sig_fault(SIGILL, ILL_PRVOPC, 2789 + (void __user *)regs->tpc, 0, current); 2723 2790 out: 2724 2791 exception_exit(prev_state); 2725 2792 }
+3 -8
arch/sparc/kernel/unaligned_32.c
··· 311 311 312 312 static void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) 313 313 { 314 - siginfo_t info; 315 - 316 - info.si_signo = SIGBUS; 317 - info.si_errno = 0; 318 - info.si_code = BUS_ADRALN; 319 - info.si_addr = (void __user *)safe_compute_effective_address(regs, insn); 320 - info.si_trapno = 0; 321 - send_sig_info(SIGBUS, &info, current); 314 + send_sig_fault(SIGBUS, BUS_ADRALN, 315 + (void __user *)safe_compute_effective_address(regs, insn), 316 + 0, current); 322 317 } 323 318 324 319 asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn)
+2 -10
arch/sparc/mm/fault_32.c
··· 127 127 static void __do_fault_siginfo(int code, int sig, struct pt_regs *regs, 128 128 unsigned long addr) 129 129 { 130 - siginfo_t info; 131 - 132 - info.si_signo = sig; 133 - info.si_code = code; 134 - info.si_errno = 0; 135 - info.si_addr = (void __user *) addr; 136 - info.si_trapno = 0; 137 - 138 130 if (unlikely(show_unhandled_signals)) 139 - show_signal_msg(regs, sig, info.si_code, 131 + show_signal_msg(regs, sig, code, 140 132 addr, current); 141 133 142 - force_sig_info (sig, &info, current); 134 + force_sig_fault(sig, code, (void __user *) addr, 0, current); 143 135 } 144 136 145 137 static unsigned long compute_si_addr(struct pt_regs *regs, int text_fault)
+1 -7
arch/sparc/mm/fault_64.c
··· 170 170 int fault_code) 171 171 { 172 172 unsigned long addr; 173 - siginfo_t info; 174 173 175 - info.si_code = code; 176 - info.si_signo = sig; 177 - info.si_errno = 0; 178 174 if (fault_code & FAULT_CODE_ITLB) { 179 175 addr = regs->tpc; 180 176 } else { ··· 183 187 else 184 188 addr = fault_addr; 185 189 } 186 - info.si_addr = (void __user *) addr; 187 - info.si_trapno = 0; 188 190 189 191 if (unlikely(show_unhandled_signals)) 190 192 show_signal_msg(regs, sig, code, addr, current); 191 193 192 - force_sig_info(sig, &info, current); 194 + force_sig_fault(sig, code, (void __user *) addr, 0, current); 193 195 } 194 196 195 197 static unsigned int get_fault_insn(struct pt_regs *regs, unsigned int insn)
+3 -10
arch/um/kernel/ptrace.c
··· 115 115 static void send_sigtrap(struct task_struct *tsk, struct uml_pt_regs *regs, 116 116 int error_code) 117 117 { 118 - struct siginfo info; 119 - 120 - memset(&info, 0, sizeof(info)); 121 - info.si_signo = SIGTRAP; 122 - info.si_code = TRAP_BRKPT; 123 - 124 - /* User-mode eip? */ 125 - info.si_addr = UPT_IS_USER(regs) ? (void __user *) UPT_IP(regs) : NULL; 126 - 127 118 /* Send us the fake SIGTRAP */ 128 - force_sig_info(SIGTRAP, &info, tsk); 119 + force_sig_fault(SIGTRAP, TRAP_BRKPT, 120 + /* User-mode eip? */ 121 + UPT_IS_USER(regs) ? (void __user *) UPT_IP(regs) : NULL, tsk); 129 122 } 130 123 131 124 /*
+22 -40
arch/um/kernel/trap.c
··· 162 162 163 163 static void bad_segv(struct faultinfo fi, unsigned long ip) 164 164 { 165 - struct siginfo si; 166 - 167 - si.si_signo = SIGSEGV; 168 - si.si_code = SEGV_ACCERR; 169 - si.si_addr = (void __user *) FAULT_ADDRESS(fi); 170 165 current->thread.arch.faultinfo = fi; 171 - force_sig_info(SIGSEGV, &si, current); 166 + force_sig_fault(SIGSEGV, SEGV_ACCERR, (void __user *) FAULT_ADDRESS(fi), 167 + current); 172 168 } 173 169 174 170 void fatal_sigsegv(void) ··· 210 214 unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, 211 215 struct uml_pt_regs *regs) 212 216 { 213 - struct siginfo si; 214 217 jmp_buf *catcher; 218 + int si_code; 215 219 int err; 216 220 int is_write = FAULT_WRITE(fi); 217 221 unsigned long address = FAULT_ADDRESS(fi); ··· 235 239 236 240 if (SEGV_IS_FIXABLE(&fi)) 237 241 err = handle_page_fault(address, ip, is_write, is_user, 238 - &si.si_code); 242 + &si_code); 239 243 else { 240 244 err = -EFAULT; 241 245 /* ··· 267 271 show_segv_info(regs); 268 272 269 273 if (err == -EACCES) { 270 - si.si_signo = SIGBUS; 271 - si.si_errno = 0; 272 - si.si_code = BUS_ADRERR; 273 - si.si_addr = (void __user *)address; 274 274 current->thread.arch.faultinfo = fi; 275 - force_sig_info(SIGBUS, &si, current); 275 + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, 276 + current); 276 277 } else { 277 278 BUG_ON(err != -EFAULT); 278 - si.si_signo = SIGSEGV; 279 - si.si_addr = (void __user *) address; 280 279 current->thread.arch.faultinfo = fi; 281 - force_sig_info(SIGSEGV, &si, current); 280 + force_sig_fault(SIGSEGV, si_code, (void __user *) address, 281 + current); 282 282 } 283 283 284 284 out: ··· 286 294 287 295 void relay_signal(int sig, struct siginfo *si, struct uml_pt_regs *regs) 288 296 { 289 - struct faultinfo *fi; 290 - struct siginfo clean_si; 291 - 297 + int code, err; 292 298 if (!UPT_IS_USER(regs)) { 293 299 if (sig == SIGBUS) 294 300 printk(KERN_ERR "Bus error - the host /dev/shm or /tmp " ··· 296 306 297 307 arch_examine_signal(sig, regs); 298 308 299 - clear_siginfo(&clean_si); 300 - clean_si.si_signo = si->si_signo; 301 - clean_si.si_errno = si->si_errno; 302 - clean_si.si_code = si->si_code; 303 - switch (sig) { 304 - case SIGILL: 305 - case SIGFPE: 306 - case SIGSEGV: 307 - case SIGBUS: 308 - case SIGTRAP: 309 - fi = UPT_FAULTINFO(regs); 310 - clean_si.si_addr = (void __user *) FAULT_ADDRESS(*fi); 309 + /* Is the signal layout for the signal known? 310 + * Signal data must be scrubbed to prevent information leaks. 311 + */ 312 + code = si->si_code; 313 + err = si->si_errno; 314 + if ((err == 0) && (siginfo_layout(sig, code) == SIL_FAULT)) { 315 + struct faultinfo *fi = UPT_FAULTINFO(regs); 311 316 current->thread.arch.faultinfo = *fi; 312 - #ifdef __ARCH_SI_TRAPNO 313 - clean_si.si_trapno = si->si_trapno; 314 - #endif 315 - break; 316 - default: 317 - printk(KERN_ERR "Attempted to relay unknown signal %d (si_code = %d)\n", 318 - sig, si->si_code); 317 + force_sig_fault(sig, code, (void __user *)FAULT_ADDRESS(*fi), 318 + current); 319 + } else { 320 + printk(KERN_ERR "Attempted to relay unknown signal %d (si_code = %d) with errno %d\n", 321 + sig, code, err); 322 + force_sig(sig, current); 319 323 } 320 - 321 - force_sig_info(sig, &clean_si, current); 322 324 } 323 325 324 326 void bus_handler(int sig, struct siginfo *si, struct uml_pt_regs *regs)
+4 -4
arch/unicore32/kernel/fpu-ucf64.c
··· 52 52 * Raise a SIGFPE for the current process. 53 53 * sicode describes the signal being raised. 54 54 */ 55 - void ucf64_raise_sigfpe(unsigned int sicode, struct pt_regs *regs) 55 + void ucf64_raise_sigfpe(struct pt_regs *regs) 56 56 { 57 57 siginfo_t info; 58 58 59 - memset(&info, 0, sizeof(info)); 59 + clear_siginfo(&info); 60 60 61 61 info.si_signo = SIGFPE; 62 - info.si_code = sicode; 62 + info.si_code = FPE_FLTUNK; 63 63 info.si_addr = (void __user *)(instruction_pointer(regs) - 4); 64 64 65 65 /* ··· 94 94 pr_debug("UniCore-F64 FPSCR 0x%08x INST 0x%08x\n", 95 95 cff(FPSCR), inst); 96 96 97 - ucf64_raise_sigfpe(0, regs); 97 + ucf64_raise_sigfpe(regs); 98 98 return; 99 99 } 100 100
+3
arch/unicore32/mm/fault.c
··· 125 125 tsk->thread.address = addr; 126 126 tsk->thread.error_code = fsr; 127 127 tsk->thread.trap_no = 14; 128 + clear_siginfo(&si); 128 129 si.si_signo = sig; 129 130 si.si_errno = 0; 130 131 si.si_code = code; ··· 473 472 printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n", 474 473 inf->name, fsr, addr); 475 474 475 + clear_siginfo(&info); 476 476 info.si_signo = inf->sig; 477 477 info.si_errno = 0; 478 478 info.si_code = inf->code; ··· 493 491 printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", 494 492 inf->name, ifsr, addr); 495 493 494 + clear_siginfo(&info); 496 495 info.si_signo = inf->sig; 497 496 info.si_errno = 0; 498 497 info.si_code = inf->code;
+1 -1
arch/x86/entry/vsyscall/vsyscall_64.c
··· 107 107 thread->cr2 = ptr; 108 108 thread->trap_nr = X86_TRAP_PF; 109 109 110 - memset(&info, 0, sizeof(info)); 110 + clear_siginfo(&info); 111 111 info.si_signo = SIGSEGV; 112 112 info.si_errno = 0; 113 113 info.si_code = SEGV_MAPERR;
+1 -1
arch/x86/kernel/ptrace.c
··· 1377 1377 tsk->thread.trap_nr = X86_TRAP_DB; 1378 1378 tsk->thread.error_code = error_code; 1379 1379 1380 - memset(info, 0, sizeof(*info)); 1381 1380 info->si_signo = SIGTRAP; 1382 1381 info->si_code = si_code; 1383 1382 info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL; ··· 1394 1395 { 1395 1396 struct siginfo info; 1396 1397 1398 + clear_siginfo(&info); 1397 1399 fill_sigtrap_info(tsk, regs, error_code, si_code, &info); 1398 1400 /* Send us the fake SIGTRAP */ 1399 1401 force_sig_info(SIGTRAP, &info, tsk);
+1 -1
arch/x86/kernel/signal_compat.c
··· 29 29 BUILD_BUG_ON(NSIGFPE != 15); 30 30 BUILD_BUG_ON(NSIGSEGV != 7); 31 31 BUILD_BUG_ON(NSIGBUS != 5); 32 - BUILD_BUG_ON(NSIGTRAP != 4); 32 + BUILD_BUG_ON(NSIGTRAP != 5); 33 33 BUILD_BUG_ON(NSIGCHLD != 6); 34 34 BUILD_BUG_ON(NSIGSYS != 1); 35 35
+3
arch/x86/kernel/traps.c
··· 299 299 if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != 300 300 NOTIFY_STOP) { 301 301 cond_local_irq_enable(regs); 302 + clear_siginfo(&info); 302 303 do_trap(trapnr, signr, str, regs, error_code, 303 304 fill_trap_info(regs, signr, trapnr, &info)); 304 305 } ··· 855 854 856 855 task->thread.trap_nr = trapnr; 857 856 task->thread.error_code = error_code; 857 + clear_siginfo(&info); 858 858 info.si_signo = SIGFPE; 859 859 info.si_errno = 0; 860 860 info.si_addr = (void __user *)uprobe_get_trap_addr(regs); ··· 931 929 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); 932 930 local_irq_enable(); 933 931 932 + clear_siginfo(&info); 934 933 info.si_signo = SIGILL; 935 934 info.si_errno = 0; 936 935 info.si_code = ILL_BADSTK;
+1
arch/x86/kernel/umip.c
··· 278 278 tsk->thread.error_code = X86_PF_USER | X86_PF_WRITE; 279 279 tsk->thread.trap_nr = X86_TRAP_PF; 280 280 281 + clear_siginfo(&info); 281 282 info.si_signo = SIGSEGV; 282 283 info.si_errno = 0; 283 284 info.si_code = SEGV_MAPERR;
+1
arch/x86/kvm/mmu.c
··· 3007 3007 { 3008 3008 siginfo_t info; 3009 3009 3010 + clear_siginfo(&info); 3010 3011 info.si_signo = SIGBUS; 3011 3012 info.si_errno = 0; 3012 3013 info.si_code = BUS_MCEERR_AR;
+1
arch/x86/mm/fault.c
··· 209 209 unsigned lsb = 0; 210 210 siginfo_t info; 211 211 212 + clear_siginfo(&info); 212 213 info.si_signo = si_signo; 213 214 info.si_errno = 0; 214 215 info.si_code = si_code;
+1 -8
arch/xtensa/kernel/traps.c
··· 323 323 void 324 324 do_unaligned_user (struct pt_regs *regs) 325 325 { 326 - siginfo_t info; 327 - 328 326 __die_if_kernel("Unhandled unaligned exception in kernel", 329 327 regs, SIGKILL); 330 328 ··· 332 334 "(pid = %d, pc = %#010lx)\n", 333 335 regs->excvaddr, current->comm, 334 336 task_pid_nr(current), regs->pc); 335 - info.si_signo = SIGBUS; 336 - info.si_errno = 0; 337 - info.si_code = BUS_ADRALN; 338 - info.si_addr = (void *) regs->excvaddr; 339 - force_sig_info(SIGSEGV, &info, current); 340 - 337 + force_sig_fault(SIGBUS, BUS_ADRALN, (void *) regs->excvaddr, current); 341 338 } 342 339 #endif 343 340
+5 -13
arch/xtensa/mm/fault.c
··· 39 39 struct mm_struct *mm = current->mm; 40 40 unsigned int exccause = regs->exccause; 41 41 unsigned int address = regs->excvaddr; 42 - siginfo_t info; 42 + int code; 43 43 44 44 int is_write, is_exec; 45 45 int fault; 46 46 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 47 47 48 - info.si_code = SEGV_MAPERR; 48 + code = SEGV_MAPERR; 49 49 50 50 /* We fault-in kernel-space virtual memory on-demand. The 51 51 * 'reference' page table is init_mm.pgd. ··· 91 91 */ 92 92 93 93 good_area: 94 - info.si_code = SEGV_ACCERR; 94 + code = SEGV_ACCERR; 95 95 96 96 if (is_write) { 97 97 if (!(vma->vm_flags & VM_WRITE)) ··· 157 157 if (user_mode(regs)) { 158 158 current->thread.bad_vaddr = address; 159 159 current->thread.error_code = is_write; 160 - info.si_signo = SIGSEGV; 161 - info.si_errno = 0; 162 - /* info.si_code has been set above */ 163 - info.si_addr = (void *) address; 164 - force_sig_info(SIGSEGV, &info, current); 160 + force_sig_fault(SIGSEGV, code, (void *) address, current); 165 161 return; 166 162 } 167 163 bad_page_fault(regs, address, SIGSEGV); ··· 182 186 * or user mode. 183 187 */ 184 188 current->thread.bad_vaddr = address; 185 - info.si_code = SIGBUS; 186 - info.si_errno = 0; 187 - info.si_code = BUS_ADRERR; 188 - info.si_addr = (void *) address; 189 - force_sig_info(SIGBUS, &info, current); 189 + force_sig_fault(SIGBUS, BUS_ADRERR, (void *) address, current); 190 190 191 191 /* Kernel mode? Handle exceptions or die */ 192 192 if (!user_mode(regs))
+48 -45
fs/signalfd.c
··· 81 81 static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo, 82 82 siginfo_t const *kinfo) 83 83 { 84 - long err; 84 + struct signalfd_siginfo new; 85 85 86 86 BUILD_BUG_ON(sizeof(struct signalfd_siginfo) != 128); 87 87 88 88 /* 89 89 * Unused members should be zero ... 90 90 */ 91 - err = __clear_user(uinfo, sizeof(*uinfo)); 91 + memset(&new, 0, sizeof(new)); 92 92 93 93 /* 94 94 * If you change siginfo_t structure, please be sure 95 95 * this code is fixed accordingly. 96 96 */ 97 - err |= __put_user(kinfo->si_signo, &uinfo->ssi_signo); 98 - err |= __put_user(kinfo->si_errno, &uinfo->ssi_errno); 99 - err |= __put_user(kinfo->si_code, &uinfo->ssi_code); 97 + new.ssi_signo = kinfo->si_signo; 98 + new.ssi_errno = kinfo->si_errno; 99 + new.ssi_code = kinfo->si_code; 100 100 switch (siginfo_layout(kinfo->si_signo, kinfo->si_code)) { 101 101 case SIL_KILL: 102 - err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid); 103 - err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid); 102 + new.ssi_pid = kinfo->si_pid; 103 + new.ssi_uid = kinfo->si_uid; 104 104 break; 105 105 case SIL_TIMER: 106 - err |= __put_user(kinfo->si_tid, &uinfo->ssi_tid); 107 - err |= __put_user(kinfo->si_overrun, &uinfo->ssi_overrun); 108 - err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr); 109 - err |= __put_user(kinfo->si_int, &uinfo->ssi_int); 106 + new.ssi_tid = kinfo->si_tid; 107 + new.ssi_overrun = kinfo->si_overrun; 108 + new.ssi_ptr = (long) kinfo->si_ptr; 109 + new.ssi_int = kinfo->si_int; 110 110 break; 111 111 case SIL_POLL: 112 - err |= __put_user(kinfo->si_band, &uinfo->ssi_band); 113 - err |= __put_user(kinfo->si_fd, &uinfo->ssi_fd); 112 + new.ssi_band = kinfo->si_band; 113 + new.ssi_fd = kinfo->si_fd; 114 114 break; 115 + case SIL_FAULT_BNDERR: 116 + case SIL_FAULT_PKUERR: 117 + /* 118 + * Fall through to the SIL_FAULT case. Both SIL_FAULT_BNDERR 119 + * and SIL_FAULT_PKUERR are only generated by faults that 120 + * deliver them synchronously to userspace. In case someone 121 + * injects one of these signals and signalfd catches it treat 122 + * it as SIL_FAULT. 123 + */ 115 124 case SIL_FAULT: 116 - err |= __put_user((long) kinfo->si_addr, &uinfo->ssi_addr); 125 + new.ssi_addr = (long) kinfo->si_addr; 117 126 #ifdef __ARCH_SI_TRAPNO 118 - err |= __put_user(kinfo->si_trapno, &uinfo->ssi_trapno); 127 + new.ssi_trapno = kinfo->si_trapno; 119 128 #endif 120 - #ifdef BUS_MCEERR_AO 121 - /* 122 - * Other callers might not initialize the si_lsb field, 123 - * so check explicitly for the right codes here. 124 - */ 125 - if (kinfo->si_signo == SIGBUS && 126 - kinfo->si_code == BUS_MCEERR_AO) 127 - err |= __put_user((short) kinfo->si_addr_lsb, 128 - &uinfo->ssi_addr_lsb); 129 + break; 130 + case SIL_FAULT_MCEERR: 131 + new.ssi_addr = (long) kinfo->si_addr; 132 + #ifdef __ARCH_SI_TRAPNO 133 + new.ssi_trapno = kinfo->si_trapno; 129 134 #endif 130 - #ifdef BUS_MCEERR_AR 131 - /* 132 - * Other callers might not initialize the si_lsb field, 133 - * so check explicitly for the right codes here. 134 - */ 135 - if (kinfo->si_signo == SIGBUS && 136 - kinfo->si_code == BUS_MCEERR_AR) 137 - err |= __put_user((short) kinfo->si_addr_lsb, 138 - &uinfo->ssi_addr_lsb); 139 - #endif 135 + new.ssi_addr_lsb = (short) kinfo->si_addr_lsb; 140 136 break; 141 137 case SIL_CHLD: 142 - err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid); 143 - err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid); 144 - err |= __put_user(kinfo->si_status, &uinfo->ssi_status); 145 - err |= __put_user(kinfo->si_utime, &uinfo->ssi_utime); 146 - err |= __put_user(kinfo->si_stime, &uinfo->ssi_stime); 138 + new.ssi_pid = kinfo->si_pid; 139 + new.ssi_uid = kinfo->si_uid; 140 + new.ssi_status = kinfo->si_status; 141 + new.ssi_utime = kinfo->si_utime; 142 + new.ssi_stime = kinfo->si_stime; 147 143 break; 148 144 case SIL_RT: 149 - default: 150 145 /* 151 146 * This case catches also the signals queued by sigqueue(). 152 147 */ 153 - err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid); 154 - err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid); 155 - err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr); 156 - err |= __put_user(kinfo->si_int, &uinfo->ssi_int); 148 + new.ssi_pid = kinfo->si_pid; 149 + new.ssi_uid = kinfo->si_uid; 150 + new.ssi_ptr = (long) kinfo->si_ptr; 151 + new.ssi_int = kinfo->si_int; 152 + break; 153 + case SIL_SYS: 154 + new.ssi_call_addr = (long) kinfo->si_call_addr; 155 + new.ssi_syscall = kinfo->si_syscall; 156 + new.ssi_arch = kinfo->si_arch; 157 157 break; 158 158 } 159 159 160 - return err ? -EFAULT: sizeof(*uinfo); 160 + if (copy_to_user(uinfo, &new, sizeof(struct signalfd_siginfo))) 161 + return -EFAULT; 162 + 163 + return sizeof(*uinfo); 161 164 } 162 165 163 166 static ssize_t signalfd_dequeue(struct signalfd_ctx *ctx, siginfo_t *info,
-1
include/linux/ptrace.h
··· 345 345 static inline void user_single_step_siginfo(struct task_struct *tsk, 346 346 struct pt_regs *regs, siginfo_t *info) 347 347 { 348 - memset(info, 0, sizeof(*info)); 349 348 info->si_signo = SIGTRAP; 350 349 } 351 350 #endif
+3
include/linux/signal.h
··· 28 28 SIL_TIMER, 29 29 SIL_POLL, 30 30 SIL_FAULT, 31 + SIL_FAULT_MCEERR, 32 + SIL_FAULT_BNDERR, 33 + SIL_FAULT_PKUERR, 31 34 SIL_CHLD, 32 35 SIL_RT, 33 36 SIL_SYS,
+1
include/linux/tracehook.h
··· 124 124 { 125 125 if (step) { 126 126 siginfo_t info; 127 + clear_siginfo(&info); 127 128 user_single_step_siginfo(current, regs, &info); 128 129 force_sig_info(SIGTRAP, &info, current); 129 130 return;
+2 -1
include/uapi/asm-generic/siginfo.h
··· 249 249 #define TRAP_TRACE 2 /* process trace trap */ 250 250 #define TRAP_BRANCH 3 /* process taken branch trap */ 251 251 #define TRAP_HWBKPT 4 /* hardware breakpoint/watchpoint */ 252 - #define NSIGTRAP 4 252 + #define TRAP_UNK 5 /* undiagnosed trap */ 253 + #define NSIGTRAP 5 253 254 254 255 /* 255 256 * There is an additional set of SIGTRAP si_codes used by ptrace
+5 -1
include/uapi/linux/signalfd.h
··· 35 35 __u64 ssi_stime; 36 36 __u64 ssi_addr; 37 37 __u16 ssi_addr_lsb; 38 + __u16 __pad2; 39 + __s32 ssi_syscall; 40 + __u64 ssi_call_addr; 41 + __u32 ssi_arch; 38 42 39 43 /* 40 44 * Pad strcture to 128 bytes. Remember to update the ··· 49 45 * comes out of a read(2) and we really don't want to have 50 46 * a compat on read(2). 51 47 */ 52 - __u8 __pad[46]; 48 + __u8 __pad[28]; 53 49 }; 54 50 55 51
+52 -129
kernel/signal.c
··· 1539 1539 return send_sig_info(info.si_signo, &info, t); 1540 1540 } 1541 1541 1542 - #if defined(BUS_MCEERR_AO) && defined(BUS_MCEERR_AR) 1543 1542 int force_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct *t) 1544 1543 { 1545 1544 struct siginfo info; ··· 1567 1568 return send_sig_info(info.si_signo, &info, t); 1568 1569 } 1569 1570 EXPORT_SYMBOL(send_sig_mceerr); 1570 - #endif 1571 1571 1572 - #ifdef SEGV_BNDERR 1573 1572 int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper) 1574 1573 { 1575 1574 struct siginfo info; ··· 1581 1584 info.si_upper = upper; 1582 1585 return force_sig_info(info.si_signo, &info, current); 1583 1586 } 1584 - #endif 1585 1587 1586 1588 #ifdef SEGV_PKUERR 1587 1589 int force_sig_pkuerr(void __user *addr, u32 pkey) ··· 2833 2837 [SIGPOLL] = { NSIGPOLL, SIL_POLL }, 2834 2838 [SIGSYS] = { NSIGSYS, SIL_SYS }, 2835 2839 }; 2836 - if ((sig < ARRAY_SIZE(filter)) && (si_code <= filter[sig].limit)) 2840 + if ((sig < ARRAY_SIZE(filter)) && (si_code <= filter[sig].limit)) { 2837 2841 layout = filter[sig].layout; 2842 + /* Handle the exceptions */ 2843 + if ((sig == SIGBUS) && 2844 + (si_code >= BUS_MCEERR_AR) && (si_code <= BUS_MCEERR_AO)) 2845 + layout = SIL_FAULT_MCEERR; 2846 + else if ((sig == SIGSEGV) && (si_code == SEGV_BNDERR)) 2847 + layout = SIL_FAULT_BNDERR; 2848 + #ifdef SEGV_PKUERR 2849 + else if ((sig == SIGSEGV) && (si_code == SEGV_PKUERR)) 2850 + layout = SIL_FAULT_PKUERR; 2851 + #endif 2852 + } 2838 2853 else if (si_code <= NSIGPOLL) 2839 2854 layout = SIL_POLL; 2840 2855 } else { ··· 2855 2848 layout = SIL_POLL; 2856 2849 else if (si_code < 0) 2857 2850 layout = SIL_RT; 2858 - /* Tests to support buggy kernel ABIs */ 2859 - #ifdef TRAP_FIXME 2860 - if ((sig == SIGTRAP) && (si_code == TRAP_FIXME)) 2861 - layout = SIL_FAULT; 2862 - #endif 2863 - #ifdef FPE_FIXME 2864 - if ((sig == SIGFPE) && (si_code == FPE_FIXME)) 2865 - layout = SIL_FAULT; 2866 - #endif 2867 2851 } 2868 2852 return layout; 2869 2853 } 2870 2854 2871 2855 int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from) 2872 2856 { 2873 - int err; 2874 - 2875 - if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t))) 2857 + if (copy_to_user(to, from , sizeof(struct siginfo))) 2876 2858 return -EFAULT; 2877 - if (from->si_code < 0) 2878 - return __copy_to_user(to, from, sizeof(siginfo_t)) 2879 - ? -EFAULT : 0; 2880 - /* 2881 - * If you change siginfo_t structure, please be sure 2882 - * this code is fixed accordingly. 2883 - * Please remember to update the signalfd_copyinfo() function 2884 - * inside fs/signalfd.c too, in case siginfo_t changes. 2885 - * It should never copy any pad contained in the structure 2886 - * to avoid security leaks, but must copy the generic 2887 - * 3 ints plus the relevant union member. 2888 - */ 2889 - err = __put_user(from->si_signo, &to->si_signo); 2890 - err |= __put_user(from->si_errno, &to->si_errno); 2891 - err |= __put_user(from->si_code, &to->si_code); 2892 - switch (siginfo_layout(from->si_signo, from->si_code)) { 2893 - case SIL_KILL: 2894 - err |= __put_user(from->si_pid, &to->si_pid); 2895 - err |= __put_user(from->si_uid, &to->si_uid); 2896 - break; 2897 - case SIL_TIMER: 2898 - /* Unreached SI_TIMER is negative */ 2899 - break; 2900 - case SIL_POLL: 2901 - err |= __put_user(from->si_band, &to->si_band); 2902 - err |= __put_user(from->si_fd, &to->si_fd); 2903 - break; 2904 - case SIL_FAULT: 2905 - err |= __put_user(from->si_addr, &to->si_addr); 2906 - #ifdef __ARCH_SI_TRAPNO 2907 - err |= __put_user(from->si_trapno, &to->si_trapno); 2908 - #endif 2909 - #ifdef __ia64__ 2910 - err |= __put_user(from->si_imm, &to->si_imm); 2911 - err |= __put_user(from->si_flags, &to->si_flags); 2912 - err |= __put_user(from->si_isr, &to->si_isr); 2913 - #endif 2914 - /* 2915 - * Other callers might not initialize the si_lsb field, 2916 - * so check explicitly for the right codes here. 2917 - */ 2918 - #ifdef BUS_MCEERR_AR 2919 - if (from->si_signo == SIGBUS && from->si_code == BUS_MCEERR_AR) 2920 - err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); 2921 - #endif 2922 - #ifdef BUS_MCEERR_AO 2923 - if (from->si_signo == SIGBUS && from->si_code == BUS_MCEERR_AO) 2924 - err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); 2925 - #endif 2926 - #ifdef SEGV_BNDERR 2927 - if (from->si_signo == SIGSEGV && from->si_code == SEGV_BNDERR) { 2928 - err |= __put_user(from->si_lower, &to->si_lower); 2929 - err |= __put_user(from->si_upper, &to->si_upper); 2930 - } 2931 - #endif 2932 - #ifdef SEGV_PKUERR 2933 - if (from->si_signo == SIGSEGV && from->si_code == SEGV_PKUERR) 2934 - err |= __put_user(from->si_pkey, &to->si_pkey); 2935 - #endif 2936 - break; 2937 - case SIL_CHLD: 2938 - err |= __put_user(from->si_pid, &to->si_pid); 2939 - err |= __put_user(from->si_uid, &to->si_uid); 2940 - err |= __put_user(from->si_status, &to->si_status); 2941 - err |= __put_user(from->si_utime, &to->si_utime); 2942 - err |= __put_user(from->si_stime, &to->si_stime); 2943 - break; 2944 - case SIL_RT: 2945 - err |= __put_user(from->si_pid, &to->si_pid); 2946 - err |= __put_user(from->si_uid, &to->si_uid); 2947 - err |= __put_user(from->si_ptr, &to->si_ptr); 2948 - break; 2949 - case SIL_SYS: 2950 - err |= __put_user(from->si_call_addr, &to->si_call_addr); 2951 - err |= __put_user(from->si_syscall, &to->si_syscall); 2952 - err |= __put_user(from->si_arch, &to->si_arch); 2953 - break; 2954 - } 2955 - return err; 2859 + return 0; 2956 2860 } 2957 2861 2958 2862 #ifdef CONFIG_COMPAT ··· 2902 2984 #ifdef __ARCH_SI_TRAPNO 2903 2985 new.si_trapno = from->si_trapno; 2904 2986 #endif 2905 - #ifdef BUS_MCEERR_AR 2906 - if ((from->si_signo == SIGBUS) && (from->si_code == BUS_MCEERR_AR)) 2907 - new.si_addr_lsb = from->si_addr_lsb; 2987 + break; 2988 + case SIL_FAULT_MCEERR: 2989 + new.si_addr = ptr_to_compat(from->si_addr); 2990 + #ifdef __ARCH_SI_TRAPNO 2991 + new.si_trapno = from->si_trapno; 2908 2992 #endif 2909 - #ifdef BUS_MCEERR_AO 2910 - if ((from->si_signo == SIGBUS) && (from->si_code == BUS_MCEERR_AO)) 2911 - new.si_addr_lsb = from->si_addr_lsb; 2993 + new.si_addr_lsb = from->si_addr_lsb; 2994 + break; 2995 + case SIL_FAULT_BNDERR: 2996 + new.si_addr = ptr_to_compat(from->si_addr); 2997 + #ifdef __ARCH_SI_TRAPNO 2998 + new.si_trapno = from->si_trapno; 2912 2999 #endif 2913 - #ifdef SEGV_BNDERR 2914 - if ((from->si_signo == SIGSEGV) && 2915 - (from->si_code == SEGV_BNDERR)) { 2916 - new.si_lower = ptr_to_compat(from->si_lower); 2917 - new.si_upper = ptr_to_compat(from->si_upper); 2918 - } 3000 + new.si_lower = ptr_to_compat(from->si_lower); 3001 + new.si_upper = ptr_to_compat(from->si_upper); 3002 + break; 3003 + case SIL_FAULT_PKUERR: 3004 + new.si_addr = ptr_to_compat(from->si_addr); 3005 + #ifdef __ARCH_SI_TRAPNO 3006 + new.si_trapno = from->si_trapno; 2919 3007 #endif 2920 - #ifdef SEGV_PKUERR 2921 - if ((from->si_signo == SIGSEGV) && 2922 - (from->si_code == SEGV_PKUERR)) 2923 - new.si_pkey = from->si_pkey; 2924 - #endif 2925 - 3008 + new.si_pkey = from->si_pkey; 2926 3009 break; 2927 3010 case SIL_CHLD: 2928 3011 new.si_pid = from->si_pid; ··· 2989 3070 #ifdef __ARCH_SI_TRAPNO 2990 3071 to->si_trapno = from.si_trapno; 2991 3072 #endif 2992 - #ifdef BUS_MCEERR_AR 2993 - if ((from.si_signo == SIGBUS) && (from.si_code == BUS_MCEERR_AR)) 2994 - to->si_addr_lsb = from.si_addr_lsb; 3073 + break; 3074 + case SIL_FAULT_MCEERR: 3075 + to->si_addr = compat_ptr(from.si_addr); 3076 + #ifdef __ARCH_SI_TRAPNO 3077 + to->si_trapno = from.si_trapno; 2995 3078 #endif 2996 - #ifdef BUS_MCEER_AO 2997 - if ((from.si_signo == SIGBUS) && (from.si_code == BUS_MCEERR_AO)) 2998 - to->si_addr_lsb = from.si_addr_lsb; 3079 + to->si_addr_lsb = from.si_addr_lsb; 3080 + break; 3081 + case SIL_FAULT_BNDERR: 3082 + to->si_addr = compat_ptr(from.si_addr); 3083 + #ifdef __ARCH_SI_TRAPNO 3084 + to->si_trapno = from.si_trapno; 2999 3085 #endif 3000 - #ifdef SEGV_BNDERR 3001 - if ((from.si_signo == SIGSEGV) && (from.si_code == SEGV_BNDERR)) { 3002 - to->si_lower = compat_ptr(from.si_lower); 3003 - to->si_upper = compat_ptr(from.si_upper); 3004 - } 3086 + to->si_lower = compat_ptr(from.si_lower); 3087 + to->si_upper = compat_ptr(from.si_upper); 3088 + break; 3089 + case SIL_FAULT_PKUERR: 3090 + to->si_addr = compat_ptr(from.si_addr); 3091 + #ifdef __ARCH_SI_TRAPNO 3092 + to->si_trapno = from.si_trapno; 3005 3093 #endif 3006 - #ifdef SEGV_PKUERR 3007 - if ((from.si_signo == SIGSEGV) && (from.si_code == SEGV_PKUERR)) 3008 - to->si_pkey = from.si_pkey; 3009 - #endif 3094 + to->si_pkey = from.si_pkey; 3010 3095 break; 3011 3096 case SIL_CHLD: 3012 3097 to->si_pid = from.si_pid;
+1
virt/kvm/arm/mmu.c
··· 1401 1401 { 1402 1402 siginfo_t info; 1403 1403 1404 + clear_siginfo(&info); 1404 1405 info.si_signo = SIGBUS; 1405 1406 info.si_errno = 0; 1406 1407 info.si_code = BUS_MCEERR_AR;