Skip to content

Commit

Permalink
platform: tdp: Implement page validation interfaces
Browse files Browse the repository at this point in the history
On TDP platforms, page validation means page acceptance. Implement
validate_{physical, virtual}_page_range() using the tdx-tdcall crate for
this TDCALL operation. Page invalidation simply means zeroing out the
page on TDP platforms.

Signed-off-by: Peter Fang <[email protected]>
  • Loading branch information
peterfang committed Oct 22, 2024
1 parent 789257e commit a422374
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 10 deletions.
2 changes: 1 addition & 1 deletion kernel/src/platform/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ pub trait SvsmPlatform {

/// Marks a virtual range of pages as valid or invalid for use as private
/// pages. Provided primarily for use in stage2 where validation by
/// physical address cannot e supported.
/// physical address cannot be supported.
fn validate_virtual_page_range(
&self,
region: MemoryRegion<VirtAddr>,
Expand Down
43 changes: 34 additions & 9 deletions kernel/src/platform/tdp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ use crate::cpu::cpuid::CpuidResult;
use crate::cpu::percpu::PerCpu;
use crate::error::SvsmError;
use crate::io::IOPort;
use crate::mm::{virt_to_frame, PerCPUPageMappingGuard};
use crate::platform::{PageEncryptionMasks, PageStateChangeOp, PageValidateOp, SvsmPlatform};
use crate::types::PageSize;
use crate::utils::immut_after_init::ImmutAfterInitCell;
use crate::utils::MemoryRegion;
use crate::utils::{zero_mem_region, MemoryRegion};
use tdx_tdcall::tdx::{
tdvmcall_io_read_16, tdvmcall_io_read_32, tdvmcall_io_read_8, tdvmcall_io_write_16,
tdvmcall_io_write_32, tdvmcall_io_write_8,
td_accept_memory, tdvmcall_io_read_16, tdvmcall_io_read_32, tdvmcall_io_read_8,
tdvmcall_io_write_16, tdvmcall_io_write_32, tdvmcall_io_write_8,
};

static GHCI_IO_DRIVER: GHCIIOPort = GHCIIOPort::new();
Expand Down Expand Up @@ -93,18 +94,42 @@ impl SvsmPlatform for TdpPlatform {

fn validate_physical_page_range(
&self,
_region: MemoryRegion<PhysAddr>,
_op: PageValidateOp,
region: MemoryRegion<PhysAddr>,
op: PageValidateOp,
) -> Result<(), SvsmError> {
Err(SvsmError::Tdx)
match op {
PageValidateOp::Validate => {
td_accept_memory(region.start().into(), region.len().try_into().unwrap());
}
PageValidateOp::Invalidate => {
let mapping = PerCPUPageMappingGuard::create(region.start(), region.end(), 0)?;
zero_mem_region(mapping.virt_addr(), mapping.virt_addr() + region.len());
}
}
Ok(())
}

fn validate_virtual_page_range(
&self,
_region: MemoryRegion<VirtAddr>,
_op: PageValidateOp,
region: MemoryRegion<VirtAddr>,
op: PageValidateOp,
) -> Result<(), SvsmError> {
Err(SvsmError::Tdx)
match op {
PageValidateOp::Validate => {
let mut va = region.start();
while va < region.end() {
let pa = virt_to_frame(va);
let sz = pa.end() - pa.address();
// td_accept_memory() will take care of alignment
td_accept_memory(pa.address().into(), sz.try_into().unwrap());
va = va + sz;
}
}
PageValidateOp::Invalidate => {
zero_mem_region(region.start(), region.end());
}
}
Ok(())
}

fn configure_alternate_injection(&mut self, _alt_inj_requested: bool) -> Result<(), SvsmError> {
Expand Down

0 comments on commit a422374

Please sign in to comment.