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