diff options
| author | Tianhao Wang <shrik3@mailbox.org> | 2024-05-30 09:35:16 +0200 |
|---|---|---|
| committer | Tianhao Wang <shrik3@mailbox.org> | 2024-06-11 15:17:11 +0200 |
| commit | 714e69d281e8b61d4214cea1c7e0a33a2f9cde71 (patch) | |
| tree | f7723a75835d9af0b1bd090d9dd3bd2511066f84 | |
| parent | fe791acbe74705b7401a19f1d85cb2f51e8ff616 (diff) | |
mm: fix Range type and addr rounding
Signed-off-by: Tianhao Wang <shrik3@mailbox.org>
| -rw-r--r-- | src/defs.rs | 31 | ||||
| -rw-r--r-- | src/machine/multiboot.rs | 13 | ||||
| -rw-r--r-- | src/mm/mod.rs | 30 | ||||
| -rw-r--r-- | src/mm/pma.rs | 11 |
4 files changed, 32 insertions, 53 deletions
diff --git a/src/defs.rs b/src/defs.rs index 3724c41..ddde0da 100644 --- a/src/defs.rs +++ b/src/defs.rs @@ -22,28 +22,15 @@ pub fn pmap_bss_end() -> u64 { return ___BSS_END__ as u64; } -pub struct Mem; -pub struct VAddr(u64); -#[derive(Debug)] -pub struct Range { - pub addr: u64, - pub len: u64, -} - pub fn roundup_4k(addr: u64) -> u64 { - return (addr + 0x1000) & 0xffff_ffff_ffff_0000; + return (addr + 0xfff) & !0xfff; } pub fn rounddown_4k(addr: u64) -> u64 { - return addr & 0xffff_ffff_ffff_0000; -} - -impl Range { - pub fn contains(&self, addr: u64) -> bool { - return self.addr <= addr && addr < self.addr + self.len; - } + return addr & !0xfff; } +pub struct Mem; impl Mem { // units pub const K: u64 = 1024; @@ -70,18 +57,6 @@ impl Mem { pub const PHY_BM_SIZE: u64 = Mem::PHY_PAGES >> 3; } -impl VAddr { - pub fn roundup_4k(&self) { - todo!() - } - pub fn rounddown_4k(&self) { - todo!() - } - pub fn page_number(&self) -> u64 { - self.0 >> Mem::PAGE_SHIFT - } -} - // PHY_TOP 128M // ~ free frames // PMA::bitmap + PHY_BM_SIZE diff --git a/src/machine/multiboot.rs b/src/machine/multiboot.rs index 303ed17..957f5de 100644 --- a/src/machine/multiboot.rs +++ b/src/machine/multiboot.rs @@ -1,7 +1,8 @@ -use crate::defs::Range; +// use crate::defs::Range; use crate::io::*; use core::fmt; use core::mem::size_of; +use core::ops::Range; use lazy_static::lazy_static; // provide functions to parse information provided by grub multiboot // see docs/multiboot.txt @@ -58,11 +59,11 @@ impl MultibootMmap { pub const MTYPE_RAM_NVS: u32 = 4; /// defective RAM pub const MTYPE_RAM_DEFECT: u32 = 5; - pub fn get_range(&self) -> Range { - return Range { - addr: self.addr, - len: self.len, - }; + pub fn get_range(&self) -> Range<u64> { + Range { + start: self.addr, + end: self.addr + self.len, + } } pub fn get_end(&self) -> u64 { return self.addr + self.len; diff --git a/src/mm/mod.rs b/src/mm/mod.rs index 27737e8..8d07cc5 100644 --- a/src/mm/mod.rs +++ b/src/mm/mod.rs @@ -1,6 +1,7 @@ use crate::defs::*; use crate::io::*; use crate::machine::multiboot; +use core::ops::Range; pub mod pma; use lazy_static::lazy_static; @@ -32,20 +33,21 @@ pub fn init() { continue; } // TODO early break if the array is already full - if mblock.get_range().contains(pmap_kernel_end()) { - let r = Range { - addr: pmap_kernel_end(), - len: mblock.get_end() - pmap_kernel_end(), - }; - inserted += GLOBAL_PMA.lock().insert_range(r); - } else { - inserted += GLOBAL_PMA.lock().insert_range(mblock.get_range()); + let mut r = mblock.get_range(); + if mblock.get_range().contains(&pmap_kernel_end()) { + r.start = pmap_kernel_end(); } - println!( - "pma init: {:#X}KiB free memory, {:#X} pages inserted from block {:#X?}", - inserted * 0x4, - inserted, - mblock, - ); + inserted += GLOBAL_PMA.lock().insert_range(&r); } + + println!( + "pma init: kernel mapped at {:#X} - {:#X}", + pmap_kernel_start(), + pmap_kernel_end() + ); + println!( + "pma init: {:#X}KiB free memory, {:#X} pages", + inserted * 0x4, + inserted, + ); } diff --git a/src/mm/pma.rs b/src/mm/pma.rs index a4c27c4..f2822e6 100644 --- a/src/mm/pma.rs +++ b/src/mm/pma.rs @@ -1,6 +1,7 @@ use crate::defs::*; use crate::io::*; use crate::machine::multiboot::MultibootMmap; +use core::ops::Range; use core::slice; extern "C" { @@ -51,18 +52,18 @@ impl PageStackAllocator { Some(self.page_stack[self.head]) } - /// 4k page only - pub fn insert_range(&mut self, r: Range) -> u64 { + /// 4k page only? + pub fn insert_range(&mut self, r: &Range<u64>) -> u64 { + // r.contains(&1); let mut inserted = 0; - let mut page = roundup_4k(r.addr); + let mut page = roundup_4k(r.start); loop { - if !r.contains(page) { + if !r.contains(&page) { break; } if !self.free_page(page) { break; } else { - println!("inserted: {:#X}", page); inserted += 1; } page += 0x1000; |
