diff --git a/os/src/config.rs b/os/src/config.rs index 2fea79d3..2c262360 100644 --- a/os/src/config.rs +++ b/os/src/config.rs @@ -18,4 +18,4 @@ pub fn kernel_stack_position(app_id: usize) -> (usize, usize) { pub const CLOCK_FREQ: usize = 403000000 / 62; #[cfg(feature = "board_qemu")] -pub const CLOCK_FREQ: usize = 12500000; \ No newline at end of file +pub const CLOCK_FREQ: usize = 12500000; diff --git a/os/src/mm/address.rs b/os/src/mm/address.rs index 90ec3aaa..e6fc10f7 100644 --- a/os/src/mm/address.rs +++ b/os/src/mm/address.rs @@ -2,6 +2,11 @@ use crate::config::{PAGE_SIZE, PAGE_SIZE_BITS}; use super::PageTableEntry; use core::fmt::{self, Debug, Formatter}; +const PA_WIDTH_SV39: usize = 56; +const VA_WIDTH_SV39: usize = 39; +const PPN_WIDTH_SV39: usize = PA_WIDTH_SV39 - PAGE_SIZE_BITS; +const VPN_WIDTH_SV39: usize = VA_WIDTH_SV39 - PAGE_SIZE_BITS; + /// Definitions #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] pub struct PhysAddr(pub usize); @@ -43,16 +48,16 @@ impl Debug for PhysPageNum { /// usize -> T: usize.into() impl From for PhysAddr { - fn from(v: usize) -> Self { Self(v) } + fn from(v: usize) -> Self { Self(v & ( (1 << PA_WIDTH_SV39) - 1 )) } } impl From for PhysPageNum { - fn from(v: usize) -> Self { Self(v) } + fn from(v: usize) -> Self { Self(v & ( (1 << PPN_WIDTH_SV39) - 1 )) } } impl From for VirtAddr { - fn from(v: usize) -> Self { Self(v) } + fn from(v: usize) -> Self { Self(v & ( (1 << VA_WIDTH_SV39) - 1 )) } } impl From for VirtPageNum { - fn from(v: usize) -> Self { Self(v) } + fn from(v: usize) -> Self { Self(v & ( (1 << VPN_WIDTH_SV39) - 1 )) } } impl From for usize { fn from(v: PhysAddr) -> Self { v.0 } @@ -187,4 +192,4 @@ impl Iterator for SimpleRangeIterator where } } } -pub type VPNRange = SimpleRange; \ No newline at end of file +pub type VPNRange = SimpleRange;