mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[bootloader] Boot other slot if a slot is invalid
This commit is contained in:
@@ -29,18 +29,34 @@ void Boot::setMode(BootMode mode) {
|
||||
Ion::ExamMode::IncrementExamMode(deltaMode);
|
||||
}
|
||||
|
||||
[[ noreturn ]] void Boot::boot() {
|
||||
__attribute__((noreturn)) void Boot::boot() {
|
||||
assert(mode() != BootMode::Unknown);
|
||||
|
||||
if (mode() == BootMode::SlotA)
|
||||
Slot::A().boot();
|
||||
else if (mode() == BootMode::SlotB)
|
||||
if (!Slot::A().kernelHeader()->isValid() && !Slot::B().kernelHeader()->isValid()) {
|
||||
// Bootloader if both invalid
|
||||
bootloader();
|
||||
} else if (!Slot::A().kernelHeader()->isValid()) {
|
||||
// If slot A is invalid and B valid, boot B
|
||||
setMode(BootMode::SlotB);
|
||||
Slot::B().boot();
|
||||
|
||||
for(;;);
|
||||
} else if (!Slot::B().kernelHeader()->isValid()) {
|
||||
// If slot B is invalid and A valid, boot A
|
||||
setMode(BootMode::SlotA);
|
||||
Slot::A().boot();
|
||||
} else {
|
||||
// Both valid, boot the selected one
|
||||
if (mode() == BootMode::SlotA) {
|
||||
Slot::A().boot();
|
||||
} else if (mode() == BootMode::SlotB) {
|
||||
Slot::B().boot();
|
||||
}
|
||||
}
|
||||
|
||||
// Achivement unlocked: How Did We Get Here?
|
||||
bootloader();
|
||||
}
|
||||
|
||||
[[ noreturn ]] void Boot::bootloader() {
|
||||
__attribute__ ((noreturn)) void Boot::bootloader() {
|
||||
Bootloader::Interface::draw();
|
||||
for(;;) {
|
||||
Ion::USB::enable();
|
||||
|
||||
Reference in New Issue
Block a user