Skip to content

Commit

Permalink
Merge pull request #347 from msft-jlange/page_validate
Browse files Browse the repository at this point in the history
platform: separate validate/invalidate method calls
  • Loading branch information
joergroedel authored May 23, 2024
2 parents 48c8cf3 + 30930c1 commit 74d8560
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 26 deletions.
5 changes: 2 additions & 3 deletions kernel/src/mm/page_visibility.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,14 @@ use crate::mm::validate::{
};
use crate::mm::virt_to_phys;
use crate::platform::{PageStateChangeOp, SVSM_PLATFORM};
use crate::sev::PvalidateOp;
use crate::types::{PageSize, PAGE_SIZE};
use crate::utils::MemoryRegion;

pub fn make_page_shared(vaddr: VirtAddr) -> Result<(), SvsmError> {
let platform = SVSM_PLATFORM.as_dyn_ref();

// Revoke page validation before changing page state.
platform.pvalidate_range(MemoryRegion::new(vaddr, PAGE_SIZE), PvalidateOp::Invalid)?;
platform.invalidate_page_range(MemoryRegion::new(vaddr, PAGE_SIZE))?;
let paddr = virt_to_phys(vaddr);
if valid_bitmap_valid_addr(paddr) {
valid_bitmap_clear_valid_4k(paddr);
Expand Down Expand Up @@ -60,7 +59,7 @@ pub fn make_page_private(vaddr: VirtAddr) -> Result<(), SvsmError> {
)?;

// Revoke page validation before changing page state.
platform.pvalidate_range(MemoryRegion::new(vaddr, PAGE_SIZE), PvalidateOp::Valid)?;
platform.validate_page_range(MemoryRegion::new(vaddr, PAGE_SIZE))?;
if valid_bitmap_valid_addr(paddr) {
valid_bitmap_set_valid_4k(paddr);
}
Expand Down
12 changes: 5 additions & 7 deletions kernel/src/platform/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ use crate::error::SvsmError;
use crate::io::IOPort;
use crate::platform::native::NativePlatform;
use crate::platform::snp::SnpPlatform;
use crate::sev::PvalidateOp;
use crate::types::PageSize;
use crate::utils::immut_after_init::ImmutAfterInitCell;
use crate::utils::MemoryRegion;
Expand Down Expand Up @@ -71,12 +70,11 @@ pub trait SvsmPlatform {
op: PageStateChangeOp,
) -> Result<(), SvsmError>;

/// Marks a page as valid or invalid as a private page.
fn pvalidate_range(
&self,
region: MemoryRegion<VirtAddr>,
op: PvalidateOp,
) -> Result<(), SvsmError>;
/// Marks a range of pages as valid for use as private pages.
fn validate_page_range(&self, region: MemoryRegion<VirtAddr>) -> Result<(), SvsmError>;

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

/// Perform an EOI of the current interrupt.
fn eoi(&self);
Expand Down
13 changes: 7 additions & 6 deletions kernel/src/platform/native.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ use crate::cpu::cpuid::CpuidResult;
use crate::cpu::percpu::PerCpu;
use crate::error::SvsmError;
use crate::platform::{IOPort, PageEncryptionMasks, PageStateChangeOp, SvsmPlatform};
use crate::sev::PvalidateOp;
use crate::svsm_console::NativeIOPort;
use crate::types::PageSize;
use crate::utils::MemoryRegion;
Expand Down Expand Up @@ -69,11 +68,13 @@ impl SvsmPlatform for NativePlatform {
Ok(())
}

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

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

Expand Down
14 changes: 8 additions & 6 deletions kernel/src/platform/snp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,14 @@ impl SvsmPlatform for SnpPlatform {
current_ghcb().page_state_change(region, size, op)
}

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

/// Marks a range of pages as invalid for use as private pages.
fn invalidate_page_range(&self, region: MemoryRegion<VirtAddr>) -> Result<(), SvsmError> {
pvalidate_range(region, PvalidateOp::Invalid)
}

fn eoi(&self) {
Expand Down
3 changes: 1 addition & 2 deletions kernel/src/stage2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ use svsm::mm::validate::{
};
use svsm::platform::{PageStateChangeOp, SvsmPlatform, SvsmPlatformCell};
use svsm::serial::SerialPort;
use svsm::sev::PvalidateOp;
use svsm::types::{PageSize, PAGE_SIZE, PAGE_SIZE_2M};
use svsm::utils::immut_after_init::ImmutAfterInitCell;
use svsm::utils::{halt, is_aligned, MemoryRegion};
Expand Down Expand Up @@ -142,7 +141,7 @@ fn map_and_validate(
.expect("GHCB::PAGE_STATE_CHANGE call failed for kernel region");
}
platform
.pvalidate_range(vregion, PvalidateOp::Valid)
.validate_page_range(vregion)
.expect("PVALIDATE kernel region failed");
valid_bitmap_set_valid_range(paddr, paddr + vregion.len());
}
Expand Down
3 changes: 1 addition & 2 deletions kernel/src/svsm_paging.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ use crate::mm::pagetable::{set_init_pgtable, PTEntryFlags, PageTableRef};
use crate::mm::PerCPUPageMappingGuard;
use crate::platform::PageStateChangeOp;
use crate::platform::SvsmPlatform;
use crate::sev::PvalidateOp;
use crate::types::{PageSize, PAGE_SIZE};
use crate::utils::MemoryRegion;
use bootlib::kernel_launch::KernelLaunchInfo;
Expand Down Expand Up @@ -111,7 +110,7 @@ fn invalidate_boot_memory_region(
let guard = PerCPUPageMappingGuard::create_4k(paddr)?;
let vaddr = guard.virt_addr();

platform.pvalidate_range(MemoryRegion::new(vaddr, PAGE_SIZE), PvalidateOp::Invalid)?;
platform.invalidate_page_range(MemoryRegion::new(vaddr, PAGE_SIZE))?;
}

if config.page_state_change_required() && !region.is_empty() {
Expand Down

0 comments on commit 74d8560

Please sign in to comment.