compat_signal.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright IBM Corp. 2000, 2006
  4. * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  5. * Gerhard Tonn (ton@de.ibm.com)
  6. *
  7. * Copyright (C) 1991, 1992 Linus Torvalds
  8. *
  9. * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
  10. */
  11. #include <linux/compat.h>
  12. #include <linux/sched.h>
  13. #include <linux/sched/task_stack.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/unistd.h>
  22. #include <linux/stddef.h>
  23. #include <linux/tty.h>
  24. #include <linux/personality.h>
  25. #include <linux/binfmts.h>
  26. #include <asm/ucontext.h>
  27. #include <linux/uaccess.h>
  28. #include <asm/lowcore.h>
  29. #include <asm/switch_to.h>
  30. #include "compat_linux.h"
  31. #include "compat_ptrace.h"
  32. #include "entry.h"
  33. typedef struct
  34. {
  35. __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
  36. struct sigcontext32 sc;
  37. _sigregs32 sregs;
  38. int signo;
  39. _sigregs_ext32 sregs_ext;
  40. __u16 svc_insn; /* Offset of svc_insn is NOT fixed! */
  41. } sigframe32;
  42. typedef struct
  43. {
  44. __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
  45. __u16 svc_insn;
  46. compat_siginfo_t info;
  47. struct ucontext32 uc;
  48. } rt_sigframe32;
  49. /* Store registers needed to create the signal frame */
  50. static void store_sigregs(void)
  51. {
  52. save_access_regs(current->thread.acrs);
  53. save_fpu_regs();
  54. }
  55. /* Load registers after signal return */
  56. static void load_sigregs(void)
  57. {
  58. restore_access_regs(current->thread.acrs);
  59. }
  60. static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
  61. {
  62. _sigregs32 user_sregs;
  63. int i;
  64. user_sregs.regs.psw.mask = (__u32)(regs->psw.mask >> 32);
  65. user_sregs.regs.psw.mask &= PSW32_MASK_USER | PSW32_MASK_RI;
  66. user_sregs.regs.psw.mask |= PSW32_USER_BITS;
  67. user_sregs.regs.psw.addr = (__u32) regs->psw.addr |
  68. (__u32)(regs->psw.mask & PSW_MASK_BA);
  69. for (i = 0; i < NUM_GPRS; i++)
  70. user_sregs.regs.gprs[i] = (__u32) regs->gprs[i];
  71. memcpy(&user_sregs.regs.acrs, current->thread.acrs,
  72. sizeof(user_sregs.regs.acrs));
  73. fpregs_store((_s390_fp_regs *) &user_sregs.fpregs, &current->thread.fpu);
  74. if (__copy_to_user(sregs, &user_sregs, sizeof(_sigregs32)))
  75. return -EFAULT;
  76. return 0;
  77. }
  78. static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
  79. {
  80. _sigregs32 user_sregs;
  81. int i;
  82. /* Alwys make any pending restarted system call return -EINTR */
  83. current->restart_block.fn = do_no_restart_syscall;
  84. if (__copy_from_user(&user_sregs, &sregs->regs, sizeof(user_sregs)))
  85. return -EFAULT;
  86. if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW32_MASK_RI))
  87. return -EINVAL;
  88. /* Test the floating-point-control word. */
  89. if (test_fp_ctl(user_sregs.fpregs.fpc))
  90. return -EINVAL;
  91. /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */
  92. regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) |
  93. (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_USER) << 32 |
  94. (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_RI) << 32 |
  95. (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_AMODE);
  96. /* Check for invalid user address space control. */
  97. if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME)
  98. regs->psw.mask = PSW_ASC_PRIMARY |
  99. (regs->psw.mask & ~PSW_MASK_ASC);
  100. regs->psw.addr = (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_INSN);
  101. for (i = 0; i < NUM_GPRS; i++)
  102. regs->gprs[i] = (__u64) user_sregs.regs.gprs[i];
  103. memcpy(&current->thread.acrs, &user_sregs.regs.acrs,
  104. sizeof(current->thread.acrs));
  105. fpregs_load((_s390_fp_regs *) &user_sregs.fpregs, &current->thread.fpu);
  106. clear_pt_regs_flag(regs, PIF_SYSCALL); /* No longer in a system call */
  107. return 0;
  108. }
  109. static int save_sigregs_ext32(struct pt_regs *regs,
  110. _sigregs_ext32 __user *sregs_ext)
  111. {
  112. __u32 gprs_high[NUM_GPRS];
  113. __u64 vxrs[__NUM_VXRS_LOW];
  114. int i;
  115. /* Save high gprs to signal stack */
  116. for (i = 0; i < NUM_GPRS; i++)
  117. gprs_high[i] = regs->gprs[i] >> 32;
  118. if (__copy_to_user(&sregs_ext->gprs_high, &gprs_high,
  119. sizeof(sregs_ext->gprs_high)))
  120. return -EFAULT;
  121. /* Save vector registers to signal stack */
  122. if (MACHINE_HAS_VX) {
  123. for (i = 0; i < __NUM_VXRS_LOW; i++)
  124. vxrs[i] = *((__u64 *)(current->thread.fpu.vxrs + i) + 1);
  125. if (__copy_to_user(&sregs_ext->vxrs_low, vxrs,
  126. sizeof(sregs_ext->vxrs_low)) ||
  127. __copy_to_user(&sregs_ext->vxrs_high,
  128. current->thread.fpu.vxrs + __NUM_VXRS_LOW,
  129. sizeof(sregs_ext->vxrs_high)))
  130. return -EFAULT;
  131. }
  132. return 0;
  133. }
  134. static int restore_sigregs_ext32(struct pt_regs *regs,
  135. _sigregs_ext32 __user *sregs_ext)
  136. {
  137. __u32 gprs_high[NUM_GPRS];
  138. __u64 vxrs[__NUM_VXRS_LOW];
  139. int i;
  140. /* Restore high gprs from signal stack */
  141. if (__copy_from_user(&gprs_high, &sregs_ext->gprs_high,
  142. sizeof(sregs_ext->gprs_high)))
  143. return -EFAULT;
  144. for (i = 0; i < NUM_GPRS; i++)
  145. *(__u32 *)&regs->gprs[i] = gprs_high[i];
  146. /* Restore vector registers from signal stack */
  147. if (MACHINE_HAS_VX) {
  148. if (__copy_from_user(vxrs, &sregs_ext->vxrs_low,
  149. sizeof(sregs_ext->vxrs_low)) ||
  150. __copy_from_user(current->thread.fpu.vxrs + __NUM_VXRS_LOW,
  151. &sregs_ext->vxrs_high,
  152. sizeof(sregs_ext->vxrs_high)))
  153. return -EFAULT;
  154. for (i = 0; i < __NUM_VXRS_LOW; i++)
  155. *((__u64 *)(current->thread.fpu.vxrs + i) + 1) = vxrs[i];
  156. }
  157. return 0;
  158. }
  159. COMPAT_SYSCALL_DEFINE0(sigreturn)
  160. {
  161. struct pt_regs *regs = task_pt_regs(current);
  162. sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
  163. sigset_t set;
  164. if (get_compat_sigset(&set, (compat_sigset_t __user *)frame->sc.oldmask))
  165. goto badframe;
  166. set_current_blocked(&set);
  167. save_fpu_regs();
  168. if (restore_sigregs32(regs, &frame->sregs))
  169. goto badframe;
  170. if (restore_sigregs_ext32(regs, &frame->sregs_ext))
  171. goto badframe;
  172. load_sigregs();
  173. return regs->gprs[2];
  174. badframe:
  175. force_sig(SIGSEGV, current);
  176. return 0;
  177. }
  178. COMPAT_SYSCALL_DEFINE0(rt_sigreturn)
  179. {
  180. struct pt_regs *regs = task_pt_regs(current);
  181. rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
  182. sigset_t set;
  183. if (get_compat_sigset(&set, &frame->uc.uc_sigmask))
  184. goto badframe;
  185. set_current_blocked(&set);
  186. if (compat_restore_altstack(&frame->uc.uc_stack))
  187. goto badframe;
  188. save_fpu_regs();
  189. if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
  190. goto badframe;
  191. if (restore_sigregs_ext32(regs, &frame->uc.uc_mcontext_ext))
  192. goto badframe;
  193. load_sigregs();
  194. return regs->gprs[2];
  195. badframe:
  196. force_sig(SIGSEGV, current);
  197. return 0;
  198. }
  199. /*
  200. * Set up a signal frame.
  201. */
  202. /*
  203. * Determine which stack to use..
  204. */
  205. static inline void __user *
  206. get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
  207. {
  208. unsigned long sp;
  209. /* Default to using normal stack */
  210. sp = (unsigned long) A(regs->gprs[15]);
  211. /* Overflow on alternate signal stack gives SIGSEGV. */
  212. if (on_sig_stack(sp) && !on_sig_stack((sp - frame_size) & -8UL))
  213. return (void __user *) -1UL;
  214. /* This is the X/Open sanctioned signal stack switching. */
  215. if (ka->sa.sa_flags & SA_ONSTACK) {
  216. if (! sas_ss_flags(sp))
  217. sp = current->sas_ss_sp + current->sas_ss_size;
  218. }
  219. return (void __user *)((sp - frame_size) & -8ul);
  220. }
  221. static int setup_frame32(struct ksignal *ksig, sigset_t *set,
  222. struct pt_regs *regs)
  223. {
  224. int sig = ksig->sig;
  225. sigframe32 __user *frame;
  226. unsigned long restorer;
  227. size_t frame_size;
  228. /*
  229. * gprs_high are always present for 31-bit compat tasks.
  230. * The space for vector registers is only allocated if
  231. * the machine supports it
  232. */
  233. frame_size = sizeof(*frame) - sizeof(frame->sregs_ext.__reserved);
  234. if (!MACHINE_HAS_VX)
  235. frame_size -= sizeof(frame->sregs_ext.vxrs_low) +
  236. sizeof(frame->sregs_ext.vxrs_high);
  237. frame = get_sigframe(&ksig->ka, regs, frame_size);
  238. if (frame == (void __user *) -1UL)
  239. return -EFAULT;
  240. /* Set up backchain. */
  241. if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
  242. return -EFAULT;
  243. /* Create struct sigcontext32 on the signal stack */
  244. if (put_compat_sigset((compat_sigset_t __user *)frame->sc.oldmask,
  245. set, sizeof(compat_sigset_t)))
  246. return -EFAULT;
  247. if (__put_user(ptr_to_compat(&frame->sc), &frame->sc.sregs))
  248. return -EFAULT;
  249. /* Store registers needed to create the signal frame */
  250. store_sigregs();
  251. /* Create _sigregs32 on the signal stack */
  252. if (save_sigregs32(regs, &frame->sregs))
  253. return -EFAULT;
  254. /* Place signal number on stack to allow backtrace from handler. */
  255. if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo))
  256. return -EFAULT;
  257. /* Create _sigregs_ext32 on the signal stack */
  258. if (save_sigregs_ext32(regs, &frame->sregs_ext))
  259. return -EFAULT;
  260. /* Set up to return from userspace. If provided, use a stub
  261. already in userspace. */
  262. if (ksig->ka.sa.sa_flags & SA_RESTORER) {
  263. restorer = (unsigned long __force)
  264. ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE;
  265. } else {
  266. /* Signal frames without vectors registers are short ! */
  267. __u16 __user *svc = (void __user *) frame + frame_size - 2;
  268. if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, svc))
  269. return -EFAULT;
  270. restorer = (unsigned long __force) svc | PSW32_ADDR_AMODE;
  271. }
  272. /* Set up registers for signal handler */
  273. regs->gprs[14] = restorer;
  274. regs->gprs[15] = (__force __u64) frame;
  275. /* Force 31 bit amode and default user address space control. */
  276. regs->psw.mask = PSW_MASK_BA |
  277. (PSW_USER_BITS & PSW_MASK_ASC) |
  278. (regs->psw.mask & ~PSW_MASK_ASC);
  279. regs->psw.addr = (__force __u64) ksig->ka.sa.sa_handler;
  280. regs->gprs[2] = sig;
  281. regs->gprs[3] = (__force __u64) &frame->sc;
  282. /* We forgot to include these in the sigcontext.
  283. To avoid breaking binary compatibility, they are passed as args. */
  284. if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
  285. sig == SIGTRAP || sig == SIGFPE) {
  286. /* set extra registers only for synchronous signals */
  287. regs->gprs[4] = regs->int_code & 127;
  288. regs->gprs[5] = regs->int_parm_long;
  289. regs->gprs[6] = current->thread.last_break;
  290. }
  291. return 0;
  292. }
  293. static int setup_rt_frame32(struct ksignal *ksig, sigset_t *set,
  294. struct pt_regs *regs)
  295. {
  296. rt_sigframe32 __user *frame;
  297. unsigned long restorer;
  298. size_t frame_size;
  299. u32 uc_flags;
  300. frame_size = sizeof(*frame) -
  301. sizeof(frame->uc.uc_mcontext_ext.__reserved);
  302. /*
  303. * gprs_high are always present for 31-bit compat tasks.
  304. * The space for vector registers is only allocated if
  305. * the machine supports it
  306. */
  307. uc_flags = UC_GPRS_HIGH;
  308. if (MACHINE_HAS_VX) {
  309. uc_flags |= UC_VXRS;
  310. } else
  311. frame_size -= sizeof(frame->uc.uc_mcontext_ext.vxrs_low) +
  312. sizeof(frame->uc.uc_mcontext_ext.vxrs_high);
  313. frame = get_sigframe(&ksig->ka, regs, frame_size);
  314. if (frame == (void __user *) -1UL)
  315. return -EFAULT;
  316. /* Set up backchain. */
  317. if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame))
  318. return -EFAULT;
  319. /* Set up to return from userspace. If provided, use a stub
  320. already in userspace. */
  321. if (ksig->ka.sa.sa_flags & SA_RESTORER) {
  322. restorer = (unsigned long __force)
  323. ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE;
  324. } else {
  325. __u16 __user *svc = &frame->svc_insn;
  326. if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, svc))
  327. return -EFAULT;
  328. restorer = (unsigned long __force) svc | PSW32_ADDR_AMODE;
  329. }
  330. /* Create siginfo on the signal stack */
  331. if (copy_siginfo_to_user32(&frame->info, &ksig->info))
  332. return -EFAULT;
  333. /* Store registers needed to create the signal frame */
  334. store_sigregs();
  335. /* Create ucontext on the signal stack. */
  336. if (__put_user(uc_flags, &frame->uc.uc_flags) ||
  337. __put_user(0, &frame->uc.uc_link) ||
  338. __compat_save_altstack(&frame->uc.uc_stack, regs->gprs[15]) ||
  339. save_sigregs32(regs, &frame->uc.uc_mcontext) ||
  340. put_compat_sigset(&frame->uc.uc_sigmask, set, sizeof(compat_sigset_t)) ||
  341. save_sigregs_ext32(regs, &frame->uc.uc_mcontext_ext))
  342. return -EFAULT;
  343. /* Set up registers for signal handler */
  344. regs->gprs[14] = restorer;
  345. regs->gprs[15] = (__force __u64) frame;
  346. /* Force 31 bit amode and default user address space control. */
  347. regs->psw.mask = PSW_MASK_BA |
  348. (PSW_USER_BITS & PSW_MASK_ASC) |
  349. (regs->psw.mask & ~PSW_MASK_ASC);
  350. regs->psw.addr = (__u64 __force) ksig->ka.sa.sa_handler;
  351. regs->gprs[2] = ksig->sig;
  352. regs->gprs[3] = (__force __u64) &frame->info;
  353. regs->gprs[4] = (__force __u64) &frame->uc;
  354. regs->gprs[5] = current->thread.last_break;
  355. return 0;
  356. }
  357. /*
  358. * OK, we're invoking a handler
  359. */
  360. void handle_signal32(struct ksignal *ksig, sigset_t *oldset,
  361. struct pt_regs *regs)
  362. {
  363. int ret;
  364. /* Set up the stack frame */
  365. if (ksig->ka.sa.sa_flags & SA_SIGINFO)
  366. ret = setup_rt_frame32(ksig, oldset, regs);
  367. else
  368. ret = setup_frame32(ksig, oldset, regs);
  369. signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLE_STEP));
  370. }