I've just fixed a little error in my code.

I attach the fixed file

2018-07-04 21:14 GMT+02:00 Almudena Garcia <liberamenso10...@gmail.com>:

> 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_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;
	}
}

Reply via email to