use crate::launch::snp::*;
use std::marker::PhantomData;
#[derive(Default)]
#[repr(C, packed)]
pub struct Init {
flags: u64,
}
#[repr(C)]
pub struct LaunchStart {
policy: u64,
gosvw: [u8; 16],
flags: u16,
pad0: [u8; 6],
pad1: [u64; 4],
}
impl From<Start> for LaunchStart {
fn from(start: Start) -> Self {
Self {
policy: start.policy.into(),
gosvw: start.gosvw,
flags: 0,
pad0: [0u8; 6],
pad1: [0u64; 4],
}
}
}
#[repr(C)]
pub struct LaunchUpdate<'a> {
pub start_gfn: u64,
pub uaddr: u64,
pub len: u64,
pub page_type: u8,
pad0: u8,
flags: u16,
pad1: u32,
pad2: [u64; 4],
_phantom: PhantomData<&'a [u8]>,
}
impl From<Update<'_>> for LaunchUpdate<'_> {
fn from(update: Update) -> Self {
Self {
start_gfn: update.start_gfn,
uaddr: update.uaddr.as_ptr() as _,
len: update.uaddr.len() as _,
page_type: update.page_type as _,
pad0: 0,
flags: 0,
pad1: 0,
pad2: [0u64; 4],
_phantom: PhantomData,
}
}
}
pub const KVM_SEV_SNP_FINISH_DATA_SIZE: usize = 32;
#[repr(C)]
pub struct LaunchFinish<'a> {
id_block_uaddr: u64,
id_auth_uaddr: u64,
id_block_en: u8,
auth_key_en: u8,
host_data: [u8; KVM_SEV_SNP_FINISH_DATA_SIZE],
pad: [u8; 6],
_phantom: PhantomData<&'a [u8]>,
}
impl From<Finish<'_, '_>> for LaunchFinish<'_> {
fn from(finish: Finish) -> Self {
let id_block = if let Some(addr) = finish.id_block {
addr.as_ptr() as u64
} else {
0
};
let id_auth = if let Some(addr) = finish.id_auth {
addr.as_ptr() as u64
} else {
0
};
Self {
id_block_uaddr: id_block,
id_auth_uaddr: id_auth,
id_block_en: u8::from(finish.id_block.is_some()),
auth_key_en: u8::from(finish.id_auth.is_some()),
host_data: finish.host_data,
pad: [0u8; 6],
_phantom: PhantomData,
}
}
}