zephyr/arch/x86/core/prep_c.c

83 lines
1.8 KiB
C

/*
* Copyright (c) 2019 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <kernel_internal.h>
#include <zephyr/arch/x86/multiboot.h>
#include <zephyr/arch/x86/efi.h>
#include <x86_mmu.h>
extern FUNC_NORETURN void z_cstart(void);
extern void x86_64_irq_init(void);
#if !defined(CONFIG_X86_64)
__pinned_data x86_boot_arg_t x86_cpu_boot_arg;
#endif
/* Early global initialization functions, C domain. This runs only on the first
* CPU for SMP systems.
*/
__boot_func
FUNC_NORETURN void z_prep_c(void *arg)
{
x86_boot_arg_t *cpu_arg = arg;
_kernel.cpus[0].nested = 0;
#ifdef CONFIG_MMU
z_x86_mmu_init();
#endif
#if defined(CONFIG_LOAPIC)
z_loapic_enable(0);
#endif
#ifdef CONFIG_X86_64
x86_64_irq_init();
#endif
if (IS_ENABLED(CONFIG_MULTIBOOT_INFO) &&
cpu_arg->boot_type == MULTIBOOT_BOOT_TYPE) {
z_multiboot_init((struct multiboot_info *)cpu_arg->arg);
} else if (IS_ENABLED(CONFIG_X86_EFI) &&
cpu_arg->boot_type == EFI_BOOT_TYPE) {
efi_init((struct efi_boot_arg *)cpu_arg->arg);
} else {
ARG_UNUSED(cpu_arg);
}
#ifdef CONFIG_X86_VERY_EARLY_CONSOLE
z_x86_early_serial_init();
#if defined(CONFIG_BOARD_QEMU_X86) || defined(CONFIG_BOARD_QEMU_X86_64)
/*
* Under QEMU and SeaBIOS, everything gets to be printed
* immediately after "Booting from ROM.." as there is no newline.
* This prevents parsing QEMU console output for the very first
* line where it needs to match from the beginning of the line.
* So add a dummy newline here so the next output is at
* the beginning of a line.
*/
arch_printk_char_out('\n');
#endif
#endif
#if CONFIG_X86_STACK_PROTECTION
unsigned int num_cpus = arch_num_cpus();
for (int i = 0; i < num_cpus; i++) {
z_x86_set_stack_guard(z_interrupt_stacks[i]);
}
#endif
#if defined(CONFIG_SMP)
z_x86_ipi_setup();
#endif
z_cstart();
CODE_UNREACHABLE;
}