@@ -6,10 +6,16 @@ use vmm_sys_util::*;
6
6
use tdx:: launch:: { TdxVcpu , TdxVm } ;
7
7
use tdx:: tdvf;
8
8
9
+ // one page of `hlt`
10
+ const CODE : & [ u8 ; 4096 ] = & [
11
+ 0xf4 ; 4096 // hlt
12
+ ] ;
13
+
9
14
#[ test]
10
15
fn launch ( ) {
11
16
const KVM_CAP_GUEST_MEMFD : u32 = 234 ;
12
17
const KVM_CAP_MEMORY_MAPPING : u32 = 236 ;
18
+ const CODE_MEM_ADDRESS : usize = 0x1000 ;
13
19
14
20
// create vm
15
21
let mut kvm_fd = Kvm :: new ( ) . unwrap ( ) ;
@@ -25,6 +31,48 @@ fn launch() {
25
31
let hob_section = tdvf:: get_hob_section ( & sections) . unwrap ( ) ;
26
32
tdx_vcpu. init ( hob_section. memory_address ) . unwrap ( ) ;
27
33
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
+
28
76
// map memory to guest
29
77
if !check_extension ( KVM_CAP_GUEST_MEMFD ) {
30
78
panic ! ( "KVM_CAP_GUEST_MEMFD isn't supported, which is required by TDX" ) ;
0 commit comments