Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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;
}