kernel/fs/drivers/
initramfs.rs1use core::ptr;
11
12use crate::device::fdt::FdtManager;
13use crate::fs::VfsManager;
14use crate::early_println;
15use crate::fs::FileSystemError;
16use crate::vm::vmem::MemoryArea;
17
18static mut INITRAMFS_AREA: Option<MemoryArea> = None;
19
20pub fn relocate_initramfs(usable_area: &mut MemoryArea) -> Result<(), &'static str> {
30 early_println!("[InitRamFS] Relocating initramfs to {:#x}", usable_area.start as usize);
31
32 let fdt_manager = FdtManager::get_manager();
34
35 let original_area = fdt_manager.get_initramfs()
37 .ok_or("Failed to get initramfs from device tree")?;
38
39 let size = original_area.size();
40 early_println!("[InitRamFS] Original initramfs at {:#x}, size: {} bytes",
41 original_area.start, size);
42
43 let new_ptr = usable_area.start as *mut u8;
44 usable_area.start = new_ptr as usize + size;
45
46 unsafe {
48 ptr::copy_nonoverlapping(
49 original_area.start as *const u8,
50 new_ptr,
51 size
52 );
53 }
54
55 let new_area = MemoryArea::new(new_ptr as usize, (new_ptr as usize) + size - 1);
57 early_println!("[InitRamFS] Relocated initramfs to {:#x}", new_area.start);
58
59 unsafe { INITRAMFS_AREA = Some(new_area) };
60
61 Ok(())
62}
63
64fn mount_initramfs(manager: &mut VfsManager, initramfs: MemoryArea) -> Result<(), FileSystemError> {
76 early_println!("[InitRamFS] Initializing initramfs");
77
78 early_println!("[InitRamFS] Using initramfs at address: {:#x}, size: {} bytes",
79 initramfs.start, initramfs.size());
80
81 let fs_id = manager.create_and_register_memory_fs("cpiofs", &initramfs)?;
83
84 match manager.mount(fs_id, "/") {
86 Ok(_) => {
87 early_println!("[InitRamFS] Successfully mounted initramfs at root directory");
88 Ok(())
89 },
90 Err(e) => {
91 early_println!("[InitRamFS] Failed to mount initramfs: {:?}", e);
92 Err(e)
93 }
94 }
95}
96
97#[allow(static_mut_refs)]
98pub fn init_initramfs(manager: &mut VfsManager) {
99 let initramfs_ptr = unsafe { INITRAMFS_AREA.as_ref().map(|area| area.start as *const u8).unwrap_or(core::ptr::null()) };
100 if !initramfs_ptr.is_null() {
101 let initramfs = unsafe { *INITRAMFS_AREA.as_ref().unwrap() };
102
103 if let Err(e) = mount_initramfs(manager, initramfs.clone()) {
105 early_println!("[InitRamFS] Warning: Could not mount initramfs: {:?}", e);
106 return;
107 }
108 } else {
109 early_println!("[InitRamFS] Warning: Initramfs relocation failed, cannot mount");
110 }
111}