@@ -13,7 +13,7 @@ use crate::error::SvsmError;
13
13
use crate :: locking:: { LockGuard , SpinLock } ;
14
14
use crate :: mm:: alloc:: { allocate_zeroed_page, free_page} ;
15
15
use crate :: mm:: { phys_to_virt, virt_to_phys, PGTABLE_LVL3_IDX_SHARED } ;
16
- use crate :: types:: { PAGE_SIZE , PAGE_SIZE_2M } ;
16
+ use crate :: types:: { PageSize , PAGE_SIZE , PAGE_SIZE_2M } ;
17
17
use crate :: utils:: immut_after_init:: ImmutAfterInitCell ;
18
18
use bitflags:: bitflags;
19
19
use core:: ops:: { Deref , DerefMut , Index , IndexMut } ;
@@ -115,6 +115,32 @@ bitflags! {
115
115
}
116
116
}
117
117
118
+ impl PTEntryFlags {
119
+ pub fn exec ( ) -> Self {
120
+ Self :: PRESENT | Self :: GLOBAL | Self :: ACCESSED | Self :: DIRTY
121
+ }
122
+
123
+ pub fn data ( ) -> Self {
124
+ Self :: PRESENT | Self :: GLOBAL | Self :: WRITABLE | Self :: NX | Self :: ACCESSED | Self :: DIRTY
125
+ }
126
+
127
+ pub fn data_ro ( ) -> Self {
128
+ Self :: PRESENT | Self :: GLOBAL | Self :: NX | Self :: ACCESSED | Self :: DIRTY
129
+ }
130
+
131
+ pub fn task_exec ( ) -> Self {
132
+ Self :: PRESENT | Self :: ACCESSED | Self :: DIRTY
133
+ }
134
+
135
+ pub fn task_data ( ) -> Self {
136
+ Self :: PRESENT | Self :: WRITABLE | Self :: NX | Self :: ACCESSED | Self :: DIRTY
137
+ }
138
+
139
+ pub fn task_data_ro ( ) -> Self {
140
+ Self :: PRESENT | Self :: NX | Self :: ACCESSED | Self :: DIRTY
141
+ }
142
+ }
143
+
118
144
#[ repr( C ) ]
119
145
#[ derive( Copy , Clone , Debug , Default ) ]
120
146
pub struct PTEntry ( PhysAddr ) ;
@@ -222,43 +248,6 @@ impl PageTable {
222
248
self . root . entries [ entry] = other. root . entries [ entry] ;
223
249
}
224
250
225
- pub fn exec_flags ( ) -> PTEntryFlags {
226
- PTEntryFlags :: PRESENT | PTEntryFlags :: GLOBAL | PTEntryFlags :: ACCESSED | PTEntryFlags :: DIRTY
227
- }
228
-
229
- pub fn data_flags ( ) -> PTEntryFlags {
230
- PTEntryFlags :: PRESENT
231
- | PTEntryFlags :: GLOBAL
232
- | PTEntryFlags :: WRITABLE
233
- | PTEntryFlags :: NX
234
- | PTEntryFlags :: ACCESSED
235
- | PTEntryFlags :: DIRTY
236
- }
237
-
238
- pub fn data_ro_flags ( ) -> PTEntryFlags {
239
- PTEntryFlags :: PRESENT
240
- | PTEntryFlags :: GLOBAL
241
- | PTEntryFlags :: NX
242
- | PTEntryFlags :: ACCESSED
243
- | PTEntryFlags :: DIRTY
244
- }
245
-
246
- pub fn task_data_flags ( ) -> PTEntryFlags {
247
- PTEntryFlags :: PRESENT
248
- | PTEntryFlags :: WRITABLE
249
- | PTEntryFlags :: NX
250
- | PTEntryFlags :: ACCESSED
251
- | PTEntryFlags :: DIRTY
252
- }
253
-
254
- pub fn task_data_ro_flags ( ) -> PTEntryFlags {
255
- PTEntryFlags :: PRESENT | PTEntryFlags :: NX | PTEntryFlags :: ACCESSED | PTEntryFlags :: DIRTY
256
- }
257
-
258
- pub fn task_exec_flags ( ) -> PTEntryFlags {
259
- PTEntryFlags :: PRESENT | PTEntryFlags :: ACCESSED | PTEntryFlags :: DIRTY
260
- }
261
-
262
251
fn allocate_page_table ( ) -> Result < * mut PTPage , SvsmError > {
263
252
let ptr = allocate_zeroed_page ( ) ?;
264
253
Ok ( ptr. as_mut_ptr :: < PTPage > ( ) )
@@ -321,7 +310,7 @@ impl PageTable {
321
310
PageTable :: walk_addr_lvl3 ( & mut self . root , vaddr)
322
311
}
323
312
324
- fn alloc_pte_lvl3 ( entry : & mut PTEntry , vaddr : VirtAddr , pgsize : usize ) -> Mapping {
313
+ fn alloc_pte_lvl3 ( entry : & mut PTEntry , vaddr : VirtAddr , size : PageSize ) -> Mapping {
325
314
let flags = entry. flags ( ) ;
326
315
327
316
if flags. contains ( PTEntryFlags :: PRESENT ) {
@@ -338,15 +327,14 @@ impl PageTable {
338
327
| PTEntryFlags :: WRITABLE
339
328
| PTEntryFlags :: USER
340
329
| PTEntryFlags :: ACCESSED ;
341
- entry. clear ( ) ;
342
330
entry. set ( set_c_bit ( paddr) , flags) ;
343
331
344
332
let idx = PageTable :: index :: < 2 > ( vaddr) ;
345
333
346
- unsafe { PageTable :: alloc_pte_lvl2 ( & mut ( * page) [ idx] , vaddr, pgsize ) }
334
+ unsafe { PageTable :: alloc_pte_lvl2 ( & mut ( * page) [ idx] , vaddr, size ) }
347
335
}
348
336
349
- fn alloc_pte_lvl2 ( entry : & mut PTEntry , vaddr : VirtAddr , pgsize : usize ) -> Mapping {
337
+ fn alloc_pte_lvl2 ( entry : & mut PTEntry , vaddr : VirtAddr , size : PageSize ) -> Mapping {
350
338
let flags = entry. flags ( ) ;
351
339
352
340
if flags. contains ( PTEntryFlags :: PRESENT ) {
@@ -363,18 +351,17 @@ impl PageTable {
363
351
| PTEntryFlags :: WRITABLE
364
352
| PTEntryFlags :: USER
365
353
| PTEntryFlags :: ACCESSED ;
366
- entry. clear ( ) ;
367
354
entry. set ( set_c_bit ( paddr) , flags) ;
368
355
369
356
let idx = PageTable :: index :: < 1 > ( vaddr) ;
370
357
371
- unsafe { PageTable :: alloc_pte_lvl1 ( & mut ( * page) [ idx] , vaddr, pgsize ) }
358
+ unsafe { PageTable :: alloc_pte_lvl1 ( & mut ( * page) [ idx] , vaddr, size ) }
372
359
}
373
360
374
- fn alloc_pte_lvl1 ( entry : & mut PTEntry , vaddr : VirtAddr , pgsize : usize ) -> Mapping {
361
+ fn alloc_pte_lvl1 ( entry : & mut PTEntry , vaddr : VirtAddr , size : PageSize ) -> Mapping {
375
362
let flags = entry. flags ( ) ;
376
363
377
- if pgsize == PAGE_SIZE_2M || flags. contains ( PTEntryFlags :: PRESENT ) {
364
+ if size == PageSize :: Huge || flags. contains ( PTEntryFlags :: PRESENT ) {
378
365
return Mapping :: Level1 ( entry) ;
379
366
}
380
367
@@ -388,7 +375,6 @@ impl PageTable {
388
375
| PTEntryFlags :: WRITABLE
389
376
| PTEntryFlags :: USER
390
377
| PTEntryFlags :: ACCESSED ;
391
- entry. clear ( ) ;
392
378
entry. set ( set_c_bit ( paddr) , flags) ;
393
379
394
380
let idx = PageTable :: index :: < 0 > ( vaddr) ;
@@ -401,9 +387,9 @@ impl PageTable {
401
387
402
388
match m {
403
389
Mapping :: Level0 ( entry) => Mapping :: Level0 ( entry) ,
404
- Mapping :: Level1 ( entry) => PageTable :: alloc_pte_lvl1 ( entry, vaddr, PAGE_SIZE ) ,
405
- Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PAGE_SIZE ) ,
406
- Mapping :: Level3 ( entry) => PageTable :: alloc_pte_lvl3 ( entry, vaddr, PAGE_SIZE ) ,
390
+ Mapping :: Level1 ( entry) => PageTable :: alloc_pte_lvl1 ( entry, vaddr, PageSize :: Regular ) ,
391
+ Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PageSize :: Regular ) ,
392
+ Mapping :: Level3 ( entry) => PageTable :: alloc_pte_lvl3 ( entry, vaddr, PageSize :: Regular ) ,
407
393
}
408
394
}
409
395
@@ -413,8 +399,8 @@ impl PageTable {
413
399
match m {
414
400
Mapping :: Level0 ( entry) => Mapping :: Level0 ( entry) ,
415
401
Mapping :: Level1 ( entry) => Mapping :: Level1 ( entry) ,
416
- Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PAGE_SIZE_2M ) ,
417
- Mapping :: Level3 ( entry) => PageTable :: alloc_pte_lvl3 ( entry, vaddr, PAGE_SIZE_2M ) ,
402
+ Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PageSize :: Huge ) ,
403
+ Mapping :: Level3 ( entry) => PageTable :: alloc_pte_lvl3 ( entry, vaddr, PageSize :: Huge ) ,
418
404
}
419
405
}
420
406
@@ -683,7 +669,7 @@ impl PageTable {
683
669
vaddr = vaddr + PAGE_SIZE_2M ;
684
670
}
685
671
_ => {
686
- log:: debug !( "Can't unmap - address not mapped {:#x}" , vaddr) ;
672
+ log:: error !( "Can't unmap - address not mapped {:#x}" , vaddr) ;
687
673
}
688
674
}
689
675
}
@@ -812,8 +798,8 @@ impl RawPageTablePart {
812
798
813
799
match m {
814
800
Mapping :: Level0 ( entry) => Mapping :: Level0 ( entry) ,
815
- Mapping :: Level1 ( entry) => PageTable :: alloc_pte_lvl1 ( entry, vaddr, PAGE_SIZE ) ,
816
- Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PAGE_SIZE ) ,
801
+ Mapping :: Level1 ( entry) => PageTable :: alloc_pte_lvl1 ( entry, vaddr, PageSize :: Regular ) ,
802
+ Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PageSize :: Regular ) ,
817
803
Mapping :: Level3 ( _) => panic ! ( "PT level 3 not possible in PageTablePart" ) ,
818
804
}
819
805
}
@@ -824,8 +810,8 @@ impl RawPageTablePart {
824
810
match m {
825
811
Mapping :: Level0 ( entry) => Mapping :: Level0 ( entry) ,
826
812
Mapping :: Level1 ( entry) => Mapping :: Level1 ( entry) ,
827
- Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PAGE_SIZE_2M ) ,
828
- Mapping :: Level3 ( entry) => PageTable :: alloc_pte_lvl3 ( entry, vaddr, PAGE_SIZE_2M ) ,
813
+ Mapping :: Level2 ( entry) => PageTable :: alloc_pte_lvl2 ( entry, vaddr, PageSize :: Huge ) ,
814
+ Mapping :: Level3 ( entry) => PageTable :: alloc_pte_lvl3 ( entry, vaddr, PageSize :: Huge ) ,
829
815
}
830
816
}
831
817
0 commit comments