aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTianhao Wang <shrik3@mailbox.org>2024-05-30 09:35:16 +0200
committerTianhao Wang <shrik3@mailbox.org>2024-06-11 15:17:11 +0200
commit714e69d281e8b61d4214cea1c7e0a33a2f9cde71 (patch)
treef7723a75835d9af0b1bd090d9dd3bd2511066f84
parentfe791acbe74705b7401a19f1d85cb2f51e8ff616 (diff)
mm: fix Range type and addr rounding
Signed-off-by: Tianhao Wang <shrik3@mailbox.org>
-rw-r--r--src/defs.rs31
-rw-r--r--src/machine/multiboot.rs13
-rw-r--r--src/mm/mod.rs30
-rw-r--r--src/mm/pma.rs11
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;