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