191e9d4abSLoGin use system_error::SystemError; 291e9d4abSLoGin 34fda81ceSLoGin use crate::mm::{ 44fda81ceSLoGin allocator::page_frame::{FrameAllocator, PageFrameCount, PageFrameUsage}, 54fda81ceSLoGin page::PageFlags, 64fda81ceSLoGin MemoryManagementArch, PhysAddr, VirtAddr, 74fda81ceSLoGin }; 84fda81ceSLoGin 94fda81ceSLoGin pub mod bump; 10666cffedSLoGin pub(super) mod init; 114fda81ceSLoGin 124fda81ceSLoGin pub type PageMapper = crate::mm::page::PageMapper<RiscV64MMArch, LockedFrameAllocator>; 134fda81ceSLoGin 14*74ffde66SLoGin /// RiscV64的内存管理架构结构体(sv39) 154fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)] 164fda81ceSLoGin pub struct RiscV64MMArch; 174fda81ceSLoGin 184fda81ceSLoGin impl MemoryManagementArch for RiscV64MMArch { 194fda81ceSLoGin const PAGE_SHIFT: usize = 12; 204fda81ceSLoGin 214fda81ceSLoGin const PAGE_ENTRY_SHIFT: usize = 9; 224fda81ceSLoGin 234fda81ceSLoGin /// sv39分页只有三级 244fda81ceSLoGin const PAGE_LEVELS: usize = 3; 254fda81ceSLoGin 264fda81ceSLoGin const ENTRY_ADDRESS_SHIFT: usize = 39; 274fda81ceSLoGin 284fda81ceSLoGin const ENTRY_FLAG_DEFAULT_PAGE: usize = Self::ENTRY_FLAG_PRESENT; 294fda81ceSLoGin 304fda81ceSLoGin const ENTRY_FLAG_DEFAULT_TABLE: usize = Self::ENTRY_FLAG_PRESENT; 314fda81ceSLoGin 324fda81ceSLoGin const ENTRY_FLAG_PRESENT: usize = 1 << 0; 334fda81ceSLoGin 344fda81ceSLoGin const ENTRY_FLAG_READONLY: usize = 1 << 1; 354fda81ceSLoGin 364fda81ceSLoGin const ENTRY_FLAG_READWRITE: usize = (1 << 2) | (1 << 1); 374fda81ceSLoGin 384fda81ceSLoGin const ENTRY_FLAG_USER: usize = (1 << 4); 394fda81ceSLoGin 404fda81ceSLoGin const ENTRY_FLAG_WRITE_THROUGH: usize = (2 << 61); 414fda81ceSLoGin 424fda81ceSLoGin const ENTRY_FLAG_CACHE_DISABLE: usize = (2 << 61); 434fda81ceSLoGin 444fda81ceSLoGin const ENTRY_FLAG_NO_EXEC: usize = 0; 454fda81ceSLoGin 464fda81ceSLoGin const ENTRY_FLAG_EXEC: usize = (1 << 3); 474fda81ceSLoGin 484fda81ceSLoGin const PHYS_OFFSET: usize = 0xffff_ffc0_0000_0000; 494fda81ceSLoGin 504fda81ceSLoGin const USER_END_VADDR: crate::mm::VirtAddr = VirtAddr::new(0x0000_003f_ffff_ffff); 514fda81ceSLoGin 524fda81ceSLoGin const USER_BRK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffff_ffff); 534fda81ceSLoGin 544fda81ceSLoGin const USER_STACK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffa0_0000); 554fda81ceSLoGin 56*74ffde66SLoGin /// 在距离sv39的顶端还有1G的位置,设置为FIXMAP的起始地址 57*74ffde66SLoGin const FIXMAP_START_VADDR: VirtAddr = VirtAddr::new(0xffff_ffff_8000_0000); 58*74ffde66SLoGin /// 设置1MB的fixmap空间 59*74ffde66SLoGin const FIXMAP_SIZE: usize = 256 * 4096; 60*74ffde66SLoGin 6145626c85SLoGin unsafe fn init() { 624fda81ceSLoGin todo!() 634fda81ceSLoGin } 644fda81ceSLoGin 654fda81ceSLoGin unsafe fn invalidate_page(address: crate::mm::VirtAddr) { 664fda81ceSLoGin todo!() 674fda81ceSLoGin } 684fda81ceSLoGin 694fda81ceSLoGin unsafe fn invalidate_all() { 704fda81ceSLoGin todo!() 714fda81ceSLoGin } 724fda81ceSLoGin 734fda81ceSLoGin unsafe fn table(table_kind: crate::mm::PageTableKind) -> crate::mm::PhysAddr { 744fda81ceSLoGin todo!() 754fda81ceSLoGin } 764fda81ceSLoGin 774fda81ceSLoGin unsafe fn set_table(table_kind: crate::mm::PageTableKind, table: crate::mm::PhysAddr) { 784fda81ceSLoGin todo!() 794fda81ceSLoGin } 804fda81ceSLoGin 814fda81ceSLoGin fn virt_is_valid(virt: crate::mm::VirtAddr) -> bool { 824fda81ceSLoGin todo!() 834fda81ceSLoGin } 844fda81ceSLoGin 854fda81ceSLoGin fn initial_page_table() -> crate::mm::PhysAddr { 864fda81ceSLoGin todo!() 874fda81ceSLoGin } 884fda81ceSLoGin 8991e9d4abSLoGin fn setup_new_usermapper() -> Result<crate::mm::ucontext::UserMapper, SystemError> { 904fda81ceSLoGin todo!() 914fda81ceSLoGin } 924fda81ceSLoGin } 934fda81ceSLoGin 944fda81ceSLoGin /// 获取内核地址默认的页面标志 954fda81ceSLoGin pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(virt: VirtAddr) -> PageFlags<A> { 964fda81ceSLoGin unimplemented!("riscv64::kernel_page_flags") 974fda81ceSLoGin } 984fda81ceSLoGin 994fda81ceSLoGin /// 全局的页帧分配器 1004fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)] 1014fda81ceSLoGin pub struct LockedFrameAllocator; 1024fda81ceSLoGin 1034fda81ceSLoGin impl FrameAllocator for LockedFrameAllocator { 1044fda81ceSLoGin unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> { 1054fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::allocate") 1064fda81ceSLoGin } 1074fda81ceSLoGin 1084fda81ceSLoGin unsafe fn free(&mut self, address: crate::mm::PhysAddr, count: PageFrameCount) { 1094fda81ceSLoGin assert!(count.data().is_power_of_two()); 1104fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::free") 1114fda81ceSLoGin } 1124fda81ceSLoGin 1134fda81ceSLoGin unsafe fn usage(&self) -> PageFrameUsage { 1144fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::usage") 1154fda81ceSLoGin } 1164fda81ceSLoGin } 117