hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/arch/xtensa/kernel/signal.c
....@@ -185,13 +185,13 @@
185185 COPY(sar);
186186 #undef COPY
187187
188
- /* All registers were flushed to stack. Start with a prestine frame. */
188
+ /* All registers were flushed to stack. Start with a pristine frame. */
189189
190190 regs->wmask = 1;
191191 regs->windowbase = 0;
192192 regs->windowstart = 1;
193193
194
- regs->syscall = -1; /* disable syscall checks */
194
+ regs->syscall = NO_SYSCALL; /* disable syscall checks */
195195
196196 /* For PS, restore only PS.CALLINC.
197197 * Assume that all other bits are either the same as for the signal
....@@ -236,9 +236,9 @@
236236 * Do a signal return; undo the signal stack.
237237 */
238238
239
-asmlinkage long xtensa_rt_sigreturn(long a0, long a1, long a2, long a3,
240
- long a4, long a5, struct pt_regs *regs)
239
+asmlinkage long xtensa_rt_sigreturn(void)
241240 {
241
+ struct pt_regs *regs = current_pt_regs();
242242 struct rt_sigframe __user *frame;
243243 sigset_t set;
244244 int ret;
....@@ -251,7 +251,7 @@
251251
252252 frame = (struct rt_sigframe __user *) regs->areg[1];
253253
254
- if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
254
+ if (!access_ok(frame, sizeof(*frame)))
255255 goto badframe;
256256
257257 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
....@@ -270,7 +270,7 @@
270270 return ret;
271271
272272 badframe:
273
- force_sig(SIGSEGV, current);
273
+ force_sig(SIGSEGV);
274274 return 0;
275275 }
276276
....@@ -335,7 +335,8 @@
335335 {
336336 struct rt_sigframe *frame;
337337 int err = 0, sig = ksig->sig;
338
- unsigned long sp, ra, tp;
338
+ unsigned long sp, ra, tp, ps;
339
+ unsigned int base;
339340
340341 sp = regs->areg[1];
341342
....@@ -348,7 +349,7 @@
348349 if (regs->depc > 64)
349350 panic ("Double exception sys_sigreturn\n");
350351
351
- if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) {
352
+ if (!access_ok(frame, sizeof(*frame))) {
352353 return -EFAULT;
353354 }
354355
....@@ -385,17 +386,26 @@
385386
386387 /* Set up registers for signal handler; preserve the threadptr */
387388 tp = regs->threadptr;
389
+ ps = regs->ps;
388390 start_thread(regs, (unsigned long) ksig->ka.sa.sa_handler,
389391 (unsigned long) frame);
390392
391
- /* Set up a stack frame for a call4
392
- * Note: PS.CALLINC is set to one by start_thread
393
- */
394
- regs->areg[4] = (((unsigned long) ra) & 0x3fffffff) | 0x40000000;
395
- regs->areg[6] = (unsigned long) sig;
396
- regs->areg[7] = (unsigned long) &frame->info;
397
- regs->areg[8] = (unsigned long) &frame->uc;
393
+ /* Set up a stack frame for a call4 if userspace uses windowed ABI */
394
+ if (ps & PS_WOE_MASK) {
395
+ base = 4;
396
+ regs->areg[base] =
397
+ (((unsigned long) ra) & 0x3fffffff) | 0x40000000;
398
+ ps = (ps & ~(PS_CALLINC_MASK | PS_OWB_MASK)) |
399
+ (1 << PS_CALLINC_SHIFT);
400
+ } else {
401
+ base = 0;
402
+ regs->areg[base] = (unsigned long) ra;
403
+ }
404
+ regs->areg[base + 2] = (unsigned long) sig;
405
+ regs->areg[base + 3] = (unsigned long) &frame->info;
406
+ regs->areg[base + 4] = (unsigned long) &frame->uc;
398407 regs->threadptr = tp;
408
+ regs->ps = ps;
399409
400410 pr_debug("SIG rt deliver (%s:%d): signal=%d sp=%p pc=%08lx\n",
401411 current->comm, current->pid, sig, frame, regs->pc);
....@@ -423,7 +433,7 @@
423433
424434 /* Are we from a system call? */
425435
426
- if ((signed)regs->syscall >= 0) {
436
+ if (regs->syscall != NO_SYSCALL) {
427437
428438 /* If so, check system call restarting.. */
429439
....@@ -438,7 +448,7 @@
438448 regs->areg[2] = -EINTR;
439449 break;
440450 }
441
- /* fallthrough */
451
+ fallthrough;
442452 case -ERESTARTNOINTR:
443453 regs->areg[2] = regs->syscall;
444454 regs->pc -= 3;
....@@ -455,14 +465,14 @@
455465 /* Set up the stack frame */
456466 ret = setup_frame(&ksig, sigmask_to_save(), regs);
457467 signal_setup_done(ret, &ksig, 0);
458
- if (current->ptrace & PT_SINGLESTEP)
468
+ if (test_thread_flag(TIF_SINGLESTEP))
459469 task_pt_regs(current)->icountlevel = 1;
460470
461471 return;
462472 }
463473
464474 /* Did we come from a system call? */
465
- if ((signed) regs->syscall >= 0) {
475
+ if (regs->syscall != NO_SYSCALL) {
466476 /* Restart the system call - no handlers present */
467477 switch (regs->areg[2]) {
468478 case -ERESTARTNOHAND:
....@@ -481,16 +491,17 @@
481491 /* If there's no signal to deliver, we just restore the saved mask. */
482492 restore_saved_sigmask();
483493
484
- if (current->ptrace & PT_SINGLESTEP)
494
+ if (test_thread_flag(TIF_SINGLESTEP))
485495 task_pt_regs(current)->icountlevel = 1;
486496 return;
487497 }
488498
489499 void do_notify_resume(struct pt_regs *regs)
490500 {
491
- if (test_thread_flag(TIF_SIGPENDING))
501
+ if (test_thread_flag(TIF_SIGPENDING) ||
502
+ test_thread_flag(TIF_NOTIFY_SIGNAL))
492503 do_signal(regs);
493504
494
- if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME))
505
+ if (test_thread_flag(TIF_NOTIFY_RESUME))
495506 tracehook_notify_resume(regs);
496507 }