20 lines
735 B
C++
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
|
|
}
|