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
parent b67656a3ac
commit 0cb1535ad1
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

@ -1803,11 +1803,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,
@ -2433,8 +2433,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())));
@ -2447,10 +2452,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

@ -136,12 +136,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

@ -393,6 +393,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,
})))
@ -413,6 +414,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,
})))