From 0234279ca861179d73ea125b947acc9baacb31ec Mon Sep 17 00:00:00 2001 From: Tianhao Wang Date: Wed, 29 May 2024 05:41:51 +0200 Subject: multiboot: parse mmap blocks Signed-off-by: Tianhao Wang --- src/machine/multiboot.rs | 55 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'src/machine/multiboot.rs') diff --git a/src/machine/multiboot.rs b/src/machine/multiboot.rs index c420c2b..885e104 100644 --- a/src/machine/multiboot.rs +++ b/src/machine/multiboot.rs @@ -1,4 +1,6 @@ use crate::io::*; +use core::fmt; +use core::mem::size_of; use lazy_static::lazy_static; // provide functions to parse information provided by grub multiboot // see docs/multiboot.txt @@ -24,7 +26,6 @@ pub fn check() -> bool { #[repr(C)] #[repr(packed)] -#[derive(Debug)] pub struct MultibootMmap { pub size: u32, pub addr: u64, @@ -32,6 +33,41 @@ pub struct MultibootMmap { pub mtype: u32, } +impl fmt::Debug for MultibootMmap { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let addr = self.addr; + let len = self.len; + let mtype = self.mtype; + write!( + f, + "[{}] @ {:#X} + {:#X}", + match mtype { + MultibootMmap::MTYPE_RAM => "GOOD", + MultibootMmap::MTYPE_RAM_RES => "RESV", + MultibootMmap::MTYPE_ACPI => "ACPI", + MultibootMmap::MTYPE_RAM_NVS => "NVS ", + MultibootMmap::MTYPE_RAM_DEFECT => "BAD ", + _ => "UNKN", + }, + addr, + len, + ) + } +} + +impl MultibootMmap { + /// avaialble ram + pub const MTYPE_RAM: u32 = 1; + /// reserved ram + pub const MTYPE_RAM_RES: u32 = 2; + /// usable memory holding ACPI info + pub const MTYPE_ACPI: u32 = 3; + /// WHAT IS THIS 4??? + pub const MTYPE_RAM_NVS: u32 = 4; + /// defective RAM + pub const MTYPE_RAM_DEFECT: u32 = 5; +} + #[repr(C)] #[repr(packed)] #[derive(Debug, Clone, Copy)] @@ -40,6 +76,23 @@ pub struct MultibootInfoMmap { pub mmap_addr: u32, } +pub fn _test_mmap() { + let mmapinfo = unsafe { MBOOTINFO.get_mmap() }.unwrap(); + let buf_start = mmapinfo.mmap_addr; + let buf_len = mmapinfo.mmap_length; + let buf_end = buf_start + buf_len; + let mut curr = buf_start as u64; + loop { + if curr >= buf_end as u64 { + break; + } + let mblock = unsafe { &*(curr as *const MultibootMmap) }; + curr += mblock.size as u64; + curr += 4; // mmap.size does not include the the size itself + println!("mem block {:#X?}", mblock); + } +} + #[repr(C)] #[repr(packed)] #[derive(Debug, Clone, Copy)] -- cgit v1.2.3-70-g09d2