static int restore_sigcontext(struct sigcontext __user *sc, int *_gr8) { struct user_context *user = current->thread.user; unsigned long tbr, psr; /* Always make any pending restarted system calls return -EINTR */ current_thread_info()->restart_block.fn = do_no_restart_syscall; tbr = user->i.tbr; psr = user->i.psr; if (copy_from_user(user, &sc->sc_context, sizeof(sc->sc_context))) goto badframe; user->i.tbr = tbr; user->i.psr = psr; restore_user_regs(user); user->i.syscallno = -1; /* disable syscall checks */ *_gr8 = user->i.gr[8]; return 0; badframe: return 1; }
/* * Do a signal return; undo the signal stack. */ int sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8, struct pt_regs *regs) { struct sigcontext __user *sc; struct sigcontext sigctx; struct mcontext __user *sr; sigset_t set; /* Always make any pending restarted system calls return -EINTR */ current_thread_info()->restart_block.fn = do_no_restart_syscall; sc = (struct sigcontext __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE); if (copy_from_user(&sigctx, sc, sizeof(sigctx))) goto badframe; set.sig[0] = sigctx.oldmask; set.sig[1] = sigctx._unused[3]; restore_sigmask(&set); sr = (struct mcontext *) sigctx.regs; if (verify_area(VERIFY_READ, sr, sizeof(*sr)) || restore_user_regs(regs, sr, 1)) goto badframe; sigreturn_exit(regs); /* doesn't return */ return 0; badframe: force_sig(SIGSEGV, current); return 0; }
static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig) { sigset_t set; struct mcontext __user *mcp; if (__copy_from_user(&set, &ucp->uc_sigmask, sizeof(set)) || __get_user(mcp, &ucp->uc_regs)) return -EFAULT; restore_sigmask(&set); if (restore_user_regs(regs, mcp, sig)) return -EFAULT; return 0; }
static int restore_sigcontext(struct sigcontext __user *sc, int *_gr8) { struct user_context *user = current->thread.user; unsigned long tbr, psr; tbr = user->i.tbr; psr = user->i.psr; if (copy_from_user(user, &sc->sc_context, sizeof(sc->sc_context))) goto badframe; user->i.tbr = tbr; user->i.psr = psr; restore_user_regs(user); user->i.syscallno = -1; /* disable syscall checks */ *_gr8 = user->i.gr[8]; return 0; badframe: return 1; }