1#![no_std]
2
3use core::{fmt::Debug, mem::MaybeUninit, ptr::NonNull};
4
5mod memregions;
6
7pub use heapless::{String, Vec};
8pub use memregions::*;
9
10#[repr(align(64))]
11#[derive(Debug, Clone)]
12pub struct BootInfo {
13 pub cpu_id: usize,
15 pub kimage_start_lma: *mut u8,
17 pub kimage_start_vma: *mut u8,
19 pub fdt: Option<NonNull<u8>>,
21 pub pg_start: *mut u8,
23 pub memory_regions: MemoryRegions,
25 pub debug_console: Option<DebugConsole>,
27 pub free_memory_start: *mut u8,
29}
30
31unsafe impl Send for BootInfo {}
32unsafe impl Sync for BootInfo {}
33
34impl BootInfo {
35 pub const fn new() -> Self {
36 unsafe { MaybeUninit::zeroed().assume_init() }
37 }
38
39 pub fn kcode_offset(&self) -> usize {
40 self.kimage_start_vma as usize - self.kimage_start_lma as usize
41 }
42}
43
44impl Default for BootInfo {
45 fn default() -> Self {
46 Self::new()
47 }
48}
49
50const COMPATIBLE_STRING_CAPACITY: usize = 32;
51const COMPATIBLE_VEC_CAPACITY: usize = 3;
52
53#[derive(Debug, Clone)]
54pub struct DebugConsole {
55 pub base_phys: usize,
57 pub base_virt: *mut u8,
59 pub compatibles: Vec<String<COMPATIBLE_STRING_CAPACITY>, COMPATIBLE_VEC_CAPACITY>,
60}