1#![allow(dead_code)]
2
3use tracing::error;
4
5use crate::cpu;
6
7const EXIT_FAILURE: u32 = 0; const EXIT_SUCCESS: u32 = 1; const 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 loop {
33 unsafe {
34 cpu::clear_interrupts();
35 cpu::halt();
37 }
38 }
39}