Skip to content

Commit 8ca5bb9

Browse files
committed
more testing
Signed-off-by: Jake Correnti <[email protected]>
1 parent b6fbecd commit 8ca5bb9

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

src/launch/mod.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,31 @@ impl TdxVm {
159159
Ok(())
160160
}
161161

162+
pub fn init_mem_region_raw(
163+
&self,
164+
source_addr: u64,
165+
gpa: u64,
166+
nr_pages: u64,
167+
extend: bool,
168+
) -> Result<(), TdxError> {
169+
let mem_region = linux::TdxInitMemRegion {
170+
source_addr,
171+
gpa,
172+
nr_pages,
173+
};
174+
175+
let mut cmd = Cmd::from(&mem_region);
176+
177+
// determines if we also extend the measurement
178+
cmd.flags = extend as u32;
179+
180+
unsafe {
181+
self.fd.encrypt_op(&mut cmd)?;
182+
}
183+
184+
Ok(())
185+
}
186+
162187
/// Complete measurement of the initial TD contents and mark it ready to run
163188
pub fn finalize(&self) -> Result<(), TdxError> {
164189
let mut cmd = Cmd {

tests/launch.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@ use vmm_sys_util::*;
66
use tdx::launch::{TdxVcpu, TdxVm};
77
use tdx::tdvf;
88

9+
// one page of `hlt`
10+
const CODE: &[u8; 4096] = &[
11+
0xf4; 4096 // hlt
12+
];
13+
914
#[test]
1015
fn launch() {
1116
const KVM_CAP_GUEST_MEMFD: u32 = 234;
1217
const KVM_CAP_MEMORY_MAPPING: u32 = 236;
18+
const CODE_MEM_ADDRESS: usize = 0x1000;
1319

1420
// create vm
1521
let mut kvm_fd = Kvm::new().unwrap();
@@ -25,6 +31,48 @@ fn launch() {
2531
let hob_section = tdvf::get_hob_section(&sections).unwrap();
2632
tdx_vcpu.init(hob_section.memory_address).unwrap();
2733

34+
// code for the guest to run
35+
let userspace_addr = ram_mmap(CODE.len() as u64);
36+
let userspace_addr = unsafe { std::slice::from_raw_parts_mut(userspace_addr as *mut u8, CODE.len()) };
37+
userspace_addr[..CODE.len()].copy_from_slice(&CODE[..]);
38+
let userspace_addr = userspace_addr as *const [u8] as *const u8 as u64;
39+
// let code_addr_space: &mut [u8] =
40+
// unsafe { std::slice::from_raw_parts_mut(userspace_addr as *mut u8, CODE.len()) };
41+
// code_addr_space[..CODE.len()].copy_from_slice(&CODE[..]);
42+
// let userspace_addr = code_addr_space as *const [u8] as *const u8 as u64;
43+
44+
let code_gmem = KvmCreateGuestMemfd {
45+
size: CODE.len() as u64,
46+
flags: 0,
47+
reserved: [0; 6],
48+
};
49+
let code_gmem = linux_ioctls::create_guest_memfd(&tdx_vm.fd, &code_gmem);
50+
if code_gmem < 0 {
51+
panic!("create guest memfd for code failed");
52+
}
53+
54+
let code_mem_region = KvmUserspaceMemoryRegion2 {
55+
slot: 22,
56+
flags: 1u32 << 2,
57+
guest_phys_addr: CODE_MEM_ADDRESS as u64,
58+
memory_size: CODE.len() as u64,
59+
userspace_addr,
60+
guest_memfd_offset: 0,
61+
guest_memfd: code_gmem as u32,
62+
pad1: 0,
63+
pad2: [0; 14],
64+
};
65+
linux_ioctls::set_user_memory_region2(&tdx_vm.fd, &code_mem_region);
66+
67+
let attr = KvmMemoryAttributes {
68+
address: CODE_MEM_ADDRESS as u64,
69+
size: CODE.len() as u64,
70+
attributes: 1u64 << 3,
71+
flags: 0,
72+
};
73+
linux_ioctls::set_memory_attributes(&tdx_vm.fd, &attr);
74+
tdx_vm.init_mem_region_raw(userspace_addr, CODE_MEM_ADDRESS as u64, CODE.len() as u64 / 4096, false).expect("INIT_MEM_REGION on code failed");
75+
2876
// map memory to guest
2977
if !check_extension(KVM_CAP_GUEST_MEMFD) {
3078
panic!("KVM_CAP_GUEST_MEMFD isn't supported, which is required by TDX");

0 commit comments

Comments
 (0)