@@ -6,10 +6,16 @@ use vmm_sys_util::*;
66use tdx:: launch:: { TdxVcpu , TdxVm } ;
77use tdx:: tdvf;
88
9+ // one page of `hlt`
10+ const CODE : & [ u8 ; 4096 ] = & [
11+ 0xf4 ; 4096 // hlt
12+ ] ;
13+
914#[ test]
1015fn 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