kernel/hw/
qemu.rs

1#![allow(dead_code)]
2
3use tracing::error;
4
5use crate::cpu;
6
7const EXIT_FAILURE: u32 = 0; // since ((0 << 1) | 1) = 1.
8const EXIT_SUCCESS: u32 = 1; // since ((1 << 1) | 1) = 3.
9
10const IO_BASE: u16 = 0xf4;
11
12pub enum ExitStatus {
13    Success,
14    Failure,
15    Custom(u32),
16}
17
18pub fn exit(status: ExitStatus) -> ! {
19    let code = match status {
20        ExitStatus::Success => EXIT_SUCCESS,
21        ExitStatus::Failure => EXIT_FAILURE,
22        ExitStatus::Custom(code) => code,
23    };
24
25    unsafe {
26        cpu::io_out(IO_BASE, code);
27    }
28
29    error!("Qemu did not exit, halting.");
30
31    // If we didn't exit, just halt
32    loop {
33        unsafe {
34            cpu::clear_interrupts();
35            // this will never wake up, we disabled interrupt, (except maybe NMI?)
36            cpu::halt();
37        }
38    }
39}