static void setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) { struct sigframe *frame; int err = 0; int signal; frame = get_sigframe(ka, regs->areg[1], sizeof(*frame)); if (regs->depc > 64) { printk("!!!!!!! DEPC !!!!!!!\n"); return; } if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) goto give_sigsegv; signal = current_thread_info()->exec_domain && current_thread_info()->exec_domain->signal_invmap && sig < 32 ? current_thread_info()->exec_domain->signal_invmap[sig] : sig; err |= setup_sigcontext(&frame->sc, &frame->cpstate, regs, set->sig[0]); if (_NSIG_WORDS > 1) { err |= __copy_to_user(frame->extramask, &set->sig[1], sizeof(frame->extramask)); } /* Create sys_sigreturn syscall in stack frame */ err |= gen_return_code(frame->retcode, USE_SIGRETURN); if (err) goto give_sigsegv; /* Create signal handler execution context. * Return context not modified until this point. */ set_thread_state(regs, frame, frame->retcode, ka->sa.sa_handler, signal, &frame->sc, NULL); /* Set access mode to USER_DS. Nomenclature is outdated, but * functionality is used in uaccess.h */ set_fs(USER_DS); #if DEBUG_SIG printk("SIG deliver (%s:%d): signal=%d sp=%p pc=%08x\n", current->comm, current->pid, signal, frame, regs->pc); #endif return; give_sigsegv: if (sig == SIGSEGV) ka->sa.sa_handler = SIG_DFL; force_sig(SIGSEGV, current); }
static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe *frame; int err = 0; int signal; frame = get_sigframe(ka, regs->areg[1], sizeof(*frame)); if (regs->depc > 64) panic ("Double exception sys_sigreturn\n"); if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) goto give_sigsegv; signal = current_thread_info()->exec_domain && current_thread_info()->exec_domain->signal_invmap && sig < 32 ? current_thread_info()->exec_domain->signal_invmap[sig] : sig; err |= copy_siginfo_to_user(&frame->info, info); /* Create the ucontext. */ err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(0, &frame->uc.uc_link); err |= __put_user((void *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); err |= __put_user(sas_ss_flags(regs->areg[1]), &frame->uc.uc_stack.ss_flags); err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->cpstate, regs, set->sig[0]); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); /* Create sys_rt_sigreturn syscall in stack frame */ err |= gen_return_code(frame->retcode, USE_RT_SIGRETURN); if (err) goto give_sigsegv; /* Create signal handler execution context. * Return context not modified until this point. */ set_thread_state(regs, frame, frame->retcode, ka->sa.sa_handler, signal, &frame->info, &frame->uc); /* Set access mode to USER_DS. Nomenclature is outdated, but * functionality is used in uaccess.h */ set_fs(USER_DS); #if DEBUG_SIG printk("SIG rt deliver (%s:%d): signal=%d sp=%p pc=%08x\n", current->comm, current->pid, signal, frame, regs->pc); #endif return; give_sigsegv: if (sig == SIGSEGV) ka->sa.sa_handler = SIG_DFL; force_sig(SIGSEGV, current); }
void gen_machine(char *machine_name) { struct state *s, *snext; struct transition *t, *tnext; struct task *task, *tasknext; if (states == NULL) fprintf(stderr, "%s: no states declared in machine %s\n", __func__, machine_name); /* dump forward declarations of all the states */ for (s=states; s; s=s->next) { if(s->action == ACTION_RUN || s->action == ACTION_PJMP) gen_runfunc_decl(s->function_or_machine); gen_state_decl(s->name); } /* delcare the machine start point */ fprintf(out_file, "\nstruct PINT_state_machine_s %s = {\n", machine_name); fprintf(out_file, "\t.name = \"%s\",\n", machine_name); fprintf(out_file, "\t.first_state = &ST_%s\n", states->name); fprintf(out_file, "};\n\n"); /* generate all output */ for (s=states; s; s=s->next) { gen_state_start(s->name, machine_name); gen_state_action(s->action, s->function_or_machine, s->name); if(s->action == ACTION_PJMP) { gen_pjtbl(s->name); /* if there are tasks (the action must be a pjmp) so we output * stuff for the tasks */ for (task=s->task; task; task=task->next) { gen_return_code(task->return_code); gen_next_state(TRANS_PJMP, task->task_name); } } gen_trtbl(s->name); for (t=s->transition; t; t=t->next) { gen_return_code(t->return_code); gen_next_state(t->type, t->next_state); } gen_state_end(); } /* purge for next machine */ for (s=states; s; s=snext) { if(s->task) { for (task=s->task; task; task=tasknext) { tasknext = task->next; free(task->return_code); free(task); } } for (t=s->transition; t; t=tnext) { tnext = t->next; free(t->return_code); free(t); } snext = s->next; free(s->name); free(s); } states = NULL; }