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