aboutsummaryrefslogtreecommitdiff
path: root/src/defs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/defs.rs')
-rw-r--r--src/defs.rs64
1 files changed, 50 insertions, 14 deletions
diff --git a/src/defs.rs b/src/defs.rs
index a89a6c7..af05da5 100644
--- a/src/defs.rs
+++ b/src/defs.rs
@@ -3,29 +3,46 @@
extern "C" {
fn ___KERNEL_PM_START__();
fn ___KERNEL_PM_END__();
- fn ___BSS_PM_START__();
- fn ___BSS_PM_END__();
+ fn ___BSS_START__();
+ fn ___BSS_END__();
}
+#[inline]
pub fn pmap_kernel_start() -> u64 {
- return ___KERNEL_PM_START__ as u64;
+ ___KERNEL_PM_START__ as u64
}
+#[inline]
pub fn pmap_kernel_end() -> u64 {
- return ___KERNEL_PM_END__ as u64;
+ ___KERNEL_PM_END__ as u64
}
-pub fn pmap_bss_start() -> u64 {
- return ___BSS_PM_START__ as u64;
+
+#[inline]
+pub fn vmap_kernel_start() -> u64 {
+ pmap_kernel_start() + Mem::KERNEL_OFFSET
+}
+
+#[inline]
+pub fn vmap_kernel_end() -> u64 {
+ pmap_kernel_end() + Mem::KERNEL_OFFSET
+}
+
+#[inline]
+pub fn bss_start() -> u64 {
+ return ___BSS_START__ as u64;
}
-pub fn pmap_bss_end() -> u64 {
- return ___BSS_PM_END__ as u64;
+#[inline]
+pub fn bss_end() -> u64 {
+ return ___BSS_END__ as u64;
}
+#[inline]
pub fn roundup_4k(addr: u64) -> u64 {
return (addr + 0xfff) & !0xfff;
}
+#[inline]
pub fn rounddown_4k(addr: u64) -> u64 {
return addr & !0xfff;
}
@@ -55,11 +72,30 @@ impl Mem {
// memory (37268) 4k pages, 37268 bits are needed, hence
// 4096 bytes, exactly one page!
pub const PHY_BM_SIZE: u64 = Mem::PHY_PAGES >> 3;
+ pub const ID_MAP_START: u64 = 0xffff_8000_0000_0000;
+ pub const ID_MAP_END: u64 = 0xffff_8010_0000_0000;
+ pub const KERNEL_OFFSET: u64 = 0xffff_8020_0000_0000;
+ // 64 GiB available memory
+ pub const MAX_PHY_MEM: u64 = 0x1000000000;
+}
+
+// convert VA <-> PA wrt. the kernel id mapping
+// from 0xffff_8000_0000_0000 ~ 0xffff_800f_ffff_ffff virtual
+// to 0x0 ~ 0xf_ffff_ffff physical (64G)
+#[allow(non_snake_case)]
+#[inline]
+pub fn V2P(va: u64) -> Option<u64> {
+ if va >= Mem::ID_MAP_END || va < Mem::ID_MAP_START {
+ return None;
+ }
+ return Some(va - Mem::ID_MAP_START);
}
-// PHY_TOP 128M
-// ~ free frames
-// PMA::bitmap + PHY_BM_SIZE
-// ~ ___KERNEL_END__
-// KERNEL IMAGE
-// KERNEL START 1 M
+#[allow(non_snake_case)]
+#[inline]
+pub fn P2V(pa: u64) -> Option<u64> {
+ if pa >= Mem::MAX_PHY_MEM {
+ return None;
+ }
+ return Some(pa + Mem::ID_MAP_START);
+}