static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe __user *frame; int err = 0; frame = get_sigframe(ka, regs); if (!frame) return 1; __put_user_error(0, &frame->uc.uc_flags, err); __put_user_error(0, &frame->uc.uc_link, err); err |= __save_altstack(&frame->uc.uc_stack, regs->sp); err |= setup_sigframe(frame, regs, set); if (err == 0) { setup_return(regs, ka, frame, usig); if (ka->sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, info); regs->regs[1] = (unsigned long)&frame->info; regs->regs[2] = (unsigned long)&frame->uc; } } return err; }
static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame)); int err = 0; if (!frame) return 1; err |= copy_siginfo_to_user(&frame->info, &ksig->info); __put_user_error(0, &frame->sig.uc.uc_flags, err); __put_user_error(NULL, &frame->sig.uc.uc_link, err); err |= __save_altstack(&frame->sig.uc.uc_stack, regs->ARM_sp); err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) err = setup_return(regs, ksig, frame->sig.retcode, frame); if (err == 0) { /* * For realtime signals we must also set the second and third * arguments for the signal handler. * -- Peter Maydell <*****@*****.**> 2000-12-06 */ regs->ARM_r1 = (unsigned long)&frame->info; regs->ARM_r2 = (unsigned long)&frame->sig.uc; } return err; }
static int setup_rt_frame(struct ksignal *ksig, sigset_t * set, struct pt_regs *regs) { struct rt_sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame)); int err = 0; if (!access_ok(frame, sizeof(*frame))) return -EFAULT; __put_user_error(0, &frame->uc.uc_flags, err); __put_user_error(NULL, &frame->uc.uc_link, err); err |= __save_altstack(&frame->uc.uc_stack, regs->sp); err |= setup_sigframe(frame, regs, set); if (err == 0) { setup_return(regs, ksig, frame); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->uregs[1] = (unsigned long)&frame->info; regs->uregs[2] = (unsigned long)&frame->uc; } } return err; }
static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); stack_t stack; int err = 0; if (!frame) return 1; err |= copy_siginfo_to_user(&frame->info, info); __put_user_error(0, &frame->sig.uc.uc_flags, err); __put_user_error(NULL, &frame->sig.uc.uc_link, err); memset(&stack, 0, sizeof(stack)); stack.ss_sp = (void __user *)current->sas_ss_sp; stack.ss_flags = sas_ss_flags(regs->ARM_sp); stack.ss_size = current->sas_ss_size; err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) err = setup_return(regs, ka, frame->sig.retcode, frame, usig); if (err == 0) { regs->ARM_r1 = (unsigned long)&frame->info; regs->ARM_r2 = (unsigned long)&frame->sig.uc; } return err; }
static int setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) { struct sigframe *frame = get_sigframe(ka, regs, sizeof(*frame)); int err = 0; preempt_disable(); if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) { preempt_enable(); return 1; } err |= setup_sigcontext(&frame->sc, /*&frame->fpstate,*/ regs, set->sig[0]); if (_NSIG_WORDS > 1) { err |= __copy_to_user(frame->extramask, &set->sig[1], sizeof(frame->extramask)); } if (err == 0) err = setup_return(regs, ka, &frame->retcode, frame, usig); preempt_enable(); return err; }
static void setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct exregs_regs *regs) { struct sigframe *frame = get_sigframe(ka, regs, sizeof(*frame)); unsigned long handler = (unsigned long)ka->sa.sa_handler; int err = 0; printk_dbg("%s called\n", __func__); if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) goto badframe; err |= setup_sigcontext(&frame->sc, /*&frame->fpstate,*/ regs, set->sig[0]); if (_NSIG_WORDS > 1) { err |= __copy_to_user(frame->extramask, &set->sig[1], sizeof(frame->extramask)); } err |= __put_user(handler, &frame->sig_ip); printk_dbg("%s frame->sig_ip = %lx\n", __func__, handler); if (!err) err = setup_return(regs, ka, &frame->retcode, frame, &frame->lr, &frame->usig, usig); if (err) goto badframe; regs->ip = TASK_SIG_BASE; switch (regs->syscall_action) { case 1: /* Syscall */ regs->ip += ((unsigned long)&__wombat_user_sigentry) & ~PAGE_MASK; break; case 0: /* Fault */ case 2: /* Restart syscall */ regs->ip += ((unsigned long)&__wombat_user_sigentry_restart) & ~PAGE_MASK; break; case 4: /* Interrupt syscall */ regs->ip += ((unsigned long)&__wombat_user_sigentry_int) & ~PAGE_MASK; break; default: BUG(); } set_need_restart(current_thread_info(), regs->ip, regs->sp, regs->flags); printk_dbg("SIG deliver (%s:%d:%lx): sp=%p pc=%p\n", current->comm, current->pid, current_thread_info()->user_tid.raw, frame, (void*)regs->ip); return; badframe: force_sigsegv(usig, current); return; }
static int setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) { struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); int err = 0; if (!frame) return 1; __put_user_error(0x5ac3c35a, &frame->uc.uc_flags, err); err |= setup_sigframe(frame, regs, set); if (err == 0) err = setup_return(regs, ka, frame->retcode, frame, usig); return err; }
static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); stack_t stack; int err = 0; if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) return 1; __put_user_error(&frame->info, &frame->pinfo, err); __put_user_error(&frame->uc, &frame->puc, err); err |= copy_siginfo_to_user(&frame->info, info); __put_user_error(0, &frame->uc.uc_flags, err); __put_user_error(NULL, &frame->uc.uc_link, err); memset(&stack, 0, sizeof(stack)); stack.ss_sp = (void *)current->sas_ss_sp; stack.ss_flags = sas_ss_flags(regs->ARM_sp); stack.ss_size = current->sas_ss_size; err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack)); err |= setup_sigcontext(&frame->uc.uc_mcontext, /*&frame->fpstate,*/ regs, set->sig[0]); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); if (err == 0) err = setup_return(regs, ka, &frame->retcode, frame, usig); if (err == 0) { /* * For realtime signals we must also set the second and third * arguments for the signal handler. * -- Peter Maydell <*****@*****.**> 2000-12-06 */ regs->ARM_r1 = (unsigned long)&frame->info; regs->ARM_r2 = (unsigned long)&frame->uc; } return err; }
static int setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) { struct sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame)); int err = 0; if (!frame) return 1; /* * Set uc.uc_flags to a value which sc.trap_no would never have. */ __put_user_error(0x5ac3c35a, &frame->uc.uc_flags, err); err |= setup_sigframe(frame, regs, set); if (err == 0) err = setup_return(regs, ksig, frame->retcode, frame); return err; }
static int setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) { struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); int err = 0; if (!frame) return 1; /* * Set uc.uc_flags to a value which sc.trap_no would never have. */ err |= __put_user(0x5ac3c35a, &frame->uc.uc_flags); err |= setup_sigframe(frame, regs, set); if (err == 0) err |= setup_return(regs, ka, frame->retcode, frame, usig); return err; }
static int setup_frame(int usig, struct k_sigaction* ka,sigset_t* set,struct pt_regs* regs) { struct sigframe __user *frame=get_sigframe(ka,regs,sizeof(struct sigframe)); int err=0; if(!frame) { return 1; } err |= setup_sigcontext(&frame->sc,regs,set->sig[0]); if(_NSIG_WORDS >1) { err |= __copy_to_user(frame->extramask,&set->sig[1], sizeof(frame->extramask)); } if(err == 0) { err=setup_return(regs,frame,ka,usig); } return err; }
static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); stack_t stack; int err = 0; if (!frame) return 1; err |= copy_siginfo_to_user(&frame->info, info); err |= __put_user(0, &frame->sig.uc.uc_flags); err |= __put_user(NULL, &frame->sig.uc.uc_link); memset(&stack, 0, sizeof(stack)); stack.ss_sp = (void __user *)current->sas_ss_sp; stack.ss_flags = sas_ss_flags(regs->UCreg_sp); stack.ss_size = current->sas_ss_size; err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) err |= setup_return(regs, ka, frame->sig.retcode, frame, usig); if (err == 0) { /* * For realtime signals we must also set the second and third * arguments for the signal handler. */ regs->UCreg_01 = (unsigned long)&frame->info; regs->UCreg_02 = (unsigned long)&frame->sig.uc; } return err; }
static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe *frame = get_sigframe(ka, regs, sizeof(*frame)); int err = 0; if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) return 1; preempt_disable(); __put_user_error(&frame->info, &frame->pinfo, err); __put_user_error(&frame->uc, &frame->puc, err); err |= copy_siginfo_to_user(&frame->info, info); /* Clear all the bits of the ucontext we don't use. */ err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); err |= setup_sigcontext(&frame->uc.uc_mcontext, /*&frame->fpstate,*/ regs, set->sig[0]); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); if (err == 0) err = setup_return(regs, ka, &frame->retcode, frame, usig); if (err == 0) { /* * For realtime signals we must also set the second and third * arguments for the signal handler. * -- Peter Maydell <*****@*****.**> 2000-12-06 */ regs->ARM_r1 = (unsigned long)&frame->info; regs->ARM_r2 = (unsigned long)&frame->uc; } preempt_enable(); return err; }
static void setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct exregs_regs *regs) { struct rt_sigframe *frame = get_sigframe(ka, regs, sizeof(*frame)); unsigned long handler = (unsigned long)ka->sa.sa_handler; int err = 0; printk_dbg("%s called\n", __func__); if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) goto badframe; __put_user_error(&frame->info, &frame->pinfo, err); __put_user_error(&frame->uc, &frame->puc, err); err |= copy_siginfo_to_user(&frame->info, info); /* Clear all the bits of the ucontext we don't use. */ err |= clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); err |= setup_sigcontext(&frame->uc.uc_mcontext, /*&frame->fpstate,*/ regs, set->sig[0]); err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __put_user(handler, &frame->sig_ip); printk_dbg("%s frame->sig_ip = %lx\n", __func__, handler); if (!err) err = setup_return(regs, ka, &frame->retcode, frame, &frame->lr, &frame->usig, usig); if (!err) { /* * For realtime signals we must also set the second and third * arguments for the signal handler. * -- Peter Maydell <*****@*****.**> 2000-12-06 */ // ARM_put_r1(regs, (unsigned long)frame->pinfo); // ARM_put_r2(regs, (unsigned long)frame->puc); } if (err) goto badframe; regs->ip = TASK_SIG_BASE; switch (regs->syscall_action) { case 1: /* Syscall */ regs->ip += ((unsigned long)&__wombat_user_rt_sigentry) & ~PAGE_MASK; break; case 0: /* Fault */ case 2: /* Restart syscall */ regs->ip += ((unsigned long)&__wombat_user_rt_sigentry_restart) & ~PAGE_MASK; break; case 4: /* Interrupt syscall */ regs->ip += ((unsigned long)&__wombat_user_rt_sigentry_int) & ~PAGE_MASK; break; default: BUG(); } set_need_restart(current_thread_info(), regs->ip, regs->sp, regs->flags); printk_dbg("SIG rt deliver (%s:%d:%lx): sp=%p pc=%p\n", current->comm, current->pid, current_thread_info()->user_tid.raw, frame, (void*)regs->ip); return; badframe: force_sigsegv(usig, current); return; }
void set_parent_info(JITMethodInfo& info) { parent_info_ = &info; setup_return(); }