Skip to content

Commit 714e69d

Browse files
committed
mm: fix Range type and addr rounding
Signed-off-by: Tianhao Wang <shrik3@mailbox.org>
1 parent fe791ac commit 714e69d

File tree

4 files changed

+32
-53
lines changed

4 files changed

+32
-53
lines changed

src/defs.rs

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,15 @@ pub fn pmap_bss_end() -> u64 {
2222
return ___BSS_END__ as u64;
2323
}
2424

25-
pub struct Mem;
26-
pub struct VAddr(u64);
27-
#[derive(Debug)]
28-
pub struct Range {
29-
pub addr: u64,
30-
pub len: u64,
31-
}
32-
3325
pub fn roundup_4k(addr: u64) -> u64 {
34-
return (addr + 0x1000) & 0xffff_ffff_ffff_0000;
26+
return (addr + 0xfff) & !0xfff;
3527
}
3628

3729
pub fn rounddown_4k(addr: u64) -> u64 {
38-
return addr & 0xffff_ffff_ffff_0000;
39-
}
40-
41-
impl Range {
42-
pub fn contains(&self, addr: u64) -> bool {
43-
return self.addr <= addr && addr < self.addr + self.len;
44-
}
30+
return addr & !0xfff;
4531
}
4632

33+
pub struct Mem;
4734
impl Mem {
4835
// units
4936
pub const K: u64 = 1024;
@@ -70,18 +57,6 @@ impl Mem {
7057
pub const PHY_BM_SIZE: u64 = Mem::PHY_PAGES >> 3;
7158
}
7259

73-
impl VAddr {
74-
pub fn roundup_4k(&self) {
75-
todo!()
76-
}
77-
pub fn rounddown_4k(&self) {
78-
todo!()
79-
}
80-
pub fn page_number(&self) -> u64 {
81-
self.0 >> Mem::PAGE_SHIFT
82-
}
83-
}
84-
8560
// PHY_TOP 128M
8661
// ~ free frames
8762
// PMA::bitmap + PHY_BM_SIZE

src/machine/multiboot.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
use crate::defs::Range;
1+
// use crate::defs::Range;
22
use crate::io::*;
33
use core::fmt;
44
use core::mem::size_of;
5+
use core::ops::Range;
56
use lazy_static::lazy_static;
67
// provide functions to parse information provided by grub multiboot
78
// see docs/multiboot.txt
@@ -58,11 +59,11 @@ impl MultibootMmap {
5859
pub const MTYPE_RAM_NVS: u32 = 4;
5960
/// defective RAM
6061
pub const MTYPE_RAM_DEFECT: u32 = 5;
61-
pub fn get_range(&self) -> Range {
62-
return Range {
63-
addr: self.addr,
64-
len: self.len,
65-
};
62+
pub fn get_range(&self) -> Range<u64> {
63+
Range {
64+
start: self.addr,
65+
end: self.addr + self.len,
66+
}
6667
}
6768
pub fn get_end(&self) -> u64 {
6869
return self.addr + self.len;

src/mm/mod.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::defs::*;
22
use crate::io::*;
33
use crate::machine::multiboot;
4+
use core::ops::Range;
45
pub mod pma;
56

67
use lazy_static::lazy_static;
@@ -32,20 +33,21 @@ pub fn init() {
3233
continue;
3334
}
3435
// TODO early break if the array is already full
35-
if mblock.get_range().contains(pmap_kernel_end()) {
36-
let r = Range {
37-
addr: pmap_kernel_end(),
38-
len: mblock.get_end() - pmap_kernel_end(),
39-
};
40-
inserted += GLOBAL_PMA.lock().insert_range(r);
41-
} else {
42-
inserted += GLOBAL_PMA.lock().insert_range(mblock.get_range());
36+
let mut r = mblock.get_range();
37+
if mblock.get_range().contains(&pmap_kernel_end()) {
38+
r.start = pmap_kernel_end();
4339
}
44-
println!(
45-
"pma init: {:#X}KiB free memory, {:#X} pages inserted from block {:#X?}",
46-
inserted * 0x4,
47-
inserted,
48-
mblock,
49-
);
40+
inserted += GLOBAL_PMA.lock().insert_range(&r);
5041
}
42+
43+
println!(
44+
"pma init: kernel mapped at {:#X} - {:#X}",
45+
pmap_kernel_start(),
46+
pmap_kernel_end()
47+
);
48+
println!(
49+
"pma init: {:#X}KiB free memory, {:#X} pages",
50+
inserted * 0x4,
51+
inserted,
52+
);
5153
}

src/mm/pma.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::defs::*;
22
use crate::io::*;
33
use crate::machine::multiboot::MultibootMmap;
4+
use core::ops::Range;
45
use core::slice;
56

67
extern "C" {
@@ -51,18 +52,18 @@ impl PageStackAllocator {
5152
Some(self.page_stack[self.head])
5253
}
5354

54-
/// 4k page only
55-
pub fn insert_range(&mut self, r: Range) -> u64 {
55+
/// 4k page only?
56+
pub fn insert_range(&mut self, r: &Range<u64>) -> u64 {
57+
// r.contains(&1);
5658
let mut inserted = 0;
57-
let mut page = roundup_4k(r.addr);
59+
let mut page = roundup_4k(r.start);
5860
loop {
59-
if !r.contains(page) {
61+
if !r.contains(&page) {
6062
break;
6163
}
6264
if !self.free_page(page) {
6365
break;
6466
} else {
65-
println!("inserted: {:#X}", page);
6667
inserted += 1;
6768
}
6869
page += 0x1000;

0 commit comments

Comments
 (0)