diff --git a/src/os/uefi/arch/x86_64/mod.rs b/src/os/uefi/arch/x86_64/mod.rs index ad5ade1bfa36708bf377c9cdbc8314cafe10a85a..aba74d9ea25751b76677ccfa935e7e0e4d66eeeb 100644 --- a/src/os/uefi/arch/x86_64/mod.rs +++ b/src/os/uefi/arch/x86_64/mod.rs @@ -223,7 +223,35 @@ fn inner() -> Result<()> { } println!("Loading Kernel..."); - let kernel = { + let kernel = if let Ok((_i, mut kernel_file)) = find("\\redox_bootloader\\kernel") { + let info = kernel_file.info()?; + let len = info.FileSize; + + let kernel = unsafe { + let ptr = allocate_zero_pages((len as usize + page_size - 1) / page_size)?; + slice::from_raw_parts_mut( + ptr as *mut u8, + len as usize + ) + }; + + let mut i = 0; + for mut chunk in kernel.chunks_mut(4 * MB) { + print!("\r{}% - {} MB", i as u64 * 100 / len, i / MB); + + let count = kernel_file.read(&mut chunk)?; + if count == 0 { + break; + } + //TODO: return error instead of assert + assert_eq!(count, chunk.len()); + + i += count; + } + println!("\r{}% - {} MB", i as u64 * 100 / len, i / MB); + + kernel + } else { let mut fs = redoxfs()?; let root = fs.header.1.root;