Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
  1/*
  2 * arch/sh/kernel/signal_64.c
  3 *
  4 * Copyright (C) 2000, 2001  Paolo Alberelli
  5 * Copyright (C) 2003 - 2008  Paul Mundt
  6 * Copyright (C) 2004  Richard Curnow
  7 *
  8 * This file is subject to the terms and conditions of the GNU General Public
  9 * License.  See the file "COPYING" in the main directory of this archive
 10 * for more details.
 11 */
 12#include <linux/rwsem.h>
 13#include <linux/sched.h>
 14#include <linux/mm.h>
 15#include <linux/smp.h>
 16#include <linux/kernel.h>
 17#include <linux/signal.h>
 18#include <linux/errno.h>
 19#include <linux/wait.h>
 20#include <linux/personality.h>
 21#include <linux/ptrace.h>
 22#include <linux/unistd.h>
 23#include <linux/stddef.h>
 24#include <linux/tracehook.h>
 25#include <asm/ucontext.h>
 26#include <asm/uaccess.h>
 27#include <asm/pgtable.h>
 28#include <asm/cacheflush.h>
 29#include <asm/fpu.h>
 30
 31#define REG_RET 9
 32#define REG_ARG1 2
 33#define REG_ARG2 3
 34#define REG_ARG3 4
 35#define REG_SP 15
 36#define REG_PR 18
 37#define REF_REG_RET regs->regs[REG_RET]
 38#define REF_REG_SP regs->regs[REG_SP]
 39#define DEREF_REG_PR regs->regs[REG_PR]
 40
 41#define DEBUG_SIG 0
 42
 43static void
 44handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
 45		struct pt_regs * regs);
 46
 47static inline void
 48handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa)
 49{
 50	/* If we're not from a syscall, bail out */
 51	if (regs->syscall_nr < 0)
 52		return;
 53
 54	/* check for system call restart.. */
 55	switch (regs->regs[REG_RET]) {
 56		case -ERESTART_RESTARTBLOCK:
 57		case -ERESTARTNOHAND:
 58		no_system_call_restart:
 59			regs->regs[REG_RET] = -EINTR;
 60			break;
 61
 62		case -ERESTARTSYS:
 63			if (!(sa->sa_flags & SA_RESTART))
 64				goto no_system_call_restart;
 65		/* fallthrough */
 66		case -ERESTARTNOINTR:
 67			/* Decode syscall # */
 68			regs->regs[REG_RET] = regs->syscall_nr;
 69			regs->pc -= 4;
 70			break;
 71	}
 72}
 73
 74/*
 75 * Note that 'init' is a special process: it doesn't get signals it doesn't
 76 * want to handle. Thus you cannot kill init even with a SIGKILL even by
 77 * mistake.
 78 *
 79 * Note that we go through the signals twice: once to check the signals that
 80 * the kernel can handle, and then we build all the user-level signal handling
 81 * stack-frames in one go after that.
 82 */
 83static void do_signal(struct pt_regs *regs)
 84{
 85	siginfo_t info;
 86	int signr;
 87	struct k_sigaction ka;
 88
 89	/*
 90	 * We want the common case to go fast, which
 91	 * is why we may in certain cases get here from
 92	 * kernel mode. Just return without doing anything
 93	 * if so.
 94	 */
 95	if (!user_mode(regs))
 96		return;
 97
 98	signr = get_signal_to_deliver(&info, &ka, regs, 0);
 99	if (signr > 0) {
100		handle_syscall_restart(regs, &ka.sa);
101
102		/* Whee!  Actually deliver the signal.  */
103		handle_signal(signr, &info, &ka, regs);
104		return;
105	}
106
107	/* Did we come from a system call? */
108	if (regs->syscall_nr >= 0) {
109		/* Restart the system call - no handlers present */
110		switch (regs->regs[REG_RET]) {
111		case -ERESTARTNOHAND:
112		case -ERESTARTSYS:
113		case -ERESTARTNOINTR:
114			/* Decode Syscall # */
115			regs->regs[REG_RET] = regs->syscall_nr;
116			regs->pc -= 4;
117			break;
118
119		case -ERESTART_RESTARTBLOCK:
120			regs->regs[REG_RET] = __NR_restart_syscall;
121			regs->pc -= 4;
122			break;
123		}
124	}
125
126	/* No signal to deliver -- put the saved sigmask back */
127	restore_saved_sigmask();
128}
129
130/*
131 * Do a signal return; undo the signal stack.
132 */
133struct sigframe {
134	struct sigcontext sc;
135	unsigned long extramask[_NSIG_WORDS-1];
136	long long retcode[2];
137};
138
139struct rt_sigframe {
140	struct siginfo __user *pinfo;
141	void *puc;
142	struct siginfo info;
143	struct ucontext uc;
144	long long retcode[2];
145};
146
147#ifdef CONFIG_SH_FPU
148static inline int
149restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
150{
151	int err = 0;
152	int fpvalid;
153
154	err |= __get_user (fpvalid, &sc->sc_fpvalid);
155	conditional_used_math(fpvalid);
156	if (! fpvalid)
157		return err;
158
159	if (current == last_task_used_math) {
160		last_task_used_math = NULL;
161		regs->sr |= SR_FD;
162	}
163
164	err |= __copy_from_user(&current->thread.xstate->hardfpu, &sc->sc_fpregs[0],
165				(sizeof(long long) * 32) + (sizeof(int) * 1));
166
167	return err;
168}
169
170static inline int
171setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
172{
173	int err = 0;
174	int fpvalid;
175
176	fpvalid = !!used_math();
177	err |= __put_user(fpvalid, &sc->sc_fpvalid);
178	if (! fpvalid)
179		return err;
180
181	if (current == last_task_used_math) {
182		enable_fpu();
183		save_fpu(current);
184		disable_fpu();
185		last_task_used_math = NULL;
186		regs->sr |= SR_FD;
187	}
188
189	err |= __copy_to_user(&sc->sc_fpregs[0], &current->thread.xstate->hardfpu,
190			      (sizeof(long long) * 32) + (sizeof(int) * 1));
191	clear_used_math();
192
193	return err;
194}
195#else
196static inline int
197restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
198{
199	return 0;
200}
201static inline int
202setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
203{
204	return 0;
205}
206#endif
207
208static int
209restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, long long *r2_p)
210{
211	unsigned int err = 0;
212        unsigned long long current_sr, new_sr;
213#define SR_MASK 0xffff8cfd
214
215#define COPY(x)		err |= __get_user(regs->x, &sc->sc_##x)
216
217	COPY(regs[0]);	COPY(regs[1]);	COPY(regs[2]);	COPY(regs[3]);
218	COPY(regs[4]);	COPY(regs[5]);	COPY(regs[6]);	COPY(regs[7]);
219	COPY(regs[8]);	COPY(regs[9]);  COPY(regs[10]);	COPY(regs[11]);
220	COPY(regs[12]);	COPY(regs[13]);	COPY(regs[14]);	COPY(regs[15]);
221	COPY(regs[16]);	COPY(regs[17]);	COPY(regs[18]);	COPY(regs[19]);
222	COPY(regs[20]);	COPY(regs[21]);	COPY(regs[22]);	COPY(regs[23]);
223	COPY(regs[24]);	COPY(regs[25]);	COPY(regs[26]);	COPY(regs[27]);
224	COPY(regs[28]);	COPY(regs[29]);	COPY(regs[30]);	COPY(regs[31]);
225	COPY(regs[32]);	COPY(regs[33]);	COPY(regs[34]);	COPY(regs[35]);
226	COPY(regs[36]);	COPY(regs[37]);	COPY(regs[38]);	COPY(regs[39]);
227	COPY(regs[40]);	COPY(regs[41]);	COPY(regs[42]);	COPY(regs[43]);
228	COPY(regs[44]);	COPY(regs[45]);	COPY(regs[46]);	COPY(regs[47]);
229	COPY(regs[48]);	COPY(regs[49]);	COPY(regs[50]);	COPY(regs[51]);
230	COPY(regs[52]);	COPY(regs[53]);	COPY(regs[54]);	COPY(regs[55]);
231	COPY(regs[56]);	COPY(regs[57]);	COPY(regs[58]);	COPY(regs[59]);
232	COPY(regs[60]);	COPY(regs[61]);	COPY(regs[62]);
233	COPY(tregs[0]);	COPY(tregs[1]);	COPY(tregs[2]);	COPY(tregs[3]);
234	COPY(tregs[4]);	COPY(tregs[5]);	COPY(tregs[6]);	COPY(tregs[7]);
235
236        /* Prevent the signal handler manipulating SR in a way that can
237           crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
238           modified */
239        current_sr = regs->sr;
240        err |= __get_user(new_sr, &sc->sc_sr);
241        regs->sr &= SR_MASK;
242        regs->sr |= (new_sr & ~SR_MASK);
243
244	COPY(pc);
245
246#undef COPY
247
248	/* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
249	 * has been restored above.) */
250	err |= restore_sigcontext_fpu(regs, sc);
251
252	regs->syscall_nr = -1;		/* disable syscall checks */
253	err |= __get_user(*r2_p, &sc->sc_regs[REG_RET]);
254	return err;
255}
256
257asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
258				   unsigned long r4, unsigned long r5,
259				   unsigned long r6, unsigned long r7,
260				   struct pt_regs * regs)
261{
262	struct sigframe __user *frame = (struct sigframe __user *) (long) REF_REG_SP;
263	sigset_t set;
264	long long ret;
265
266	/* Always make any pending restarted system calls return -EINTR */
267	current_thread_info()->restart_block.fn = do_no_restart_syscall;
268
269	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
270		goto badframe;
271
272	if (__get_user(set.sig[0], &frame->sc.oldmask)
273	    || (_NSIG_WORDS > 1
274		&& __copy_from_user(&set.sig[1], &frame->extramask,
275				    sizeof(frame->extramask))))
276		goto badframe;
277
278	set_current_blocked(&set);
279
280	if (restore_sigcontext(regs, &frame->sc, &ret))
281		goto badframe;
282	regs->pc -= 4;
283
284	return (int) ret;
285
286badframe:
287	force_sig(SIGSEGV, current);
288	return 0;
289}
290
291asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
292				unsigned long r4, unsigned long r5,
293				unsigned long r6, unsigned long r7,
294				struct pt_regs * regs)
295{
296	struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
297	sigset_t set;
298	long long ret;
299
300	/* Always make any pending restarted system calls return -EINTR */
301	current_thread_info()->restart_block.fn = do_no_restart_syscall;
302
303	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
304		goto badframe;
305
306	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
307		goto badframe;
308
309	set_current_blocked(&set);
310
311	if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
312		goto badframe;
313	regs->pc -= 4;
314
315	if (restore_altstack(&frame->uc.uc_stack))
316		goto badframe;
317
318	return (int) ret;
319
320badframe:
321	force_sig(SIGSEGV, current);
322	return 0;
323}
324
325/*
326 * Set up a signal frame.
327 */
328static int
329setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
330		 unsigned long mask)
331{
332	int err = 0;
333
334	/* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
335	err |= setup_sigcontext_fpu(regs, sc);
336
337#define COPY(x)		err |= __put_user(regs->x, &sc->sc_##x)
338
339	COPY(regs[0]);	COPY(regs[1]);	COPY(regs[2]);	COPY(regs[3]);
340	COPY(regs[4]);	COPY(regs[5]);	COPY(regs[6]);	COPY(regs[7]);
341	COPY(regs[8]);	COPY(regs[9]);	COPY(regs[10]);	COPY(regs[11]);
342	COPY(regs[12]);	COPY(regs[13]);	COPY(regs[14]);	COPY(regs[15]);
343	COPY(regs[16]);	COPY(regs[17]);	COPY(regs[18]);	COPY(regs[19]);
344	COPY(regs[20]);	COPY(regs[21]);	COPY(regs[22]);	COPY(regs[23]);
345	COPY(regs[24]);	COPY(regs[25]);	COPY(regs[26]);	COPY(regs[27]);
346	COPY(regs[28]);	COPY(regs[29]);	COPY(regs[30]);	COPY(regs[31]);
347	COPY(regs[32]);	COPY(regs[33]);	COPY(regs[34]);	COPY(regs[35]);
348	COPY(regs[36]);	COPY(regs[37]);	COPY(regs[38]);	COPY(regs[39]);
349	COPY(regs[40]);	COPY(regs[41]);	COPY(regs[42]);	COPY(regs[43]);
350	COPY(regs[44]);	COPY(regs[45]);	COPY(regs[46]);	COPY(regs[47]);
351	COPY(regs[48]);	COPY(regs[49]);	COPY(regs[50]);	COPY(regs[51]);
352	COPY(regs[52]);	COPY(regs[53]);	COPY(regs[54]);	COPY(regs[55]);
353	COPY(regs[56]);	COPY(regs[57]);	COPY(regs[58]);	COPY(regs[59]);
354	COPY(regs[60]);	COPY(regs[61]);	COPY(regs[62]);
355	COPY(tregs[0]);	COPY(tregs[1]);	COPY(tregs[2]);	COPY(tregs[3]);
356	COPY(tregs[4]);	COPY(tregs[5]);	COPY(tregs[6]);	COPY(tregs[7]);
357	COPY(sr);	COPY(pc);
358
359#undef COPY
360
361	err |= __put_user(mask, &sc->oldmask);
362
363	return err;
364}
365
366/*
367 * Determine which stack to use..
368 */
369static inline void __user *
370get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
371{
372	if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
373		sp = current->sas_ss_sp + current->sas_ss_size;
374
375	return (void __user *)((sp - frame_size) & -8ul);
376}
377
378void sa_default_restorer(void);		/* See comments below */
379void sa_default_rt_restorer(void);	/* See comments below */
380
381static int setup_frame(int sig, struct k_sigaction *ka,
382		       sigset_t *set, struct pt_regs *regs)
383{
384	struct sigframe __user *frame;
385	int err = 0;
386	int signal;
387
388	frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
389
390	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
391		goto give_sigsegv;
392
393	signal = current_thread_info()->exec_domain
394		&& current_thread_info()->exec_domain->signal_invmap
395		&& sig < 32
396		? current_thread_info()->exec_domain->signal_invmap[sig]
397		: sig;
398
399	err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
400
401	/* Give up earlier as i386, in case */
402	if (err)
403		goto give_sigsegv;
404
405	if (_NSIG_WORDS > 1) {
406		err |= __copy_to_user(frame->extramask, &set->sig[1],
407				      sizeof(frame->extramask)); }
408
409	/* Give up earlier as i386, in case */
410	if (err)
411		goto give_sigsegv;
412
413	/* Set up to return from userspace.  If provided, use a stub
414	   already in userspace.  */
415	if (ka->sa.sa_flags & SA_RESTORER) {
416		/*
417		 * On SH5 all edited pointers are subject to NEFF
418		 */
419		DEREF_REG_PR = neff_sign_extend((unsigned long)
420			ka->sa.sa_restorer | 0x1);
421	} else {
422		/*
423		 * Different approach on SH5.
424	         * . Endianness independent asm code gets placed in entry.S .
425		 *   This is limited to four ASM instructions corresponding
426		 *   to two long longs in size.
427		 * . err checking is done on the else branch only
428		 * . flush_icache_range() is called upon __put_user() only
429		 * . all edited pointers are subject to NEFF
430		 * . being code, linker turns ShMedia bit on, always
431		 *   dereference index -1.
432		 */
433		DEREF_REG_PR = neff_sign_extend((unsigned long)
434			frame->retcode | 0x01);
435
436		if (__copy_to_user(frame->retcode,
437			(void *)((unsigned long)sa_default_restorer & (~1)), 16) != 0)
438			goto give_sigsegv;
439
440		/* Cohere the trampoline with the I-cache. */
441		flush_cache_sigtramp(DEREF_REG_PR-1);
442	}
443
444	/*
445	 * Set up registers for signal handler.
446	 * All edited pointers are subject to NEFF.
447	 */
448	regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
449	regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
450
451        /* FIXME:
452           The glibc profiling support for SH-5 needs to be passed a sigcontext
453           so it can retrieve the PC.  At some point during 2003 the glibc
454           support was changed to receive the sigcontext through the 2nd
455           argument, but there are still versions of libc.so in use that use
456           the 3rd argument.  Until libc.so is stabilised, pass the sigcontext
457           through both 2nd and 3rd arguments.
458        */
459
460	regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
461	regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
462
463	regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
464
465	set_fs(USER_DS);
466
467	/* Broken %016Lx */
468	pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
469		 signal, current->comm, current->pid, frame,
470		 regs->pc >> 32, regs->pc & 0xffffffff,
471		 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
472
473	return 0;
474
475give_sigsegv:
476	force_sigsegv(sig, current);
477	return -EFAULT;
478}
479
480static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
481			  sigset_t *set, struct pt_regs *regs)
482{
483	struct rt_sigframe __user *frame;
484	int err = 0;
485	int signal;
486
487	frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
488
489	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
490		goto give_sigsegv;
491
492	signal = current_thread_info()->exec_domain
493		&& current_thread_info()->exec_domain->signal_invmap
494		&& sig < 32
495		? current_thread_info()->exec_domain->signal_invmap[sig]
496		: sig;
497
498	err |= __put_user(&frame->info, &frame->pinfo);
499	err |= __put_user(&frame->uc, &frame->puc);
500	err |= copy_siginfo_to_user(&frame->info, info);
501
502	/* Give up earlier as i386, in case */
503	if (err)
504		goto give_sigsegv;
505
506	/* Create the ucontext.  */
507	err |= __put_user(0, &frame->uc.uc_flags);
508	err |= __put_user(0, &frame->uc.uc_link);
509	err |= __save_altstack(&frame->uc.uc_stack, regs->regs[REG_SP]);
510	err |= setup_sigcontext(&frame->uc.uc_mcontext,
511			        regs, set->sig[0]);
512	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
513
514	/* Give up earlier as i386, in case */
515	if (err)
516		goto give_sigsegv;
517
518	/* Set up to return from userspace.  If provided, use a stub
519	   already in userspace.  */
520	if (ka->sa.sa_flags & SA_RESTORER) {
521		/*
522		 * On SH5 all edited pointers are subject to NEFF
523		 */
524		DEREF_REG_PR = neff_sign_extend((unsigned long)
525			ka->sa.sa_restorer | 0x1);
526	} else {
527		/*
528		 * Different approach on SH5.
529	         * . Endianness independent asm code gets placed in entry.S .
530		 *   This is limited to four ASM instructions corresponding
531		 *   to two long longs in size.
532		 * . err checking is done on the else branch only
533		 * . flush_icache_range() is called upon __put_user() only
534		 * . all edited pointers are subject to NEFF
535		 * . being code, linker turns ShMedia bit on, always
536		 *   dereference index -1.
537		 */
538		DEREF_REG_PR = neff_sign_extend((unsigned long)
539			frame->retcode | 0x01);
540
541		if (__copy_to_user(frame->retcode,
542			(void *)((unsigned long)sa_default_rt_restorer & (~1)), 16) != 0)
543			goto give_sigsegv;
544
545		/* Cohere the trampoline with the I-cache. */
546		flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
547	}
548
549	/*
550	 * Set up registers for signal handler.
551	 * All edited pointers are subject to NEFF.
552	 */
553	regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
554	regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
555	regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
556	regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
557	regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
558
559	set_fs(USER_DS);
560
561	pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
562		 signal, current->comm, current->pid, frame,
563		 regs->pc >> 32, regs->pc & 0xffffffff,
564		 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
565
566	return 0;
567
568give_sigsegv:
569	force_sigsegv(sig, current);
570	return -EFAULT;
571}
572
573/*
574 * OK, we're invoking a handler
575 */
576static void
577handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
578		struct pt_regs * regs)
579{
580	sigset_t *oldset = sigmask_to_save();
581	int ret;
582
583	/* Set up the stack frame */
584	if (ka->sa.sa_flags & SA_SIGINFO)
585		ret = setup_rt_frame(sig, ka, info, oldset, regs);
586	else
587		ret = setup_frame(sig, ka, oldset, regs);
588
589	if (ret)
590		return;
591
592	signal_delivered(sig, info, ka, regs,
593			test_thread_flag(TIF_SINGLESTEP));
594}
595
596asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
597{
598	if (thread_info_flags & _TIF_SIGPENDING)
599		do_signal(regs);
600
601	if (thread_info_flags & _TIF_NOTIFY_RESUME) {
602		clear_thread_flag(TIF_NOTIFY_RESUME);
603		tracehook_notify_resume(regs);
604	}
605}