pie_boot_if/
lib.rs

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    /// CPU 硬件ID
14    pub cpu_id: usize,
15    /// 内核镜像物理地址
16    pub kimage_start_lma: *mut u8,
17    /// 内核镜像虚拟地址
18    pub kimage_start_vma: *mut u8,
19    /// 设备树物理地址
20    pub fdt: Option<NonNull<u8>>,
21    /// 页表开始物理地址
22    pub pg_start: *mut u8,
23    /// 内存区域
24    pub memory_regions: MemoryRegions,
25    /// 调试串口地址
26    pub debug_console: Option<DebugConsole>,
27    /// 可用内存起始地址
28    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    /// IO\MMIO 物理基地址
56    pub base_phys: usize,
57    /// IO\MMIO 虚拟基地址
58    pub base_virt: *mut u8,
59    pub compatibles: Vec<String<COMPATIBLE_STRING_CAPACITY>, COMPATIBLE_VEC_CAPACITY>,
60}