1
Files
interrupt-handling-using-th…/code/ap_boot_usa.cpp
2023-02-26 21:12:51 +01:00

20 lines
735 B
C++

// Excerpt from the Universal Startup Algorithm
for (uint8_t cpu = 0; cpu < cpuCount; ++cpu) {
if (cpu == LocalApic::getId()) { continue; } // Skip the BSP
LocalApic::clearErrors();
LocalApic::sendInitIpi(cpu, ICREntry::Level::ASSERT);
LocalApic::waitForIpiDispatch();
LocalApic::sendInitIpi(cpu, ICREntry::Level::DEASSERT);
LocalApic::waitForIpiDispatch();
Pit::earlyDelay(10'000); // 10 milliseconds
for (uint8_t i = 0; i < 2; ++i) {
LocalApic::clearErrors();
LocalApic::sendStartupIpi(cpu, apStartupAddress);
LocalApic::waitForIpiDispatch();
Pit::earlyDelay(200); // 200 microseconds
}
while (!(runningAPs & (1 << cpu))) {} // Wait until the AP is running
}