xref: /DragonOS/kernel/src/arch/riscv64/mm/mod.rs (revision 91e9d4ab55ef960f57a1b6287bc523ca4341f67a)
1*91e9d4abSLoGin use system_error::SystemError;
2*91e9d4abSLoGin 
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 
144fda81ceSLoGin /// RiscV64的内存管理架构结构体
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 
564fda81ceSLoGin     unsafe fn init() -> &'static [crate::mm::PhysMemoryArea] {
574fda81ceSLoGin         todo!()
584fda81ceSLoGin     }
594fda81ceSLoGin 
604fda81ceSLoGin     unsafe fn invalidate_page(address: crate::mm::VirtAddr) {
614fda81ceSLoGin         todo!()
624fda81ceSLoGin     }
634fda81ceSLoGin 
644fda81ceSLoGin     unsafe fn invalidate_all() {
654fda81ceSLoGin         todo!()
664fda81ceSLoGin     }
674fda81ceSLoGin 
684fda81ceSLoGin     unsafe fn table(table_kind: crate::mm::PageTableKind) -> crate::mm::PhysAddr {
694fda81ceSLoGin         todo!()
704fda81ceSLoGin     }
714fda81ceSLoGin 
724fda81ceSLoGin     unsafe fn set_table(table_kind: crate::mm::PageTableKind, table: crate::mm::PhysAddr) {
734fda81ceSLoGin         todo!()
744fda81ceSLoGin     }
754fda81ceSLoGin 
764fda81ceSLoGin     fn virt_is_valid(virt: crate::mm::VirtAddr) -> bool {
774fda81ceSLoGin         todo!()
784fda81ceSLoGin     }
794fda81ceSLoGin 
804fda81ceSLoGin     fn initial_page_table() -> crate::mm::PhysAddr {
814fda81ceSLoGin         todo!()
824fda81ceSLoGin     }
834fda81ceSLoGin 
84*91e9d4abSLoGin     fn setup_new_usermapper() -> Result<crate::mm::ucontext::UserMapper, SystemError> {
854fda81ceSLoGin         todo!()
864fda81ceSLoGin     }
874fda81ceSLoGin }
884fda81ceSLoGin 
894fda81ceSLoGin /// 获取内核地址默认的页面标志
904fda81ceSLoGin pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(virt: VirtAddr) -> PageFlags<A> {
914fda81ceSLoGin     unimplemented!("riscv64::kernel_page_flags")
924fda81ceSLoGin }
934fda81ceSLoGin 
944fda81ceSLoGin /// 全局的页帧分配器
954fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)]
964fda81ceSLoGin pub struct LockedFrameAllocator;
974fda81ceSLoGin 
984fda81ceSLoGin impl FrameAllocator for LockedFrameAllocator {
994fda81ceSLoGin     unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> {
1004fda81ceSLoGin         unimplemented!("RiscV64 LockedFrameAllocator::allocate")
1014fda81ceSLoGin     }
1024fda81ceSLoGin 
1034fda81ceSLoGin     unsafe fn free(&mut self, address: crate::mm::PhysAddr, count: PageFrameCount) {
1044fda81ceSLoGin         assert!(count.data().is_power_of_two());
1054fda81ceSLoGin         unimplemented!("RiscV64 LockedFrameAllocator::free")
1064fda81ceSLoGin     }
1074fda81ceSLoGin 
1084fda81ceSLoGin     unsafe fn usage(&self) -> PageFrameUsage {
1094fda81ceSLoGin         unimplemented!("RiscV64 LockedFrameAllocator::usage")
1104fda81ceSLoGin     }
1114fda81ceSLoGin }
112