/* * 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); }
/* * 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); }