hermit_entry/boot_info/
mod.rs1#[cfg(feature = "loader")]
8mod loader;
9
10#[cfg(feature = "kernel")]
11mod kernel;
12
13use core::num::{NonZeroU32, NonZeroU64};
14use core::ops::Range;
15
16use time::OffsetDateTime;
17
18#[cfg(target_arch = "x86_64")]
20pub type SerialPortBase = core::num::NonZeroU16;
21
22#[cfg(target_arch = "aarch64")]
24pub type SerialPortBase = core::num::NonZeroU64;
25
26#[cfg(target_arch = "riscv64")]
28pub type SerialPortBase = core::num::NonZeroU64;
29
30pub type DeviceTreeAddress = core::num::NonZeroU64;
32
33#[derive(Debug)]
39pub struct BootInfo {
40 pub hardware_info: HardwareInfo,
42
43 pub load_info: LoadInfo,
45
46 pub platform_info: PlatformInfo,
48}
49
50#[derive(Debug)]
52pub struct HardwareInfo {
53 pub phys_addr_range: Range<u64>,
55
56 pub serial_port_base: Option<SerialPortBase>,
58
59 pub device_tree: Option<DeviceTreeAddress>,
61}
62
63#[derive(Debug)]
65pub struct LoadInfo {
66 pub kernel_image_addr_range: Range<u64>,
68
69 pub tls_info: Option<TlsInfo>,
71}
72
73#[derive(Debug)]
77pub enum PlatformInfo {
78 #[cfg(target_arch = "x86_64")]
80 Multiboot {
81 command_line: Option<&'static str>,
83
84 multiboot_info_addr: core::num::NonZeroU64,
86 },
87 #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
89 LinuxBoot,
90 Uhyve {
92 has_pci: bool,
94
95 num_cpus: NonZeroU64,
97
98 cpu_freq: Option<NonZeroU32>,
100
101 boot_time: OffsetDateTime,
103 },
104 LinuxBootParams {
106 command_line: Option<&'static str>,
108
109 boot_params_addr: core::num::NonZeroU64,
111 },
112 Fdt,
117}
118
119#[repr(C)]
121#[derive(Clone, Copy, Debug)]
122pub struct TlsInfo {
123 pub start: u64,
125
126 pub filesz: u64,
128
129 pub memsz: u64,
131
132 pub align: u64,
134}
135
136#[derive(Clone, Copy, Debug)]
140#[repr(C)]
141pub struct RawBootInfo {
142 hardware_info: RawHardwareInfo,
143 load_info: RawLoadInfo,
144 platform_info: RawPlatformInfo,
145}
146
147#[derive(Clone, Copy, Debug)]
148#[repr(C)]
149struct RawHardwareInfo {
150 phys_addr_start: u64,
151 phys_addr_end: u64,
152 serial_port_base: Option<SerialPortBase>,
153 device_tree: Option<DeviceTreeAddress>,
154}
155
156#[derive(Clone, Copy, Debug)]
157#[repr(C)]
158struct RawLoadInfo {
159 kernel_image_addr_start: u64,
160 kernel_image_addr_end: u64,
161 tls_info: TlsInfo,
162}
163
164#[derive(Clone, Copy, Debug)]
165#[cfg_attr(target_arch = "x86_64", repr(C, align(8)))]
166#[cfg_attr(not(target_arch = "x86_64"), repr(transparent))]
167struct Align8<T>(pub T);
168
169impl<T> From<T> for Align8<T> {
170 fn from(value: T) -> Self {
171 Self(value)
172 }
173}
174
175#[cfg_attr(not(all(feature = "loader", feature = "kernel")), expect(dead_code))]
176#[derive(Clone, Copy, Debug)]
177#[repr(C)]
178enum RawPlatformInfo {
179 #[cfg(target_arch = "x86_64")]
180 Multiboot {
181 command_line_data: *const u8,
182 command_line_len: u64,
183 multiboot_info_addr: core::num::NonZeroU64,
184 },
185 #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
186 LinuxBoot,
187 Uhyve {
188 has_pci: bool,
189 num_cpus: NonZeroU64,
190 cpu_freq: Option<NonZeroU32>,
191 boot_time: Align8<[u8; 16]>,
192 },
193 LinuxBootParams {
194 command_line_data: *const u8,
195 command_line_len: u64,
196 boot_params_addr: core::num::NonZeroU64,
197 },
198 Fdt,
199}