runtime-rs: remove hardcoding of SEV physical address reduction

Previous commit enabled getting the physical address reduction from
processor but just stored it for later use.  This commit adds handling
of the value to ProtectionDevice and enables the QEMU driver to use it.

Signed-off-by: Pavel Mores <pmores@redhat.com>
This commit is contained in:
Pavel Mores
2025-03-04 14:21:50 +01:00
committed by Fabiano Fidêncio
parent 6f9178d290
commit 74f9fdb11f
4 changed files with 17 additions and 5 deletions

View File

@@ -21,6 +21,7 @@ pub enum ProtectionDeviceConfig {
pub struct SevSnpConfig {
pub is_snp: bool,
pub cbitpos: u32,
pub phys_addr_reduction: u32,
pub firmware: String,
pub host_data: Option<String>,
}

View File

@@ -1875,11 +1875,11 @@ struct ObjectSevSnpGuest {
}
impl ObjectSevSnpGuest {
fn new(is_snp: bool, cbitpos: u32, host_data: Option<String>) -> Self {
fn new(is_snp: bool, cbitpos: u32, reduced_phys_bits: u32, host_data: Option<String>) -> Self {
ObjectSevSnpGuest {
id: (if is_snp { "snp" } else { "sev" }).to_owned(),
cbitpos,
reduced_phys_bits: 1,
reduced_phys_bits,
kernel_hashes: true,
host_data,
is_snp,
@@ -2538,8 +2538,13 @@ impl<'a> QemuCmdLine<'a> {
.remove_all_by_key("rootfstype".to_string());
}
pub fn add_sev_protection_device(&mut self, cbitpos: u32, firmware: &str) {
let sev_object = ObjectSevSnpGuest::new(true, cbitpos, None);
pub fn add_sev_protection_device(
&mut self,
cbitpos: u32,
phys_addr_reduction: u32,
firmware: &str,
) {
let sev_object = ObjectSevSnpGuest::new(false, cbitpos, phys_addr_reduction, None);
self.devices.push(Box::new(sev_object));
self.devices.push(Box::new(Bios::new(firmware.to_owned())));
@@ -2552,10 +2557,12 @@ impl<'a> QemuCmdLine<'a> {
pub fn add_sev_snp_protection_device(
&mut self,
cbitpos: u32,
phys_addr_reduction: u32,
firmware: &str,
host_data: &Option<String>,
) {
let sev_snp_object = ObjectSevSnpGuest::new(true, cbitpos, host_data.clone());
let sev_snp_object =
ObjectSevSnpGuest::new(true, cbitpos, phys_addr_reduction, host_data.clone());
self.devices.push(Box::new(sev_snp_object));
self.devices.push(Box::new(Bios::new(firmware.to_owned())));

View File

@@ -163,12 +163,14 @@ impl QemuInner {
if sev_snp_cfg.is_snp {
cmdline.add_sev_snp_protection_device(
sev_snp_cfg.cbitpos,
sev_snp_cfg.phys_addr_reduction,
&sev_snp_cfg.firmware,
&sev_snp_cfg.host_data,
)
} else {
cmdline.add_sev_protection_device(
sev_snp_cfg.cbitpos,
sev_snp_cfg.phys_addr_reduction,
&sev_snp_cfg.firmware,
)
}

View File

@@ -423,6 +423,7 @@ impl VirtSandbox {
Ok(Some(ProtectionDeviceConfig::SevSnp(SevSnpConfig {
is_snp: false,
cbitpos: details.cbitpos,
phys_addr_reduction: details.phys_addr_reduction,
firmware: hypervisor_config.boot_info.firmware.clone(),
host_data: None,
})))
@@ -443,6 +444,7 @@ impl VirtSandbox {
Ok(Some(ProtectionDeviceConfig::SevSnp(SevSnpConfig {
is_snp,
cbitpos: details.cbitpos,
phys_addr_reduction: details.phys_addr_reduction,
firmware: hypervisor_config.boot_info.firmware.clone(),
host_data: init_data,
})))