@@ -16,20 +16,21 @@ use axerrno::{ax_err, ax_err_type};
1616use memory_addr:: PhysAddr ;
1717use memory_set:: MappingError ;
1818use page_table_entry:: MappingFlags ;
19- use page_table_multiarch:: PagingHandler ;
19+ use page_table_multiarch:: { PageSize , PagingHandler } ;
2020
2121use crate :: GuestPhysAddr ;
2222
2323cfg_if:: cfg_if! {
2424 if #[ cfg( target_arch = "x86_64" ) ] {
2525 pub type NestedPageTableL4 <H > = arch:: ExtendedPageTable <H >;
26-
2726 } else if #[ cfg( any( target_arch = "riscv32" , target_arch = "riscv64" ) ) ] {
27+ /// RISC-V Level 3 nested page table (Sv39, x4 not supported)
2828 pub type NestedPageTableL3 <H > = page_table_multiarch:: PageTable64 <arch:: Sv39MetaData <GuestPhysAddr >, arch:: Rv64PTE , H >;
29- pub type NestedPageTableL4 <H > = page_table_multiarch:: PageTable64 <arch:: Sv48MetaData <GuestPhysAddr >, arch:: Rv64PTE , H >;
3029
30+ /// RISC-V Level 4 nested page table (Sv48, x4 not supported)
31+ pub type NestedPageTableL4 <H > = page_table_multiarch:: PageTable64 <arch:: Sv48MetaData <GuestPhysAddr >, arch:: Rv64PTE , H >;
3132 } else if #[ cfg( target_arch = "aarch64" ) ] {
32- /// AArch64 Level 3 nested page table type alias.
33+ /// AArch64 Level 3 nested page table type alias.
3334 pub type NestedPageTableL3 <H > = page_table_multiarch:: PageTable64 <arch:: A64HVPagingMetaDataL3 , arch:: A64PTEHV , H >;
3435
3536 /// AArch64 Level 4 nested page table type alias.
@@ -51,8 +52,6 @@ impl<H: PagingHandler> NestedPageTable<H> {
5152 3 => {
5253 #[ cfg( not( target_arch = "x86_64" ) ) ]
5354 {
54- use axerrno:: ax_err_type;
55-
5655 let res = NestedPageTableL3 :: try_new ( ) . map_err ( |_| ax_err_type ! ( NoMemory ) ) ?;
5756 Ok ( NestedPageTable :: L3 ( res) )
5857 }
@@ -69,7 +68,7 @@ impl<H: PagingHandler> NestedPageTable<H> {
6968 }
7069 }
7170
72- pub fn root_paddr ( & self ) -> memory_addr :: PhysAddr {
71+ pub const fn root_paddr ( & self ) -> PhysAddr {
7372 match self {
7473 #[ cfg( not( target_arch = "x86_64" ) ) ]
7574 NestedPageTable :: L3 ( pt) => pt. root_paddr ( ) ,
@@ -81,22 +80,20 @@ impl<H: PagingHandler> NestedPageTable<H> {
8180 pub fn map (
8281 & mut self ,
8382 vaddr : crate :: GuestPhysAddr ,
84- paddr : memory_addr :: PhysAddr ,
85- size : page_table_multiarch :: PageSize ,
83+ paddr : PhysAddr ,
84+ size : PageSize ,
8685 flags : page_table_entry:: MappingFlags ,
8786 ) -> memory_set:: MappingResult {
8887 match self {
8988 #[ cfg( not( target_arch = "x86_64" ) ) ]
90- NestedPageTable :: L3 ( pt) => {
91- pt. map ( vaddr, paddr, size, flags)
92- . map_err ( |_| MappingError :: BadState ) ?
93- . flush ( ) ;
94- }
95- NestedPageTable :: L4 ( pt) => {
96- pt. map ( vaddr, paddr, size, flags)
97- . map_err ( |_| MappingError :: BadState ) ?
98- . flush ( ) ;
99- }
89+ NestedPageTable :: L3 ( pt) => pt
90+ . cursor ( )
91+ . map ( vaddr, paddr, size, flags)
92+ . map_err ( |_| MappingError :: BadState ) ?,
93+ NestedPageTable :: L4 ( pt) => pt
94+ . cursor ( )
95+ . map ( vaddr, paddr, size, flags)
96+ . map_err ( |_| MappingError :: BadState ) ?,
10097 }
10198 Ok ( ( ) )
10299 }
@@ -105,19 +102,11 @@ impl<H: PagingHandler> NestedPageTable<H> {
105102 pub fn unmap (
106103 & mut self ,
107104 vaddr : GuestPhysAddr ,
108- ) -> memory_set:: MappingResult < ( memory_addr :: PhysAddr , page_table_multiarch :: PageSize ) > {
105+ ) -> memory_set:: MappingResult < ( PhysAddr , MappingFlags , PageSize ) > {
109106 match self {
110107 #[ cfg( not( target_arch = "x86_64" ) ) ]
111- NestedPageTable :: L3 ( pt) => {
112- let ( addr, size, f) = pt. unmap ( vaddr) . map_err ( |_| MappingError :: BadState ) ?;
113- f. flush ( ) ;
114- Ok ( ( addr, size) )
115- }
116- NestedPageTable :: L4 ( pt) => {
117- let ( addr, size, f) = pt. unmap ( vaddr) . map_err ( |_| MappingError :: BadState ) ?;
118- f. flush ( ) ;
119- Ok ( ( addr, size) )
120- }
108+ NestedPageTable :: L3 ( pt) => pt. cursor ( ) . unmap ( vaddr) . map_err ( |_| MappingError :: BadState ) ,
109+ NestedPageTable :: L4 ( pt) => pt. cursor ( ) . unmap ( vaddr) . map_err ( |_| MappingError :: BadState ) ,
121110 }
122111 }
123112
@@ -129,52 +118,42 @@ impl<H: PagingHandler> NestedPageTable<H> {
129118 size : usize ,
130119 flags : MappingFlags ,
131120 allow_huge : bool ,
132- flush_tlb_by_page : bool ,
133121 ) -> memory_set:: MappingResult {
134122 match self {
135123 #[ cfg( not( target_arch = "x86_64" ) ) ]
136- NestedPageTable :: L3 ( pt) => {
137- pt. map_region ( vaddr, get_paddr, size, flags, allow_huge, flush_tlb_by_page)
138- . map_err ( |_| MappingError :: BadState ) ?
139- . flush_all ( ) ;
140- }
141- NestedPageTable :: L4 ( pt) => {
142- pt. map_region ( vaddr, get_paddr, size, flags, allow_huge, flush_tlb_by_page)
143- . map_err ( |_| MappingError :: BadState ) ?
144- . flush_all ( ) ;
145- }
124+ NestedPageTable :: L3 ( pt) => pt
125+ . cursor ( )
126+ . map_region ( vaddr, get_paddr, size, flags, allow_huge)
127+ . map_err ( |_| MappingError :: BadState ) ?,
128+ NestedPageTable :: L4 ( pt) => pt
129+ . cursor ( )
130+ . map_region ( vaddr, get_paddr, size, flags, allow_huge)
131+ . map_err ( |_| MappingError :: BadState ) ?,
146132 }
147133 Ok ( ( ) )
148134 }
149135
150136 /// Unmaps a region.
151- pub fn unmap_region (
152- & mut self ,
153- start : GuestPhysAddr ,
154- size : usize ,
155- flush : bool ,
156- ) -> memory_set:: MappingResult {
137+ pub fn unmap_region ( & mut self , start : GuestPhysAddr , size : usize ) -> memory_set:: MappingResult {
157138 match self {
158139 #[ cfg( not( target_arch = "x86_64" ) ) ]
159- NestedPageTable :: L3 ( pt) => {
160- pt. unmap_region ( start, size, flush)
161- . map_err ( |_| MappingError :: BadState ) ?
162- . ignore ( ) ;
163- }
164- NestedPageTable :: L4 ( pt) => {
165- pt. unmap_region ( start, size, flush)
166- . map_err ( |_| MappingError :: BadState ) ?
167- . ignore ( ) ;
168- }
140+ NestedPageTable :: L3 ( pt) => pt
141+ . cursor ( )
142+ . unmap_region ( start, size)
143+ . map_err ( |_| MappingError :: BadState ) ?,
144+ NestedPageTable :: L4 ( pt) => pt
145+ . cursor ( )
146+ . unmap_region ( start, size)
147+ . map_err ( |_| MappingError :: BadState ) ?,
169148 }
170149 Ok ( ( ) )
171150 }
172151
173152 pub fn remap ( & mut self , start : GuestPhysAddr , paddr : PhysAddr , flags : MappingFlags ) -> bool {
174153 match self {
175154 #[ cfg( not( target_arch = "x86_64" ) ) ]
176- NestedPageTable :: L3 ( pt) => pt. remap ( start, paddr, flags) . is_ok ( ) ,
177- NestedPageTable :: L4 ( pt) => pt. remap ( start, paddr, flags) . is_ok ( ) ,
155+ NestedPageTable :: L3 ( pt) => pt. cursor ( ) . remap ( start, paddr, flags) . is_ok ( ) ,
156+ NestedPageTable :: L4 ( pt) => pt. cursor ( ) . remap ( start, paddr, flags) . is_ok ( ) ,
178157 }
179158 }
180159
@@ -184,19 +163,16 @@ impl<H: PagingHandler> NestedPageTable<H> {
184163 start : GuestPhysAddr ,
185164 size : usize ,
186165 new_flags : page_table_entry:: MappingFlags ,
187- flush : bool ,
188166 ) -> bool {
189167 match self {
190168 #[ cfg( not( target_arch = "x86_64" ) ) ]
191169 NestedPageTable :: L3 ( pt) => pt
192- . protect_region ( start, size, new_flags, flush) // If the TLB is refreshed immediately every time, there might be performance issues.
193- // The TLB refresh is managed uniformly at a higher level.
194- . map ( |tlb| tlb. ignore ( ) )
170+ . cursor ( )
171+ . protect_region ( start, size, new_flags) // If the TLB is refreshed immediately every time, there might be performance issues.
195172 . is_ok ( ) ,
196173 NestedPageTable :: L4 ( pt) => pt
197- . protect_region ( start, size, new_flags, flush) // If the TLB is refreshed immediately every time, there might be performance issues.
198- // The TLB refresh is managed uniformly at a higher level.
199- . map ( |tlb| tlb. ignore ( ) )
174+ . cursor ( )
175+ . protect_region ( start, size, new_flags) // If the TLB is refreshed immediately every time, there might be performance issues.
200176 . is_ok ( ) ,
201177 }
202178 }
@@ -205,11 +181,8 @@ impl<H: PagingHandler> NestedPageTable<H> {
205181 pub fn query (
206182 & self ,
207183 vaddr : crate :: GuestPhysAddr ,
208- ) -> page_table_multiarch:: PagingResult < (
209- memory_addr:: PhysAddr ,
210- page_table_entry:: MappingFlags ,
211- page_table_multiarch:: PageSize ,
212- ) > {
184+ ) -> page_table_multiarch:: PagingResult < ( PhysAddr , page_table_entry:: MappingFlags , PageSize ) >
185+ {
213186 match self {
214187 #[ cfg( not( target_arch = "x86_64" ) ) ]
215188 NestedPageTable :: L3 ( pt) => pt. query ( vaddr) ,
0 commit comments