signal.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Author: Hanlu Li <lihanlu@loongson.cn>
  4. * Huacai Chen <chenhuacai@loongson.cn>
  5. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  6. *
  7. * Derived from MIPS:
  8. * Copyright (C) 1991, 1992 Linus Torvalds
  9. * Copyright (C) 1994 - 2000 Ralf Baechle
  10. * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  11. * Copyright (C) 2014, Imagination Technologies Ltd.
  12. */
  13. #include <linux/audit.h>
  14. #include <linux/cache.h>
  15. #include <linux/context_tracking.h>
  16. #include <linux/entry-common.h>
  17. #include <linux/irqflags.h>
  18. #include <linux/rseq.h>
  19. #include <linux/sched.h>
  20. #include <linux/mm.h>
  21. #include <linux/personality.h>
  22. #include <linux/smp.h>
  23. #include <linux/kernel.h>
  24. #include <linux/signal.h>
  25. #include <linux/errno.h>
  26. #include <linux/wait.h>
  27. #include <linux/ptrace.h>
  28. #include <linux/unistd.h>
  29. #include <linux/compiler.h>
  30. #include <linux/syscalls.h>
  31. #include <linux/uaccess.h>
  32. #include <asm/asm.h>
  33. #include <asm/cacheflush.h>
  34. #include <asm/cpu-features.h>
  35. #include <asm/fpu.h>
  36. #include <asm/lbt.h>
  37. #include <asm/ucontext.h>
  38. #include <asm/vdso.h>
  39. #ifdef DEBUG_SIG
  40. # define DEBUGP(fmt, args...) printk("%s: " fmt, __func__, ##args)
  41. #else
  42. # define DEBUGP(fmt, args...)
  43. #endif
  44. /* Make sure we will not lose FPU ownership */
  45. #define lock_fpu_owner() ({ preempt_disable(); pagefault_disable(); })
  46. #define unlock_fpu_owner() ({ pagefault_enable(); preempt_enable(); })
  47. /* Make sure we will not lose LBT ownership */
  48. #define lock_lbt_owner() ({ preempt_disable(); pagefault_disable(); })
  49. #define unlock_lbt_owner() ({ pagefault_enable(); preempt_enable(); })
  50. struct rt_sigframe {
  51. struct siginfo rs_info;
  52. struct ucontext rs_uctx;
  53. };
  54. struct _ctx_layout {
  55. struct sctx_info *addr;
  56. unsigned int size;
  57. };
  58. struct extctx_layout {
  59. unsigned long size;
  60. unsigned int flags;
  61. struct _ctx_layout fpu;
  62. struct _ctx_layout lsx;
  63. struct _ctx_layout lasx;
  64. struct _ctx_layout lbt;
  65. struct _ctx_layout end;
  66. };
  67. static void __user *get_ctx_through_ctxinfo(struct sctx_info *info)
  68. {
  69. return (void __user *)((char *)info + sizeof(struct sctx_info));
  70. }
  71. /*
  72. * Thread saved context copy to/from a signal context presumed to be on the
  73. * user stack, and therefore accessed with appropriate macros from uaccess.h.
  74. */
  75. static int copy_fpu_to_sigcontext(struct fpu_context __user *ctx)
  76. {
  77. int i;
  78. int err = 0;
  79. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  80. uint64_t __user *fcc = &ctx->fcc;
  81. uint32_t __user *fcsr = &ctx->fcsr;
  82. for (i = 0; i < NUM_FPU_REGS; i++) {
  83. err |=
  84. __put_user(get_fpr64(&current->thread.fpu.fpr[i], 0),
  85. &regs[i]);
  86. }
  87. err |= __put_user(current->thread.fpu.fcc, fcc);
  88. err |= __put_user(current->thread.fpu.fcsr, fcsr);
  89. return err;
  90. }
  91. static int copy_fpu_from_sigcontext(struct fpu_context __user *ctx)
  92. {
  93. int i;
  94. int err = 0;
  95. u64 fpr_val;
  96. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  97. uint64_t __user *fcc = &ctx->fcc;
  98. uint32_t __user *fcsr = &ctx->fcsr;
  99. for (i = 0; i < NUM_FPU_REGS; i++) {
  100. err |= __get_user(fpr_val, &regs[i]);
  101. set_fpr64(&current->thread.fpu.fpr[i], 0, fpr_val);
  102. }
  103. err |= __get_user(current->thread.fpu.fcc, fcc);
  104. err |= __get_user(current->thread.fpu.fcsr, fcsr);
  105. return err;
  106. }
  107. static int copy_lsx_to_sigcontext(struct lsx_context __user *ctx)
  108. {
  109. int i;
  110. int err = 0;
  111. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  112. uint64_t __user *fcc = &ctx->fcc;
  113. uint32_t __user *fcsr = &ctx->fcsr;
  114. for (i = 0; i < NUM_FPU_REGS; i++) {
  115. err |= __put_user(get_fpr64(&current->thread.fpu.fpr[i], 0),
  116. &regs[2*i]);
  117. err |= __put_user(get_fpr64(&current->thread.fpu.fpr[i], 1),
  118. &regs[2*i+1]);
  119. }
  120. err |= __put_user(current->thread.fpu.fcc, fcc);
  121. err |= __put_user(current->thread.fpu.fcsr, fcsr);
  122. return err;
  123. }
  124. static int copy_lsx_from_sigcontext(struct lsx_context __user *ctx)
  125. {
  126. int i;
  127. int err = 0;
  128. u64 fpr_val;
  129. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  130. uint64_t __user *fcc = &ctx->fcc;
  131. uint32_t __user *fcsr = &ctx->fcsr;
  132. for (i = 0; i < NUM_FPU_REGS; i++) {
  133. err |= __get_user(fpr_val, &regs[2*i]);
  134. set_fpr64(&current->thread.fpu.fpr[i], 0, fpr_val);
  135. err |= __get_user(fpr_val, &regs[2*i+1]);
  136. set_fpr64(&current->thread.fpu.fpr[i], 1, fpr_val);
  137. }
  138. err |= __get_user(current->thread.fpu.fcc, fcc);
  139. err |= __get_user(current->thread.fpu.fcsr, fcsr);
  140. return err;
  141. }
  142. static int copy_lasx_to_sigcontext(struct lasx_context __user *ctx)
  143. {
  144. int i;
  145. int err = 0;
  146. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  147. uint64_t __user *fcc = &ctx->fcc;
  148. uint32_t __user *fcsr = &ctx->fcsr;
  149. for (i = 0; i < NUM_FPU_REGS; i++) {
  150. err |= __put_user(get_fpr64(&current->thread.fpu.fpr[i], 0),
  151. &regs[4*i]);
  152. err |= __put_user(get_fpr64(&current->thread.fpu.fpr[i], 1),
  153. &regs[4*i+1]);
  154. err |= __put_user(get_fpr64(&current->thread.fpu.fpr[i], 2),
  155. &regs[4*i+2]);
  156. err |= __put_user(get_fpr64(&current->thread.fpu.fpr[i], 3),
  157. &regs[4*i+3]);
  158. }
  159. err |= __put_user(current->thread.fpu.fcc, fcc);
  160. err |= __put_user(current->thread.fpu.fcsr, fcsr);
  161. return err;
  162. }
  163. static int copy_lasx_from_sigcontext(struct lasx_context __user *ctx)
  164. {
  165. int i;
  166. int err = 0;
  167. u64 fpr_val;
  168. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  169. uint64_t __user *fcc = &ctx->fcc;
  170. uint32_t __user *fcsr = &ctx->fcsr;
  171. for (i = 0; i < NUM_FPU_REGS; i++) {
  172. err |= __get_user(fpr_val, &regs[4*i]);
  173. set_fpr64(&current->thread.fpu.fpr[i], 0, fpr_val);
  174. err |= __get_user(fpr_val, &regs[4*i+1]);
  175. set_fpr64(&current->thread.fpu.fpr[i], 1, fpr_val);
  176. err |= __get_user(fpr_val, &regs[4*i+2]);
  177. set_fpr64(&current->thread.fpu.fpr[i], 2, fpr_val);
  178. err |= __get_user(fpr_val, &regs[4*i+3]);
  179. set_fpr64(&current->thread.fpu.fpr[i], 3, fpr_val);
  180. }
  181. err |= __get_user(current->thread.fpu.fcc, fcc);
  182. err |= __get_user(current->thread.fpu.fcsr, fcsr);
  183. return err;
  184. }
  185. #ifdef CONFIG_CPU_HAS_LBT
  186. static int copy_lbt_to_sigcontext(struct lbt_context __user *ctx)
  187. {
  188. int err = 0;
  189. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  190. uint32_t __user *eflags = (uint32_t *)&ctx->eflags;
  191. err |= __put_user(current->thread.lbt.scr0, &regs[0]);
  192. err |= __put_user(current->thread.lbt.scr1, &regs[1]);
  193. err |= __put_user(current->thread.lbt.scr2, &regs[2]);
  194. err |= __put_user(current->thread.lbt.scr3, &regs[3]);
  195. err |= __put_user(current->thread.lbt.eflags, eflags);
  196. return err;
  197. }
  198. static int copy_lbt_from_sigcontext(struct lbt_context __user *ctx)
  199. {
  200. int err = 0;
  201. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  202. uint32_t __user *eflags = (uint32_t *)&ctx->eflags;
  203. err |= __get_user(current->thread.lbt.scr0, &regs[0]);
  204. err |= __get_user(current->thread.lbt.scr1, &regs[1]);
  205. err |= __get_user(current->thread.lbt.scr2, &regs[2]);
  206. err |= __get_user(current->thread.lbt.scr3, &regs[3]);
  207. err |= __get_user(current->thread.lbt.eflags, eflags);
  208. return err;
  209. }
  210. static int copy_ftop_to_sigcontext(struct lbt_context __user *ctx)
  211. {
  212. uint32_t __user *ftop = &ctx->ftop;
  213. return __put_user(current->thread.fpu.ftop, ftop);
  214. }
  215. static int copy_ftop_from_sigcontext(struct lbt_context __user *ctx)
  216. {
  217. uint32_t __user *ftop = &ctx->ftop;
  218. return __get_user(current->thread.fpu.ftop, ftop);
  219. }
  220. #endif
  221. /*
  222. * Wrappers for the assembly _{save,restore}_fp_context functions.
  223. */
  224. static int save_hw_fpu_context(struct fpu_context __user *ctx)
  225. {
  226. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  227. uint64_t __user *fcc = &ctx->fcc;
  228. uint32_t __user *fcsr = &ctx->fcsr;
  229. return _save_fp_context(regs, fcc, fcsr);
  230. }
  231. static int restore_hw_fpu_context(struct fpu_context __user *ctx)
  232. {
  233. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  234. uint64_t __user *fcc = &ctx->fcc;
  235. uint32_t __user *fcsr = &ctx->fcsr;
  236. return _restore_fp_context(regs, fcc, fcsr);
  237. }
  238. static int save_hw_lsx_context(struct lsx_context __user *ctx)
  239. {
  240. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  241. uint64_t __user *fcc = &ctx->fcc;
  242. uint32_t __user *fcsr = &ctx->fcsr;
  243. return _save_lsx_context(regs, fcc, fcsr);
  244. }
  245. static int restore_hw_lsx_context(struct lsx_context __user *ctx)
  246. {
  247. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  248. uint64_t __user *fcc = &ctx->fcc;
  249. uint32_t __user *fcsr = &ctx->fcsr;
  250. return _restore_lsx_context(regs, fcc, fcsr);
  251. }
  252. static int save_hw_lasx_context(struct lasx_context __user *ctx)
  253. {
  254. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  255. uint64_t __user *fcc = &ctx->fcc;
  256. uint32_t __user *fcsr = &ctx->fcsr;
  257. return _save_lasx_context(regs, fcc, fcsr);
  258. }
  259. static int restore_hw_lasx_context(struct lasx_context __user *ctx)
  260. {
  261. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  262. uint64_t __user *fcc = &ctx->fcc;
  263. uint32_t __user *fcsr = &ctx->fcsr;
  264. return _restore_lasx_context(regs, fcc, fcsr);
  265. }
  266. /*
  267. * Wrappers for the assembly _{save,restore}_lbt_context functions.
  268. */
  269. #ifdef CONFIG_CPU_HAS_LBT
  270. static int save_hw_lbt_context(struct lbt_context __user *ctx)
  271. {
  272. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  273. uint32_t __user *eflags = (uint32_t *)&ctx->eflags;
  274. return _save_lbt_context(regs, eflags);
  275. }
  276. static int restore_hw_lbt_context(struct lbt_context __user *ctx)
  277. {
  278. uint64_t __user *regs = (uint64_t *)&ctx->regs;
  279. uint32_t __user *eflags = (uint32_t *)&ctx->eflags;
  280. return _restore_lbt_context(regs, eflags);
  281. }
  282. static int save_hw_ftop_context(struct lbt_context __user *ctx)
  283. {
  284. uint32_t __user *ftop = &ctx->ftop;
  285. return _save_ftop_context(ftop);
  286. }
  287. static int restore_hw_ftop_context(struct lbt_context __user *ctx)
  288. {
  289. uint32_t __user *ftop = &ctx->ftop;
  290. return _restore_ftop_context(ftop);
  291. }
  292. #endif
  293. static int fcsr_pending(unsigned int __user *fcsr)
  294. {
  295. int err, sig = 0;
  296. unsigned int csr, enabled;
  297. err = __get_user(csr, fcsr);
  298. enabled = ((csr & FPU_CSR_ALL_E) << 24);
  299. /*
  300. * If the signal handler set some FPU exceptions, clear it and
  301. * send SIGFPE.
  302. */
  303. if (csr & enabled) {
  304. csr &= ~enabled;
  305. err |= __put_user(csr, fcsr);
  306. sig = SIGFPE;
  307. }
  308. return err ?: sig;
  309. }
  310. /*
  311. * Helper routines
  312. */
  313. static int protected_save_fpu_context(struct extctx_layout *extctx)
  314. {
  315. int err = 0;
  316. struct sctx_info __user *info = extctx->fpu.addr;
  317. struct fpu_context __user *fpu_ctx = (struct fpu_context *)get_ctx_through_ctxinfo(info);
  318. uint64_t __user *regs = (uint64_t *)&fpu_ctx->regs;
  319. uint64_t __user *fcc = &fpu_ctx->fcc;
  320. uint32_t __user *fcsr = &fpu_ctx->fcsr;
  321. while (1) {
  322. lock_fpu_owner();
  323. if (is_fpu_owner())
  324. err = save_hw_fpu_context(fpu_ctx);
  325. else
  326. err = copy_fpu_to_sigcontext(fpu_ctx);
  327. unlock_fpu_owner();
  328. err |= __put_user(FPU_CTX_MAGIC, &info->magic);
  329. err |= __put_user(extctx->fpu.size, &info->size);
  330. if (likely(!err))
  331. break;
  332. /* Touch the FPU context and try again */
  333. err = __put_user(0, &regs[0]) |
  334. __put_user(0, &regs[31]) |
  335. __put_user(0, fcc) |
  336. __put_user(0, fcsr);
  337. if (err)
  338. return err; /* really bad sigcontext */
  339. }
  340. return err;
  341. }
  342. static int protected_restore_fpu_context(struct extctx_layout *extctx)
  343. {
  344. int err = 0, sig = 0, tmp __maybe_unused;
  345. struct sctx_info __user *info = extctx->fpu.addr;
  346. struct fpu_context __user *fpu_ctx = (struct fpu_context *)get_ctx_through_ctxinfo(info);
  347. uint64_t __user *regs = (uint64_t *)&fpu_ctx->regs;
  348. uint64_t __user *fcc = &fpu_ctx->fcc;
  349. uint32_t __user *fcsr = &fpu_ctx->fcsr;
  350. err = sig = fcsr_pending(fcsr);
  351. if (err < 0)
  352. return err;
  353. while (1) {
  354. lock_fpu_owner();
  355. if (is_fpu_owner())
  356. err = restore_hw_fpu_context(fpu_ctx);
  357. else
  358. err = copy_fpu_from_sigcontext(fpu_ctx);
  359. unlock_fpu_owner();
  360. if (likely(!err))
  361. break;
  362. /* Touch the FPU context and try again */
  363. err = __get_user(tmp, &regs[0]) |
  364. __get_user(tmp, &regs[31]) |
  365. __get_user(tmp, fcc) |
  366. __get_user(tmp, fcsr);
  367. if (err)
  368. break; /* really bad sigcontext */
  369. }
  370. return err ?: sig;
  371. }
  372. static int protected_save_lsx_context(struct extctx_layout *extctx)
  373. {
  374. int err = 0;
  375. struct sctx_info __user *info = extctx->lsx.addr;
  376. struct lsx_context __user *lsx_ctx = (struct lsx_context *)get_ctx_through_ctxinfo(info);
  377. uint64_t __user *regs = (uint64_t *)&lsx_ctx->regs;
  378. uint64_t __user *fcc = &lsx_ctx->fcc;
  379. uint32_t __user *fcsr = &lsx_ctx->fcsr;
  380. while (1) {
  381. lock_fpu_owner();
  382. if (is_lsx_enabled())
  383. err = save_hw_lsx_context(lsx_ctx);
  384. else {
  385. if (is_fpu_owner())
  386. save_fp(current);
  387. err = copy_lsx_to_sigcontext(lsx_ctx);
  388. }
  389. unlock_fpu_owner();
  390. err |= __put_user(LSX_CTX_MAGIC, &info->magic);
  391. err |= __put_user(extctx->lsx.size, &info->size);
  392. if (likely(!err))
  393. break;
  394. /* Touch the LSX context and try again */
  395. err = __put_user(0, &regs[0]) |
  396. __put_user(0, &regs[32*2-1]) |
  397. __put_user(0, fcc) |
  398. __put_user(0, fcsr);
  399. if (err)
  400. return err; /* really bad sigcontext */
  401. }
  402. return err;
  403. }
  404. static int protected_restore_lsx_context(struct extctx_layout *extctx)
  405. {
  406. int err = 0, sig = 0, tmp __maybe_unused;
  407. struct sctx_info __user *info = extctx->lsx.addr;
  408. struct lsx_context __user *lsx_ctx = (struct lsx_context *)get_ctx_through_ctxinfo(info);
  409. uint64_t __user *regs = (uint64_t *)&lsx_ctx->regs;
  410. uint64_t __user *fcc = &lsx_ctx->fcc;
  411. uint32_t __user *fcsr = &lsx_ctx->fcsr;
  412. err = sig = fcsr_pending(fcsr);
  413. if (err < 0)
  414. return err;
  415. while (1) {
  416. lock_fpu_owner();
  417. if (is_lsx_enabled())
  418. err = restore_hw_lsx_context(lsx_ctx);
  419. else {
  420. err = copy_lsx_from_sigcontext(lsx_ctx);
  421. if (is_fpu_owner())
  422. restore_fp(current);
  423. }
  424. unlock_fpu_owner();
  425. if (likely(!err))
  426. break;
  427. /* Touch the LSX context and try again */
  428. err = __get_user(tmp, &regs[0]) |
  429. __get_user(tmp, &regs[32*2-1]) |
  430. __get_user(tmp, fcc) |
  431. __get_user(tmp, fcsr);
  432. if (err)
  433. break; /* really bad sigcontext */
  434. }
  435. return err ?: sig;
  436. }
  437. static int protected_save_lasx_context(struct extctx_layout *extctx)
  438. {
  439. int err = 0;
  440. struct sctx_info __user *info = extctx->lasx.addr;
  441. struct lasx_context __user *lasx_ctx =
  442. (struct lasx_context *)get_ctx_through_ctxinfo(info);
  443. uint64_t __user *regs = (uint64_t *)&lasx_ctx->regs;
  444. uint64_t __user *fcc = &lasx_ctx->fcc;
  445. uint32_t __user *fcsr = &lasx_ctx->fcsr;
  446. while (1) {
  447. lock_fpu_owner();
  448. if (is_lasx_enabled())
  449. err = save_hw_lasx_context(lasx_ctx);
  450. else {
  451. if (is_lsx_enabled())
  452. save_lsx(current);
  453. else if (is_fpu_owner())
  454. save_fp(current);
  455. err = copy_lasx_to_sigcontext(lasx_ctx);
  456. }
  457. unlock_fpu_owner();
  458. err |= __put_user(LASX_CTX_MAGIC, &info->magic);
  459. err |= __put_user(extctx->lasx.size, &info->size);
  460. if (likely(!err))
  461. break;
  462. /* Touch the LASX context and try again */
  463. err = __put_user(0, &regs[0]) |
  464. __put_user(0, &regs[32*4-1]) |
  465. __put_user(0, fcc) |
  466. __put_user(0, fcsr);
  467. if (err)
  468. return err; /* really bad sigcontext */
  469. }
  470. return err;
  471. }
  472. static int protected_restore_lasx_context(struct extctx_layout *extctx)
  473. {
  474. int err = 0, sig = 0, tmp __maybe_unused;
  475. struct sctx_info __user *info = extctx->lasx.addr;
  476. struct lasx_context __user *lasx_ctx =
  477. (struct lasx_context *)get_ctx_through_ctxinfo(info);
  478. uint64_t __user *regs = (uint64_t *)&lasx_ctx->regs;
  479. uint64_t __user *fcc = &lasx_ctx->fcc;
  480. uint32_t __user *fcsr = &lasx_ctx->fcsr;
  481. err = sig = fcsr_pending(fcsr);
  482. if (err < 0)
  483. return err;
  484. while (1) {
  485. lock_fpu_owner();
  486. if (is_lasx_enabled())
  487. err = restore_hw_lasx_context(lasx_ctx);
  488. else {
  489. err = copy_lasx_from_sigcontext(lasx_ctx);
  490. if (is_lsx_enabled())
  491. restore_lsx(current);
  492. else if (is_fpu_owner())
  493. restore_fp(current);
  494. }
  495. unlock_fpu_owner();
  496. if (likely(!err))
  497. break;
  498. /* Touch the LASX context and try again */
  499. err = __get_user(tmp, &regs[0]) |
  500. __get_user(tmp, &regs[32*4-1]) |
  501. __get_user(tmp, fcc) |
  502. __get_user(tmp, fcsr);
  503. if (err)
  504. break; /* really bad sigcontext */
  505. }
  506. return err ?: sig;
  507. }
  508. #ifdef CONFIG_CPU_HAS_LBT
  509. static int protected_save_lbt_context(struct extctx_layout *extctx)
  510. {
  511. int err = 0;
  512. struct sctx_info __user *info = extctx->lbt.addr;
  513. struct lbt_context __user *lbt_ctx =
  514. (struct lbt_context *)get_ctx_through_ctxinfo(info);
  515. uint64_t __user *regs = (uint64_t *)&lbt_ctx->regs;
  516. uint32_t __user *eflags = (uint32_t *)&lbt_ctx->eflags;
  517. while (1) {
  518. lock_lbt_owner();
  519. if (is_lbt_owner())
  520. err |= save_hw_lbt_context(lbt_ctx);
  521. else
  522. err |= copy_lbt_to_sigcontext(lbt_ctx);
  523. if (is_fpu_owner())
  524. err |= save_hw_ftop_context(lbt_ctx);
  525. else
  526. err |= copy_ftop_to_sigcontext(lbt_ctx);
  527. unlock_lbt_owner();
  528. err |= __put_user(LBT_CTX_MAGIC, &info->magic);
  529. err |= __put_user(extctx->lbt.size, &info->size);
  530. if (likely(!err))
  531. break;
  532. /* Touch the LBT context and try again */
  533. err = __put_user(0, &regs[0]) | __put_user(0, eflags);
  534. if (err)
  535. return err;
  536. }
  537. return err;
  538. }
  539. static int protected_restore_lbt_context(struct extctx_layout *extctx)
  540. {
  541. int err = 0, tmp __maybe_unused;
  542. struct sctx_info __user *info = extctx->lbt.addr;
  543. struct lbt_context __user *lbt_ctx =
  544. (struct lbt_context *)get_ctx_through_ctxinfo(info);
  545. uint64_t __user *regs = (uint64_t *)&lbt_ctx->regs;
  546. uint32_t __user *eflags = (uint32_t *)&lbt_ctx->eflags;
  547. while (1) {
  548. lock_lbt_owner();
  549. if (is_lbt_owner())
  550. err |= restore_hw_lbt_context(lbt_ctx);
  551. else
  552. err |= copy_lbt_from_sigcontext(lbt_ctx);
  553. if (is_fpu_owner())
  554. err |= restore_hw_ftop_context(lbt_ctx);
  555. else
  556. err |= copy_ftop_from_sigcontext(lbt_ctx);
  557. unlock_lbt_owner();
  558. if (likely(!err))
  559. break;
  560. /* Touch the LBT context and try again */
  561. err = __get_user(tmp, &regs[0]) | __get_user(tmp, eflags);
  562. if (err)
  563. return err;
  564. }
  565. return err;
  566. }
  567. #endif
  568. static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
  569. struct extctx_layout *extctx)
  570. {
  571. int i, err = 0;
  572. struct sctx_info __user *info;
  573. err |= __put_user(regs->csr_era, &sc->sc_pc);
  574. err |= __put_user(extctx->flags, &sc->sc_flags);
  575. err |= __put_user(0, &sc->sc_regs[0]);
  576. for (i = 1; i < 32; i++)
  577. err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
  578. #ifdef CONFIG_CPU_HAS_LBT
  579. if (extctx->lbt.addr)
  580. err |= protected_save_lbt_context(extctx);
  581. #endif
  582. if (extctx->lasx.addr)
  583. err |= protected_save_lasx_context(extctx);
  584. else if (extctx->lsx.addr)
  585. err |= protected_save_lsx_context(extctx);
  586. else if (extctx->fpu.addr)
  587. err |= protected_save_fpu_context(extctx);
  588. /* Set the "end" magic */
  589. info = (struct sctx_info *)extctx->end.addr;
  590. err |= __put_user(0, &info->magic);
  591. err |= __put_user(0, &info->size);
  592. return err;
  593. }
  594. static int parse_extcontext(struct sigcontext __user *sc, struct extctx_layout *extctx)
  595. {
  596. int err = 0;
  597. unsigned int magic, size;
  598. struct sctx_info __user *info = (struct sctx_info __user *)&sc->sc_extcontext;
  599. while(1) {
  600. err |= __get_user(magic, &info->magic);
  601. err |= __get_user(size, &info->size);
  602. if (err)
  603. return err;
  604. switch (magic) {
  605. case 0: /* END */
  606. goto done;
  607. case FPU_CTX_MAGIC:
  608. if (size < (sizeof(struct sctx_info) +
  609. sizeof(struct fpu_context)))
  610. goto invalid;
  611. extctx->fpu.addr = info;
  612. break;
  613. case LSX_CTX_MAGIC:
  614. if (size < (sizeof(struct sctx_info) +
  615. sizeof(struct lsx_context)))
  616. goto invalid;
  617. extctx->lsx.addr = info;
  618. break;
  619. case LASX_CTX_MAGIC:
  620. if (size < (sizeof(struct sctx_info) +
  621. sizeof(struct lasx_context)))
  622. goto invalid;
  623. extctx->lasx.addr = info;
  624. break;
  625. case LBT_CTX_MAGIC:
  626. if (size < (sizeof(struct sctx_info) +
  627. sizeof(struct lbt_context)))
  628. goto invalid;
  629. extctx->lbt.addr = info;
  630. break;
  631. default:
  632. goto invalid;
  633. }
  634. info = (struct sctx_info *)((char *)info + size);
  635. }
  636. done:
  637. return 0;
  638. invalid:
  639. return -EINVAL;
  640. }
  641. static int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
  642. {
  643. int i, err = 0;
  644. struct extctx_layout extctx;
  645. memset(&extctx, 0, sizeof(struct extctx_layout));
  646. err = __get_user(extctx.flags, &sc->sc_flags);
  647. if (err)
  648. goto bad;
  649. err = parse_extcontext(sc, &extctx);
  650. if (err)
  651. goto bad;
  652. conditional_used_math(extctx.flags & SC_USED_FP);
  653. /*
  654. * The signal handler may have used FPU; give it up if the program
  655. * doesn't want it following sigreturn.
  656. */
  657. if (!(extctx.flags & SC_USED_FP))
  658. lose_fpu(0);
  659. /* Always make any pending restarted system calls return -EINTR */
  660. current->restart_block.fn = do_no_restart_syscall;
  661. err |= __get_user(regs->csr_era, &sc->sc_pc);
  662. for (i = 1; i < 32; i++)
  663. err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
  664. if (extctx.lasx.addr)
  665. err |= protected_restore_lasx_context(&extctx);
  666. else if (extctx.lsx.addr)
  667. err |= protected_restore_lsx_context(&extctx);
  668. else if (extctx.fpu.addr)
  669. err |= protected_restore_fpu_context(&extctx);
  670. #ifdef CONFIG_CPU_HAS_LBT
  671. if (extctx.lbt.addr)
  672. err |= protected_restore_lbt_context(&extctx);
  673. #endif
  674. bad:
  675. return err;
  676. }
  677. static unsigned int handle_flags(void)
  678. {
  679. unsigned int flags = 0;
  680. flags = used_math() ? SC_USED_FP : 0;
  681. switch (current->thread.error_code) {
  682. case 1:
  683. flags |= SC_ADDRERR_RD;
  684. break;
  685. case 2:
  686. flags |= SC_ADDRERR_WR;
  687. break;
  688. }
  689. return flags;
  690. }
  691. static unsigned long extframe_alloc(struct extctx_layout *extctx,
  692. struct _ctx_layout *layout,
  693. size_t size, unsigned int align, unsigned long base)
  694. {
  695. unsigned long new_base = base - size;
  696. new_base = round_down(new_base, (align < 16 ? 16 : align));
  697. new_base -= sizeof(struct sctx_info);
  698. layout->addr = (void *)new_base;
  699. layout->size = (unsigned int)(base - new_base);
  700. extctx->size += layout->size;
  701. return new_base;
  702. }
  703. static unsigned long setup_extcontext(struct extctx_layout *extctx, unsigned long sp)
  704. {
  705. unsigned long new_sp = sp;
  706. memset(extctx, 0, sizeof(struct extctx_layout));
  707. extctx->flags = handle_flags();
  708. /* Grow down, alloc "end" context info first. */
  709. new_sp -= sizeof(struct sctx_info);
  710. extctx->end.addr = (void *)new_sp;
  711. extctx->end.size = (unsigned int)sizeof(struct sctx_info);
  712. extctx->size += extctx->end.size;
  713. if (extctx->flags & SC_USED_FP) {
  714. if (cpu_has_lasx && thread_lasx_context_live())
  715. new_sp = extframe_alloc(extctx, &extctx->lasx,
  716. sizeof(struct lasx_context), LASX_CTX_ALIGN, new_sp);
  717. else if (cpu_has_lsx && thread_lsx_context_live())
  718. new_sp = extframe_alloc(extctx, &extctx->lsx,
  719. sizeof(struct lsx_context), LSX_CTX_ALIGN, new_sp);
  720. else if (cpu_has_fpu)
  721. new_sp = extframe_alloc(extctx, &extctx->fpu,
  722. sizeof(struct fpu_context), FPU_CTX_ALIGN, new_sp);
  723. }
  724. #ifdef CONFIG_CPU_HAS_LBT
  725. if (cpu_has_lbt && thread_lbt_context_live()) {
  726. new_sp = extframe_alloc(extctx, &extctx->lbt,
  727. sizeof(struct lbt_context), LBT_CTX_ALIGN, new_sp);
  728. }
  729. #endif
  730. return new_sp;
  731. }
  732. static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
  733. struct extctx_layout *extctx)
  734. {
  735. unsigned long sp;
  736. /* Default to using normal stack */
  737. sp = regs->regs[3];
  738. /*
  739. * If we are on the alternate signal stack and would overflow it, don't.
  740. * Return an always-bogus address instead so we will die with SIGSEGV.
  741. */
  742. if (on_sig_stack(sp) &&
  743. !likely(on_sig_stack(sp - sizeof(struct rt_sigframe))))
  744. return (void __user __force *)(-1UL);
  745. sp = sigsp(sp, ksig);
  746. sp = round_down(sp, 16);
  747. sp = setup_extcontext(extctx, sp);
  748. sp -= sizeof(struct rt_sigframe);
  749. if (!IS_ALIGNED(sp, 16))
  750. BUG();
  751. return (void __user *)sp;
  752. }
  753. /*
  754. * Atomically swap in the new signal mask, and wait for a signal.
  755. */
  756. SYSCALL_DEFINE0(rt_sigreturn)
  757. {
  758. int sig;
  759. sigset_t set;
  760. struct pt_regs *regs;
  761. struct rt_sigframe __user *frame;
  762. regs = current_pt_regs();
  763. frame = (struct rt_sigframe __user *)regs->regs[3];
  764. if (!access_ok(frame, sizeof(*frame)))
  765. goto badframe;
  766. if (__copy_from_user(&set, &frame->rs_uctx.uc_sigmask, sizeof(set)))
  767. goto badframe;
  768. set_current_blocked(&set);
  769. sig = restore_sigcontext(regs, &frame->rs_uctx.uc_mcontext);
  770. if (sig < 0)
  771. goto badframe;
  772. else if (sig)
  773. force_sig(sig);
  774. regs->regs[0] = 0; /* No syscall restarting */
  775. if (restore_altstack(&frame->rs_uctx.uc_stack))
  776. goto badframe;
  777. return regs->regs[4];
  778. badframe:
  779. force_sig(SIGSEGV);
  780. return 0;
  781. }
  782. static int setup_rt_frame(void *sig_return, struct ksignal *ksig,
  783. struct pt_regs *regs, sigset_t *set)
  784. {
  785. int err = 0;
  786. struct extctx_layout extctx;
  787. struct rt_sigframe __user *frame;
  788. frame = get_sigframe(ksig, regs, &extctx);
  789. if (!access_ok(frame, sizeof(*frame) + extctx.size))
  790. return -EFAULT;
  791. /* Create siginfo. */
  792. err |= copy_siginfo_to_user(&frame->rs_info, &ksig->info);
  793. /* Create the ucontext. */
  794. err |= __put_user(0, &frame->rs_uctx.uc_flags);
  795. err |= __put_user(NULL, &frame->rs_uctx.uc_link);
  796. err |= __save_altstack(&frame->rs_uctx.uc_stack, regs->regs[3]);
  797. err |= setup_sigcontext(regs, &frame->rs_uctx.uc_mcontext, &extctx);
  798. err |= __copy_to_user(&frame->rs_uctx.uc_sigmask, set, sizeof(*set));
  799. if (err)
  800. return -EFAULT;
  801. /*
  802. * Arguments to signal handler:
  803. *
  804. * a0 = signal number
  805. * a1 = pointer to siginfo
  806. * a2 = pointer to ucontext
  807. *
  808. * c0_era point to the signal handler, $r3 (sp) points to
  809. * the struct rt_sigframe.
  810. */
  811. regs->regs[4] = ksig->sig;
  812. regs->regs[5] = (unsigned long) &frame->rs_info;
  813. regs->regs[6] = (unsigned long) &frame->rs_uctx;
  814. regs->regs[3] = (unsigned long) frame;
  815. regs->regs[1] = (unsigned long) sig_return;
  816. regs->csr_era = (unsigned long) ksig->ka.sa.sa_handler;
  817. DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
  818. current->comm, current->pid,
  819. frame, regs->csr_era, regs->regs[1]);
  820. return 0;
  821. }
  822. static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
  823. {
  824. int ret;
  825. sigset_t *oldset = sigmask_to_save();
  826. void *vdso = current->mm->context.vdso;
  827. /* Are we from a system call? */
  828. if (regs->regs[0]) {
  829. switch (regs->regs[4]) {
  830. case -ERESTART_RESTARTBLOCK:
  831. case -ERESTARTNOHAND:
  832. regs->regs[4] = -EINTR;
  833. break;
  834. case -ERESTARTSYS:
  835. if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
  836. regs->regs[4] = -EINTR;
  837. break;
  838. }
  839. fallthrough;
  840. case -ERESTARTNOINTR:
  841. regs->regs[4] = regs->orig_a0;
  842. regs->csr_era -= 4;
  843. }
  844. regs->regs[0] = 0; /* Don't deal with this again. */
  845. }
  846. rseq_signal_deliver(ksig, regs);
  847. ret = setup_rt_frame(vdso + current->thread.vdso->offset_sigreturn, ksig, regs, oldset);
  848. signal_setup_done(ret, ksig, 0);
  849. }
  850. void arch_do_signal_or_restart(struct pt_regs *regs)
  851. {
  852. struct ksignal ksig;
  853. if (get_signal(&ksig)) {
  854. /* Whee! Actually deliver the signal. */
  855. handle_signal(&ksig, regs);
  856. return;
  857. }
  858. /* Are we from a system call? */
  859. if (regs->regs[0]) {
  860. switch (regs->regs[4]) {
  861. case -ERESTARTNOHAND:
  862. case -ERESTARTSYS:
  863. case -ERESTARTNOINTR:
  864. regs->regs[4] = regs->orig_a0;
  865. regs->csr_era -= 4;
  866. break;
  867. case -ERESTART_RESTARTBLOCK:
  868. regs->regs[4] = regs->orig_a0;
  869. regs->regs[11] = __NR_restart_syscall;
  870. regs->csr_era -= 4;
  871. break;
  872. }
  873. regs->regs[0] = 0; /* Don't deal with this again. */
  874. }
  875. /*
  876. * If there's no signal to deliver, we just put the saved sigmask
  877. * back
  878. */
  879. restore_saved_sigmask();
  880. }