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 | ||