xref: /openbmc/linux/arch/s390/kernel/compat_signal.c (revision 930beb5a)
1 /*
2  *    Copyright IBM Corp. 2000, 2006
3  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
4  *               Gerhard Tonn (ton@de.ibm.com)
5  *
6  *  Copyright (C) 1991, 1992  Linus Torvalds
7  *
8  *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
9  */
10 
11 #include <linux/compat.h>
12 #include <linux/sched.h>
13 #include <linux/mm.h>
14 #include <linux/smp.h>
15 #include <linux/kernel.h>
16 #include <linux/signal.h>
17 #include <linux/errno.h>
18 #include <linux/wait.h>
19 #include <linux/ptrace.h>
20 #include <linux/unistd.h>
21 #include <linux/stddef.h>
22 #include <linux/tty.h>
23 #include <linux/personality.h>
24 #include <linux/binfmts.h>
25 #include <asm/ucontext.h>
26 #include <asm/uaccess.h>
27 #include <asm/lowcore.h>
28 #include <asm/switch_to.h>
29 #include "compat_linux.h"
30 #include "compat_ptrace.h"
31 #include "entry.h"
32 
33 typedef struct
34 {
35 	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
36 	struct sigcontext32 sc;
37 	_sigregs32 sregs;
38 	int signo;
39 	__u32 gprs_high[NUM_GPRS];
40 	__u8 retcode[S390_SYSCALL_SIZE];
41 } sigframe32;
42 
43 typedef struct
44 {
45 	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
46 	__u8 retcode[S390_SYSCALL_SIZE];
47 	compat_siginfo_t info;
48 	struct ucontext32 uc;
49 	__u32 gprs_high[NUM_GPRS];
50 } rt_sigframe32;
51 
52 int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
53 {
54 	int err;
55 
56 	/* If you change siginfo_t structure, please be sure
57 	   this code is fixed accordingly.
58 	   It should never copy any pad contained in the structure
59 	   to avoid security leaks, but must copy the generic
60 	   3 ints plus the relevant union member.
61 	   This routine must convert siginfo from 64bit to 32bit as well
62 	   at the same time.  */
63 	err = __put_user(from->si_signo, &to->si_signo);
64 	err |= __put_user(from->si_errno, &to->si_errno);
65 	err |= __put_user((short)from->si_code, &to->si_code);
66 	if (from->si_code < 0)
67 		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
68 	else {
69 		switch (from->si_code >> 16) {
70 		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
71 		case __SI_MESGQ >> 16:
72 			err |= __put_user(from->si_int, &to->si_int);
73 			/* fallthrough */
74 		case __SI_KILL >> 16:
75 			err |= __put_user(from->si_pid, &to->si_pid);
76 			err |= __put_user(from->si_uid, &to->si_uid);
77 			break;
78 		case __SI_CHLD >> 16:
79 			err |= __put_user(from->si_pid, &to->si_pid);
80 			err |= __put_user(from->si_uid, &to->si_uid);
81 			err |= __put_user(from->si_utime, &to->si_utime);
82 			err |= __put_user(from->si_stime, &to->si_stime);
83 			err |= __put_user(from->si_status, &to->si_status);
84 			break;
85 		case __SI_FAULT >> 16:
86 			err |= __put_user((unsigned long) from->si_addr,
87 					  &to->si_addr);
88 			break;
89 		case __SI_POLL >> 16:
90 			err |= __put_user(from->si_band, &to->si_band);
91 			err |= __put_user(from->si_fd, &to->si_fd);
92 			break;
93 		case __SI_TIMER >> 16:
94 			err |= __put_user(from->si_tid, &to->si_tid);
95 			err |= __put_user(from->si_overrun, &to->si_overrun);
96 			err |= __put_user(from->si_int, &to->si_int);
97 			break;
98 		default:
99 			break;
100 		}
101 	}
102 	return err ? -EFAULT : 0;
103 }
104 
105 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
106 {
107 	int err;
108 	u32 tmp;
109 
110 	err = __get_user(to->si_signo, &from->si_signo);
111 	err |= __get_user(to->si_errno, &from->si_errno);
112 	err |= __get_user(to->si_code, &from->si_code);
113 
114 	if (to->si_code < 0)
115 		err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
116 	else {
117 		switch (to->si_code >> 16) {
118 		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
119 		case __SI_MESGQ >> 16:
120 			err |= __get_user(to->si_int, &from->si_int);
121 			/* fallthrough */
122 		case __SI_KILL >> 16:
123 			err |= __get_user(to->si_pid, &from->si_pid);
124 			err |= __get_user(to->si_uid, &from->si_uid);
125 			break;
126 		case __SI_CHLD >> 16:
127 			err |= __get_user(to->si_pid, &from->si_pid);
128 			err |= __get_user(to->si_uid, &from->si_uid);
129 			err |= __get_user(to->si_utime, &from->si_utime);
130 			err |= __get_user(to->si_stime, &from->si_stime);
131 			err |= __get_user(to->si_status, &from->si_status);
132 			break;
133 		case __SI_FAULT >> 16:
134 			err |= __get_user(tmp, &from->si_addr);
135 			to->si_addr = (void __force __user *)
136 				(u64) (tmp & PSW32_ADDR_INSN);
137 			break;
138 		case __SI_POLL >> 16:
139 			err |= __get_user(to->si_band, &from->si_band);
140 			err |= __get_user(to->si_fd, &from->si_fd);
141 			break;
142 		case __SI_TIMER >> 16:
143 			err |= __get_user(to->si_tid, &from->si_tid);
144 			err |= __get_user(to->si_overrun, &from->si_overrun);
145 			err |= __get_user(to->si_int, &from->si_int);
146 			break;
147 		default:
148 			break;
149 		}
150 	}
151 	return err ? -EFAULT : 0;
152 }
153 
154 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
155 {
156 	_sigregs32 user_sregs;
157 	int i;
158 
159 	user_sregs.regs.psw.mask = (__u32)(regs->psw.mask >> 32);
160 	user_sregs.regs.psw.mask &= PSW32_MASK_USER | PSW32_MASK_RI;
161 	user_sregs.regs.psw.mask |= PSW32_USER_BITS;
162 	user_sregs.regs.psw.addr = (__u32) regs->psw.addr |
163 		(__u32)(regs->psw.mask & PSW_MASK_BA);
164 	for (i = 0; i < NUM_GPRS; i++)
165 		user_sregs.regs.gprs[i] = (__u32) regs->gprs[i];
166 	save_access_regs(current->thread.acrs);
167 	memcpy(&user_sregs.regs.acrs, current->thread.acrs,
168 	       sizeof(user_sregs.regs.acrs));
169 	save_fp_ctl(&current->thread.fp_regs.fpc);
170 	save_fp_regs(current->thread.fp_regs.fprs);
171 	memcpy(&user_sregs.fpregs, &current->thread.fp_regs,
172 	       sizeof(user_sregs.fpregs));
173 	if (__copy_to_user(sregs, &user_sregs, sizeof(_sigregs32)))
174 		return -EFAULT;
175 	return 0;
176 }
177 
178 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
179 {
180 	_sigregs32 user_sregs;
181 	int i;
182 
183 	/* Alwys make any pending restarted system call return -EINTR */
184 	current_thread_info()->restart_block.fn = do_no_restart_syscall;
185 
186 	if (__copy_from_user(&user_sregs, &sregs->regs, sizeof(user_sregs)))
187 		return -EFAULT;
188 
189 	if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW32_MASK_RI))
190 		return -EINVAL;
191 
192 	/* Loading the floating-point-control word can fail. Do that first. */
193 	if (restore_fp_ctl(&user_sregs.fpregs.fpc))
194 		return -EINVAL;
195 
196 	/* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */
197 	regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) |
198 		(__u64)(user_sregs.regs.psw.mask & PSW32_MASK_USER) << 32 |
199 		(__u64)(user_sregs.regs.psw.mask & PSW32_MASK_RI) << 32 |
200 		(__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_AMODE);
201 	/* Check for invalid user address space control. */
202 	if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME)
203 		regs->psw.mask = PSW_ASC_PRIMARY |
204 			(regs->psw.mask & ~PSW_MASK_ASC);
205 	regs->psw.addr = (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_INSN);
206 	for (i = 0; i < NUM_GPRS; i++)
207 		regs->gprs[i] = (__u64) user_sregs.regs.gprs[i];
208 	memcpy(&current->thread.acrs, &user_sregs.regs.acrs,
209 	       sizeof(current->thread.acrs));
210 	restore_access_regs(current->thread.acrs);
211 
212 	memcpy(&current->thread.fp_regs, &user_sregs.fpregs,
213 	       sizeof(current->thread.fp_regs));
214 
215 	restore_fp_regs(current->thread.fp_regs.fprs);
216 	clear_thread_flag(TIF_SYSCALL);	/* No longer in a system call */
217 	return 0;
218 }
219 
220 static int save_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
221 {
222 	__u32 gprs_high[NUM_GPRS];
223 	int i;
224 
225 	for (i = 0; i < NUM_GPRS; i++)
226 		gprs_high[i] = regs->gprs[i] >> 32;
227 	if (__copy_to_user(uregs, &gprs_high, sizeof(gprs_high)))
228 		return -EFAULT;
229 	return 0;
230 }
231 
232 static int restore_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
233 {
234 	__u32 gprs_high[NUM_GPRS];
235 	int i;
236 
237 	if (__copy_from_user(&gprs_high, uregs, sizeof(gprs_high)))
238 		return -EFAULT;
239 	for (i = 0; i < NUM_GPRS; i++)
240 		*(__u32 *)&regs->gprs[i] = gprs_high[i];
241 	return 0;
242 }
243 
244 asmlinkage long sys32_sigreturn(void)
245 {
246 	struct pt_regs *regs = task_pt_regs(current);
247 	sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
248 	sigset_t set;
249 
250 	if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
251 		goto badframe;
252 	set_current_blocked(&set);
253 	if (restore_sigregs32(regs, &frame->sregs))
254 		goto badframe;
255 	if (restore_sigregs_gprs_high(regs, frame->gprs_high))
256 		goto badframe;
257 	return regs->gprs[2];
258 badframe:
259 	force_sig(SIGSEGV, current);
260 	return 0;
261 }
262 
263 asmlinkage long sys32_rt_sigreturn(void)
264 {
265 	struct pt_regs *regs = task_pt_regs(current);
266 	rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
267 	sigset_t set;
268 
269 	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
270 		goto badframe;
271 	set_current_blocked(&set);
272 	if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
273 		goto badframe;
274 	if (restore_sigregs_gprs_high(regs, frame->gprs_high))
275 		goto badframe;
276 	if (compat_restore_altstack(&frame->uc.uc_stack))
277 		goto badframe;
278 	return regs->gprs[2];
279 badframe:
280 	force_sig(SIGSEGV, current);
281 	return 0;
282 }
283 
284 /*
285  * Set up a signal frame.
286  */
287 
288 
289 /*
290  * Determine which stack to use..
291  */
292 static inline void __user *
293 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
294 {
295 	unsigned long sp;
296 
297 	/* Default to using normal stack */
298 	sp = (unsigned long) A(regs->gprs[15]);
299 
300 	/* Overflow on alternate signal stack gives SIGSEGV. */
301 	if (on_sig_stack(sp) && !on_sig_stack((sp - frame_size) & -8UL))
302 		return (void __user *) -1UL;
303 
304 	/* This is the X/Open sanctioned signal stack switching.  */
305 	if (ka->sa.sa_flags & SA_ONSTACK) {
306 		if (! sas_ss_flags(sp))
307 			sp = current->sas_ss_sp + current->sas_ss_size;
308 	}
309 
310 	return (void __user *)((sp - frame_size) & -8ul);
311 }
312 
313 static inline int map_signal(int sig)
314 {
315 	if (current_thread_info()->exec_domain
316 	    && current_thread_info()->exec_domain->signal_invmap
317 	    && sig < 32)
318 		return current_thread_info()->exec_domain->signal_invmap[sig];
319         else
320 		return sig;
321 }
322 
323 static int setup_frame32(int sig, struct k_sigaction *ka,
324 			sigset_t *set, struct pt_regs * regs)
325 {
326 	sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
327 
328 	if (frame == (void __user *) -1UL)
329 		goto give_sigsegv;
330 
331 	if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
332 		goto give_sigsegv;
333 
334 	if (save_sigregs32(regs, &frame->sregs))
335 		goto give_sigsegv;
336 	if (save_sigregs_gprs_high(regs, frame->gprs_high))
337 		goto give_sigsegv;
338 	if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
339 		goto give_sigsegv;
340 
341 	/* Set up to return from userspace.  If provided, use a stub
342 	   already in userspace.  */
343 	if (ka->sa.sa_flags & SA_RESTORER) {
344 		regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
345 	} else {
346 		regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
347 		if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
348 			       (u16 __force __user *)(frame->retcode)))
349 			goto give_sigsegv;
350         }
351 
352 	/* Set up backchain. */
353 	if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
354 		goto give_sigsegv;
355 
356 	/* Set up registers for signal handler */
357 	regs->gprs[15] = (__force __u64) frame;
358 	/* Force 31 bit amode and default user address space control. */
359 	regs->psw.mask = PSW_MASK_BA |
360 		(PSW_USER_BITS & PSW_MASK_ASC) |
361 		(regs->psw.mask & ~PSW_MASK_ASC);
362 	regs->psw.addr = (__force __u64) ka->sa.sa_handler;
363 
364 	regs->gprs[2] = map_signal(sig);
365 	regs->gprs[3] = (__force __u64) &frame->sc;
366 
367 	/* We forgot to include these in the sigcontext.
368 	   To avoid breaking binary compatibility, they are passed as args. */
369 	if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
370 	    sig == SIGTRAP || sig == SIGFPE) {
371 		/* set extra registers only for synchronous signals */
372 		regs->gprs[4] = regs->int_code & 127;
373 		regs->gprs[5] = regs->int_parm_long;
374 		regs->gprs[6] = task_thread_info(current)->last_break;
375 	}
376 
377 	/* Place signal number on stack to allow backtrace from handler.  */
378 	if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo))
379 		goto give_sigsegv;
380 	return 0;
381 
382 give_sigsegv:
383 	force_sigsegv(sig, current);
384 	return -EFAULT;
385 }
386 
387 static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
388 			   sigset_t *set, struct pt_regs * regs)
389 {
390 	int err = 0;
391 	rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
392 
393 	if (frame == (void __user *) -1UL)
394 		goto give_sigsegv;
395 
396 	if (copy_siginfo_to_user32(&frame->info, info))
397 		goto give_sigsegv;
398 
399 	/* Create the ucontext.  */
400 	err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags);
401 	err |= __put_user(0, &frame->uc.uc_link);
402 	err |= __compat_save_altstack(&frame->uc.uc_stack, regs->gprs[15]);
403 	err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
404 	err |= save_sigregs_gprs_high(regs, frame->gprs_high);
405 	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
406 	if (err)
407 		goto give_sigsegv;
408 
409 	/* Set up to return from userspace.  If provided, use a stub
410 	   already in userspace.  */
411 	if (ka->sa.sa_flags & SA_RESTORER) {
412 		regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
413 	} else {
414 		regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
415 		err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
416 				  (u16 __force __user *)(frame->retcode));
417 	}
418 
419 	/* Set up backchain. */
420 	if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame))
421 		goto give_sigsegv;
422 
423 	/* Set up registers for signal handler */
424 	regs->gprs[15] = (__force __u64) frame;
425 	/* Force 31 bit amode and default user address space control. */
426 	regs->psw.mask = PSW_MASK_BA |
427 		(PSW_USER_BITS & PSW_MASK_ASC) |
428 		(regs->psw.mask & ~PSW_MASK_ASC);
429 	regs->psw.addr = (__u64 __force) ka->sa.sa_handler;
430 
431 	regs->gprs[2] = map_signal(sig);
432 	regs->gprs[3] = (__force __u64) &frame->info;
433 	regs->gprs[4] = (__force __u64) &frame->uc;
434 	regs->gprs[5] = task_thread_info(current)->last_break;
435 	return 0;
436 
437 give_sigsegv:
438 	force_sigsegv(sig, current);
439 	return -EFAULT;
440 }
441 
442 /*
443  * OK, we're invoking a handler
444  */
445 
446 void handle_signal32(unsigned long sig, struct k_sigaction *ka,
447 		    siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
448 {
449 	int ret;
450 
451 	/* Set up the stack frame */
452 	if (ka->sa.sa_flags & SA_SIGINFO)
453 		ret = setup_rt_frame32(sig, ka, info, oldset, regs);
454 	else
455 		ret = setup_frame32(sig, ka, oldset, regs);
456 	if (ret)
457 		return;
458 	signal_delivered(sig, info, ka, regs,
459 				 test_thread_flag(TIF_SINGLE_STEP));
460 }
461 
462