- run_queue_init(&p->runq);
-
- p->state = PROCESSOR_OFF_LINE;
- p->active_thread = p->next_thread = p->idle_thread = THREAD_NULL;
- p->processor_set = pset;
- p->current_pri = MINPRI;
- timer_call_setup(&p->quantum_timer, thread_quantum_expire, p);
- p->deadline = UINT64_MAX;
- p->timeslice = 0;
- p->processor_self = IP_NULL;
- simple_lock_init(&p->lock, 0);
- processor_data_init(p);
- PROCESSOR_DATA(p, slot_num) = slot_num;
- p->processor_list = NULL;
+ if (processor != master_processor) {
+ /* Scheduler state deferred until sched_init() */
+ SCHED(processor_init)(processor);
+ }
+
+ processor->state = PROCESSOR_OFF_LINE;
+ processor->active_thread = processor->next_thread = processor->idle_thread = THREAD_NULL;
+ processor->processor_set = pset;
+ processor->current_pri = MINPRI;
+ processor->current_thmode = TH_MODE_NONE;
+ processor->cpu_id = cpu_id;
+ timer_call_setup(&processor->quantum_timer, thread_quantum_expire, processor);
+ processor->deadline = UINT64_MAX;
+ processor->timeslice = 0;
+ processor->processor_meta = PROCESSOR_META_NULL;
+ processor->processor_self = IP_NULL;
+ processor_data_init(processor);
+ processor->processor_list = NULL;
+
+ pset_lock(pset);
+ if (pset->cpu_set_count++ == 0)
+ pset->cpu_set_low = pset->cpu_set_hi = cpu_id;
+ else {
+ pset->cpu_set_low = (cpu_id < pset->cpu_set_low)? cpu_id: pset->cpu_set_low;
+ pset->cpu_set_hi = (cpu_id > pset->cpu_set_hi)? cpu_id: pset->cpu_set_hi;
+ }
+ pset_unlock(pset);