aboutsummaryrefslogtreecommitdiff
path: root/src/defs.rs
diff options
context:
space:
mode:
authorTianhao Wang <shrik3@mailbox.org>2024-05-29 19:53:52 +0200
committerTianhao Wang <shrik3@mailbox.org>2024-06-11 15:17:11 +0200
commitcd658673a35df8b0da3551e819e26d35c18b89f2 (patch)
tree74c209b519290eb43545e800b88ddf9dfa796a7a /src/defs.rs
parent9cf85e88211512b0410f9bb9f2f19ea4ce9a8190 (diff)
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 <shrik3@mailbox.org>
Diffstat (limited to 'src/defs.rs')
-rw-r--r--src/defs.rs59
1 files changed, 51 insertions, 8 deletions
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 {