1
1
#[ macro_use]
2
2
extern crate log;
3
3
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 ;
4
9
use std:: collections:: hash_map:: Entry ;
5
10
use std:: collections:: HashMap ;
6
11
use std:: convert:: TryInto ;
@@ -15,6 +20,9 @@ use std::path::PathBuf;
15
20
use std:: slice;
16
21
use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
17
22
use std:: sync:: Mutex ;
23
+ use vm_memory:: GuestMemoryMmap ;
24
+ use vm_memory:: GuestMemoryRegion ;
25
+ use vm_memory:: { Address , GuestMemory } ;
18
26
19
27
#[ cfg( target_os = "macos" ) ]
20
28
use crossbeam_channel:: unbounded;
@@ -1077,9 +1085,12 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
1077
1085
#[ cfg( target_os = "macos" ) ]
1078
1086
let ( sender, receiver) = unbounded ( ) ;
1079
1087
1088
+ let ( io_sender, receiver) = unbounded ( ) ;
1089
+
1080
1090
let _vmm = match vmm:: builder:: build_microvm (
1081
1091
& ctx_cfg. vmr ,
1082
1092
& mut event_manager,
1093
+ io_sender,
1083
1094
ctx_cfg. shutdown_efd ,
1084
1095
#[ cfg( target_os = "macos" ) ]
1085
1096
sender,
@@ -1094,6 +1105,50 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
1094
1105
#[ cfg( target_os = "macos" ) ]
1095
1106
let mapper_vmm = _vmm. clone ( ) ;
1096
1107
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
+
1097
1152
#[ cfg( target_os = "macos" ) ]
1098
1153
std:: thread:: spawn ( move || loop {
1099
1154
match receiver. recv ( ) {
0 commit comments