@@ -14,8 +14,6 @@ use env_logger::{Env, Target};
1414#[ cfg( feature = "gpu" ) ]
1515use krun_display:: DisplayBackend ;
1616
17- #[ cfg( not( feature = "tee" ) ) ]
18- use devices:: virtio:: fs:: InitPayload ;
1917use libc:: { c_char, c_int, size_t} ;
2018use once_cell:: sync:: Lazy ;
2119use polly:: event_manager:: EventManager ;
@@ -36,8 +34,6 @@ use std::os::fd::{BorrowedFd, FromRawFd, RawFd};
3634use std:: path:: PathBuf ;
3735use std:: slice;
3836use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
39- #[ cfg( not( any( feature = "tee" , feature = "aws-nitro" ) ) ) ]
40- use std:: sync:: Arc ;
4137use std:: sync:: { LazyLock , Mutex } ;
4238use utils:: eventfd:: EventFd ;
4339use vmm:: resources:: {
@@ -94,7 +90,7 @@ static KRUNFW: LazyLock<Option<libloading::Library>> =
9490 LazyLock :: new ( || unsafe { libloading:: Library :: new ( KRUNFW_NAME ) . ok ( ) } ) ;
9591
9692#[ cfg( not( any( feature = "tee" , feature = "aws-nitro" ) ) ) ]
97- const DEFAULT_INIT_PAYLOAD : InitPayload = InitPayload :: Static ( krun_init:: DEFAULT_INIT ) ;
93+ const DEFAULT_INIT_PAYLOAD : & [ u8 ] = krun_init:: DEFAULT_INIT ;
9894
9995pub struct KrunfwBindings {
10096 get_kernel : libloading:: Symbol <
@@ -171,7 +167,7 @@ struct ContextConfig {
171167 vmm_uid : Option < libc:: uid_t > ,
172168 vmm_gid : Option < libc:: gid_t > ,
173169 #[ cfg( not( feature = "tee" ) ) ]
174- init_payload : Option < InitPayload > ,
170+ init_payload : Option < & ' static [ u8 ] > ,
175171}
176172
177173impl ContextConfig {
@@ -241,13 +237,13 @@ impl ContextConfig {
241237 }
242238
243239 #[ cfg( not( feature = "tee" ) ) ]
244- fn set_init_payload ( & mut self , init_payload : InitPayload ) {
245- self . init_payload = Some ( init_payload ) ;
240+ fn set_init_binary ( & mut self , init_binary : & ' static [ u8 ] ) {
241+ self . init_payload = Some ( init_binary ) ;
246242 }
247243
248244 #[ cfg( not( feature = "tee" ) ) ]
249- fn get_init_payload ( & self ) -> InitPayload {
250- self . init_payload . clone ( ) . unwrap_or ( DEFAULT_INIT_PAYLOAD )
245+ fn get_init_binary ( & self ) -> & ' static [ u8 ] {
246+ self . init_payload . unwrap_or ( DEFAULT_INIT_PAYLOAD )
251247 }
252248
253249 fn get_args ( & self ) -> String {
@@ -613,7 +609,7 @@ pub unsafe extern "C" fn krun_set_root(ctx_id: u32, c_root_path: *const c_char)
613609 // Default to a conservative 512 MB window.
614610 shm_size : Some ( 1 << 29 ) ,
615611 allow_root_dir_delete : false ,
616- init_payload : Some ( cfg. get_init_payload ( ) ) ,
612+ init_payload : Some ( cfg. get_init_binary ( ) ) ,
617613 } ) ;
618614 }
619615 Entry :: Vacant ( _) => return -libc:: ENOENT ,
@@ -634,18 +630,18 @@ pub unsafe extern "C" fn krun_set_init(
634630 return -libc:: EINVAL ;
635631 }
636632
637- let payload = InitPayload :: Owned ( Arc :: < [ u8 ] > :: from ( slice :: from_raw_parts (
638- init_binary ,
639- init_binary_len ,
640- ) ) ) ;
633+ // SAFETY CONTRACT: The caller guarantees that this memory range remains
634+ // valid for the full VM lifetime (until krun_start_enter() returns and the
635+ // context is dropped). We do not copy the bytes.
636+ let payload : & ' static [ u8 ] = slice :: from_raw_parts ( init_binary , init_binary_len ) ;
641637
642638 match CTX_MAP . lock ( ) . unwrap ( ) . entry ( ctx_id) {
643639 Entry :: Occupied ( mut ctx_cfg_entry) => {
644640 let ctx_cfg = ctx_cfg_entry. get_mut ( ) ;
645- ctx_cfg. set_init_payload ( payload. clone ( ) ) ;
641+ ctx_cfg. set_init_binary ( payload) ;
646642
647643 for fs_cfg in & mut ctx_cfg. vmr . fs {
648- fs_cfg. init_payload = Some ( payload. clone ( ) ) ;
644+ fs_cfg. init_payload = Some ( payload) ;
649645 }
650646 }
651647 Entry :: Vacant ( _) => return -libc:: ENOENT ,
@@ -679,7 +675,7 @@ pub unsafe extern "C" fn krun_add_virtiofs(
679675 shared_dir : path. to_string ( ) ,
680676 shm_size : None ,
681677 allow_root_dir_delete : false ,
682- init_payload : Some ( cfg. get_init_payload ( ) ) ,
678+ init_payload : Some ( cfg. get_init_binary ( ) ) ,
683679 } ) ;
684680 }
685681 Entry :: Vacant ( _) => return -libc:: ENOENT ,
@@ -714,7 +710,7 @@ pub unsafe extern "C" fn krun_add_virtiofs2(
714710 shared_dir : path. to_string ( ) ,
715711 shm_size : Some ( shm_size. try_into ( ) . unwrap ( ) ) ,
716712 allow_root_dir_delete : false ,
717- init_payload : Some ( cfg. get_init_payload ( ) ) ,
713+ init_payload : Some ( cfg. get_init_binary ( ) ) ,
718714 } ) ;
719715 }
720716 Entry :: Vacant ( _) => return -libc:: ENOENT ,
@@ -2347,7 +2343,7 @@ pub unsafe extern "C" fn krun_set_root_disk_remount(
23472343 // Default to a conservative 512 MB window.
23482344 shm_size : Some ( 1 << 29 ) ,
23492345 allow_root_dir_delete : true ,
2350- init_payload : Some ( ctx_cfg. get_init_payload ( ) ) ,
2346+ init_payload : Some ( ctx_cfg. get_init_binary ( ) ) ,
23512347 } ) ;
23522348
23532349 ctx_cfg. set_block_root ( device, fstype, options) ;
0 commit comments