Skip to content

Commit 641952b

Browse files
authored
Merge pull request #147 from 00xc/mm/pgtable
mm/pgtable: minor cleanups
2 parents 62eca0f + 371ca45 commit 641952b

File tree

5 files changed

+54
-68
lines changed

5 files changed

+54
-68
lines changed

src/cpu/percpu.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::cpu::vmsa::init_guest_vmsa;
1414
use crate::error::SvsmError;
1515
use crate::locking::{LockGuard, RWLock, SpinLock};
1616
use crate::mm::alloc::{allocate_page, allocate_zeroed_page};
17-
use crate::mm::pagetable::{get_init_pgtable_locked, PTEntryFlags, PageTable, PageTableRef};
17+
use crate::mm::pagetable::{get_init_pgtable_locked, PTEntryFlags, PageTableRef};
1818
use crate::mm::virtualrange::VirtualRange;
1919
use crate::mm::vm::{Mapping, VMKernelStack, VMPhysMem, VMRMapping, VMReserved, VMR};
2020
use crate::mm::{
@@ -304,7 +304,7 @@ impl PerCpu {
304304
pub fn map_self_stage2(&mut self) -> Result<(), SvsmError> {
305305
let vaddr = VirtAddr::from(self as *const PerCpu);
306306
let paddr = virt_to_phys(vaddr);
307-
let flags = PageTable::data_flags();
307+
let flags = PTEntryFlags::data();
308308

309309
self.get_pgtable().map_4k(SVSM_PERCPU_BASE, paddr, flags)
310310
}

src/mm/pagetable.rs

+43-57
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::error::SvsmError;
1313
use crate::locking::{LockGuard, SpinLock};
1414
use crate::mm::alloc::{allocate_zeroed_page, free_page};
1515
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};
1717
use crate::utils::immut_after_init::ImmutAfterInitCell;
1818
use bitflags::bitflags;
1919
use core::ops::{Deref, DerefMut, Index, IndexMut};
@@ -115,6 +115,32 @@ bitflags! {
115115
}
116116
}
117117

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+
118144
#[repr(C)]
119145
#[derive(Copy, Clone, Debug, Default)]
120146
pub struct PTEntry(PhysAddr);
@@ -222,43 +248,6 @@ impl PageTable {
222248
self.root.entries[entry] = other.root.entries[entry];
223249
}
224250

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-
262251
fn allocate_page_table() -> Result<*mut PTPage, SvsmError> {
263252
let ptr = allocate_zeroed_page()?;
264253
Ok(ptr.as_mut_ptr::<PTPage>())
@@ -321,7 +310,7 @@ impl PageTable {
321310
PageTable::walk_addr_lvl3(&mut self.root, vaddr)
322311
}
323312

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 {
325314
let flags = entry.flags();
326315

327316
if flags.contains(PTEntryFlags::PRESENT) {
@@ -338,15 +327,14 @@ impl PageTable {
338327
| PTEntryFlags::WRITABLE
339328
| PTEntryFlags::USER
340329
| PTEntryFlags::ACCESSED;
341-
entry.clear();
342330
entry.set(set_c_bit(paddr), flags);
343331

344332
let idx = PageTable::index::<2>(vaddr);
345333

346-
unsafe { PageTable::alloc_pte_lvl2(&mut (*page)[idx], vaddr, pgsize) }
334+
unsafe { PageTable::alloc_pte_lvl2(&mut (*page)[idx], vaddr, size) }
347335
}
348336

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 {
350338
let flags = entry.flags();
351339

352340
if flags.contains(PTEntryFlags::PRESENT) {
@@ -363,18 +351,17 @@ impl PageTable {
363351
| PTEntryFlags::WRITABLE
364352
| PTEntryFlags::USER
365353
| PTEntryFlags::ACCESSED;
366-
entry.clear();
367354
entry.set(set_c_bit(paddr), flags);
368355

369356
let idx = PageTable::index::<1>(vaddr);
370357

371-
unsafe { PageTable::alloc_pte_lvl1(&mut (*page)[idx], vaddr, pgsize) }
358+
unsafe { PageTable::alloc_pte_lvl1(&mut (*page)[idx], vaddr, size) }
372359
}
373360

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 {
375362
let flags = entry.flags();
376363

377-
if pgsize == PAGE_SIZE_2M || flags.contains(PTEntryFlags::PRESENT) {
364+
if size == PageSize::Huge || flags.contains(PTEntryFlags::PRESENT) {
378365
return Mapping::Level1(entry);
379366
}
380367

@@ -388,7 +375,6 @@ impl PageTable {
388375
| PTEntryFlags::WRITABLE
389376
| PTEntryFlags::USER
390377
| PTEntryFlags::ACCESSED;
391-
entry.clear();
392378
entry.set(set_c_bit(paddr), flags);
393379

394380
let idx = PageTable::index::<0>(vaddr);
@@ -401,9 +387,9 @@ impl PageTable {
401387

402388
match m {
403389
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),
407393
}
408394
}
409395

@@ -413,8 +399,8 @@ impl PageTable {
413399
match m {
414400
Mapping::Level0(entry) => Mapping::Level0(entry),
415401
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),
418404
}
419405
}
420406

@@ -683,7 +669,7 @@ impl PageTable {
683669
vaddr = vaddr + PAGE_SIZE_2M;
684670
}
685671
_ => {
686-
log::debug!("Can't unmap - address not mapped {:#x}", vaddr);
672+
log::error!("Can't unmap - address not mapped {:#x}", vaddr);
687673
}
688674
}
689675
}
@@ -812,8 +798,8 @@ impl RawPageTablePart {
812798

813799
match m {
814800
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),
817803
Mapping::Level3(_) => panic!("PT level 3 not possible in PageTablePart"),
818804
}
819805
}
@@ -824,8 +810,8 @@ impl RawPageTablePart {
824810
match m {
825811
Mapping::Level0(entry) => Mapping::Level0(entry),
826812
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),
829815
}
830816
}
831817

src/mm/ptguards.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//
55
// Author: Joerg Roedel <[email protected]>
66

7-
use super::pagetable::PageTable;
7+
use super::pagetable::PTEntryFlags;
88
use crate::address::{Address, PhysAddr, VirtAddr};
99
use crate::cpu::percpu::this_cpu_mut;
1010
use crate::cpu::tlb::flush_address_sync;
@@ -45,7 +45,7 @@ impl PerCPUPageMappingGuard {
4545
assert!((paddr_start.bits() & align_mask) == 0);
4646
assert!((paddr_end.bits() & align_mask) == 0);
4747

48-
let flags = PageTable::data_flags();
48+
let flags = PTEntryFlags::data();
4949
let huge = ((paddr_start.bits() & (PAGE_SIZE_2M - 1)) == 0)
5050
&& ((paddr_end.bits() & (PAGE_SIZE_2M - 1)) == 0);
5151
let vaddr = if huge {

src/mm/stack.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::cpu::flush_tlb_global_sync;
99
use crate::error::SvsmError;
1010
use crate::locking::SpinLock;
1111
use crate::mm::alloc::{allocate_zeroed_page, free_page};
12-
use crate::mm::pagetable::{get_init_pgtable_locked, PageTable, PageTableRef};
12+
use crate::mm::pagetable::{get_init_pgtable_locked, PTEntryFlags, PageTableRef};
1313
use crate::mm::{phys_to_virt, virt_to_phys};
1414
use crate::mm::{
1515
STACK_PAGES, STACK_SIZE, STACK_TOTAL_SIZE, SVSM_SHARED_STACK_BASE, SVSM_SHARED_STACK_END,
@@ -80,7 +80,7 @@ static STACK_ALLOC: SpinLock<StackRange> = SpinLock::new(StackRange::new(
8080
));
8181

8282
pub fn allocate_stack_addr(stack: VirtAddr, pgtable: &mut PageTableRef) -> Result<(), SvsmError> {
83-
let flags = PageTable::data_flags();
83+
let flags = PTEntryFlags::data();
8484
for i in 0..STACK_PAGES {
8585
let page = allocate_zeroed_page()?;
8686
let paddr = virt_to_phys(page);

src/svsm_paging.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::elf;
1010
use crate::error::SvsmError;
1111
use crate::kernel_launch::KernelLaunchInfo;
1212
use crate::mm;
13-
use crate::mm::pagetable::{set_init_pgtable, PageTable, PageTableRef};
13+
use crate::mm::pagetable::{set_init_pgtable, PTEntryFlags, PageTable, PageTableRef};
1414
use crate::mm::PerCPUPageMappingGuard;
1515
use crate::sev::ghcb::PageStateChangeOp;
1616
use crate::sev::{pvalidate, PvalidateOp};
@@ -30,11 +30,11 @@ pub fn init_page_table(launch_info: &KernelLaunchInfo, kernel_elf: &elf::Elf64Fi
3030
let aligned_vaddr_end = vaddr_end.page_align_up();
3131
let segment_len = aligned_vaddr_end - vaddr_start;
3232
let flags = if segment.flags.contains(elf::Elf64PhdrFlags::EXECUTE) {
33-
PageTable::exec_flags()
33+
PTEntryFlags::exec()
3434
} else if segment.flags.contains(elf::Elf64PhdrFlags::WRITE) {
35-
PageTable::data_flags()
35+
PTEntryFlags::data()
3636
} else {
37-
PageTable::data_ro_flags()
37+
PTEntryFlags::data_ro()
3838
};
3939

4040
pgtable
@@ -50,7 +50,7 @@ pub fn init_page_table(launch_info: &KernelLaunchInfo, kernel_elf: &elf::Elf64Fi
5050
VirtAddr::from(launch_info.heap_area_virt_start),
5151
VirtAddr::from(launch_info.heap_area_virt_end()),
5252
PhysAddr::from(launch_info.heap_area_phys_start),
53-
PageTable::data_flags(),
53+
PTEntryFlags::data(),
5454
)
5555
.expect("Failed to map heap");
5656

0 commit comments

Comments
 (0)