示例#1
0
/*
 * Userland override of lwkt_gdinit.  Called from mi_gdinit().  Note that
 * critical sections do not work until lwkt_init_thread() is called.  The
 * idle thread will be left in a critical section.
 */
void
lwkt_gdinit(struct globaldata *gd)
{
    int i;

    for (i = 0; i < sizeof(gd->gd_tdrunq)/sizeof(gd->gd_tdrunq[0]); ++i)
	TAILQ_INIT(&gd->gd_tdrunq[i]);
    gd->gd_runqmask = 0;
    gd->gd_curthread = &gd->gd_idlethread;
    TAILQ_INIT(&gd->gd_tdallq);

    /* Set up this cpu's idle thread */
    lwkt_init_thread(&gd->gd_idlethread, 
		libcaps_alloc_stack(LWKT_THREAD_STACK), LWKT_THREAD_STACK,
		0, gd);
    cpu_set_thread_handler(&gd->gd_idlethread, lwkt_exit, lwkt_idleloop, NULL);
}
示例#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);
}