|
13 | 13 | // limitations under the License. |
14 | 14 |
|
15 | 15 | use std::iter::zip; |
| 16 | +use std::sync::Arc; |
16 | 17 | use std::sync::atomic::Ordering; |
17 | 18 |
|
18 | 19 | use zerocopy::FromZeros; |
19 | 20 |
|
20 | 21 | use crate::arch::layout::MEM_64_START; |
21 | 22 | use crate::arch::reg::{Reg, SegAccess, SegReg, SegRegVal}; |
22 | | -use crate::arch::sev::{SevPolicy, SnpPageType}; |
| 23 | +use crate::arch::sev::{SevPolicy, SnpPageType, SnpPolicy}; |
23 | 24 | use crate::board::{Board, Result, VcpuGuard}; |
24 | 25 | use crate::firmware::ovmf::sev::{ |
25 | 26 | SevDescType, SevMetadataDesc, SnpCpuidFunc, SnpCpuidInfo, parse_desc, parse_sev_ap_eip, |
26 | 27 | }; |
27 | | -use crate::hv::{Vcpu, Vm}; |
| 28 | +use crate::hv::{Vcpu, Vm, VmMemory}; |
28 | 29 | use crate::mem::mapped::ArcMemPages; |
| 30 | +use crate::mem::{self, LayoutChanged, MarkPrivateMemory}; |
29 | 31 |
|
30 | 32 | impl<V> Board<V> |
31 | 33 | where |
@@ -162,4 +164,38 @@ where |
162 | 164 | )?; |
163 | 165 | Ok(()) |
164 | 166 | } |
| 167 | + |
| 168 | + pub(crate) fn sev_init(&self, policy: SevPolicy, memory: Arc<V::Memory>) -> Result<()> { |
| 169 | + self.vm.sev_launch_start(policy)?; |
| 170 | + let encrypt_pages = Box::new(EncryptPages { memory }); |
| 171 | + self.memory.register_change_callback(encrypt_pages)?; |
| 172 | + Ok(()) |
| 173 | + } |
| 174 | + |
| 175 | + pub(crate) fn snp_init(&self, policy: SnpPolicy, memory: Arc<V::Memory>) -> Result<()> { |
| 176 | + self.vm.snp_launch_start(policy)?; |
| 177 | + let encrypt_pages = Box::new(EncryptPages { |
| 178 | + memory: memory.clone(), |
| 179 | + }); |
| 180 | + self.memory.register_change_callback(encrypt_pages)?; |
| 181 | + let mark_private_memory = Box::new(MarkPrivateMemory { memory }); |
| 182 | + self.memory.register_change_callback(mark_private_memory)?; |
| 183 | + Ok(()) |
| 184 | + } |
| 185 | +} |
| 186 | + |
| 187 | +#[derive(Debug)] |
| 188 | +pub struct EncryptPages { |
| 189 | + memory: Arc<dyn VmMemory>, |
| 190 | +} |
| 191 | + |
| 192 | +impl LayoutChanged for EncryptPages { |
| 193 | + fn ram_added(&self, _: u64, pages: &ArcMemPages) -> mem::Result<()> { |
| 194 | + self.memory.register_encrypted_range(pages.as_slice())?; |
| 195 | + Ok(()) |
| 196 | + } |
| 197 | + |
| 198 | + fn ram_removed(&self, _: u64, _: &ArcMemPages) -> mem::Result<()> { |
| 199 | + Ok(()) |
| 200 | + } |
165 | 201 | } |
0 commit comments