signal.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * PA-RISC architecture-specific signal handling support.
  4. *
  5. * Copyright (C) 2000 David Huggins-Daines <[email protected]>
  6. * Copyright (C) 2000 Linuxcare, Inc.
  7. * Copyright (C) 2000-2022 Helge Deller <[email protected]>
  8. * Copyright (C) 2022 John David Anglin <[email protected]>
  9. *
  10. * Based on the ia64, i386, and alpha versions.
  11. */
  12. #include <linux/sched.h>
  13. #include <linux/sched/debug.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/ptrace.h>
  21. #include <linux/resume_user_mode.h>
  22. #include <linux/unistd.h>
  23. #include <linux/stddef.h>
  24. #include <linux/compat.h>
  25. #include <linux/elf.h>
  26. #include <asm/ucontext.h>
  27. #include <asm/rt_sigframe.h>
  28. #include <linux/uaccess.h>
  29. #include <asm/cacheflush.h>
  30. #include <asm/asm-offsets.h>
  31. #include <asm/vdso.h>
  32. #ifdef CONFIG_COMPAT
  33. #include "signal32.h"
  34. #endif
  35. #define DEBUG_SIG 0
  36. #define DEBUG_SIG_LEVEL 2
  37. #if DEBUG_SIG
  38. #define DBG(LEVEL, ...) \
  39. ((DEBUG_SIG_LEVEL >= LEVEL) \
  40. ? printk(__VA_ARGS__) : (void) 0)
  41. #else
  42. #define DBG(LEVEL, ...)
  43. #endif
  44. /* gcc will complain if a pointer is cast to an integer of different
  45. * size. If you really need to do this (and we do for an ELF32 user
  46. * application in an ELF64 kernel) then you have to do a cast to an
  47. * integer of the same size first. The A() macro accomplishes
  48. * this. */
  49. #define A(__x) ((unsigned long)(__x))
  50. /*
  51. * Do a signal return - restore sigcontext.
  52. */
  53. static long
  54. restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
  55. {
  56. long err = 0;
  57. err |= __copy_from_user(regs->gr, sc->sc_gr, sizeof(regs->gr));
  58. err |= __copy_from_user(regs->fr, sc->sc_fr, sizeof(regs->fr));
  59. err |= __copy_from_user(regs->iaoq, sc->sc_iaoq, sizeof(regs->iaoq));
  60. err |= __copy_from_user(regs->iasq, sc->sc_iasq, sizeof(regs->iasq));
  61. err |= __get_user(regs->sar, &sc->sc_sar);
  62. DBG(2, "%s: iaoq is %#lx / %#lx\n",
  63. __func__, regs->iaoq[0], regs->iaoq[1]);
  64. DBG(2, "%s: r28 is %ld\n", __func__, regs->gr[28]);
  65. return err;
  66. }
  67. void
  68. sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
  69. {
  70. struct rt_sigframe __user *frame;
  71. sigset_t set;
  72. unsigned long usp = (regs->gr[30] & ~(0x01UL));
  73. unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
  74. #ifdef CONFIG_64BIT
  75. struct compat_rt_sigframe __user * compat_frame;
  76. if (is_compat_task())
  77. sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
  78. #endif
  79. current->restart_block.fn = do_no_restart_syscall;
  80. /* Unwind the user stack to get the rt_sigframe structure. */
  81. frame = (struct rt_sigframe __user *)
  82. (usp - sigframe_size);
  83. DBG(2, "%s: frame is %p pid %d\n", __func__, frame, task_pid_nr(current));
  84. regs->orig_r28 = 1; /* no restarts for sigreturn */
  85. #ifdef CONFIG_64BIT
  86. compat_frame = (struct compat_rt_sigframe __user *)frame;
  87. if (is_compat_task()) {
  88. if (get_compat_sigset(&set, &compat_frame->uc.uc_sigmask))
  89. goto give_sigsegv;
  90. } else
  91. #endif
  92. {
  93. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  94. goto give_sigsegv;
  95. }
  96. set_current_blocked(&set);
  97. /* Good thing we saved the old gr[30], eh? */
  98. #ifdef CONFIG_64BIT
  99. if (is_compat_task()) {
  100. DBG(1, "%s: compat_frame->uc.uc_mcontext 0x%p\n",
  101. __func__, &compat_frame->uc.uc_mcontext);
  102. // FIXME: Load upper half from register file
  103. if (restore_sigcontext32(&compat_frame->uc.uc_mcontext,
  104. &compat_frame->regs, regs))
  105. goto give_sigsegv;
  106. DBG(1, "%s: usp %#08lx stack 0x%p\n",
  107. __func__, usp, &compat_frame->uc.uc_stack);
  108. if (compat_restore_altstack(&compat_frame->uc.uc_stack))
  109. goto give_sigsegv;
  110. } else
  111. #endif
  112. {
  113. DBG(1, "%s: frame->uc.uc_mcontext 0x%p\n",
  114. __func__, &frame->uc.uc_mcontext);
  115. if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
  116. goto give_sigsegv;
  117. DBG(1, "%s: usp %#08lx stack 0x%p\n",
  118. __func__, usp, &frame->uc.uc_stack);
  119. if (restore_altstack(&frame->uc.uc_stack))
  120. goto give_sigsegv;
  121. }
  122. /* If we are on the syscall path IAOQ will not be restored, and
  123. * if we are on the interrupt path we must not corrupt gr31.
  124. */
  125. if (in_syscall)
  126. regs->gr[31] = regs->iaoq[0];
  127. return;
  128. give_sigsegv:
  129. DBG(1, "%s: Sending SIGSEGV\n", __func__);
  130. force_sig(SIGSEGV);
  131. return;
  132. }
  133. /*
  134. * Set up a signal frame.
  135. */
  136. static inline void __user *
  137. get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
  138. {
  139. /*FIXME: ELF32 vs. ELF64 has different frame_size, but since we
  140. don't use the parameter it doesn't matter */
  141. DBG(1, "%s: ka = %#lx, sp = %#lx, frame_size = %zu\n",
  142. __func__, (unsigned long)ka, sp, frame_size);
  143. /* Align alternate stack and reserve 64 bytes for the signal
  144. handler's frame marker. */
  145. if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
  146. sp = (current->sas_ss_sp + 0x7f) & ~0x3f; /* Stacks grow up! */
  147. DBG(1, "%s: Returning sp = %#lx\n", __func__, (unsigned long)sp);
  148. return (void __user *) sp; /* Stacks grow up. Fun. */
  149. }
  150. static long
  151. setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_syscall)
  152. {
  153. unsigned long flags = 0;
  154. long err = 0;
  155. if (on_sig_stack((unsigned long) sc))
  156. flags |= PARISC_SC_FLAG_ONSTACK;
  157. if (in_syscall) {
  158. flags |= PARISC_SC_FLAG_IN_SYSCALL;
  159. /* regs->iaoq is undefined in the syscall return path */
  160. err |= __put_user(regs->gr[31], &sc->sc_iaoq[0]);
  161. err |= __put_user(regs->gr[31]+4, &sc->sc_iaoq[1]);
  162. err |= __put_user(regs->sr[3], &sc->sc_iasq[0]);
  163. err |= __put_user(regs->sr[3], &sc->sc_iasq[1]);
  164. DBG(1, "%s: iaoq %#lx / %#lx (in syscall)\n",
  165. __func__, regs->gr[31], regs->gr[31]+4);
  166. } else {
  167. err |= __copy_to_user(sc->sc_iaoq, regs->iaoq, sizeof(regs->iaoq));
  168. err |= __copy_to_user(sc->sc_iasq, regs->iasq, sizeof(regs->iasq));
  169. DBG(1, "%s: iaoq %#lx / %#lx (not in syscall)\n",
  170. __func__, regs->iaoq[0], regs->iaoq[1]);
  171. }
  172. err |= __put_user(flags, &sc->sc_flags);
  173. err |= __copy_to_user(sc->sc_gr, regs->gr, sizeof(regs->gr));
  174. err |= __copy_to_user(sc->sc_fr, regs->fr, sizeof(regs->fr));
  175. err |= __put_user(regs->sar, &sc->sc_sar);
  176. DBG(1, "%s: r28 is %ld\n", __func__, regs->gr[28]);
  177. return err;
  178. }
  179. static long
  180. setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
  181. int in_syscall)
  182. {
  183. struct rt_sigframe __user *frame;
  184. unsigned long rp, usp;
  185. unsigned long haddr, sigframe_size;
  186. unsigned long start;
  187. int err = 0;
  188. #ifdef CONFIG_64BIT
  189. struct compat_rt_sigframe __user * compat_frame;
  190. #endif
  191. usp = (regs->gr[30] & ~(0x01UL));
  192. sigframe_size = PARISC_RT_SIGFRAME_SIZE;
  193. #ifdef CONFIG_64BIT
  194. if (is_compat_task()) {
  195. /* The gcc alloca implementation leaves garbage in the upper 32 bits of sp */
  196. usp = (compat_uint_t)usp;
  197. sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
  198. }
  199. #endif
  200. frame = get_sigframe(&ksig->ka, usp, sigframe_size);
  201. DBG(1, "%s: frame %p info %p\n", __func__, frame, &ksig->info);
  202. start = (unsigned long) frame;
  203. if (start >= TASK_SIZE_MAX - sigframe_size)
  204. return -EFAULT;
  205. #ifdef CONFIG_64BIT
  206. compat_frame = (struct compat_rt_sigframe __user *)frame;
  207. if (is_compat_task()) {
  208. DBG(1, "%s: frame->info = 0x%p\n", __func__, &compat_frame->info);
  209. err |= copy_siginfo_to_user32(&compat_frame->info, &ksig->info);
  210. err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
  211. DBG(1, "%s: frame->uc = 0x%p\n", __func__, &compat_frame->uc);
  212. DBG(1, "%s: frame->uc.uc_mcontext = 0x%p\n",
  213. __func__, &compat_frame->uc.uc_mcontext);
  214. err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext,
  215. &compat_frame->regs, regs, in_syscall);
  216. err |= put_compat_sigset(&compat_frame->uc.uc_sigmask, set,
  217. sizeof(compat_sigset_t));
  218. } else
  219. #endif
  220. {
  221. DBG(1, "%s: frame->info = 0x%p\n", __func__, &frame->info);
  222. err |= copy_siginfo_to_user(&frame->info, &ksig->info);
  223. err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
  224. DBG(1, "%s: frame->uc = 0x%p\n", __func__, &frame->uc);
  225. DBG(1, "%s: frame->uc.uc_mcontext = 0x%p\n",
  226. __func__, &frame->uc.uc_mcontext);
  227. err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
  228. /* FIXME: Should probably be converted as well for the compat case */
  229. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  230. }
  231. if (err)
  232. return -EFAULT;
  233. #ifdef CONFIG_64BIT
  234. if (!is_compat_task())
  235. rp = VDSO64_SYMBOL(current, sigtramp_rt);
  236. else
  237. #endif
  238. rp = VDSO32_SYMBOL(current, sigtramp_rt);
  239. if (in_syscall)
  240. rp += 4*4; /* skip 4 instructions and start at ldi 1,%r25 */
  241. haddr = A(ksig->ka.sa.sa_handler);
  242. /* The sa_handler may be a pointer to a function descriptor */
  243. #ifdef CONFIG_64BIT
  244. if (is_compat_task()) {
  245. #endif
  246. if (haddr & PA_PLABEL_FDESC) {
  247. Elf32_Fdesc fdesc;
  248. Elf32_Fdesc __user *ufdesc = (Elf32_Fdesc __user *)A(haddr & ~3);
  249. err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
  250. if (err)
  251. return -EFAULT;
  252. haddr = fdesc.addr;
  253. regs->gr[19] = fdesc.gp;
  254. }
  255. #ifdef CONFIG_64BIT
  256. } else {
  257. Elf64_Fdesc fdesc;
  258. Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3);
  259. err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
  260. if (err)
  261. return -EFAULT;
  262. haddr = fdesc.addr;
  263. regs->gr[19] = fdesc.gp;
  264. DBG(1, "%s: 64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n",
  265. __func__, haddr, regs->gr[19], in_syscall);
  266. }
  267. #endif
  268. /* The syscall return path will create IAOQ values from r31.
  269. */
  270. if (in_syscall) {
  271. regs->gr[31] = haddr;
  272. #ifdef CONFIG_64BIT
  273. if (!test_thread_flag(TIF_32BIT))
  274. sigframe_size |= 1; /* XXX ???? */
  275. #endif
  276. } else {
  277. unsigned long psw = USER_PSW;
  278. #ifdef CONFIG_64BIT
  279. if (!test_thread_flag(TIF_32BIT))
  280. psw |= PSW_W;
  281. #endif
  282. /* If we are singlestepping, arrange a trap to be delivered
  283. when we return to userspace. Note the semantics -- we
  284. should trap before the first insn in the handler is
  285. executed. Ref:
  286. http://sources.redhat.com/ml/gdb/2004-11/msg00245.html
  287. */
  288. if (pa_psw(current)->r) {
  289. pa_psw(current)->r = 0;
  290. psw |= PSW_R;
  291. mtctl(-1, 0);
  292. }
  293. regs->gr[0] = psw;
  294. regs->iaoq[0] = haddr | PRIV_USER;
  295. regs->iaoq[1] = regs->iaoq[0] + 4;
  296. }
  297. regs->gr[2] = rp; /* userland return pointer */
  298. regs->gr[26] = ksig->sig; /* signal number */
  299. #ifdef CONFIG_64BIT
  300. if (is_compat_task()) {
  301. regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */
  302. regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */
  303. } else
  304. #endif
  305. {
  306. regs->gr[25] = A(&frame->info); /* siginfo pointer */
  307. regs->gr[24] = A(&frame->uc); /* ucontext pointer */
  308. }
  309. DBG(1, "%s: making sigreturn frame: %#lx + %#lx = %#lx\n", __func__,
  310. regs->gr[30], sigframe_size,
  311. regs->gr[30] + sigframe_size);
  312. /* Raise the user stack pointer to make a proper call frame. */
  313. regs->gr[30] = (A(frame) + sigframe_size);
  314. DBG(1, "%s: sig deliver (%s,%d) frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n",
  315. __func__, current->comm, current->pid, frame, regs->gr[30],
  316. regs->iaoq[0], regs->iaoq[1], rp);
  317. return 0;
  318. }
  319. /*
  320. * OK, we're invoking a handler.
  321. */
  322. static void
  323. handle_signal(struct ksignal *ksig, struct pt_regs *regs, int in_syscall)
  324. {
  325. int ret;
  326. sigset_t *oldset = sigmask_to_save();
  327. DBG(1, "%s: sig=%d, ka=%p, info=%p, oldset=%p, regs=%p\n",
  328. __func__, ksig->sig, &ksig->ka, &ksig->info, oldset, regs);
  329. /* Set up the stack frame */
  330. ret = setup_rt_frame(ksig, oldset, regs, in_syscall);
  331. signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP) ||
  332. test_thread_flag(TIF_BLOCKSTEP));
  333. DBG(1, "%s: Exit (success), regs->gr[28] = %ld\n",
  334. __func__, regs->gr[28]);
  335. }
  336. /*
  337. * Check how the syscall number gets loaded into %r20 within
  338. * the delay branch in userspace and adjust as needed.
  339. */
  340. static void check_syscallno_in_delay_branch(struct pt_regs *regs)
  341. {
  342. u32 opcode, source_reg;
  343. u32 __user *uaddr;
  344. int err;
  345. /* Usually we don't have to restore %r20 (the system call number)
  346. * because it gets loaded in the delay slot of the branch external
  347. * instruction via the ldi instruction.
  348. * In some cases a register-to-register copy instruction might have
  349. * been used instead, in which case we need to copy the syscall
  350. * number into the source register before returning to userspace.
  351. */
  352. /* A syscall is just a branch, so all we have to do is fiddle the
  353. * return pointer so that the ble instruction gets executed again.
  354. */
  355. regs->gr[31] -= 8; /* delayed branching */
  356. /* Get assembler opcode of code in delay branch */
  357. uaddr = (unsigned int *) ((regs->gr[31] & ~3) + 4);
  358. err = get_user(opcode, uaddr);
  359. if (err)
  360. return;
  361. /* Check if delay branch uses "ldi int,%r20" */
  362. if ((opcode & 0xffff0000) == 0x34140000)
  363. return; /* everything ok, just return */
  364. /* Check if delay branch uses "nop" */
  365. if (opcode == INSN_NOP)
  366. return;
  367. /* Check if delay branch uses "copy %rX,%r20" */
  368. if ((opcode & 0xffe0ffff) == 0x08000254) {
  369. source_reg = (opcode >> 16) & 31;
  370. regs->gr[source_reg] = regs->gr[20];
  371. return;
  372. }
  373. pr_warn("syscall restart: %s (pid %d): unexpected opcode 0x%08x\n",
  374. current->comm, task_pid_nr(current), opcode);
  375. }
  376. static inline void
  377. syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
  378. {
  379. if (regs->orig_r28)
  380. return;
  381. regs->orig_r28 = 1; /* no more restarts */
  382. DBG(1, "%s: orig_r28 = %ld pid %d r20 %ld\n",
  383. __func__, regs->orig_r28, task_pid_nr(current), regs->gr[20]);
  384. /* Check the return code */
  385. switch (regs->gr[28]) {
  386. case -ERESTART_RESTARTBLOCK:
  387. case -ERESTARTNOHAND:
  388. DBG(1, "%s: ERESTARTNOHAND: returning -EINTR\n", __func__);
  389. regs->gr[28] = -EINTR;
  390. break;
  391. case -ERESTARTSYS:
  392. if (!(ka->sa.sa_flags & SA_RESTART)) {
  393. DBG(1, "%s: ERESTARTSYS: putting -EINTR pid %d\n",
  394. __func__, task_pid_nr(current));
  395. regs->gr[28] = -EINTR;
  396. break;
  397. }
  398. fallthrough;
  399. case -ERESTARTNOINTR:
  400. DBG(1, "%s: %ld\n", __func__, regs->gr[28]);
  401. check_syscallno_in_delay_branch(regs);
  402. break;
  403. }
  404. }
  405. static inline void
  406. insert_restart_trampoline(struct pt_regs *regs)
  407. {
  408. if (regs->orig_r28)
  409. return;
  410. regs->orig_r28 = 1; /* no more restarts */
  411. DBG(2, "%s: gr28 = %ld pid %d\n",
  412. __func__, regs->gr[28], task_pid_nr(current));
  413. switch (regs->gr[28]) {
  414. case -ERESTART_RESTARTBLOCK: {
  415. /* Restart the system call - no handlers present */
  416. unsigned int *usp = (unsigned int *)regs->gr[30];
  417. unsigned long rp;
  418. long err = 0;
  419. /* check that we don't exceed the stack */
  420. if (A(&usp[0]) >= TASK_SIZE_MAX - 5 * sizeof(int))
  421. return;
  422. /* Call trampoline in vdso to restart the syscall
  423. * with __NR_restart_syscall.
  424. * Original return addresses are on stack like this:
  425. *
  426. * 0: <return address (orig r31)>
  427. * 4: <2nd half for 64-bit>
  428. */
  429. #ifdef CONFIG_64BIT
  430. if (!is_compat_task()) {
  431. err |= put_user(regs->gr[31] >> 32, &usp[0]);
  432. err |= put_user(regs->gr[31] & 0xffffffff, &usp[1]);
  433. rp = VDSO64_SYMBOL(current, restart_syscall);
  434. } else
  435. #endif
  436. {
  437. err |= put_user(regs->gr[31], &usp[0]);
  438. rp = VDSO32_SYMBOL(current, restart_syscall);
  439. }
  440. WARN_ON(err);
  441. regs->gr[31] = rp;
  442. DBG(1, "%s: ERESTART_RESTARTBLOCK\n", __func__);
  443. return;
  444. }
  445. case -EINTR:
  446. /* ok, was handled before and should be returned. */
  447. break;
  448. case -ERESTARTNOHAND:
  449. case -ERESTARTSYS:
  450. case -ERESTARTNOINTR:
  451. DBG(1, "%s: Type %ld\n", __func__, regs->gr[28]);
  452. check_syscallno_in_delay_branch(regs);
  453. return;
  454. default:
  455. break;
  456. }
  457. }
  458. /*
  459. * We need to be able to restore the syscall arguments (r21-r26) to
  460. * restart syscalls. Thus, the syscall path should save them in the
  461. * pt_regs structure (it's okay to do so since they are caller-save
  462. * registers). As noted below, the syscall number gets restored for
  463. * us due to the magic of delayed branching.
  464. */
  465. static void do_signal(struct pt_regs *regs, long in_syscall)
  466. {
  467. struct ksignal ksig;
  468. int restart_syscall;
  469. bool has_handler;
  470. has_handler = get_signal(&ksig);
  471. restart_syscall = 0;
  472. if (in_syscall)
  473. restart_syscall = 1;
  474. if (has_handler) {
  475. /* Restart a system call if necessary. */
  476. if (restart_syscall)
  477. syscall_restart(regs, &ksig.ka);
  478. handle_signal(&ksig, regs, in_syscall);
  479. DBG(1, "%s: Handled signal pid %d\n",
  480. __func__, task_pid_nr(current));
  481. return;
  482. }
  483. /* Do we need to restart the system call? */
  484. if (restart_syscall)
  485. insert_restart_trampoline(regs);
  486. DBG(1, "%s: Exit (not delivered), regs->gr[28] = %ld orig_r28 = %ld pid %d\n",
  487. __func__, regs->gr[28], regs->orig_r28, task_pid_nr(current));
  488. restore_saved_sigmask();
  489. }
  490. void do_notify_resume(struct pt_regs *regs, long in_syscall)
  491. {
  492. if (test_thread_flag(TIF_SIGPENDING) ||
  493. test_thread_flag(TIF_NOTIFY_SIGNAL))
  494. do_signal(regs, in_syscall);
  495. if (test_thread_flag(TIF_NOTIFY_RESUME))
  496. resume_user_mode_work(regs);
  497. }