xref: /DragonOS/kernel/src/arch/riscv64/mm/mod.rs (revision 74ffde667e5e7f4ac8ce6d5a5ec2c1403f36cbb0)
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