| /* |
| * Copyright (c) 2019 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/kernel.h> |
| #include <kernel_internal.h> |
| #include <zephyr/arch/x86/acpi.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_x86_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(); |
| } |