0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/sched.h>
0012 #include <linux/kernel.h>
0013 #include <linux/signal.h>
0014 #include <linux/errno.h>
0015 #include <linux/wait.h>
0016 #include <linux/ptrace.h>
0017 #include <linux/unistd.h>
0018 #include <linux/mm.h>
0019 #include <linux/tty.h>
0020 #include <linux/binfmts.h>
0021 #include <linux/compat.h>
0022 #include <linux/bitops.h>
0023
0024 #include <linux/uaccess.h>
0025 #include <asm/ptrace.h>
0026 #include <asm/psrcompat.h>
0027 #include <asm/fpumacro.h>
0028 #include <asm/visasm.h>
0029 #include <asm/compat_signal.h>
0030 #include <asm/switch_to.h>
0031
0032 #include "sigutil.h"
0033 #include "kernel.h"
0034
0035
0036
0037
0038 #define SIGINFO_EXTRA_V8PLUS_MAGIC 0x130e269
0039 typedef struct {
0040 unsigned int g_upper[8];
0041 unsigned int o_upper[8];
0042 unsigned int asi;
0043 } siginfo_extra_v8plus_t;
0044
0045 struct signal_frame32 {
0046 struct sparc_stackf32 ss;
0047 __siginfo32_t info;
0048 u32 fpu_save;
0049 unsigned int insns[2];
0050 unsigned int extramask[_COMPAT_NSIG_WORDS - 1];
0051 unsigned int extra_size;
0052
0053 siginfo_extra_v8plus_t v8plus;
0054 u32 rwin_save;
0055 } __attribute__((aligned(8)));
0056
0057 struct rt_signal_frame32 {
0058 struct sparc_stackf32 ss;
0059 compat_siginfo_t info;
0060 struct pt_regs32 regs;
0061 compat_sigset_t mask;
0062 u32 fpu_save;
0063 unsigned int insns[2];
0064 compat_stack_t stack;
0065 unsigned int extra_size;
0066
0067 siginfo_extra_v8plus_t v8plus;
0068 u32 rwin_save;
0069 } __attribute__((aligned(8)));
0070
0071
0072
0073
0074
0075 static bool invalid_frame_pointer(void __user *fp, int fplen)
0076 {
0077 if ((((unsigned long) fp) & 15) ||
0078 ((unsigned long)fp) > 0x100000000ULL - fplen)
0079 return true;
0080 return false;
0081 }
0082
0083 void do_sigreturn32(struct pt_regs *regs)
0084 {
0085 struct signal_frame32 __user *sf;
0086 compat_uptr_t fpu_save;
0087 compat_uptr_t rwin_save;
0088 unsigned int psr, ufp;
0089 unsigned int pc, npc;
0090 sigset_t set;
0091 compat_sigset_t seta;
0092 int err, i;
0093
0094
0095 current->restart_block.fn = do_no_restart_syscall;
0096
0097 synchronize_user_stack();
0098
0099 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
0100 sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP];
0101
0102
0103 if (invalid_frame_pointer(sf, sizeof(*sf)))
0104 goto segv;
0105
0106 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP]))
0107 goto segv;
0108
0109 if (ufp & 0x7)
0110 goto segv;
0111
0112 if (__get_user(pc, &sf->info.si_regs.pc) ||
0113 __get_user(npc, &sf->info.si_regs.npc))
0114 goto segv;
0115
0116 if ((pc | npc) & 3)
0117 goto segv;
0118
0119 if (test_thread_flag(TIF_32BIT)) {
0120 pc &= 0xffffffff;
0121 npc &= 0xffffffff;
0122 }
0123 regs->tpc = pc;
0124 regs->tnpc = npc;
0125
0126
0127 err = __get_user(regs->y, &sf->info.si_regs.y);
0128 err |= __get_user(psr, &sf->info.si_regs.psr);
0129
0130 for (i = UREG_G1; i <= UREG_I7; i++)
0131 err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
0132 if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
0133 err |= __get_user(i, &sf->v8plus.g_upper[0]);
0134 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
0135 unsigned long asi;
0136
0137 for (i = UREG_G1; i <= UREG_I7; i++)
0138 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
0139 err |= __get_user(asi, &sf->v8plus.asi);
0140 regs->tstate &= ~TSTATE_ASI;
0141 regs->tstate |= ((asi & 0xffUL) << 24UL);
0142 }
0143 }
0144
0145
0146 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
0147 regs->tstate |= psr_to_tstate_icc(psr);
0148
0149
0150 pt_regs_clear_syscall(regs);
0151
0152 err |= __get_user(fpu_save, &sf->fpu_save);
0153 if (!err && fpu_save)
0154 err |= restore_fpu_state(regs, compat_ptr(fpu_save));
0155 err |= __get_user(rwin_save, &sf->rwin_save);
0156 if (!err && rwin_save) {
0157 if (restore_rwin_state(compat_ptr(rwin_save)))
0158 goto segv;
0159 }
0160 err |= __get_user(seta.sig[0], &sf->info.si_mask);
0161 err |= copy_from_user(&seta.sig[1], &sf->extramask,
0162 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
0163 if (err)
0164 goto segv;
0165
0166 set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
0167 set_current_blocked(&set);
0168 return;
0169
0170 segv:
0171 force_sig(SIGSEGV);
0172 }
0173
0174 asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
0175 {
0176 struct rt_signal_frame32 __user *sf;
0177 unsigned int psr, pc, npc, ufp;
0178 compat_uptr_t fpu_save;
0179 compat_uptr_t rwin_save;
0180 sigset_t set;
0181 int err, i;
0182
0183
0184 current->restart_block.fn = do_no_restart_syscall;
0185
0186 synchronize_user_stack();
0187 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
0188 sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
0189
0190
0191 if (invalid_frame_pointer(sf, sizeof(*sf)))
0192 goto segv;
0193
0194 if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
0195 goto segv;
0196
0197 if (ufp & 0x7)
0198 goto segv;
0199
0200 if (__get_user(pc, &sf->regs.pc) ||
0201 __get_user(npc, &sf->regs.npc))
0202 goto segv;
0203
0204 if ((pc | npc) & 3)
0205 goto segv;
0206
0207 if (test_thread_flag(TIF_32BIT)) {
0208 pc &= 0xffffffff;
0209 npc &= 0xffffffff;
0210 }
0211 regs->tpc = pc;
0212 regs->tnpc = npc;
0213
0214
0215 err = __get_user(regs->y, &sf->regs.y);
0216 err |= __get_user(psr, &sf->regs.psr);
0217
0218 for (i = UREG_G1; i <= UREG_I7; i++)
0219 err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]);
0220 if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
0221 err |= __get_user(i, &sf->v8plus.g_upper[0]);
0222 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
0223 unsigned long asi;
0224
0225 for (i = UREG_G1; i <= UREG_I7; i++)
0226 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
0227 err |= __get_user(asi, &sf->v8plus.asi);
0228 regs->tstate &= ~TSTATE_ASI;
0229 regs->tstate |= ((asi & 0xffUL) << 24UL);
0230 }
0231 }
0232
0233
0234 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
0235 regs->tstate |= psr_to_tstate_icc(psr);
0236
0237
0238 pt_regs_clear_syscall(regs);
0239
0240 err |= __get_user(fpu_save, &sf->fpu_save);
0241 if (!err && fpu_save)
0242 err |= restore_fpu_state(regs, compat_ptr(fpu_save));
0243 err |= get_compat_sigset(&set, &sf->mask);
0244 err |= compat_restore_altstack(&sf->stack);
0245 if (err)
0246 goto segv;
0247
0248 err |= __get_user(rwin_save, &sf->rwin_save);
0249 if (!err && rwin_save) {
0250 if (restore_rwin_state(compat_ptr(rwin_save)))
0251 goto segv;
0252 }
0253
0254 set_current_blocked(&set);
0255 return;
0256 segv:
0257 force_sig(SIGSEGV);
0258 }
0259
0260 static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
0261 {
0262 unsigned long sp;
0263
0264 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
0265 sp = regs->u_regs[UREG_FP];
0266
0267
0268
0269
0270
0271 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
0272 return (void __user *) -1L;
0273
0274
0275 sp = sigsp(sp, ksig) - framesize;
0276
0277
0278
0279
0280
0281
0282
0283 sp &= ~15UL;
0284
0285 return (void __user *) sp;
0286 }
0287
0288
0289
0290
0291
0292
0293
0294
0295 static void flush_signal_insns(unsigned long address)
0296 {
0297 unsigned long pstate, paddr;
0298 pte_t *ptep, pte;
0299 pgd_t *pgdp;
0300 p4d_t *p4dp;
0301 pud_t *pudp;
0302 pmd_t *pmdp;
0303
0304
0305 wmb();
0306
0307
0308
0309
0310
0311
0312
0313 __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
0314 __asm__ __volatile__("wrpr %0, %1, %%pstate"
0315 : : "r" (pstate), "i" (PSTATE_IE));
0316
0317 pgdp = pgd_offset(current->mm, address);
0318 if (pgd_none(*pgdp))
0319 goto out_irqs_on;
0320 p4dp = p4d_offset(pgdp, address);
0321 if (p4d_none(*p4dp))
0322 goto out_irqs_on;
0323 pudp = pud_offset(p4dp, address);
0324 if (pud_none(*pudp))
0325 goto out_irqs_on;
0326 pmdp = pmd_offset(pudp, address);
0327 if (pmd_none(*pmdp))
0328 goto out_irqs_on;
0329
0330 ptep = pte_offset_map(pmdp, address);
0331 pte = *ptep;
0332 if (!pte_present(pte))
0333 goto out_unmap;
0334
0335 paddr = (unsigned long) page_address(pte_page(pte));
0336
0337 __asm__ __volatile__("flush %0 + %1"
0338 :
0339 : "r" (paddr),
0340 "r" (address & (PAGE_SIZE - 1))
0341 : "memory");
0342
0343 out_unmap:
0344 pte_unmap(ptep);
0345 out_irqs_on:
0346 __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
0347
0348 }
0349
0350 static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,
0351 sigset_t *oldset)
0352 {
0353 struct signal_frame32 __user *sf;
0354 int i, err, wsaved;
0355 void __user *tail;
0356 int sigframe_size;
0357 u32 psr;
0358 compat_sigset_t seta;
0359
0360
0361 synchronize_user_stack();
0362 save_and_clear_fpu();
0363
0364 wsaved = get_thread_wsaved();
0365
0366 sigframe_size = sizeof(*sf);
0367 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
0368 sigframe_size += sizeof(__siginfo_fpu_t);
0369 if (wsaved)
0370 sigframe_size += sizeof(__siginfo_rwin_t);
0371
0372 sf = (struct signal_frame32 __user *)
0373 get_sigframe(ksig, regs, sigframe_size);
0374
0375 if (invalid_frame_pointer(sf, sigframe_size)) {
0376 if (show_unhandled_signals)
0377 pr_info("%s[%d] bad frame in setup_frame32: %08lx TPC %08lx O7 %08lx\n",
0378 current->comm, current->pid, (unsigned long)sf,
0379 regs->tpc, regs->u_regs[UREG_I7]);
0380 force_sigsegv(ksig->sig);
0381 return -EINVAL;
0382 }
0383
0384 tail = (sf + 1);
0385
0386
0387 if (test_thread_flag(TIF_32BIT)) {
0388 regs->tpc &= 0xffffffff;
0389 regs->tnpc &= 0xffffffff;
0390 }
0391 err = put_user(regs->tpc, &sf->info.si_regs.pc);
0392 err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
0393 err |= __put_user(regs->y, &sf->info.si_regs.y);
0394 psr = tstate_to_psr(regs->tstate);
0395 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
0396 psr |= PSR_EF;
0397 err |= __put_user(psr, &sf->info.si_regs.psr);
0398 for (i = 0; i < 16; i++)
0399 err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
0400 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
0401 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
0402 for (i = 1; i < 16; i++)
0403 err |= __put_user(((u32 *)regs->u_regs)[2*i],
0404 &sf->v8plus.g_upper[i]);
0405 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
0406 &sf->v8plus.asi);
0407
0408 if (psr & PSR_EF) {
0409 __siginfo_fpu_t __user *fp = tail;
0410 tail += sizeof(*fp);
0411 err |= save_fpu_state(regs, fp);
0412 err |= __put_user((u64)fp, &sf->fpu_save);
0413 } else {
0414 err |= __put_user(0, &sf->fpu_save);
0415 }
0416 if (wsaved) {
0417 __siginfo_rwin_t __user *rwp = tail;
0418 tail += sizeof(*rwp);
0419 err |= save_rwin_state(wsaved, rwp);
0420 err |= __put_user((u64)rwp, &sf->rwin_save);
0421 set_thread_wsaved(0);
0422 } else {
0423 err |= __put_user(0, &sf->rwin_save);
0424 }
0425
0426
0427 BUILD_BUG_ON(_NSIG_WORDS != 1);
0428 BUILD_BUG_ON(_COMPAT_NSIG_WORDS != 2);
0429 seta.sig[1] = (oldset->sig[0] >> 32);
0430 seta.sig[0] = oldset->sig[0];
0431
0432 err |= __put_user(seta.sig[0], &sf->info.si_mask);
0433 err |= __copy_to_user(sf->extramask, &seta.sig[1],
0434 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
0435
0436 if (!wsaved) {
0437 err |= raw_copy_in_user((u32 __user *)sf,
0438 (u32 __user *)(regs->u_regs[UREG_FP]),
0439 sizeof(struct reg_window32));
0440 } else {
0441 struct reg_window *rp;
0442
0443 rp = ¤t_thread_info()->reg_window[wsaved - 1];
0444 for (i = 0; i < 8; i++)
0445 err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
0446 for (i = 0; i < 6; i++)
0447 err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
0448 err |= __put_user(rp->ins[6], &sf->ss.fp);
0449 err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
0450 }
0451 if (err)
0452 return err;
0453
0454
0455 regs->u_regs[UREG_FP] = (unsigned long) sf;
0456 regs->u_regs[UREG_I0] = ksig->sig;
0457 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
0458 regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
0459
0460
0461 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
0462 regs->tnpc = (regs->tpc + 4);
0463 if (test_thread_flag(TIF_32BIT)) {
0464 regs->tpc &= 0xffffffff;
0465 regs->tnpc &= 0xffffffff;
0466 }
0467
0468
0469 if (ksig->ka.ka_restorer) {
0470 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
0471 } else {
0472 unsigned long address = ((unsigned long)&(sf->insns[0]));
0473
0474 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
0475
0476 err = __put_user(0x821020d8, &sf->insns[0]);
0477 err |= __put_user(0x91d02010, &sf->insns[1]);
0478 if (err)
0479 return err;
0480 flush_signal_insns(address);
0481 }
0482 return 0;
0483 }
0484
0485 static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,
0486 sigset_t *oldset)
0487 {
0488 struct rt_signal_frame32 __user *sf;
0489 int i, err, wsaved;
0490 void __user *tail;
0491 int sigframe_size;
0492 u32 psr;
0493
0494
0495 synchronize_user_stack();
0496 save_and_clear_fpu();
0497
0498 wsaved = get_thread_wsaved();
0499
0500 sigframe_size = sizeof(*sf);
0501 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
0502 sigframe_size += sizeof(__siginfo_fpu_t);
0503 if (wsaved)
0504 sigframe_size += sizeof(__siginfo_rwin_t);
0505
0506 sf = (struct rt_signal_frame32 __user *)
0507 get_sigframe(ksig, regs, sigframe_size);
0508
0509 if (invalid_frame_pointer(sf, sigframe_size)) {
0510 if (show_unhandled_signals)
0511 pr_info("%s[%d] bad frame in setup_rt_frame32: %08lx TPC %08lx O7 %08lx\n",
0512 current->comm, current->pid, (unsigned long)sf,
0513 regs->tpc, regs->u_regs[UREG_I7]);
0514 force_sigsegv(ksig->sig);
0515 return -EINVAL;
0516 }
0517
0518 tail = (sf + 1);
0519
0520
0521 if (test_thread_flag(TIF_32BIT)) {
0522 regs->tpc &= 0xffffffff;
0523 regs->tnpc &= 0xffffffff;
0524 }
0525 err = put_user(regs->tpc, &sf->regs.pc);
0526 err |= __put_user(regs->tnpc, &sf->regs.npc);
0527 err |= __put_user(regs->y, &sf->regs.y);
0528 psr = tstate_to_psr(regs->tstate);
0529 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
0530 psr |= PSR_EF;
0531 err |= __put_user(psr, &sf->regs.psr);
0532 for (i = 0; i < 16; i++)
0533 err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]);
0534 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
0535 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
0536 for (i = 1; i < 16; i++)
0537 err |= __put_user(((u32 *)regs->u_regs)[2*i],
0538 &sf->v8plus.g_upper[i]);
0539 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
0540 &sf->v8plus.asi);
0541
0542 if (psr & PSR_EF) {
0543 __siginfo_fpu_t __user *fp = tail;
0544 tail += sizeof(*fp);
0545 err |= save_fpu_state(regs, fp);
0546 err |= __put_user((u64)fp, &sf->fpu_save);
0547 } else {
0548 err |= __put_user(0, &sf->fpu_save);
0549 }
0550 if (wsaved) {
0551 __siginfo_rwin_t __user *rwp = tail;
0552 tail += sizeof(*rwp);
0553 err |= save_rwin_state(wsaved, rwp);
0554 err |= __put_user((u64)rwp, &sf->rwin_save);
0555 set_thread_wsaved(0);
0556 } else {
0557 err |= __put_user(0, &sf->rwin_save);
0558 }
0559
0560
0561 err |= copy_siginfo_to_user32(&sf->info, &ksig->info);
0562
0563
0564 err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
0565
0566 err |= put_compat_sigset(&sf->mask, oldset, sizeof(compat_sigset_t));
0567
0568 if (!wsaved) {
0569 err |= raw_copy_in_user((u32 __user *)sf,
0570 (u32 __user *)(regs->u_regs[UREG_FP]),
0571 sizeof(struct reg_window32));
0572 } else {
0573 struct reg_window *rp;
0574
0575 rp = ¤t_thread_info()->reg_window[wsaved - 1];
0576 for (i = 0; i < 8; i++)
0577 err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
0578 for (i = 0; i < 6; i++)
0579 err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
0580 err |= __put_user(rp->ins[6], &sf->ss.fp);
0581 err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
0582 }
0583 if (err)
0584 return err;
0585
0586
0587 regs->u_regs[UREG_FP] = (unsigned long) sf;
0588 regs->u_regs[UREG_I0] = ksig->sig;
0589 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
0590 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
0591
0592
0593 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
0594 regs->tnpc = (regs->tpc + 4);
0595 if (test_thread_flag(TIF_32BIT)) {
0596 regs->tpc &= 0xffffffff;
0597 regs->tnpc &= 0xffffffff;
0598 }
0599
0600
0601 if (ksig->ka.ka_restorer)
0602 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
0603 else {
0604 unsigned long address = ((unsigned long)&(sf->insns[0]));
0605
0606 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
0607
0608
0609 err |= __put_user(0x82102065, &sf->insns[0]);
0610
0611
0612 err |= __put_user(0x91d02010, &sf->insns[1]);
0613 if (err)
0614 return err;
0615
0616 flush_signal_insns(address);
0617 }
0618 return 0;
0619 }
0620
0621 static inline void handle_signal32(struct ksignal *ksig,
0622 struct pt_regs *regs)
0623 {
0624 sigset_t *oldset = sigmask_to_save();
0625 int err;
0626
0627 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
0628 err = setup_rt_frame32(ksig, regs, oldset);
0629 else
0630 err = setup_frame32(ksig, regs, oldset);
0631
0632 signal_setup_done(err, ksig, 0);
0633 }
0634
0635 static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
0636 struct sigaction *sa)
0637 {
0638 switch (regs->u_regs[UREG_I0]) {
0639 case ERESTART_RESTARTBLOCK:
0640 case ERESTARTNOHAND:
0641 no_system_call_restart:
0642 regs->u_regs[UREG_I0] = EINTR;
0643 regs->tstate |= TSTATE_ICARRY;
0644 break;
0645 case ERESTARTSYS:
0646 if (!(sa->sa_flags & SA_RESTART))
0647 goto no_system_call_restart;
0648 fallthrough;
0649 case ERESTARTNOINTR:
0650 regs->u_regs[UREG_I0] = orig_i0;
0651 regs->tpc -= 4;
0652 regs->tnpc -= 4;
0653 }
0654 }
0655
0656
0657
0658
0659
0660 void do_signal32(struct pt_regs * regs)
0661 {
0662 struct ksignal ksig;
0663 unsigned long orig_i0 = 0;
0664 int restart_syscall = 0;
0665 bool has_handler = get_signal(&ksig);
0666
0667 if (pt_regs_is_syscall(regs) &&
0668 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
0669 restart_syscall = 1;
0670 orig_i0 = regs->u_regs[UREG_G6];
0671 }
0672
0673 if (has_handler) {
0674 if (restart_syscall)
0675 syscall_restart32(orig_i0, regs, &ksig.ka.sa);
0676 handle_signal32(&ksig, regs);
0677 } else {
0678 if (restart_syscall) {
0679 switch (regs->u_regs[UREG_I0]) {
0680 case ERESTARTNOHAND:
0681 case ERESTARTSYS:
0682 case ERESTARTNOINTR:
0683
0684 regs->u_regs[UREG_I0] = orig_i0;
0685 regs->tpc -= 4;
0686 regs->tnpc -= 4;
0687 pt_regs_clear_syscall(regs);
0688 fallthrough;
0689 case ERESTART_RESTARTBLOCK:
0690 regs->u_regs[UREG_G1] = __NR_restart_syscall;
0691 regs->tpc -= 4;
0692 regs->tnpc -= 4;
0693 pt_regs_clear_syscall(regs);
0694 }
0695 }
0696 restore_saved_sigmask();
0697 }
0698 }
0699
0700 struct sigstack32 {
0701 u32 the_stack;
0702 int cur_status;
0703 };
0704
0705 asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
0706 {
0707 struct sigstack32 __user *ssptr =
0708 (struct sigstack32 __user *)((unsigned long)(u_ssptr));
0709 struct sigstack32 __user *ossptr =
0710 (struct sigstack32 __user *)((unsigned long)(u_ossptr));
0711 int ret = -EFAULT;
0712
0713
0714 if (ossptr) {
0715 if (put_user(current->sas_ss_sp + current->sas_ss_size,
0716 &ossptr->the_stack) ||
0717 __put_user(on_sig_stack(sp), &ossptr->cur_status))
0718 goto out;
0719 }
0720
0721
0722 if (ssptr) {
0723 u32 ss_sp;
0724
0725 if (get_user(ss_sp, &ssptr->the_stack))
0726 goto out;
0727
0728
0729
0730
0731 ret = -EPERM;
0732 if (current->sas_ss_sp && on_sig_stack(sp))
0733 goto out;
0734
0735
0736
0737
0738
0739 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
0740 current->sas_ss_size = SIGSTKSZ;
0741 }
0742
0743 ret = 0;
0744 out:
0745 return ret;
0746 }
0747
0748
0749
0750
0751
0752 static_assert(NSIGILL == 11);
0753 static_assert(NSIGFPE == 15);
0754 static_assert(NSIGSEGV == 9);
0755 static_assert(NSIGBUS == 5);
0756 static_assert(NSIGTRAP == 6);
0757 static_assert(NSIGCHLD == 6);
0758 static_assert(NSIGSYS == 2);
0759 static_assert(sizeof(compat_siginfo_t) == 128);
0760 static_assert(__alignof__(compat_siginfo_t) == 4);
0761 static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
0762 static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
0763 static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
0764 static_assert(offsetof(compat_siginfo_t, si_pid) == 0x0c);
0765 static_assert(offsetof(compat_siginfo_t, si_uid) == 0x10);
0766 static_assert(offsetof(compat_siginfo_t, si_tid) == 0x0c);
0767 static_assert(offsetof(compat_siginfo_t, si_overrun) == 0x10);
0768 static_assert(offsetof(compat_siginfo_t, si_status) == 0x14);
0769 static_assert(offsetof(compat_siginfo_t, si_utime) == 0x18);
0770 static_assert(offsetof(compat_siginfo_t, si_stime) == 0x1c);
0771 static_assert(offsetof(compat_siginfo_t, si_value) == 0x14);
0772 static_assert(offsetof(compat_siginfo_t, si_int) == 0x14);
0773 static_assert(offsetof(compat_siginfo_t, si_ptr) == 0x14);
0774 static_assert(offsetof(compat_siginfo_t, si_addr) == 0x0c);
0775 static_assert(offsetof(compat_siginfo_t, si_trapno) == 0x10);
0776 static_assert(offsetof(compat_siginfo_t, si_addr_lsb) == 0x10);
0777 static_assert(offsetof(compat_siginfo_t, si_lower) == 0x14);
0778 static_assert(offsetof(compat_siginfo_t, si_upper) == 0x18);
0779 static_assert(offsetof(compat_siginfo_t, si_pkey) == 0x14);
0780 static_assert(offsetof(compat_siginfo_t, si_perf_data) == 0x10);
0781 static_assert(offsetof(compat_siginfo_t, si_perf_type) == 0x14);
0782 static_assert(offsetof(compat_siginfo_t, si_perf_flags) == 0x18);
0783 static_assert(offsetof(compat_siginfo_t, si_band) == 0x0c);
0784 static_assert(offsetof(compat_siginfo_t, si_fd) == 0x10);