xref: /openbmc/linux/arch/parisc/kernel/signal.c (revision 827634ad)
1 /*
2  *  linux/arch/parisc/kernel/signal.c: Architecture-specific signal
3  *  handling support.
4  *
5  *  Copyright (C) 2000 David Huggins-Daines <dhd@debian.org>
6  *  Copyright (C) 2000 Linuxcare, Inc.
7  *
8  *  Based on the ia64, i386, and alpha versions.
9  *
10  *  Like the IA-64, we are a recent enough port (we are *starting*
11  *  with glibc2.2) that we do not need to support the old non-realtime
12  *  Linux signals.  Therefore we don't.
13  */
14 
15 #include <linux/sched.h>
16 #include <linux/mm.h>
17 #include <linux/smp.h>
18 #include <linux/kernel.h>
19 #include <linux/signal.h>
20 #include <linux/errno.h>
21 #include <linux/wait.h>
22 #include <linux/ptrace.h>
23 #include <linux/tracehook.h>
24 #include <linux/unistd.h>
25 #include <linux/stddef.h>
26 #include <linux/compat.h>
27 #include <linux/elf.h>
28 #include <asm/ucontext.h>
29 #include <asm/rt_sigframe.h>
30 #include <asm/uaccess.h>
31 #include <asm/pgalloc.h>
32 #include <asm/cacheflush.h>
33 #include <asm/asm-offsets.h>
34 
35 #ifdef CONFIG_COMPAT
36 #include "signal32.h"
37 #endif
38 
39 #define DEBUG_SIG 0
40 #define DEBUG_SIG_LEVEL 2
41 
42 #if DEBUG_SIG
43 #define DBG(LEVEL, ...) \
44         ((DEBUG_SIG_LEVEL >= LEVEL) \
45 	? printk(__VA_ARGS__) : (void) 0)
46 #else
47 #define DBG(LEVEL, ...)
48 #endif
49 
50 /* gcc will complain if a pointer is cast to an integer of different
51  * size.  If you really need to do this (and we do for an ELF32 user
52  * application in an ELF64 kernel) then you have to do a cast to an
53  * integer of the same size first.  The A() macro accomplishes
54  * this. */
55 #define A(__x)	((unsigned long)(__x))
56 
57 /*
58  * Do a signal return - restore sigcontext.
59  */
60 
61 /* Trampoline for calling rt_sigreturn() */
62 #define INSN_LDI_R25_0	 0x34190000 /* ldi  0,%r25 (in_syscall=0) */
63 #define INSN_LDI_R25_1	 0x34190002 /* ldi  1,%r25 (in_syscall=1) */
64 #define INSN_LDI_R20	 0x3414015a /* ldi  __NR_rt_sigreturn,%r20 */
65 #define INSN_BLE_SR2_R0  0xe4008200 /* be,l 0x100(%sr2,%r0),%sr0,%r31 */
66 #define INSN_NOP	 0x08000240 /* nop */
67 /* For debugging */
68 #define INSN_DIE_HORRIBLY 0x68000ccc /* stw %r0,0x666(%sr0,%r0) */
69 
70 static long
71 restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
72 {
73 	long err = 0;
74 
75 	err |= __copy_from_user(regs->gr, sc->sc_gr, sizeof(regs->gr));
76 	err |= __copy_from_user(regs->fr, sc->sc_fr, sizeof(regs->fr));
77 	err |= __copy_from_user(regs->iaoq, sc->sc_iaoq, sizeof(regs->iaoq));
78 	err |= __copy_from_user(regs->iasq, sc->sc_iasq, sizeof(regs->iasq));
79 	err |= __get_user(regs->sar, &sc->sc_sar);
80 	DBG(2,"restore_sigcontext: iaoq is %#lx / %#lx\n",
81 			regs->iaoq[0],regs->iaoq[1]);
82 	DBG(2,"restore_sigcontext: r28 is %ld\n", regs->gr[28]);
83 	return err;
84 }
85 
86 void
87 sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
88 {
89 	struct rt_sigframe __user *frame;
90 	sigset_t set;
91 	unsigned long usp = (regs->gr[30] & ~(0x01UL));
92 	unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
93 #ifdef CONFIG_64BIT
94 	compat_sigset_t compat_set;
95 	struct compat_rt_sigframe __user * compat_frame;
96 
97 	if (is_compat_task())
98 		sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
99 #endif
100 
101 	current->restart_block.fn = do_no_restart_syscall;
102 
103 	/* Unwind the user stack to get the rt_sigframe structure. */
104 	frame = (struct rt_sigframe __user *)
105 		(usp - sigframe_size);
106 	DBG(2,"sys_rt_sigreturn: frame is %p\n", frame);
107 
108 	regs->orig_r28 = 1; /* no restarts for sigreturn */
109 
110 #ifdef CONFIG_64BIT
111 	compat_frame = (struct compat_rt_sigframe __user *)frame;
112 
113 	if (is_compat_task()) {
114 		DBG(2,"sys_rt_sigreturn: ELF32 process.\n");
115 		if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set)))
116 			goto give_sigsegv;
117 		sigset_32to64(&set,&compat_set);
118 	} else
119 #endif
120 	{
121 		if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
122 			goto give_sigsegv;
123 	}
124 
125 	set_current_blocked(&set);
126 
127 	/* Good thing we saved the old gr[30], eh? */
128 #ifdef CONFIG_64BIT
129 	if (is_compat_task()) {
130 		DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n",
131 				&compat_frame->uc.uc_mcontext);
132 // FIXME: Load upper half from register file
133 		if (restore_sigcontext32(&compat_frame->uc.uc_mcontext,
134 					&compat_frame->regs, regs))
135 			goto give_sigsegv;
136 		DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
137 				usp, &compat_frame->uc.uc_stack);
138 		if (compat_restore_altstack(&compat_frame->uc.uc_stack))
139 			goto give_sigsegv;
140 	} else
141 #endif
142 	{
143 		DBG(1,"sys_rt_sigreturn: frame->uc.uc_mcontext 0x%p\n",
144 				&frame->uc.uc_mcontext);
145 		if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
146 			goto give_sigsegv;
147 		DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
148 				usp, &frame->uc.uc_stack);
149 		if (restore_altstack(&frame->uc.uc_stack))
150 			goto give_sigsegv;
151 	}
152 
153 
154 
155 	/* If we are on the syscall path IAOQ will not be restored, and
156 	 * if we are on the interrupt path we must not corrupt gr31.
157 	 */
158 	if (in_syscall)
159 		regs->gr[31] = regs->iaoq[0];
160 #if DEBUG_SIG
161 	DBG(1,"sys_rt_sigreturn: returning to %#lx, DUMPING REGS:\n", regs->iaoq[0]);
162 	show_regs(regs);
163 #endif
164 	return;
165 
166 give_sigsegv:
167 	DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
168 	force_sig(SIGSEGV, current);
169 	return;
170 }
171 
172 /*
173  * Set up a signal frame.
174  */
175 
176 static inline void __user *
177 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
178 {
179 	/*FIXME: ELF32 vs. ELF64 has different frame_size, but since we
180 	  don't use the parameter it doesn't matter */
181 
182 	DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",
183 			(unsigned long)ka, sp, frame_size);
184 
185 	/* Align alternate stack and reserve 64 bytes for the signal
186 	   handler's frame marker.  */
187 	if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
188 		sp = (current->sas_ss_sp + 0x7f) & ~0x3f; /* Stacks grow up! */
189 
190 	DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);
191 	return (void __user *) sp; /* Stacks grow up.  Fun. */
192 }
193 
194 static long
195 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_syscall)
196 
197 {
198 	unsigned long flags = 0;
199 	long err = 0;
200 
201 	if (on_sig_stack((unsigned long) sc))
202 		flags |= PARISC_SC_FLAG_ONSTACK;
203 	if (in_syscall) {
204 		flags |= PARISC_SC_FLAG_IN_SYSCALL;
205 		/* regs->iaoq is undefined in the syscall return path */
206 		err |= __put_user(regs->gr[31], &sc->sc_iaoq[0]);
207 		err |= __put_user(regs->gr[31]+4, &sc->sc_iaoq[1]);
208 		err |= __put_user(regs->sr[3], &sc->sc_iasq[0]);
209 		err |= __put_user(regs->sr[3], &sc->sc_iasq[1]);
210 		DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (in syscall)\n",
211 			regs->gr[31], regs->gr[31]+4);
212 	} else {
213 		err |= __copy_to_user(sc->sc_iaoq, regs->iaoq, sizeof(regs->iaoq));
214 		err |= __copy_to_user(sc->sc_iasq, regs->iasq, sizeof(regs->iasq));
215 		DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (not in syscall)\n",
216 			regs->iaoq[0], regs->iaoq[1]);
217 	}
218 
219 	err |= __put_user(flags, &sc->sc_flags);
220 	err |= __copy_to_user(sc->sc_gr, regs->gr, sizeof(regs->gr));
221 	err |= __copy_to_user(sc->sc_fr, regs->fr, sizeof(regs->fr));
222 	err |= __put_user(regs->sar, &sc->sc_sar);
223 	DBG(1,"setup_sigcontext: r28 is %ld\n", regs->gr[28]);
224 
225 	return err;
226 }
227 
228 static long
229 setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
230 	       int in_syscall)
231 {
232 	struct rt_sigframe __user *frame;
233 	unsigned long rp, usp;
234 	unsigned long haddr, sigframe_size;
235 	int err = 0;
236 #ifdef CONFIG_64BIT
237 	struct compat_rt_sigframe __user * compat_frame;
238 	compat_sigset_t compat_set;
239 #endif
240 
241 	usp = (regs->gr[30] & ~(0x01UL));
242 	/*FIXME: frame_size parameter is unused, remove it. */
243 	frame = get_sigframe(&ksig->ka, usp, sizeof(*frame));
244 
245 	DBG(1,"SETUP_RT_FRAME: START\n");
246 	DBG(1,"setup_rt_frame: frame %p info %p\n", frame, ksig->info);
247 
248 
249 #ifdef CONFIG_64BIT
250 
251 	compat_frame = (struct compat_rt_sigframe __user *)frame;
252 
253 	if (is_compat_task()) {
254 		DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
255 		err |= copy_siginfo_to_user32(&compat_frame->info, &ksig->info);
256 		err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
257 		DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
258 		DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
259 		err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext,
260 					&compat_frame->regs, regs, in_syscall);
261 		sigset_64to32(&compat_set,set);
262 		err |= __copy_to_user(&compat_frame->uc.uc_sigmask, &compat_set, sizeof(compat_set));
263 	} else
264 #endif
265 	{
266 		DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
267 		err |= copy_siginfo_to_user(&frame->info, &ksig->info);
268 		err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
269 		DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
270 		DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
271 		err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
272 		/* FIXME: Should probably be converted as well for the compat case */
273 		err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
274 	}
275 
276 	if (err)
277 		return -EFAULT;
278 
279 	/* Set up to return from userspace.  If provided, use a stub
280 	   already in userspace. The first words of tramp are used to
281 	   save the previous sigrestartblock trampoline that might be
282 	   on the stack. We start the sigreturn trampoline at
283 	   SIGRESTARTBLOCK_TRAMP+X. */
284 	err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
285 			&frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
286 	err |= __put_user(INSN_LDI_R20,
287 			&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
288 	err |= __put_user(INSN_BLE_SR2_R0,
289 			&frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
290 	err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
291 
292 #if DEBUG_SIG
293 	/* Assert that we're flushing in the correct space... */
294 	{
295 		unsigned long sid;
296 		asm ("mfsp %%sr3,%0" : "=r" (sid));
297 		DBG(1,"setup_rt_frame: Flushing 64 bytes at space %#x offset %p\n",
298 		       sid, frame->tramp);
299 	}
300 #endif
301 
302 	flush_user_dcache_range((unsigned long) &frame->tramp[0],
303 			   (unsigned long) &frame->tramp[TRAMP_SIZE]);
304 	flush_user_icache_range((unsigned long) &frame->tramp[0],
305 			   (unsigned long) &frame->tramp[TRAMP_SIZE]);
306 
307 	/* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
308 	 * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
309 	 * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
310 	 */
311 	rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
312 
313 	if (err)
314 		return -EFAULT;
315 
316 	haddr = A(ksig->ka.sa.sa_handler);
317 	/* The sa_handler may be a pointer to a function descriptor */
318 #ifdef CONFIG_64BIT
319 	if (is_compat_task()) {
320 #endif
321 		if (haddr & PA_PLABEL_FDESC) {
322 			Elf32_Fdesc fdesc;
323 			Elf32_Fdesc __user *ufdesc = (Elf32_Fdesc __user *)A(haddr & ~3);
324 
325 			err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
326 
327 			if (err)
328 				return -EFAULT;
329 
330 			haddr = fdesc.addr;
331 			regs->gr[19] = fdesc.gp;
332 		}
333 #ifdef CONFIG_64BIT
334 	} else {
335 		Elf64_Fdesc fdesc;
336 		Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3);
337 
338 		err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
339 
340 		if (err)
341 			return -EFAULT;
342 
343 		haddr = fdesc.addr;
344 		regs->gr[19] = fdesc.gp;
345 		DBG(1,"setup_rt_frame: 64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n",
346 		     haddr, regs->gr[19], in_syscall);
347 	}
348 #endif
349 
350 	/* The syscall return path will create IAOQ values from r31.
351 	 */
352 	sigframe_size = PARISC_RT_SIGFRAME_SIZE;
353 #ifdef CONFIG_64BIT
354 	if (is_compat_task())
355 		sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
356 #endif
357 	if (in_syscall) {
358 		regs->gr[31] = haddr;
359 #ifdef CONFIG_64BIT
360 		if (!test_thread_flag(TIF_32BIT))
361 			sigframe_size |= 1;
362 #endif
363 	} else {
364 		unsigned long psw = USER_PSW;
365 #ifdef CONFIG_64BIT
366 		if (!test_thread_flag(TIF_32BIT))
367 			psw |= PSW_W;
368 #endif
369 
370 		/* If we are singlestepping, arrange a trap to be delivered
371 		   when we return to userspace. Note the semantics -- we
372 		   should trap before the first insn in the handler is
373 		   executed. Ref:
374 			http://sources.redhat.com/ml/gdb/2004-11/msg00245.html
375 		 */
376 		if (pa_psw(current)->r) {
377 			pa_psw(current)->r = 0;
378 			psw |= PSW_R;
379 			mtctl(-1, 0);
380 		}
381 
382 		regs->gr[0] = psw;
383 		regs->iaoq[0] = haddr | 3;
384 		regs->iaoq[1] = regs->iaoq[0] + 4;
385 	}
386 
387 	regs->gr[2]  = rp;                /* userland return pointer */
388 	regs->gr[26] = ksig->sig;               /* signal number */
389 
390 #ifdef CONFIG_64BIT
391 	if (is_compat_task()) {
392 		regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */
393 		regs->gr[24] = A(&compat_frame->uc);   /* ucontext pointer */
394 	} else
395 #endif
396 	{
397 		regs->gr[25] = A(&frame->info); /* siginfo pointer */
398 		regs->gr[24] = A(&frame->uc);   /* ucontext pointer */
399 	}
400 
401 	DBG(1,"setup_rt_frame: making sigreturn frame: %#lx + %#lx = %#lx\n",
402 	       regs->gr[30], sigframe_size,
403 	       regs->gr[30] + sigframe_size);
404 	/* Raise the user stack pointer to make a proper call frame. */
405 	regs->gr[30] = (A(frame) + sigframe_size);
406 
407 
408 	DBG(1,"setup_rt_frame: sig deliver (%s,%d) frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n",
409 	       current->comm, current->pid, frame, regs->gr[30],
410 	       regs->iaoq[0], regs->iaoq[1], rp);
411 
412 	return 0;
413 }
414 
415 /*
416  * OK, we're invoking a handler.
417  */
418 
419 static void
420 handle_signal(struct ksignal *ksig, struct pt_regs *regs, int in_syscall)
421 {
422 	int ret;
423 	sigset_t *oldset = sigmask_to_save();
424 
425 	DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n",
426 	       ksig->sig, ksig->ka, ksig->info, oldset, regs);
427 
428 	/* Set up the stack frame */
429 	ret = setup_rt_frame(ksig, oldset, regs, in_syscall);
430 
431 	signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP) ||
432 			  test_thread_flag(TIF_BLOCKSTEP));
433 
434 	DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
435 		regs->gr[28]);
436 }
437 
438 static inline void
439 syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
440 {
441 	if (regs->orig_r28)
442 		return;
443 	regs->orig_r28 = 1; /* no more restarts */
444 	/* Check the return code */
445 	switch (regs->gr[28]) {
446 	case -ERESTART_RESTARTBLOCK:
447 	case -ERESTARTNOHAND:
448 		DBG(1,"ERESTARTNOHAND: returning -EINTR\n");
449 		regs->gr[28] = -EINTR;
450 		break;
451 
452 	case -ERESTARTSYS:
453 		if (!(ka->sa.sa_flags & SA_RESTART)) {
454 			DBG(1,"ERESTARTSYS: putting -EINTR\n");
455 			regs->gr[28] = -EINTR;
456 			break;
457 		}
458 		/* fallthrough */
459 	case -ERESTARTNOINTR:
460 		/* A syscall is just a branch, so all
461 		 * we have to do is fiddle the return pointer.
462 		 */
463 		regs->gr[31] -= 8; /* delayed branching */
464 		break;
465 	}
466 }
467 
468 static inline void
469 insert_restart_trampoline(struct pt_regs *regs)
470 {
471 	if (regs->orig_r28)
472 		return;
473 	regs->orig_r28 = 1; /* no more restarts */
474 	switch(regs->gr[28]) {
475 	case -ERESTART_RESTARTBLOCK: {
476 		/* Restart the system call - no handlers present */
477 		unsigned int *usp = (unsigned int *)regs->gr[30];
478 		unsigned long start = (unsigned long) &usp[2];
479 		unsigned long end  = (unsigned long) &usp[5];
480 		long err = 0;
481 
482 		/* Setup a trampoline to restart the syscall
483 		 * with __NR_restart_syscall
484 		 *
485 		 *  0: <return address (orig r31)>
486 		 *  4: <2nd half for 64-bit>
487 		 *  8: ldw 0(%sp), %r31
488 		 * 12: be 0x100(%sr2, %r0)
489 		 * 16: ldi __NR_restart_syscall, %r20
490 		 */
491 #ifdef CONFIG_64BIT
492 		err |= put_user(regs->gr[31] >> 32, &usp[0]);
493 		err |= put_user(regs->gr[31] & 0xffffffff, &usp[1]);
494 		err |= put_user(0x0fc010df, &usp[2]);
495 #else
496 		err |= put_user(regs->gr[31], &usp[0]);
497 		err |= put_user(0x0fc0109f, &usp[2]);
498 #endif
499 		err |= put_user(0xe0008200, &usp[3]);
500 		err |= put_user(0x34140000, &usp[4]);
501 
502 		WARN_ON(err);
503 
504 		/* flush data/instruction cache for new insns */
505 		flush_user_dcache_range(start, end);
506 		flush_user_icache_range(start, end);
507 
508 		regs->gr[31] = regs->gr[30] + 8;
509 		return;
510 	}
511 	case -ERESTARTNOHAND:
512 	case -ERESTARTSYS:
513 	case -ERESTARTNOINTR: {
514 		/* Hooray for delayed branching.  We don't
515 		 * have to restore %r20 (the system call
516 		 * number) because it gets loaded in the delay
517 		 * slot of the branch external instruction.
518 		 */
519 		regs->gr[31] -= 8;
520 		return;
521 	}
522 	default:
523 		break;
524 	}
525 }
526 
527 /*
528  * Note that 'init' is a special process: it doesn't get signals it doesn't
529  * want to handle. Thus you cannot kill init even with a SIGKILL even by
530  * mistake.
531  *
532  * We need to be able to restore the syscall arguments (r21-r26) to
533  * restart syscalls.  Thus, the syscall path should save them in the
534  * pt_regs structure (it's okay to do so since they are caller-save
535  * registers).  As noted below, the syscall number gets restored for
536  * us due to the magic of delayed branching.
537  */
538 asmlinkage void
539 do_signal(struct pt_regs *regs, long in_syscall)
540 {
541 	struct ksignal ksig;
542 
543 	DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n",
544 	       regs, regs->sr[7], in_syscall);
545 
546 	if (get_signal(&ksig)) {
547 		DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]);
548 		/* Restart a system call if necessary. */
549 		if (in_syscall)
550 			syscall_restart(regs, &ksig.ka);
551 
552 		handle_signal(&ksig, regs, in_syscall);
553 		return;
554 	}
555 
556 	/* Did we come from a system call? */
557 	if (in_syscall)
558 		insert_restart_trampoline(regs);
559 
560 	DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n",
561 		regs->gr[28]);
562 
563 	restore_saved_sigmask();
564 }
565 
566 void do_notify_resume(struct pt_regs *regs, long in_syscall)
567 {
568 	if (test_thread_flag(TIF_SIGPENDING))
569 		do_signal(regs, in_syscall);
570 
571 	if (test_thread_flag(TIF_NOTIFY_RESUME)) {
572 		clear_thread_flag(TIF_NOTIFY_RESUME);
573 		tracehook_notify_resume(regs);
574 	}
575 }
576