11#[ macro_use]  
22extern  crate  log; 
33
4+ use  crossbeam_channel:: unbounded; 
5+ use  kvm_bindings:: kvm_memory_attributes; 
6+ use  libc:: fallocate; 
7+ use  libc:: FALLOC_FL_KEEP_SIZE ; 
8+ use  libc:: FALLOC_FL_PUNCH_HOLE ; 
49use  std:: collections:: hash_map:: Entry ; 
510use  std:: collections:: HashMap ; 
611use  std:: convert:: TryInto ; 
@@ -15,6 +20,9 @@ use std::path::PathBuf;
1520use  std:: slice; 
1621use  std:: sync:: atomic:: { AtomicI32 ,  Ordering } ; 
1722use  std:: sync:: Mutex ; 
23+ use  vm_memory:: GuestMemoryMmap ; 
24+ use  vm_memory:: GuestMemoryRegion ; 
25+ use  vm_memory:: { Address ,  GuestMemory } ; 
1826
1927#[ cfg( target_os = "macos" ) ]  
2028use  crossbeam_channel:: unbounded; 
@@ -1077,9 +1085,12 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
10771085    #[ cfg( target_os = "macos" ) ]  
10781086    let  ( sender,  receiver)  = unbounded ( ) ; 
10791087
1088+     let  ( io_sender,  receiver)  = unbounded ( ) ; 
1089+ 
10801090    let  _vmm = match  vmm:: builder:: build_microvm ( 
10811091        & ctx_cfg. vmr , 
10821092        & mut  event_manager, 
1093+         io_sender, 
10831094        ctx_cfg. shutdown_efd , 
10841095        #[ cfg( target_os = "macos" ) ]  
10851096        sender, 
@@ -1094,6 +1105,50 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
10941105    #[ cfg( target_os = "macos" ) ]  
10951106    let  mapper_vmm = _vmm. clone ( ) ; 
10961107
1108+     let  vm = _vmm. lock ( ) . unwrap ( ) . kvm_vm ( ) . fd . clone ( ) ; 
1109+     let  guest_mem = _vmm. lock ( ) . unwrap ( ) . guest_memory ( ) . clone ( ) ; 
1110+     let  guest_memfd = _vmm. lock ( ) . unwrap ( ) . guest_memfd_vec . clone ( ) ; 
1111+ 
1112+     std:: thread:: spawn ( move  || loop  { 
1113+         match  receiver. recv ( )  { 
1114+             Err ( e)  => error ! ( "Error in receiver: {:?}" ,  e) , 
1115+             Ok ( m)  => { 
1116+                 let  ret = vm
1117+                     . lock ( ) 
1118+                     . unwrap ( ) 
1119+                     . set_memory_attributes ( kvm_memory_attributes  { 
1120+                         address :  m. addr , 
1121+                         size :  m. size , 
1122+                         attributes :  m. attributes  as  u64 , 
1123+                         flags :  0 , 
1124+                     } ) ; 
1125+ 
1126+                 // from private to shared 
1127+                 // e.g., ram_block_discard_guest_memfd_range 
1128+                 if  m. attributes  == 0  { 
1129+                     for  ( index,  region)  in  guest_mem. iter ( ) . enumerate ( )  { 
1130+                         if  ( region. start_addr ( ) . raw_value ( )  + region. size ( )  as  u64 )  > m. addr  { 
1131+                             // offset es function de la posicion de mapeo 
1132+                             let  offset = m. addr  - region. start_addr ( ) . raw_value ( ) ; 
1133+                             unsafe  { 
1134+                                 let  ret = fallocate ( 
1135+                                     * guest_memfd. get ( index) . unwrap ( ) , 
1136+                                     FALLOC_FL_PUNCH_HOLE  | FALLOC_FL_KEEP_SIZE , 
1137+                                     offset as  i64 , 
1138+                                     m. size  as  i64 , 
1139+                                 ) ; 
1140+                             } 
1141+                         } 
1142+                     } 
1143+                 // from shared to private 
1144+                 // e.g., ram_block_discard_range 
1145+                 }  else  { 
1146+                     // do something 
1147+                 } 
1148+             } 
1149+         } 
1150+     } ) ; 
1151+ 
10971152    #[ cfg( target_os = "macos" ) ]  
10981153    std:: thread:: spawn ( move  || loop  { 
10991154        match  receiver. recv ( )  { 
0 commit comments