Skip to content

Commit

Permalink
platform: add GPA to validate_page_range()
Browse files Browse the repository at this point in the history
validate_page_range() currently takes GVA due to the design of
PVALIDATE. In the case of TDX, GPA is required for page acceptance.

Add an additional input, paddr (PhysAddr), to validate_page_range(). An
explicit input for GPA is required because virt_to_phys() is not always
available. The input region may be out of range for the current
KERNEL_MAPPING.

Signed-off-by: Peter Fang <[email protected]>
  • Loading branch information
peterfang committed Jul 31, 2024
1 parent 50588df commit 3b74997
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 8 deletions.
2 changes: 1 addition & 1 deletion kernel/src/cpu/idt/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ impl WriteLockGuard<'static, IDT> {
/// Load an IDT. Its lifetime must be static so that its entries are
/// always available to the CPU.
pub fn load(&self) {
let desc: IdtDesc = IdtDesc {
let desc = IdtDesc {
size: (IDT_ENTRIES * 16) as u16,
address: VirtAddr::from(self.entries.as_ptr()),
};
Expand Down
2 changes: 1 addition & 1 deletion kernel/src/igvm_params.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ impl IgvmParams<'_> {
}

let mem_map_va_region = MemoryRegion::<VirtAddr>::new(mem_map_va, mem_map_region.len());
platform.validate_page_range(mem_map_va_region)?;
platform.validate_page_range(mem_map_va_region, mem_map_region.start())?;

// Calculate the maximum number of entries that can be inserted.
let max_entries = fw_info.memory_map_page_count as usize * PAGE_SIZE
Expand Down
2 changes: 1 addition & 1 deletion kernel/src/mm/page_visibility.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ pub fn make_page_private(vaddr: VirtAddr) -> Result<(), SvsmError> {
)?;

// Revoke page validation before changing page state.
platform.validate_page_range(MemoryRegion::new(vaddr, PAGE_SIZE))?;
platform.validate_page_range(MemoryRegion::new(vaddr, PAGE_SIZE), paddr)?;
if valid_bitmap_valid_addr(paddr) {
valid_bitmap_set_valid_4k(paddr);
}
Expand Down
6 changes: 5 additions & 1 deletion kernel/src/platform/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,11 @@ pub trait SvsmPlatform {
) -> Result<(), SvsmError>;

/// Marks a range of pages as valid for use as private pages.
fn validate_page_range(&self, region: MemoryRegion<VirtAddr>) -> Result<(), SvsmError>;
fn validate_page_range(
&self,
region: MemoryRegion<VirtAddr>,
paddr: PhysAddr,
) -> Result<(), SvsmError>;

/// Marks a range of pages as invalid for use as private pages.
fn invalidate_page_range(&self, region: MemoryRegion<VirtAddr>) -> Result<(), SvsmError>;
Expand Down
6 changes: 5 additions & 1 deletion kernel/src/platform/native.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,11 @@ impl SvsmPlatform for NativePlatform {
}

/// Marks a range of pages as valid for use as private pages.
fn validate_page_range(&self, _region: MemoryRegion<VirtAddr>) -> Result<(), SvsmError> {
fn validate_page_range(
&self,
_region: MemoryRegion<VirtAddr>,
_paddr: PhysAddr,
) -> Result<(), SvsmError> {
Ok(())
}

Expand Down
6 changes: 5 additions & 1 deletion kernel/src/platform/snp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,11 @@ impl SvsmPlatform for SnpPlatform {
}

/// Marks a range of pages as valid for use as private pages.
fn validate_page_range(&self, region: MemoryRegion<VirtAddr>) -> Result<(), SvsmError> {
fn validate_page_range(
&self,
region: MemoryRegion<VirtAddr>,
_paddr: PhysAddr,
) -> Result<(), SvsmError> {
pvalidate_range(region, PvalidateOp::Valid)
}

Expand Down
6 changes: 5 additions & 1 deletion kernel/src/platform/tdp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,11 @@ impl SvsmPlatform for TdpPlatform {
Err(SvsmError::Tdx)
}

fn validate_page_range(&self, _region: MemoryRegion<VirtAddr>) -> Result<(), SvsmError> {
fn validate_page_range(
&self,
_region: MemoryRegion<VirtAddr>,
_paddr: PhysAddr,
) -> Result<(), SvsmError> {
Err(SvsmError::Tdx)
}

Expand Down
2 changes: 1 addition & 1 deletion kernel/src/stage2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ fn map_and_validate(
PageStateChangeOp::Private,
)?;
}
platform.validate_page_range(vregion)?;
platform.validate_page_range(vregion, paddr)?;
valid_bitmap_set_valid_range(paddr, paddr + vregion.len());
Ok(())
}
Expand Down

0 comments on commit 3b74997

Please sign in to comment.