1*4fda81ceSLoGin use crate::mm::{ 2*4fda81ceSLoGin allocator::page_frame::{FrameAllocator, PageFrameCount, PageFrameUsage}, 3*4fda81ceSLoGin page::PageFlags, 4*4fda81ceSLoGin MemoryManagementArch, PhysAddr, VirtAddr, 5*4fda81ceSLoGin }; 6*4fda81ceSLoGin 7*4fda81ceSLoGin pub mod bump; 8*4fda81ceSLoGin 9*4fda81ceSLoGin pub type PageMapper = crate::mm::page::PageMapper<RiscV64MMArch, LockedFrameAllocator>; 10*4fda81ceSLoGin 11*4fda81ceSLoGin /// RiscV64的内存管理架构结构体 12*4fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)] 13*4fda81ceSLoGin pub struct RiscV64MMArch; 14*4fda81ceSLoGin 15*4fda81ceSLoGin impl MemoryManagementArch for RiscV64MMArch { 16*4fda81ceSLoGin const PAGE_SHIFT: usize = 12; 17*4fda81ceSLoGin 18*4fda81ceSLoGin const PAGE_ENTRY_SHIFT: usize = 9; 19*4fda81ceSLoGin 20*4fda81ceSLoGin /// sv39分页只有三级 21*4fda81ceSLoGin const PAGE_LEVELS: usize = 3; 22*4fda81ceSLoGin 23*4fda81ceSLoGin const ENTRY_ADDRESS_SHIFT: usize = 39; 24*4fda81ceSLoGin 25*4fda81ceSLoGin const ENTRY_FLAG_DEFAULT_PAGE: usize = Self::ENTRY_FLAG_PRESENT; 26*4fda81ceSLoGin 27*4fda81ceSLoGin const ENTRY_FLAG_DEFAULT_TABLE: usize = Self::ENTRY_FLAG_PRESENT; 28*4fda81ceSLoGin 29*4fda81ceSLoGin const ENTRY_FLAG_PRESENT: usize = 1 << 0; 30*4fda81ceSLoGin 31*4fda81ceSLoGin const ENTRY_FLAG_READONLY: usize = 1 << 1; 32*4fda81ceSLoGin 33*4fda81ceSLoGin const ENTRY_FLAG_READWRITE: usize = (1 << 2) | (1 << 1); 34*4fda81ceSLoGin 35*4fda81ceSLoGin const ENTRY_FLAG_USER: usize = (1 << 4); 36*4fda81ceSLoGin 37*4fda81ceSLoGin const ENTRY_FLAG_WRITE_THROUGH: usize = (2 << 61); 38*4fda81ceSLoGin 39*4fda81ceSLoGin const ENTRY_FLAG_CACHE_DISABLE: usize = (2 << 61); 40*4fda81ceSLoGin 41*4fda81ceSLoGin const ENTRY_FLAG_NO_EXEC: usize = 0; 42*4fda81ceSLoGin 43*4fda81ceSLoGin const ENTRY_FLAG_EXEC: usize = (1 << 3); 44*4fda81ceSLoGin 45*4fda81ceSLoGin const PHYS_OFFSET: usize = 0xffff_ffc0_0000_0000; 46*4fda81ceSLoGin 47*4fda81ceSLoGin const USER_END_VADDR: crate::mm::VirtAddr = VirtAddr::new(0x0000_003f_ffff_ffff); 48*4fda81ceSLoGin 49*4fda81ceSLoGin const USER_BRK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffff_ffff); 50*4fda81ceSLoGin 51*4fda81ceSLoGin const USER_STACK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffa0_0000); 52*4fda81ceSLoGin 53*4fda81ceSLoGin unsafe fn init() -> &'static [crate::mm::PhysMemoryArea] { 54*4fda81ceSLoGin todo!() 55*4fda81ceSLoGin } 56*4fda81ceSLoGin 57*4fda81ceSLoGin unsafe fn invalidate_page(address: crate::mm::VirtAddr) { 58*4fda81ceSLoGin todo!() 59*4fda81ceSLoGin } 60*4fda81ceSLoGin 61*4fda81ceSLoGin unsafe fn invalidate_all() { 62*4fda81ceSLoGin todo!() 63*4fda81ceSLoGin } 64*4fda81ceSLoGin 65*4fda81ceSLoGin unsafe fn table(table_kind: crate::mm::PageTableKind) -> crate::mm::PhysAddr { 66*4fda81ceSLoGin todo!() 67*4fda81ceSLoGin } 68*4fda81ceSLoGin 69*4fda81ceSLoGin unsafe fn set_table(table_kind: crate::mm::PageTableKind, table: crate::mm::PhysAddr) { 70*4fda81ceSLoGin todo!() 71*4fda81ceSLoGin } 72*4fda81ceSLoGin 73*4fda81ceSLoGin fn virt_is_valid(virt: crate::mm::VirtAddr) -> bool { 74*4fda81ceSLoGin todo!() 75*4fda81ceSLoGin } 76*4fda81ceSLoGin 77*4fda81ceSLoGin fn initial_page_table() -> crate::mm::PhysAddr { 78*4fda81ceSLoGin todo!() 79*4fda81ceSLoGin } 80*4fda81ceSLoGin 81*4fda81ceSLoGin fn setup_new_usermapper() -> Result<crate::mm::ucontext::UserMapper, crate::syscall::SystemError> 82*4fda81ceSLoGin { 83*4fda81ceSLoGin todo!() 84*4fda81ceSLoGin } 85*4fda81ceSLoGin } 86*4fda81ceSLoGin 87*4fda81ceSLoGin /// 获取内核地址默认的页面标志 88*4fda81ceSLoGin pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(virt: VirtAddr) -> PageFlags<A> { 89*4fda81ceSLoGin unimplemented!("riscv64::kernel_page_flags") 90*4fda81ceSLoGin } 91*4fda81ceSLoGin 92*4fda81ceSLoGin /// 全局的页帧分配器 93*4fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)] 94*4fda81ceSLoGin pub struct LockedFrameAllocator; 95*4fda81ceSLoGin 96*4fda81ceSLoGin impl FrameAllocator for LockedFrameAllocator { 97*4fda81ceSLoGin unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> { 98*4fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::allocate") 99*4fda81ceSLoGin } 100*4fda81ceSLoGin 101*4fda81ceSLoGin unsafe fn free(&mut self, address: crate::mm::PhysAddr, count: PageFrameCount) { 102*4fda81ceSLoGin assert!(count.data().is_power_of_two()); 103*4fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::free") 104*4fda81ceSLoGin } 105*4fda81ceSLoGin 106*4fda81ceSLoGin unsafe fn usage(&self) -> PageFrameUsage { 107*4fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::usage") 108*4fda81ceSLoGin } 109*4fda81ceSLoGin } 110