Skip to content

Commit e8014c9

Browse files
committed
add log
1 parent cea816c commit e8014c9

File tree

4 files changed

+49
-22
lines changed

4 files changed

+49
-22
lines changed

modules/axfs/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ cfg-if = "1.0"
2828
crate_interface = {version = "0.1", optional = true}
2929
lazyinit = "0.2"
3030
log = "0.4"
31-
lwext4_rust = {git = "https://github.com/Josen-B/lwext4_rust.git"}
31+
lwext4_rust = {git = "https://github.com/Josen-B/lwext4_rust.git", tag ="v1.0"}
3232

3333
[dependencies.fatfs]
3434
default-features = false

modules/axhal/src/dtb.rs

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
1-
use fdt_parser::{Fdt, FdtHeader};
1+
//! DTB (Device Tree Blob) related functionality.
2+
extern crate alloc;
23

4+
use alloc::boxed::Box;
35
use core::fmt::Write;
6+
use fdt_parser::{Fdt, FdtHeader};
47
use lazyinit::LazyInit;
58

6-
static BOOTARGS_STR: LazyInit<heapless::String<256>> = LazyInit::new();
9+
pub static BOOT_ARG: LazyInit<usize> = LazyInit::new();
10+
static CACHED_FDT: LazyInit<Fdt<'static>> = LazyInit::new();
11+
static BOOTARGS_STR: LazyInit<heapless::String<1024>> = LazyInit::new();
712

8-
pub fn bootargs_message() -> Option<&'static str> {
9-
let fdt_addr = crate::get_bootarg();
13+
/// Returns the boot argument.
14+
/// This is typically the device tree blob address passed from the bootloader.
15+
pub fn get_bootarg() -> usize {
16+
*BOOT_ARG
17+
}
1018

19+
/// Get the cached FDT or initialize it if not already done.
20+
fn get_fdt() -> Option<&'static Fdt<'static>> {
21+
// Return cached FDT if available
22+
if let Some(fdt) = CACHED_FDT.get() {
23+
return Some(fdt);
24+
}
25+
26+
// Parse and cache the FDT
27+
let fdt_addr = get_bootarg();
1128
if fdt_addr == 0 {
1229
return None;
1330
}
@@ -31,18 +48,38 @@ pub fn bootargs_message() -> Option<&'static str> {
3148
core::slice::from_raw_parts(ptr, size)
3249
};
3350

34-
let fdt = match Fdt::from_bytes(fdt_bytes) {
35-
Ok(fdt) => fdt,
36-
Err(_) => return None,
37-
};
51+
// Leak the FDT bytes to create a 'static reference
52+
let fdt_bytes_static = Box::leak(fdt_bytes.to_vec().into_boxed_slice());
53+
54+
match Fdt::from_bytes(fdt_bytes_static) {
55+
Ok(fdt) => {
56+
// Store the FDT in the cache
57+
CACHED_FDT.init_once(fdt);
58+
CACHED_FDT.get()
59+
}
60+
Err(_) => None,
61+
}
62+
}
63+
64+
/// Get the bootargs chosen from the device tree.
65+
pub fn get_chosen() -> Option<&'static str> {
66+
// If bootargs are already cached, return them
67+
if let Some(bootargs) = BOOTARGS_STR.get() {
68+
return Some(bootargs.as_str());
69+
}
70+
71+
// Get or initialize the cached FDT
72+
let fdt = get_fdt()?;
3873

3974
if let Some(chosen) = fdt.chosen() {
4075
if let Some(bootargs) = chosen.bootargs() {
4176
// Store bootargs in static variable
42-
let mut bootargs_str = heapless::String::<256>::new();
77+
let mut bootargs_str = heapless::String::<1024>::new();
4378
if write!(bootargs_str, "{}", bootargs).is_ok() {
4479
BOOTARGS_STR.init_once(bootargs_str);
4580
return Some(BOOTARGS_STR.as_str());
81+
} else {
82+
warn!("Failed to write bootargs");
4683
}
4784
}
4885
}

modules/axhal/src/lib.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,9 @@ pub fn init_percpu_secondary(cpu_id: usize) {
126126
self::percpu::init_secondary(cpu_id);
127127
}
128128

129-
use lazyinit::LazyInit;
130-
131-
static BOOT_ARG: LazyInit<usize> = LazyInit::new();
132-
133129
/// Initializes the platform and boot argument.
134130
/// This function should be called as early as possible.
135131
pub fn init_early(cpu_id: usize, arg: usize) {
136-
BOOT_ARG.init_once(arg);
132+
dtb::BOOT_ARG.init_once(arg);
137133
axplat::init::init_early(cpu_id, arg);
138134
}
139-
140-
/// Returns the boot argument.
141-
/// This is typically the device tree blob address passed from the bootloader.
142-
pub fn get_bootarg() -> usize {
143-
*BOOT_ARG
144-
}

modules/axruntime/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ pub fn rust_main(cpu_id: usize, arg: usize) -> ! {
169169
let all_devices = axdriver::init_drivers();
170170

171171
#[cfg(feature = "fs")]
172-
axfs::init_filesystems(all_devices.block, axhal::dtb::bootargs_message());
172+
axfs::init_filesystems(all_devices.block, axhal::dtb::get_chosen());
173173

174174
#[cfg(feature = "net")]
175175
axnet::init_network(all_devices.net);

0 commit comments

Comments
 (0)