1 use system_error::SystemError;
2
3 use crate::arch::init::multiboot::early_multiboot_init;
4
5 use super::multiboot2::early_multiboot2_init;
6
7 const BOOT_ENTRY_TYPE_MULTIBOOT: u64 = 1;
8 const BOOT_ENTRY_TYPE_MULTIBOOT2: u64 = 2;
9 const BOOT_ENTRY_TYPE_LINUX_32: u64 = 3;
10 const BOOT_ENTRY_TYPE_LINUX_64: u64 = 4;
11
12 #[derive(Debug)]
13 #[repr(u64)]
14 enum BootProtocol {
15 Multiboot = 1,
16 Multiboot2,
17 Linux32,
18 Linux64,
19 }
20
21 impl TryFrom<u64> for BootProtocol {
22 type Error = SystemError;
23
try_from(value: u64) -> Result<Self, Self::Error>24 fn try_from(value: u64) -> Result<Self, Self::Error> {
25 match value {
26 BOOT_ENTRY_TYPE_MULTIBOOT => Ok(BootProtocol::Multiboot),
27 BOOT_ENTRY_TYPE_MULTIBOOT2 => Ok(BootProtocol::Multiboot2),
28 BOOT_ENTRY_TYPE_LINUX_32 => Ok(BootProtocol::Linux32),
29 BOOT_ENTRY_TYPE_LINUX_64 => Ok(BootProtocol::Linux64),
30 _ => Err(SystemError::EINVAL),
31 }
32 }
33 }
34
35 #[inline(never)]
early_boot_init( boot_entry_type: u64, arg1: u64, arg2: u64, ) -> Result<(), SystemError>36 pub(super) fn early_boot_init(
37 boot_entry_type: u64,
38 arg1: u64,
39 arg2: u64,
40 ) -> Result<(), SystemError> {
41 let boot_protocol = BootProtocol::try_from(boot_entry_type)?;
42 match boot_protocol {
43 BootProtocol::Multiboot => early_multiboot_init(arg1 as u32, arg2),
44 BootProtocol::Multiboot2 => early_multiboot2_init(arg1 as u32, arg2),
45 BootProtocol::Linux32 => {
46 // linux32_init(arg1, arg2);
47 unimplemented!();
48 }
49 BootProtocol::Linux64 => {
50 // linux64_init(arg1, arg2);
51 unimplemented!();
52 }
53 }
54 }
55