1
1
use riscv:: register:: satp;
2
2
use system_error:: SystemError ;
3
3
4
- use crate :: {
5
- kdebug,
6
- mm:: {
7
- allocator:: page_frame:: { FrameAllocator , PageFrameCount , PageFrameUsage , PhysPageFrame } ,
8
- page:: PageFlags ,
9
- MemoryManagementArch , PageTableKind , PhysAddr , VirtAddr ,
10
- } ,
4
+ use crate :: mm:: {
5
+ allocator:: page_frame:: { FrameAllocator , PageFrameCount , PageFrameUsage , PhysPageFrame } ,
6
+ page:: PageFlags ,
7
+ MemoryManagementArch , PageTableKind , PhysAddr , VirtAddr ,
11
8
} ;
12
9
13
10
pub mod bump;
@@ -28,6 +25,9 @@ pub(self) static mut KERNEL_END_VA: VirtAddr = VirtAddr::new(0);
28
25
#[ derive( Debug , Clone , Copy , Hash ) ]
29
26
pub struct RiscV64MMArch ;
30
27
28
+ impl RiscV64MMArch {
29
+ pub const ENTRY_FLAG_GLOBAL : usize = 1 << 5 ;
30
+ }
31
31
impl MemoryManagementArch for RiscV64MMArch {
32
32
const PAGE_SHIFT : usize = 12 ;
33
33
@@ -38,13 +38,17 @@ impl MemoryManagementArch for RiscV64MMArch {
38
38
39
39
const ENTRY_ADDRESS_SHIFT : usize = 39 ;
40
40
41
- const ENTRY_FLAG_DEFAULT_PAGE : usize = Self :: ENTRY_FLAG_PRESENT ;
41
+ const ENTRY_FLAG_DEFAULT_PAGE : usize = Self :: ENTRY_FLAG_PRESENT
42
+ | Self :: ENTRY_FLAG_READWRITE
43
+ | Self :: ENTRY_FLAG_DIRTY
44
+ | Self :: ENTRY_FLAG_ACCESSED
45
+ | Self :: ENTRY_FLAG_GLOBAL ;
42
46
43
47
const ENTRY_FLAG_DEFAULT_TABLE : usize = Self :: ENTRY_FLAG_PRESENT ;
44
48
45
49
const ENTRY_FLAG_PRESENT : usize = 1 << 0 ;
46
50
47
- const ENTRY_FLAG_READONLY : usize = 1 << 1 ;
51
+ const ENTRY_FLAG_READONLY : usize = 0 ;
48
52
49
53
const ENTRY_FLAG_READWRITE : usize = ( 1 << 2 ) | ( 1 << 1 ) ;
50
54
@@ -57,6 +61,8 @@ impl MemoryManagementArch for RiscV64MMArch {
57
61
const ENTRY_FLAG_NO_EXEC : usize = 0 ;
58
62
59
63
const ENTRY_FLAG_EXEC : usize = ( 1 << 3 ) ;
64
+ const ENTRY_FLAG_ACCESSED : usize = ( 1 << 6 ) ;
65
+ const ENTRY_FLAG_DIRTY : usize = ( 1 << 7 ) ;
60
66
61
67
const PHYS_OFFSET : usize = 0xffff_ffc0_0000_0000 ;
62
68
@@ -89,14 +95,11 @@ impl MemoryManagementArch for RiscV64MMArch {
89
95
90
96
let paddr = PhysPageFrame :: from_ppn ( ppn) . phys_address ( ) ;
91
97
92
- kdebug ! ( "table(): {paddr:?}, ppn: {ppn}" ) ;
93
-
94
98
return paddr;
95
99
}
96
100
97
101
unsafe fn set_table ( _table_kind : PageTableKind , table : PhysAddr ) {
98
102
let ppn = PhysPageFrame :: new ( table) . ppn ( ) ;
99
- kdebug ! ( "set_table(): {table:?}, ppn:{ppn}" ) ;
100
103
riscv:: asm:: sfence_vma_all ( ) ;
101
104
satp:: set ( satp:: Mode :: Sv39 , 0 , ppn) ;
102
105
}
@@ -131,13 +134,11 @@ impl MemoryManagementArch for RiscV64MMArch {
131
134
unsafe fn virt_2_phys ( virt : VirtAddr ) -> Option < PhysAddr > {
132
135
if virt >= KERNEL_BEGIN_VA && virt < KERNEL_END_VA {
133
136
let r = KERNEL_BEGIN_PA + ( virt - KERNEL_BEGIN_VA ) ;
134
- kdebug ! ( "virt_2_phys: kernel address: virt = {virt:?}, paddr = {r:?}" ) ;
135
137
return Some ( r) ;
136
138
}
137
139
138
140
if let Some ( paddr) = virt. data ( ) . checked_sub ( Self :: PHYS_OFFSET ) {
139
141
let r = PhysAddr :: new ( paddr) ;
140
- kdebug ! ( "virt_2_phys: non-kernel address: virt = {virt:?}, paddr = {r:?}" ) ;
141
142
return Some ( r) ;
142
143
} else {
143
144
return None ;
@@ -147,8 +148,6 @@ impl MemoryManagementArch for RiscV64MMArch {
147
148
fn make_entry ( paddr : PhysAddr , page_flags : usize ) -> usize {
148
149
let ppn = PhysPageFrame :: new ( paddr) . ppn ( ) ;
149
150
let r = ( ( ppn & ( ( 1 << 44 ) - 1 ) ) << 10 ) | page_flags;
150
-
151
- kdebug ! ( "make entry: r={r:#x}" ) ;
152
151
return r;
153
152
}
154
153
}
0 commit comments