Ejemplo n.º 1
0
static int
elf_loadnotes(struct lwp *lp, prpsinfo_t *psinfo, prstatus_t *status,
	   prfpregset_t *fpregset, prsavetls_t *tls)
{
	struct proc *p = lp->lwp_proc;
	//struct lwp *nlp;
	int error;

	/* validate status and psinfo */
	TRACE_ENTER;
	if (status->pr_version != PRSTATUS_VERSION ||
	    status->pr_statussz != sizeof(prstatus_t) ||
	    status->pr_gregsetsz != sizeof(gregset_t) ||
	    status->pr_fpregsetsz != sizeof(fpregset_t) ||
	    psinfo->pr_version != PRPSINFO_VERSION ||
	    psinfo->pr_psinfosz != sizeof(prpsinfo_t)) {
	        PRINTF(("status check failed\n"));
		error = EINVAL;
		goto done;
	}
	/* XXX lwp handle more than one lwp*/
	/* XXX restore each thread */
	if ((error = set_regs(lp, &status->pr_reg)) != 0)
		goto done;
	error = set_fpregs(lp, fpregset);

	/* XXX SJG */
	kprintf("Avem la load %i\n", p->p_nthreads);
	kprintf("xxx: restoring TLS-fu\n");
	bcopy(tls, &lp->lwp_thread->td_tls, sizeof *tls);
//	crit_enter();
//	set_user_TLS();
//	crit_exit();

	/* Try to recreate another thread */
#if 0
	kprintf("xxx restoring a second thread\n");	
	status++; fpregset++; tls++;
	// create new thread
	lwp_rb_tree_RB_INSERT(&p->p_lwp_tree, nlp);
	//nlp->lwp_cpumask = (cpumask_t)-1;
	//nlp->lwp_thread ?
	p->p_nthreads++;
	p->p_lasttid++;
	nlp->lwp_proc = p;
	// append stored info
	if ((error = set_regs(nlp, &status->pr_reg)) != 0)
		goto done;
	error = set_fpregs(nlp, fpregset);
	bcopy(tls, &nlp->lwp_thread->td_tls, sizeof *tls);
#endif

	
	strlcpy(p->p_comm, psinfo->pr_fname, sizeof(p->p_comm));
	/* XXX psinfo->pr_psargs not yet implemented */

 done:	
	TRACE_EXIT;
	return error;
}
Ejemplo n.º 2
0
/*
 * Callbacks from machine-dependant startup code (e.g. init386) to set
 * up low level entities related to cpu #0's globaldata.
 *
 * Called from very low level boot code.
 */
void
mi_proc0init(struct globaldata *gd, struct user *proc0paddr)
{
	lwkt_init_thread(&thread0, proc0paddr, LWKT_THREAD_STACK, 0, gd);
	lwkt_set_comm(&thread0, "thread0");
	RB_INIT(&proc0.p_lwp_tree);
	spin_init(&proc0.p_spin);
	lwkt_token_init(&proc0.p_token, "iproc");
	proc0.p_lasttid = 0;	/* +1 = next TID */
	lwp_rb_tree_RB_INSERT(&proc0.p_lwp_tree, &lwp0);
	lwp0.lwp_thread = &thread0;
	lwp0.lwp_proc = &proc0;
	proc0.p_usched = usched_init();
	lwp0.lwp_cpumask = (cpumask_t)-1;
	varsymset_init(&proc0.p_varsymset, NULL);
	thread0.td_flags |= TDF_RUNNING;
	thread0.td_proc = &proc0;
	thread0.td_lwp = &lwp0;
	thread0.td_switch = cpu_lwkt_switch;
	lwkt_schedule_self(curthread);
}