#include "startup.h" #include "../arch/acpi.h" #include "../arch/apic.h" #include "../arch/core.h" #include "../arch/idt.h" #include "../arch/pic.h" #include "../compiler/libc.h" #include "../debug/output.h" #include "../interrupt/handlers.h" /*! \brief The first processor is the Bootstrap Processor (BSP) */ static bool isBootstrapProcessor = true; extern "C" [[noreturn]] void kernel_init() { if (isBootstrapProcessor) { isBootstrapProcessor = false; // Setup and load Interrupt Description Table (IDT) initInterruptHandlers(); // Initialize PICs PIC::initialize(); // Call global constructors CSU::initializer(); // Initialize ACPI if (!ACPI::init()) { DBG_VERBOSE << "No ACPI!"; Core::die(); } // Initialize APIC (using ACPI) if (!APIC::init()) { DBG_VERBOSE << "APIC Initialization failed"; Core::die(); } // Initialize the Bootstrap Processor Core::init(); // Go to main function main(); // Exit CPU DBG_VERBOSE << "CPU core " << Core::getID() << " (BSP) shutdown." << endl; Core::exit(); } else { // Load Interrupt Description Table (IDT) IDT::load(); // Initialize this application processor Core::init(); // And call the AP main main_ap(); // Exit CPU DBG_VERBOSE << "CPU core " << Core::getID() << " (AP) shutdown." << endl; Core::exit(); } // Only on last core if (Core::countOnline() == 1) { // Call global destructors CSU::finalizer(); } // wait forever while (true) { Core::die(); } }