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,8 @@ use std::path::PathBuf;
1520use std:: slice;
1621use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
1722use std:: sync:: Mutex ;
23+ use vm_memory:: GuestMemoryRegion ;
24+ use vm_memory:: { Address , GuestMemory } ;
1825
1926#[ cfg( target_os = "macos" ) ]
2027use crossbeam_channel:: unbounded;
@@ -1077,9 +1084,12 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
10771084 #[ cfg( target_os = "macos" ) ]
10781085 let ( sender, receiver) = unbounded ( ) ;
10791086
1087+ let ( io_sender, receiver) = unbounded ( ) ;
1088+
10801089 let _vmm = match vmm:: builder:: build_microvm (
10811090 & ctx_cfg. vmr ,
10821091 & mut event_manager,
1092+ io_sender,
10831093 ctx_cfg. shutdown_efd ,
10841094 #[ cfg( target_os = "macos" ) ]
10851095 sender,
@@ -1094,6 +1104,50 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
10941104 #[ cfg( target_os = "macos" ) ]
10951105 let mapper_vmm = _vmm. clone ( ) ;
10961106
1107+ let vm = _vmm. lock ( ) . unwrap ( ) . kvm_vm ( ) . fd . clone ( ) ;
1108+ let guest_mem = _vmm. lock ( ) . unwrap ( ) . guest_memory ( ) . clone ( ) ;
1109+ let guest_memfd = _vmm. lock ( ) . unwrap ( ) . guest_memfd_vec . clone ( ) ;
1110+
1111+ std:: thread:: spawn ( move || loop {
1112+ match receiver. recv ( ) {
1113+ Err ( e) => error ! ( "Error in receiver: {:?}" , e) ,
1114+ Ok ( m) => {
1115+ let _ret = vm
1116+ . lock ( )
1117+ . unwrap ( )
1118+ . set_memory_attributes ( kvm_memory_attributes {
1119+ address : m. addr ,
1120+ size : m. size ,
1121+ attributes : m. attributes as u64 ,
1122+ flags : 0 ,
1123+ } ) ;
1124+
1125+ // from private to shared
1126+ // e.g., ram_block_discard_guest_memfd_range
1127+ if m. attributes == 0 {
1128+ for ( index, region) in guest_mem. iter ( ) . enumerate ( ) {
1129+ if ( region. start_addr ( ) . raw_value ( ) + region. size ( ) as u64 ) > m. addr {
1130+ // offset es function de la posicion de mapeo
1131+ let offset = m. addr - region. start_addr ( ) . raw_value ( ) ;
1132+ unsafe {
1133+ let _ret = fallocate (
1134+ * guest_memfd. get ( index) . unwrap ( ) ,
1135+ FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE ,
1136+ offset as i64 ,
1137+ m. size as i64 ,
1138+ ) ;
1139+ }
1140+ }
1141+ }
1142+ // from shared to private
1143+ // e.g., ram_block_discard_range
1144+ } else {
1145+ // do something
1146+ }
1147+ }
1148+ }
1149+ } ) ;
1150+
10971151 #[ cfg( target_os = "macos" ) ]
10981152 std:: thread:: spawn ( move || loop {
10991153 match receiver. recv ( ) {
0 commit comments