2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 1991, 1992 Linus Torvalds
7 * Copyright (C) 1994 - 2000, 2006 Ralf Baechle
8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
9 * Copyright (C) 2016, Imagination Technologies Ltd.
11 #include <linux/compiler.h>
12 #include <linux/errno.h>
13 #include <linux/signal.h>
14 #include <linux/uaccess.h>
17 #include <asm/compat-signal.h>
20 #include <asm/unistd.h>
22 #include "signal-common.h"
25 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
27 #define __NR_O32_restart_syscall 4253
30 u32 sf_ass
[4]; /* argument save space for o32 */
31 u32 sf_pad
[2]; /* Was: signal trampoline */
32 struct sigcontext32 sf_sc
;
33 compat_sigset_t sf_mask
;
39 compat_stack_t uc_stack
;
40 struct sigcontext32 uc_mcontext
;
41 compat_sigset_t uc_sigmask
; /* mask last for extensibility */
44 struct rt_sigframe32
{
45 u32 rs_ass
[4]; /* argument save space for o32 */
46 u32 rs_pad
[2]; /* Was: signal trampoline */
47 compat_siginfo_t rs_info
;
48 struct ucontext32 rs_uc
;
51 static int setup_sigcontext32(struct pt_regs
*regs
,
52 struct sigcontext32 __user
*sc
)
57 err
|= __put_user(regs
->cp0_epc
, &sc
->sc_pc
);
59 err
|= __put_user(0, &sc
->sc_regs
[0]);
60 for (i
= 1; i
< 32; i
++)
61 err
|= __put_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
63 err
|= __put_user(regs
->hi
, &sc
->sc_mdhi
);
64 err
|= __put_user(regs
->lo
, &sc
->sc_mdlo
);
66 err
|= __put_user(rddsp(DSP_MASK
), &sc
->sc_dsp
);
67 err
|= __put_user(mfhi1(), &sc
->sc_hi1
);
68 err
|= __put_user(mflo1(), &sc
->sc_lo1
);
69 err
|= __put_user(mfhi2(), &sc
->sc_hi2
);
70 err
|= __put_user(mflo2(), &sc
->sc_lo2
);
71 err
|= __put_user(mfhi3(), &sc
->sc_hi3
);
72 err
|= __put_user(mflo3(), &sc
->sc_lo3
);
76 * Save FPU state to signal context. Signal handler
77 * will "inherit" current FPU state.
79 err
|= protected_save_fp_context(sc
);
84 static int restore_sigcontext32(struct pt_regs
*regs
,
85 struct sigcontext32 __user
*sc
)
91 /* Always make any pending restarted system calls return -EINTR */
92 current
->restart_block
.fn
= do_no_restart_syscall
;
94 err
|= __get_user(regs
->cp0_epc
, &sc
->sc_pc
);
95 err
|= __get_user(regs
->hi
, &sc
->sc_mdhi
);
96 err
|= __get_user(regs
->lo
, &sc
->sc_mdlo
);
98 err
|= __get_user(treg
, &sc
->sc_hi1
); mthi1(treg
);
99 err
|= __get_user(treg
, &sc
->sc_lo1
); mtlo1(treg
);
100 err
|= __get_user(treg
, &sc
->sc_hi2
); mthi2(treg
);
101 err
|= __get_user(treg
, &sc
->sc_lo2
); mtlo2(treg
);
102 err
|= __get_user(treg
, &sc
->sc_hi3
); mthi3(treg
);
103 err
|= __get_user(treg
, &sc
->sc_lo3
); mtlo3(treg
);
104 err
|= __get_user(treg
, &sc
->sc_dsp
); wrdsp(treg
, DSP_MASK
);
107 for (i
= 1; i
< 32; i
++)
108 err
|= __get_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
110 return err
?: protected_restore_fp_context(sc
);
113 static int setup_frame_32(void *sig_return
, struct ksignal
*ksig
,
114 struct pt_regs
*regs
, sigset_t
*set
)
116 struct sigframe32 __user
*frame
;
119 frame
= get_sigframe(ksig
, regs
, sizeof(*frame
));
120 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
123 err
|= setup_sigcontext32(regs
, &frame
->sf_sc
);
124 err
|= __copy_conv_sigset_to_user(&frame
->sf_mask
, set
);
130 * Arguments to signal handler:
133 * a1 = 0 (should be cause)
134 * a2 = pointer to struct sigcontext
136 * $25 and c0_epc point to the signal handler, $29 points to the
139 regs
->regs
[ 4] = ksig
->sig
;
141 regs
->regs
[ 6] = (unsigned long) &frame
->sf_sc
;
142 regs
->regs
[29] = (unsigned long) frame
;
143 regs
->regs
[31] = (unsigned long) sig_return
;
144 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ksig
->ka
.sa
.sa_handler
;
146 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
147 current
->comm
, current
->pid
,
148 frame
, regs
->cp0_epc
, regs
->regs
[31]);
153 asmlinkage
void sys32_rt_sigreturn(nabi_no_regargs
struct pt_regs regs
)
155 struct rt_sigframe32 __user
*frame
;
159 frame
= (struct rt_sigframe32 __user
*) regs
.regs
[29];
160 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
162 if (__copy_conv_sigset_from_user(&set
, &frame
->rs_uc
.uc_sigmask
))
165 set_current_blocked(&set
);
167 sig
= restore_sigcontext32(®s
, &frame
->rs_uc
.uc_mcontext
);
171 force_sig(sig
, current
);
173 if (compat_restore_altstack(&frame
->rs_uc
.uc_stack
))
177 * Don't let your children do this ...
179 __asm__
__volatile__(
187 force_sig(SIGSEGV
, current
);
190 static int setup_rt_frame_32(void *sig_return
, struct ksignal
*ksig
,
191 struct pt_regs
*regs
, sigset_t
*set
)
193 struct rt_sigframe32 __user
*frame
;
196 frame
= get_sigframe(ksig
, regs
, sizeof(*frame
));
197 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
200 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
201 err
|= copy_siginfo_to_user32(&frame
->rs_info
, &ksig
->info
);
203 /* Create the ucontext. */
204 err
|= __put_user(0, &frame
->rs_uc
.uc_flags
);
205 err
|= __put_user(0, &frame
->rs_uc
.uc_link
);
206 err
|= __compat_save_altstack(&frame
->rs_uc
.uc_stack
, regs
->regs
[29]);
207 err
|= setup_sigcontext32(regs
, &frame
->rs_uc
.uc_mcontext
);
208 err
|= __copy_conv_sigset_to_user(&frame
->rs_uc
.uc_sigmask
, set
);
214 * Arguments to signal handler:
217 * a1 = 0 (should be cause)
218 * a2 = pointer to ucontext
220 * $25 and c0_epc point to the signal handler, $29 points to
221 * the struct rt_sigframe32.
223 regs
->regs
[ 4] = ksig
->sig
;
224 regs
->regs
[ 5] = (unsigned long) &frame
->rs_info
;
225 regs
->regs
[ 6] = (unsigned long) &frame
->rs_uc
;
226 regs
->regs
[29] = (unsigned long) frame
;
227 regs
->regs
[31] = (unsigned long) sig_return
;
228 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ksig
->ka
.sa
.sa_handler
;
230 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
231 current
->comm
, current
->pid
,
232 frame
, regs
->cp0_epc
, regs
->regs
[31]);
238 * o32 compatibility on 64-bit kernels, without DSP ASE
240 struct mips_abi mips_abi_32
= {
241 .setup_frame
= setup_frame_32
,
242 .setup_rt_frame
= setup_rt_frame_32
,
243 .restart
= __NR_O32_restart_syscall
,
245 .off_sc_fpregs
= offsetof(struct sigcontext32
, sc_fpregs
),
246 .off_sc_fpc_csr
= offsetof(struct sigcontext32
, sc_fpc_csr
),
247 .off_sc_used_math
= offsetof(struct sigcontext32
, sc_used_math
),
249 .vdso
= &vdso_image_o32
,
253 asmlinkage
void sys32_sigreturn(nabi_no_regargs
struct pt_regs regs
)
255 struct sigframe32 __user
*frame
;
259 frame
= (struct sigframe32 __user
*) regs
.regs
[29];
260 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
262 if (__copy_conv_sigset_from_user(&blocked
, &frame
->sf_mask
))
265 set_current_blocked(&blocked
);
267 sig
= restore_sigcontext32(®s
, &frame
->sf_sc
);
271 force_sig(sig
, current
);
274 * Don't let your children do this ...
276 __asm__
__volatile__(
284 force_sig(SIGSEGV
, current
);