Hi, other time: I'm trying to develop intel_startCPU function, using the function of this file as base code https://github.com/nneonneo/osx-10.9-opensource/blob/master/xnu-2422.1.72/osfmk/i386/mp.c
I've got to replace the *ml_set_interrupts_enabled() *calls, and now I need to replace this call:* cpu_desc_init64(cpu_datap(slot_num));* Reading the comments, this function do this: *Initialize (or re-initialize) the descriptor tables for this cpu. * Propagate processor mode to slave.* But I won't be clear what is the Mach equivalent to this function. I attach the current code Can you help me? 2018-07-03 18:35 GMT+02:00 Luca Dariz <luca.da...@gmail.com>: > Il 03/07/2018 18:15, Almudena Garcia ha scritto: > > Using grep, I've found /local_bh_count/ and /local_irq_count. ffs /is > > defined correctly. > > > > But I don't find the /intel_startCPU/ definition. In > > /i386/i386/mp_desc.c /there are many calls to this, but It doesn't > > appear to be in any file. > > > > Do you know about this? > > No. Note that the whole file results empty if NCPU == 1.. maybe it got > lost when SMP was disabled, you could try to look for some old Mach > version which supported SMP, or implement your own. > For example you can look at the XNU kernel and see how it is implemented > there. > > Luca >
#include <kern/kmutex.h> #include <kern/cpu_number.h> #include <i386/gdt.h> #include <i386/ldt.h> #include <i386/i386/pcb.h> #include <i386/i386/tss.h> 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)); /* 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_save(&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; } }