From cd658673a35df8b0da3551e819e26d35c18b89f2 Mon Sep 17 00:00:00 2001 From: Tianhao Wang Date: Wed, 29 May 2024 19:53:52 +0200 Subject: mm: add stack based PMA use 8MiB reserved array to manage up to 4GiB of physical memory (4K Pages only) Signed-off-by: Tianhao Wang --- src/defs.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 8 deletions(-) (limited to 'src/defs.rs') diff --git a/src/defs.rs b/src/defs.rs index cec17c9..3724c41 100644 --- a/src/defs.rs +++ b/src/defs.rs @@ -1,16 +1,59 @@ +// exported symbols from asm/linker. +// They are always unsafe. +extern "C" { + fn ___KERNEL_START__(); + fn ___KERNEL_END__(); + fn ___BSS_START__(); + fn ___BSS_END__(); +} + +pub fn pmap_kernel_start() -> u64 { + return ___KERNEL_START__ as u64; +} + +pub fn pmap_kernel_end() -> u64 { + return ___KERNEL_END__ as u64; +} +pub fn pmap_bss_start() -> u64 { + return ___BSS_START__ as u64; +} + +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; +} + +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; + } +} impl Mem { // units - pub const K: usize = 1024; - pub const M: usize = 1024 * Mem::K; - pub const G: usize = 1024 * Mem::M; + pub const K: u64 = 1024; + pub const M: u64 = 1024 * Mem::K; + pub const G: u64 = 1024 * Mem::M; // physical memory layout: qemu defaults to 128 MiB phy Memory - pub const PHY_TOP: usize = 128 * Mem::M; + pub const PHY_TOP: u64 = 128 * Mem::M; // 4 lv 4K paging - pub const PAGE_SIZE: usize = 0x1000; - pub const PAGE_SHIFT: usize = 12; + pub const PAGE_SIZE: u64 = 0x1000; + pub const PAGE_SHIFT: u64 = 12; pub const PAGE_MASK: u64 = 0xfff; pub const L0_SHIFT: u8 = 39; pub const L0_MASK: u64 = 0x1ff << Mem::L0_SHIFT; @@ -20,11 +63,11 @@ impl Mem { pub const L2_MASK: u64 = 0x1ff << Mem::L2_SHIFT; pub const L3_SHIFT: u8 = 12; pub const L3_MASK: u64 = 0x1ff << Mem::L3_SHIFT; - pub const PHY_PAGES: usize = Mem::PHY_TOP >> Mem::PAGE_SHIFT; + pub const PHY_PAGES: u64 = Mem::PHY_TOP >> Mem::PAGE_SHIFT; // size of frame allocator bitmap: number of physical frames / 8 for 128M // memory (37268) 4k pages, 37268 bits are needed, hence // 4096 bytes, exactly one page! - pub const PHY_BM_SIZE: usize = Mem::PHY_PAGES >> 3; + pub const PHY_BM_SIZE: u64 = Mem::PHY_PAGES >> 3; } impl VAddr { -- cgit v1.2.3-70-g09d2