xref: /DragonOS/kernel/src/arch/riscv64/mm/mod.rs (revision 666cffedab3da9684e5abf5eebcbddae63590364)
14fda81ceSLoGin use crate::mm::{
24fda81ceSLoGin     allocator::page_frame::{FrameAllocator, PageFrameCount, PageFrameUsage},
34fda81ceSLoGin     page::PageFlags,
44fda81ceSLoGin     MemoryManagementArch, PhysAddr, VirtAddr,
54fda81ceSLoGin };
64fda81ceSLoGin 
74fda81ceSLoGin pub mod bump;
8*666cffedSLoGin pub(super) mod init;
94fda81ceSLoGin 
104fda81ceSLoGin pub type PageMapper = crate::mm::page::PageMapper<RiscV64MMArch, LockedFrameAllocator>;
114fda81ceSLoGin 
124fda81ceSLoGin /// RiscV64的内存管理架构结构体
134fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)]
144fda81ceSLoGin pub struct RiscV64MMArch;
154fda81ceSLoGin 
164fda81ceSLoGin impl MemoryManagementArch for RiscV64MMArch {
174fda81ceSLoGin     const PAGE_SHIFT: usize = 12;
184fda81ceSLoGin 
194fda81ceSLoGin     const PAGE_ENTRY_SHIFT: usize = 9;
204fda81ceSLoGin 
214fda81ceSLoGin     /// sv39分页只有三级
224fda81ceSLoGin     const PAGE_LEVELS: usize = 3;
234fda81ceSLoGin 
244fda81ceSLoGin     const ENTRY_ADDRESS_SHIFT: usize = 39;
254fda81ceSLoGin 
264fda81ceSLoGin     const ENTRY_FLAG_DEFAULT_PAGE: usize = Self::ENTRY_FLAG_PRESENT;
274fda81ceSLoGin 
284fda81ceSLoGin     const ENTRY_FLAG_DEFAULT_TABLE: usize = Self::ENTRY_FLAG_PRESENT;
294fda81ceSLoGin 
304fda81ceSLoGin     const ENTRY_FLAG_PRESENT: usize = 1 << 0;
314fda81ceSLoGin 
324fda81ceSLoGin     const ENTRY_FLAG_READONLY: usize = 1 << 1;
334fda81ceSLoGin 
344fda81ceSLoGin     const ENTRY_FLAG_READWRITE: usize = (1 << 2) | (1 << 1);
354fda81ceSLoGin 
364fda81ceSLoGin     const ENTRY_FLAG_USER: usize = (1 << 4);
374fda81ceSLoGin 
384fda81ceSLoGin     const ENTRY_FLAG_WRITE_THROUGH: usize = (2 << 61);
394fda81ceSLoGin 
404fda81ceSLoGin     const ENTRY_FLAG_CACHE_DISABLE: usize = (2 << 61);
414fda81ceSLoGin 
424fda81ceSLoGin     const ENTRY_FLAG_NO_EXEC: usize = 0;
434fda81ceSLoGin 
444fda81ceSLoGin     const ENTRY_FLAG_EXEC: usize = (1 << 3);
454fda81ceSLoGin 
464fda81ceSLoGin     const PHYS_OFFSET: usize = 0xffff_ffc0_0000_0000;
474fda81ceSLoGin 
484fda81ceSLoGin     const USER_END_VADDR: crate::mm::VirtAddr = VirtAddr::new(0x0000_003f_ffff_ffff);
494fda81ceSLoGin 
504fda81ceSLoGin     const USER_BRK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffff_ffff);
514fda81ceSLoGin 
524fda81ceSLoGin     const USER_STACK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffa0_0000);
534fda81ceSLoGin 
544fda81ceSLoGin     unsafe fn init() -> &'static [crate::mm::PhysMemoryArea] {
554fda81ceSLoGin         todo!()
564fda81ceSLoGin     }
574fda81ceSLoGin 
584fda81ceSLoGin     unsafe fn invalidate_page(address: crate::mm::VirtAddr) {
594fda81ceSLoGin         todo!()
604fda81ceSLoGin     }
614fda81ceSLoGin 
624fda81ceSLoGin     unsafe fn invalidate_all() {
634fda81ceSLoGin         todo!()
644fda81ceSLoGin     }
654fda81ceSLoGin 
664fda81ceSLoGin     unsafe fn table(table_kind: crate::mm::PageTableKind) -> crate::mm::PhysAddr {
674fda81ceSLoGin         todo!()
684fda81ceSLoGin     }
694fda81ceSLoGin 
704fda81ceSLoGin     unsafe fn set_table(table_kind: crate::mm::PageTableKind, table: crate::mm::PhysAddr) {
714fda81ceSLoGin         todo!()
724fda81ceSLoGin     }
734fda81ceSLoGin 
744fda81ceSLoGin     fn virt_is_valid(virt: crate::mm::VirtAddr) -> bool {
754fda81ceSLoGin         todo!()
764fda81ceSLoGin     }
774fda81ceSLoGin 
784fda81ceSLoGin     fn initial_page_table() -> crate::mm::PhysAddr {
794fda81ceSLoGin         todo!()
804fda81ceSLoGin     }
814fda81ceSLoGin 
824fda81ceSLoGin     fn setup_new_usermapper() -> Result<crate::mm::ucontext::UserMapper, crate::syscall::SystemError>
834fda81ceSLoGin     {
844fda81ceSLoGin         todo!()
854fda81ceSLoGin     }
864fda81ceSLoGin }
874fda81ceSLoGin 
884fda81ceSLoGin /// 获取内核地址默认的页面标志
894fda81ceSLoGin pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(virt: VirtAddr) -> PageFlags<A> {
904fda81ceSLoGin     unimplemented!("riscv64::kernel_page_flags")
914fda81ceSLoGin }
924fda81ceSLoGin 
934fda81ceSLoGin /// 全局的页帧分配器
944fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)]
954fda81ceSLoGin pub struct LockedFrameAllocator;
964fda81ceSLoGin 
974fda81ceSLoGin impl FrameAllocator for LockedFrameAllocator {
984fda81ceSLoGin     unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> {
994fda81ceSLoGin         unimplemented!("RiscV64 LockedFrameAllocator::allocate")
1004fda81ceSLoGin     }
1014fda81ceSLoGin 
1024fda81ceSLoGin     unsafe fn free(&mut self, address: crate::mm::PhysAddr, count: PageFrameCount) {
1034fda81ceSLoGin         assert!(count.data().is_power_of_two());
1044fda81ceSLoGin         unimplemented!("RiscV64 LockedFrameAllocator::free")
1054fda81ceSLoGin     }
1064fda81ceSLoGin 
1074fda81ceSLoGin     unsafe fn usage(&self) -> PageFrameUsage {
1084fda81ceSLoGin         unimplemented!("RiscV64 LockedFrameAllocator::usage")
1094fda81ceSLoGin     }
1104fda81ceSLoGin }
111