diff options
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/process.c | 10 | ||||
-rw-r--r-- | arch/mips/kernel/signal.c | 26 | ||||
-rw-r--r-- | arch/mips/kernel/signal32.c | 16 | ||||
-rw-r--r-- | arch/mips/kernel/signal_n32.c | 5 |
4 files changed, 32 insertions, 25 deletions
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index 98432097a86a..4fe3d5715c41 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
@@ -62,9 +62,9 @@ extern int do_signal32(sigset_t *oldset, struct pt_regs *regs); | |||
62 | /* | 62 | /* |
63 | * Native o32 and N64 ABI without DSP ASE | 63 | * Native o32 and N64 ABI without DSP ASE |
64 | */ | 64 | */ |
65 | extern void setup_frame(struct k_sigaction * ka, struct pt_regs *regs, | 65 | extern int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, |
66 | int signr, sigset_t *set); | 66 | int signr, sigset_t *set); |
67 | extern void setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | 67 | extern int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, |
68 | int signr, sigset_t *set, siginfo_t *info); | 68 | int signr, sigset_t *set, siginfo_t *info); |
69 | 69 | ||
70 | struct mips_abi mips_abi = { | 70 | struct mips_abi mips_abi = { |
@@ -79,9 +79,9 @@ struct mips_abi mips_abi = { | |||
79 | /* | 79 | /* |
80 | * o32 compatibility on 64-bit kernels, without DSP ASE | 80 | * o32 compatibility on 64-bit kernels, without DSP ASE |
81 | */ | 81 | */ |
82 | extern void setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | 82 | extern int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, |
83 | int signr, sigset_t *set); | 83 | int signr, sigset_t *set); |
84 | extern void setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | 84 | extern int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, |
85 | int signr, sigset_t *set, siginfo_t *info); | 85 | int signr, sigset_t *set, siginfo_t *info); |
86 | 86 | ||
87 | struct mips_abi mips_abi_32 = { | 87 | struct mips_abi mips_abi_32 = { |
@@ -95,7 +95,7 @@ struct mips_abi mips_abi_32 = { | |||
95 | /* | 95 | /* |
96 | * N32 on 64-bit kernels, without DSP ASE | 96 | * N32 on 64-bit kernels, without DSP ASE |
97 | */ | 97 | */ |
98 | extern void setup_rt_frame_n32(struct k_sigaction * ka, struct pt_regs *regs, | 98 | extern int setup_rt_frame_n32(struct k_sigaction * ka, struct pt_regs *regs, |
99 | int signr, sigset_t *set, siginfo_t *info); | 99 | int signr, sigset_t *set, siginfo_t *info); |
100 | 100 | ||
101 | struct mips_abi mips_abi_n32 = { | 101 | struct mips_abi mips_abi_n32 = { |
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index 8679ccff870e..9202a17db8f7 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
@@ -278,7 +278,7 @@ badframe: | |||
278 | } | 278 | } |
279 | 279 | ||
280 | #ifdef CONFIG_TRAD_SIGNALS | 280 | #ifdef CONFIG_TRAD_SIGNALS |
281 | void setup_frame(struct k_sigaction * ka, struct pt_regs *regs, | 281 | int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, |
282 | int signr, sigset_t *set) | 282 | int signr, sigset_t *set) |
283 | { | 283 | { |
284 | struct sigframe *frame; | 284 | struct sigframe *frame; |
@@ -317,14 +317,15 @@ void setup_frame(struct k_sigaction * ka, struct pt_regs *regs, | |||
317 | current->comm, current->pid, | 317 | current->comm, current->pid, |
318 | frame, regs->cp0_epc, frame->regs[31]); | 318 | frame, regs->cp0_epc, frame->regs[31]); |
319 | #endif | 319 | #endif |
320 | return; | 320 | return 1; |
321 | 321 | ||
322 | give_sigsegv: | 322 | give_sigsegv: |
323 | force_sigsegv(signr, current); | 323 | force_sigsegv(signr, current); |
324 | return 0; | ||
324 | } | 325 | } |
325 | #endif | 326 | #endif |
326 | 327 | ||
327 | void setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | 328 | int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, |
328 | int signr, sigset_t *set, siginfo_t *info) | 329 | int signr, sigset_t *set, siginfo_t *info) |
329 | { | 330 | { |
330 | struct rt_sigframe *frame; | 331 | struct rt_sigframe *frame; |
@@ -376,18 +377,21 @@ void setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | |||
376 | current->comm, current->pid, | 377 | current->comm, current->pid, |
377 | frame, regs->cp0_epc, regs->regs[31]); | 378 | frame, regs->cp0_epc, regs->regs[31]); |
378 | #endif | 379 | #endif |
379 | return; | 380 | return 1; |
380 | 381 | ||
381 | give_sigsegv: | 382 | give_sigsegv: |
382 | force_sigsegv(signr, current); | 383 | force_sigsegv(signr, current); |
384 | return 0; | ||
383 | } | 385 | } |
384 | 386 | ||
385 | extern void setup_rt_frame_n32(struct k_sigaction * ka, | 387 | extern void setup_rt_frame_n32(struct k_sigaction * ka, |
386 | struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info); | 388 | struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info); |
387 | 389 | ||
388 | static inline void handle_signal(unsigned long sig, siginfo_t *info, | 390 | static inline int handle_signal(unsigned long sig, siginfo_t *info, |
389 | struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs) | 391 | struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs) |
390 | { | 392 | { |
393 | int ret; | ||
394 | |||
391 | switch(regs->regs[0]) { | 395 | switch(regs->regs[0]) { |
392 | case ERESTART_RESTARTBLOCK: | 396 | case ERESTART_RESTARTBLOCK: |
393 | case ERESTARTNOHAND: | 397 | case ERESTARTNOHAND: |
@@ -407,9 +411,9 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info, | |||
407 | regs->regs[0] = 0; /* Don't deal with this again. */ | 411 | regs->regs[0] = 0; /* Don't deal with this again. */ |
408 | 412 | ||
409 | if (sig_uses_siginfo(ka)) | 413 | if (sig_uses_siginfo(ka)) |
410 | current->thread.abi->setup_rt_frame(ka, regs, sig, oldset, info); | 414 | ret = current->thread.abi->setup_rt_frame(ka, regs, sig, oldset, info); |
411 | else | 415 | else |
412 | current->thread.abi->setup_frame(ka, regs, sig, oldset); | 416 | ret = current->thread.abi->setup_frame(ka, regs, sig, oldset); |
413 | 417 | ||
414 | spin_lock_irq(¤t->sighand->siglock); | 418 | spin_lock_irq(¤t->sighand->siglock); |
415 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 419 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
@@ -417,6 +421,8 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info, | |||
417 | sigaddset(¤t->blocked,sig); | 421 | sigaddset(¤t->blocked,sig); |
418 | recalc_sigpending(); | 422 | recalc_sigpending(); |
419 | spin_unlock_irq(¤t->sighand->siglock); | 423 | spin_unlock_irq(¤t->sighand->siglock); |
424 | |||
425 | return ret; | ||
420 | } | 426 | } |
421 | 427 | ||
422 | int do_signal(sigset_t *oldset, struct pt_regs *regs) | 428 | int do_signal(sigset_t *oldset, struct pt_regs *regs) |
@@ -440,10 +446,8 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) | |||
440 | oldset = ¤t->blocked; | 446 | oldset = ¤t->blocked; |
441 | 447 | ||
442 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 448 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
443 | if (signr > 0) { | 449 | if (signr > 0) |
444 | handle_signal(signr, &info, &ka, oldset, regs); | 450 | return handle_signal(signr, &info, &ka, oldset, regs); |
445 | return 1; | ||
446 | } | ||
447 | 451 | ||
448 | no_signal: | 452 | no_signal: |
449 | /* | 453 | /* |
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index 806ed073e54d..dbe821303125 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -769,9 +769,11 @@ give_sigsegv: | |||
769 | force_sigsegv(signr, current); | 769 | force_sigsegv(signr, current); |
770 | } | 770 | } |
771 | 771 | ||
772 | static inline void handle_signal(unsigned long sig, siginfo_t *info, | 772 | static inline int handle_signal(unsigned long sig, siginfo_t *info, |
773 | struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs) | 773 | struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs) |
774 | { | 774 | { |
775 | int ret; | ||
776 | |||
775 | switch (regs->regs[0]) { | 777 | switch (regs->regs[0]) { |
776 | case ERESTART_RESTARTBLOCK: | 778 | case ERESTART_RESTARTBLOCK: |
777 | case ERESTARTNOHAND: | 779 | case ERESTARTNOHAND: |
@@ -791,9 +793,9 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info, | |||
791 | regs->regs[0] = 0; /* Don't deal with this again. */ | 793 | regs->regs[0] = 0; /* Don't deal with this again. */ |
792 | 794 | ||
793 | if (ka->sa.sa_flags & SA_SIGINFO) | 795 | if (ka->sa.sa_flags & SA_SIGINFO) |
794 | current->thread.abi->setup_rt_frame(ka, regs, sig, oldset, info); | 796 | ret = current->thread.abi->setup_rt_frame(ka, regs, sig, oldset, info); |
795 | else | 797 | else |
796 | current->thread.abi->setup_frame(ka, regs, sig, oldset); | 798 | ret = current->thread.abi->setup_frame(ka, regs, sig, oldset); |
797 | 799 | ||
798 | spin_lock_irq(¤t->sighand->siglock); | 800 | spin_lock_irq(¤t->sighand->siglock); |
799 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 801 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
@@ -801,6 +803,8 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info, | |||
801 | sigaddset(¤t->blocked,sig); | 803 | sigaddset(¤t->blocked,sig); |
802 | recalc_sigpending(); | 804 | recalc_sigpending(); |
803 | spin_unlock_irq(¤t->sighand->siglock); | 805 | spin_unlock_irq(¤t->sighand->siglock); |
806 | |||
807 | return ret; | ||
804 | } | 808 | } |
805 | 809 | ||
806 | int do_signal32(sigset_t *oldset, struct pt_regs *regs) | 810 | int do_signal32(sigset_t *oldset, struct pt_regs *regs) |
@@ -824,10 +828,8 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs) | |||
824 | oldset = ¤t->blocked; | 828 | oldset = ¤t->blocked; |
825 | 829 | ||
826 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 830 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
827 | if (signr > 0) { | 831 | if (signr > 0) |
828 | handle_signal(signr, &info, &ka, oldset, regs); | 832 | return handle_signal(signr, &info, &ka, oldset, regs); |
829 | return 1; | ||
830 | } | ||
831 | 833 | ||
832 | no_signal: | 834 | no_signal: |
833 | /* | 835 | /* |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index f47c3aaaec8a..ec61b2670ba6 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
@@ -130,7 +130,7 @@ badframe: | |||
130 | force_sig(SIGSEGV, current); | 130 | force_sig(SIGSEGV, current); |
131 | } | 131 | } |
132 | 132 | ||
133 | void setup_rt_frame_n32(struct k_sigaction * ka, | 133 | int setup_rt_frame_n32(struct k_sigaction * ka, |
134 | struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info) | 134 | struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info) |
135 | { | 135 | { |
136 | struct rt_sigframe_n32 *frame; | 136 | struct rt_sigframe_n32 *frame; |
@@ -184,8 +184,9 @@ void setup_rt_frame_n32(struct k_sigaction * ka, | |||
184 | current->comm, current->pid, | 184 | current->comm, current->pid, |
185 | frame, regs->cp0_epc, regs->regs[31]); | 185 | frame, regs->cp0_epc, regs->regs[31]); |
186 | #endif | 186 | #endif |
187 | return; | 187 | return 1; |
188 | 188 | ||
189 | give_sigsegv: | 189 | give_sigsegv: |
190 | force_sigsegv(signr, current); | 190 | force_sigsegv(signr, current); |
191 | return 0; | ||
191 | } | 192 | } |