diff options
Diffstat (limited to 'arch/parisc/kernel/signal.c')
| -rw-r--r-- | arch/parisc/kernel/signal.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 0224651fd8f1..82c24e62ab63 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -490,15 +490,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 490 | 490 | ||
| 491 | give_sigsegv: | 491 | give_sigsegv: |
| 492 | DBG(1,"setup_rt_frame: sending SIGSEGV\n"); | 492 | DBG(1,"setup_rt_frame: sending SIGSEGV\n"); |
| 493 | if (sig == SIGSEGV) | 493 | force_sigsegv(sig, current); |
| 494 | ka->sa.sa_handler = SIG_DFL; | ||
| 495 | si.si_signo = SIGSEGV; | ||
| 496 | si.si_errno = 0; | ||
| 497 | si.si_code = SI_KERNEL; | ||
| 498 | si.si_pid = current->pid; | ||
| 499 | si.si_uid = current->uid; | ||
| 500 | si.si_addr = frame; | ||
| 501 | force_sig_info(SIGSEGV, &si, current); | ||
| 502 | return 0; | 494 | return 0; |
| 503 | } | 495 | } |
| 504 | 496 | ||
| @@ -633,10 +625,14 @@ do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall) | |||
| 633 | put_user(0xe0008200, &usp[3]); | 625 | put_user(0xe0008200, &usp[3]); |
| 634 | put_user(0x34140000, &usp[4]); | 626 | put_user(0x34140000, &usp[4]); |
| 635 | 627 | ||
| 636 | /* Stack is 64-byte aligned, and we only | 628 | /* Stack is 64-byte aligned, and we only need |
| 637 | * need to flush 1 cache line */ | 629 | * to flush 1 cache line. |
| 638 | asm("fdc 0(%%sr3, %0)\n" | 630 | * Flushing one cacheline is cheap. |
| 639 | "fic 0(%%sr3, %0)\n" | 631 | * "sync" on bigger (> 4 way) boxes is not. |
| 632 | */ | ||
| 633 | asm("fdc %%r0(%%sr3, %0)\n" | ||
| 634 | "sync\n" | ||
| 635 | "fic %%r0(%%sr3, %0)\n" | ||
| 640 | "sync\n" | 636 | "sync\n" |
| 641 | : : "r"(regs->gr[30])); | 637 | : : "r"(regs->gr[30])); |
| 642 | 638 | ||
