0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 #include <linux/signal.h>
0048 #include <linux/ptrace.h>
0049 #include <linux/personality.h>
0050 #include <linux/uaccess.h>
0051 #include <linux/syscalls.h>
0052 #include <linux/resume_user_mode.h>
0053 #include <linux/sched/task_stack.h>
0054
0055 #include <asm/ucontext.h>
0056
0057 struct rt_sigframe {
0058 struct siginfo info;
0059 struct ucontext uc;
0060 #define MAGIC_SIGALTSTK 0x07302004
0061 unsigned int sigret_magic;
0062 };
0063
0064 static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
0065 {
0066 int err = 0;
0067 #ifndef CONFIG_ISA_ARCOMPACT
0068 struct user_regs_arcv2 v2abi;
0069
0070 v2abi.r30 = regs->r30;
0071 #ifdef CONFIG_ARC_HAS_ACCL_REGS
0072 v2abi.r58 = regs->r58;
0073 v2abi.r59 = regs->r59;
0074 #else
0075 v2abi.r58 = v2abi.r59 = 0;
0076 #endif
0077 err = __copy_to_user(&mctx->v2abi, &v2abi, sizeof(v2abi));
0078 #endif
0079 return err;
0080 }
0081
0082 static int restore_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
0083 {
0084 int err = 0;
0085 #ifndef CONFIG_ISA_ARCOMPACT
0086 struct user_regs_arcv2 v2abi;
0087
0088 err = __copy_from_user(&v2abi, &mctx->v2abi, sizeof(v2abi));
0089
0090 regs->r30 = v2abi.r30;
0091 #ifdef CONFIG_ARC_HAS_ACCL_REGS
0092 regs->r58 = v2abi.r58;
0093 regs->r59 = v2abi.r59;
0094 #endif
0095 #endif
0096 return err;
0097 }
0098
0099 static int
0100 stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs,
0101 sigset_t *set)
0102 {
0103 int err;
0104 struct user_regs_struct uregs;
0105
0106 uregs.scratch.bta = regs->bta;
0107 uregs.scratch.lp_start = regs->lp_start;
0108 uregs.scratch.lp_end = regs->lp_end;
0109 uregs.scratch.lp_count = regs->lp_count;
0110 uregs.scratch.status32 = regs->status32;
0111 uregs.scratch.ret = regs->ret;
0112 uregs.scratch.blink = regs->blink;
0113 uregs.scratch.fp = regs->fp;
0114 uregs.scratch.gp = regs->r26;
0115 uregs.scratch.r12 = regs->r12;
0116 uregs.scratch.r11 = regs->r11;
0117 uregs.scratch.r10 = regs->r10;
0118 uregs.scratch.r9 = regs->r9;
0119 uregs.scratch.r8 = regs->r8;
0120 uregs.scratch.r7 = regs->r7;
0121 uregs.scratch.r6 = regs->r6;
0122 uregs.scratch.r5 = regs->r5;
0123 uregs.scratch.r4 = regs->r4;
0124 uregs.scratch.r3 = regs->r3;
0125 uregs.scratch.r2 = regs->r2;
0126 uregs.scratch.r1 = regs->r1;
0127 uregs.scratch.r0 = regs->r0;
0128 uregs.scratch.sp = regs->sp;
0129
0130 err = __copy_to_user(&(sf->uc.uc_mcontext.regs.scratch), &uregs.scratch,
0131 sizeof(sf->uc.uc_mcontext.regs.scratch));
0132
0133 if (is_isa_arcv2())
0134 err |= save_arcv2_regs(&(sf->uc.uc_mcontext), regs);
0135
0136 err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(sigset_t));
0137
0138 return err ? -EFAULT : 0;
0139 }
0140
0141 static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf)
0142 {
0143 sigset_t set;
0144 int err;
0145 struct user_regs_struct uregs;
0146
0147 err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set));
0148 err |= __copy_from_user(&uregs.scratch,
0149 &(sf->uc.uc_mcontext.regs.scratch),
0150 sizeof(sf->uc.uc_mcontext.regs.scratch));
0151
0152 if (is_isa_arcv2())
0153 err |= restore_arcv2_regs(&(sf->uc.uc_mcontext), regs);
0154
0155 if (err)
0156 return -EFAULT;
0157
0158 set_current_blocked(&set);
0159 regs->bta = uregs.scratch.bta;
0160 regs->lp_start = uregs.scratch.lp_start;
0161 regs->lp_end = uregs.scratch.lp_end;
0162 regs->lp_count = uregs.scratch.lp_count;
0163 regs->status32 = uregs.scratch.status32;
0164 regs->ret = uregs.scratch.ret;
0165 regs->blink = uregs.scratch.blink;
0166 regs->fp = uregs.scratch.fp;
0167 regs->r26 = uregs.scratch.gp;
0168 regs->r12 = uregs.scratch.r12;
0169 regs->r11 = uregs.scratch.r11;
0170 regs->r10 = uregs.scratch.r10;
0171 regs->r9 = uregs.scratch.r9;
0172 regs->r8 = uregs.scratch.r8;
0173 regs->r7 = uregs.scratch.r7;
0174 regs->r6 = uregs.scratch.r6;
0175 regs->r5 = uregs.scratch.r5;
0176 regs->r4 = uregs.scratch.r4;
0177 regs->r3 = uregs.scratch.r3;
0178 regs->r2 = uregs.scratch.r2;
0179 regs->r1 = uregs.scratch.r1;
0180 regs->r0 = uregs.scratch.r0;
0181 regs->sp = uregs.scratch.sp;
0182
0183 return 0;
0184 }
0185
0186 static inline int is_do_ss_needed(unsigned int magic)
0187 {
0188 if (MAGIC_SIGALTSTK == magic)
0189 return 1;
0190 else
0191 return 0;
0192 }
0193
0194 SYSCALL_DEFINE0(rt_sigreturn)
0195 {
0196 struct rt_sigframe __user *sf;
0197 unsigned int magic;
0198 struct pt_regs *regs = current_pt_regs();
0199
0200
0201 current->restart_block.fn = do_no_restart_syscall;
0202
0203
0204
0205
0206
0207 if (regs->sp & 3)
0208 goto badframe;
0209
0210 sf = (struct rt_sigframe __force __user *)(regs->sp);
0211
0212 if (!access_ok(sf, sizeof(*sf)))
0213 goto badframe;
0214
0215 if (__get_user(magic, &sf->sigret_magic))
0216 goto badframe;
0217
0218 if (unlikely(is_do_ss_needed(magic)))
0219 if (restore_altstack(&sf->uc.uc_stack))
0220 goto badframe;
0221
0222 if (restore_usr_regs(regs, sf))
0223 goto badframe;
0224
0225
0226 syscall_wont_restart(regs);
0227
0228
0229
0230
0231
0232
0233
0234
0235 regs->status32 |= STATUS_U_MASK;
0236
0237 return regs->r0;
0238
0239 badframe:
0240 force_sig(SIGSEGV);
0241 return 0;
0242 }
0243
0244
0245
0246
0247 static inline void __user *get_sigframe(struct ksignal *ksig,
0248 struct pt_regs *regs,
0249 unsigned long framesize)
0250 {
0251 unsigned long sp = sigsp(regs->sp, ksig);
0252 void __user *frame;
0253
0254
0255
0256
0257
0258
0259 frame = (void __user *)((sp - framesize) & ~7);
0260
0261
0262 if (!access_ok(frame, framesize))
0263 frame = NULL;
0264
0265 return frame;
0266 }
0267
0268 static int
0269 setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
0270 {
0271 struct rt_sigframe __user *sf;
0272 unsigned int magic = 0;
0273 int err = 0;
0274
0275 sf = get_sigframe(ksig, regs, sizeof(struct rt_sigframe));
0276 if (!sf)
0277 return 1;
0278
0279
0280
0281
0282
0283
0284
0285
0286 err |= stash_usr_regs(sf, regs, set);
0287
0288
0289
0290
0291
0292
0293
0294 if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) {
0295 err |= copy_siginfo_to_user(&sf->info, &ksig->info);
0296 err |= __put_user(0, &sf->uc.uc_flags);
0297 err |= __put_user(NULL, &sf->uc.uc_link);
0298 err |= __save_altstack(&sf->uc.uc_stack, regs->sp);
0299
0300
0301 regs->r1 = (unsigned long)&sf->info;
0302 regs->r2 = (unsigned long)&sf->uc;
0303
0304
0305
0306
0307
0308 magic = MAGIC_SIGALTSTK;
0309 }
0310
0311 err |= __put_user(magic, &sf->sigret_magic);
0312 if (err)
0313 return err;
0314
0315
0316 regs->r0 = ksig->sig;
0317
0318
0319 regs->ret = (unsigned long)ksig->ka.sa.sa_handler;
0320
0321
0322
0323
0324
0325 if(!(ksig->ka.sa.sa_flags & SA_RESTORER))
0326 return 1;
0327
0328 regs->blink = (unsigned long)ksig->ka.sa.sa_restorer;
0329
0330
0331 regs->sp = (unsigned long)sf;
0332
0333
0334
0335
0336
0337 regs->status32 &= ~STATUS_DE_MASK;
0338 regs->status32 |= STATUS_L_MASK;
0339
0340 return err;
0341 }
0342
0343 static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs)
0344 {
0345 switch (regs->r0) {
0346 case -ERESTART_RESTARTBLOCK:
0347 case -ERESTARTNOHAND:
0348
0349
0350
0351
0352
0353
0354 regs->r0 = -EINTR;
0355 break;
0356
0357 case -ERESTARTSYS:
0358
0359
0360
0361
0362
0363 if (!(ka->sa.sa_flags & SA_RESTART)) {
0364 regs->r0 = -EINTR;
0365 break;
0366 }
0367 fallthrough;
0368
0369 case -ERESTARTNOINTR:
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380 regs->r0 = regs->orig_r0;
0381 regs->ret -= is_isa_arcv2() ? 2 : 4;
0382 break;
0383 }
0384 }
0385
0386
0387
0388
0389 static void
0390 handle_signal(struct ksignal *ksig, struct pt_regs *regs)
0391 {
0392 sigset_t *oldset = sigmask_to_save();
0393 int failed;
0394
0395
0396 failed = setup_rt_frame(ksig, oldset, regs);
0397
0398 signal_setup_done(failed, ksig, 0);
0399 }
0400
0401 void do_signal(struct pt_regs *regs)
0402 {
0403 struct ksignal ksig;
0404 int restart_scall;
0405
0406 restart_scall = in_syscall(regs) && syscall_restartable(regs);
0407
0408 if (test_thread_flag(TIF_SIGPENDING) && get_signal(&ksig)) {
0409 if (restart_scall) {
0410 arc_restart_syscall(&ksig.ka, regs);
0411 syscall_wont_restart(regs);
0412 }
0413 handle_signal(&ksig, regs);
0414 return;
0415 }
0416
0417 if (restart_scall) {
0418
0419 if (regs->r0 == -ERESTARTNOHAND ||
0420 regs->r0 == -ERESTARTSYS || regs->r0 == -ERESTARTNOINTR) {
0421 regs->r0 = regs->orig_r0;
0422 regs->ret -= is_isa_arcv2() ? 2 : 4;
0423 } else if (regs->r0 == -ERESTART_RESTARTBLOCK) {
0424 regs->r8 = __NR_restart_syscall;
0425 regs->ret -= is_isa_arcv2() ? 2 : 4;
0426 }
0427 syscall_wont_restart(regs);
0428 }
0429
0430
0431 restore_saved_sigmask();
0432 }
0433
0434 void do_notify_resume(struct pt_regs *regs)
0435 {
0436
0437
0438
0439
0440 if (test_thread_flag(TIF_NOTIFY_RESUME))
0441 resume_user_mode_work(regs);
0442 }