aboutsummaryrefslogtreecommitdiff
path: root/mirai/boot/sequence/sequence.zig
blob: 2500455dd58db0279d94c60a3d1b4062727bc3e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! Boot Sequence

const asm_cpu = @import("../../asm/cpu/cpu.zig");
const serial = @import("../../drivers/serial/serial.zig");

pub const constants = @import("constants/constants.zig");
pub const types = @import("types/types.zig");
pub const phases = @import("phases/phases.zig");
pub const message = @import("message/message.zig");
pub const state = @import("state.zig");

pub const Phase = constants.Phase;
pub const BootInfo = types.BootInfo;

pub fn execute(boot_info: *const BootInfo) bool {
    state.set_boot_info(boot_info);

    if (!serial.initialize_default()) {
        return false;
    }

    message.print_banner();

    serial.printf("Starting Akiba boot sequence\n", .{});
    serial.printf("Powered by the Mirai kernel\n\n", .{});

    state.set_current_phase(Phase.cpu);
    if (!phases.execute_cpu()) {
        serial.printf("\nCPU initialization failed, cannot continue\n", .{});
        return false;
    }
    state.advance_phase();

    serial.printf("\n", .{});

    state.set_current_phase(Phase.memory);
    if (!phases.execute_memory(boot_info)) {
        serial.printf("\nMemory initialization failed, cannot continue\n", .{});
        return false;
    }
    state.advance_phase();

    serial.printf("\nBoot sequence complete, Akiba is ready\n", .{});
    state.set_current_phase(Phase.complete);

    return true;
}

pub fn halt_on_failure() noreturn {
    serial.printf("\nSystem halted due to unrecoverable error\n", .{});
    asm_cpu.halt_loop();
}

pub fn get_current_phase() Phase {
    return state.get_current_phase();
}

pub fn get_boot_info() ?*const BootInfo {
    return state.get_boot_info();
}

pub fn is_complete() bool {
    return state.is_complete();
}