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