x86: move calling z_loapic_enable into z_x86_prep_c

This moves calling z_loapic_enable() from crt0.S into
z_x86_prep_c(). This is done so we can move BSS clearing
and data section copying inside z_x86_prep_c() as
these are needed before calling z_loapic_enable().

Signed-off-by: Daniel Leung <daniel.leung@intel.com>
This commit is contained in:
Daniel Leung 2021-02-10 14:18:45 -08:00 committed by Anas Nashif
commit dd98de880a
3 changed files with 16 additions and 8 deletions

View file

@ -224,13 +224,6 @@ __csSet:
movl %eax, %cr0
#endif /* CONFIG_X86_MMU */
#ifdef CONFIG_LOAPIC
/* For BSP, cpu_number is 0 */
xorl %eax, %eax
pushl %eax
call z_loapic_enable
#endif
pushl %ebx /* pointer to multiboot info, or NULL */
call z_x86_prep_c /* enter kernel; never returns */

View file

@ -163,8 +163,19 @@ FUNC_NORETURN void z_x86_cpu_init(struct x86_cpuboot *cpuboot)
{
x86_sse_init(NULL);
#if CONFIG_MP_NUM_CPUS > 1
/* The internal cpu_number is the index to x86_cpuboot[] */
z_loapic_enable((unsigned char)(cpuboot - x86_cpuboot));
unsigned char cpu_num = (unsigned char)(cpuboot - x86_cpuboot);
if (cpu_num > 0) {
/*
* For CPU #0, z_loapic_enable(0) will be done
* inside z_x86_prep_c() so there is no need to do it
* here.
*/
z_loapic_enable(cpu_num);
}
#endif
#ifdef CONFIG_USERSPACE
/* Set landing site for 'syscall' instruction */

View file

@ -22,6 +22,10 @@ FUNC_NORETURN void z_x86_prep_c(void *arg)
_kernel.cpus[0].nested = 0;
#if defined(CONFIG_LOAPIC)
z_loapic_enable(0);
#endif
#ifdef CONFIG_X86_VERY_EARLY_CONSOLE
z_x86_early_serial_init();
#endif