diff --git a/Cargo.toml b/Cargo.toml index f67bc36c1b..5df1ace17a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,7 +86,7 @@ build-time = "0.1.3" cfg-if = "1" crossbeam-utils = { version = "0.8", default-features = false } dyn-clone = "1.0" -fdt = "0.1" +fdt = { version = "0.1", features = ["pretty-printing"] } free-list = "0.3" hashbrown = { version = "0.14", default-features = false } hermit-entry = { version = "0.10", features = ["kernel"] } diff --git a/src/arch/x86_64/kernel/mod.rs b/src/arch/x86_64/kernel/mod.rs index aef2bc5768..e6243eea57 100644 --- a/src/arch/x86_64/kernel/mod.rs +++ b/src/arch/x86_64/kernel/mod.rs @@ -4,6 +4,7 @@ use core::num::NonZeroU64; use core::ptr; use core::sync::atomic::{AtomicPtr, AtomicU32, Ordering}; +use fdt::Fdt; use hermit_entry::boot_info::{BootInfo, PlatformInfo, RawBootInfo}; use hermit_sync::InterruptSpinMutex; use x86::controlregs::{cr0, cr0_write, cr4, Cr0}; @@ -81,11 +82,11 @@ pub fn get_mbinfo() -> Option { } } -pub fn get_fdt() -> Option { - boot_info() - .hardware_info - .device_tree - .map(|fdt| fdt.get() as usize) +pub fn get_fdt() -> Option> { + boot_info().hardware_info.device_tree.map(|fdt| { + let ptr = ptr::with_exposed_provenance(fdt.get().try_into().unwrap()); + unsafe { Fdt::from_ptr(ptr).unwrap() } + }) } #[cfg(feature = "smp")] diff --git a/src/arch/x86_64/mm/physicalmem.rs b/src/arch/x86_64/mm/physicalmem.rs index b410a5fc7d..f63bed0d8a 100644 --- a/src/arch/x86_64/mm/physicalmem.rs +++ b/src/arch/x86_64/mm/physicalmem.rs @@ -18,8 +18,7 @@ const KVM_32BIT_GAP_SIZE: usize = 768 << 20; const KVM_32BIT_GAP_START: usize = KVM_32BIT_MAX_MEM_SIZE - KVM_32BIT_GAP_SIZE; fn detect_from_fdt() -> Result<(), ()> { - let fdt_addr = get_fdt().ok_or(())?; - let fdt = unsafe { fdt::Fdt::from_ptr(fdt_addr as *const u8).unwrap() }; + let fdt = get_fdt().ok_or(())?; let mems = fdt.find_all_nodes("/memory"); let all_regions = mems.map(|m| m.reg().unwrap().next().unwrap()); diff --git a/src/lib.rs b/src/lib.rs index 30e97d58f0..efa829f31e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -193,6 +193,11 @@ fn boot_processor_main() -> ! { info!("Welcome to Hermit {}", env!("CARGO_PKG_VERSION")); info!("Kernel starts at {:p}", env::get_base_address()); + #[cfg(target_arch = "x86_64")] + if let Some(fdt) = kernel::get_fdt() { + info!("FDT:\n{fdt:#?}"); + } + extern "C" { static mut __bss_start: u8; }