diff options
Diffstat (limited to 'arch/mips/kernel/signal_n32.c')
-rw-r--r-- | arch/mips/kernel/signal_n32.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 57456e6a0c62..7ca2a078841f 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
@@ -31,6 +31,7 @@ | |||
31 | 31 | ||
32 | #include <asm/asm.h> | 32 | #include <asm/asm.h> |
33 | #include <asm/cacheflush.h> | 33 | #include <asm/cacheflush.h> |
34 | #include <asm/compat-signal.h> | ||
34 | #include <asm/sim.h> | 35 | #include <asm/sim.h> |
35 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
36 | #include <asm/ucontext.h> | 37 | #include <asm/ucontext.h> |
@@ -47,7 +48,9 @@ | |||
47 | #define __NR_N32_rt_sigreturn 6211 | 48 | #define __NR_N32_rt_sigreturn 6211 |
48 | #define __NR_N32_restart_syscall 6214 | 49 | #define __NR_N32_restart_syscall 6214 |
49 | 50 | ||
50 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 51 | extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *); |
52 | extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *); | ||
53 | |||
51 | 54 | ||
52 | /* IRIX compatible stack_t */ | 55 | /* IRIX compatible stack_t */ |
53 | typedef struct sigaltstack32 { | 56 | typedef struct sigaltstack32 { |
@@ -61,7 +64,7 @@ struct ucontextn32 { | |||
61 | s32 uc_link; | 64 | s32 uc_link; |
62 | stack32_t uc_stack; | 65 | stack32_t uc_stack; |
63 | struct sigcontext uc_mcontext; | 66 | struct sigcontext uc_mcontext; |
64 | sigset_t uc_sigmask; /* mask last for extensibility */ | 67 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ |
65 | }; | 68 | }; |
66 | 69 | ||
67 | #if ICACHE_REFILLS_WORKAROUND_WAR == 0 | 70 | #if ICACHE_REFILLS_WORKAROUND_WAR == 0 |
@@ -127,7 +130,7 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
127 | frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; | 130 | frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; |
128 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 131 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
129 | goto badframe; | 132 | goto badframe; |
130 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) | 133 | if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask)) |
131 | goto badframe; | 134 | goto badframe; |
132 | 135 | ||
133 | sigdelsetmask(&set, ~_BLOCKABLE); | 136 | sigdelsetmask(&set, ~_BLOCKABLE); |
@@ -193,7 +196,7 @@ int setup_rt_frame_n32(struct k_sigaction * ka, | |||
193 | err |= __put_user(current->sas_ss_size, | 196 | err |= __put_user(current->sas_ss_size, |
194 | &frame->rs_uc.uc_stack.ss_size); | 197 | &frame->rs_uc.uc_stack.ss_size); |
195 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); | 198 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); |
196 | err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); | 199 | err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); |
197 | 200 | ||
198 | if (err) | 201 | if (err) |
199 | goto give_sigsegv; | 202 | goto give_sigsegv; |