Initial commit
This commit is contained in:
19
code/ap_boot_usa.cpp
Normal file
19
code/ap_boot_usa.cpp
Normal file
@ -0,0 +1,19 @@
|
||||
// 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
|
||||
}
|
||||
Reference in New Issue
Block a user