From fe4e02a7ad7d0ecf605eb5e00e1be7583d79ce2d Mon Sep 17 00:00:00 2001 From: AlmuHS Date: Sat, 7 Jul 2018 14:50:08 +0200 Subject: moved intel_startCPU to mp_desk.c --- i386/i386/mp_desc.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/i386/i386/mp_desc.c b/i386/i386/mp_desc.c index 6aa8e664..d07281c9 100644 --- a/i386/i386/mp_desc.c +++ b/i386/i386/mp_desc.c @@ -165,6 +165,68 @@ mp_desc_init(int mycpu) } +kern_return_t intel_startCPU(int slot_num) +{ + int lapic = cpu_to_lapic[slot_num]; + int eFlagsRegister; + + assert(lapic != -1); + + DBGLOG_CPU_INIT(slot_num); + + DBG("intel_startCPU(%d) lapic_id=%d\n", slot_num, lapic); + DBG("IdlePTD(%p): 0x%x\n", &IdlePTD, (int) (uintptr_t)IdlePTD); + + /* + * Initialize (or re-initialize) the descriptor tables for this cpu. + * Propagate processor mode to slave. + */ + /*cpu_desc_init64(cpu_datap(slot_num));*/ + mp_desc_init(slot_num); + + /* Serialize use of the slave boot stack, etc. */ + kmutex_lock(&mp_cpu_boot_lock); + + /*istate = ml_set_interrupts_enabled(FALSE);*/ + cpu_intr_save(&eFlagsRegister); + if (slot_num == cpu_number()) { + /*ml_set_interrupts_enabled(istate);*/ + cpu_intr_restore(eFlagsRegister); + lck_mtx_unlock(&mp_cpu_boot_lock); + return KERN_SUCCESS; + } + + start_info.starter_cpu = cpu_number(); + start_info.target_cpu = slot_num; + start_info.target_lapic = lapic; + tsc_entry_barrier = 2; + tsc_exit_barrier = 2; + + /* + * Perform the processor startup sequence with all running + * processors rendezvous'ed. This is required during periods when + * the cache-disable bit is set for MTRR/PAT initialization. + */ + /*mp_rendezvous_no_intrs(start_cpu, (void *) &start_info);*/ + + start_info.target_cpu = 0; + + /*ml_set_interrupts_enabled(istate);*/ + cpu_intr_restore(eFlagsRegister); + lck_mtx_unlock(&mp_cpu_boot_lock); + + if (!cpu_datap(slot_num)->cpu_running) { + kprintf("Failed to start CPU %02d\n", slot_num); + printf("Failed to start CPU %02d, rebooting...\n", slot_num); + delay(1000000); + halt_cpu(); + return KERN_SUCCESS; + } else { + kprintf("Started cpu %d (lapic id %08x)\n", slot_num, lapic); + return KERN_SUCCESS; + } +} + /* * Called after all CPUs have been found, but before the VM system * is running. The machine array must show which CPUs exist. -- cgit v1.2.3