@@ -76,8 +76,6 @@ pub(crate) struct HyperlightVm {
7676 entrypoint : u64 ,
7777 orig_rsp : GuestPtr ,
7878 interrupt_handle : Arc < dyn InterruptHandleImpl > ,
79- mem_mgr : Option < SandboxMemoryManager < HostSharedMemory > > ,
80- host_funcs : Option < Arc < Mutex < FunctionRegistry > > > ,
8179
8280 sandbox_regions : Vec < MemoryRegion > , // Initially mapped regions when sandbox is created
8381 mmap_regions : Vec < ( u32 , MemoryRegion ) > , // Later mapped regions (slot number, region)
@@ -193,8 +191,6 @@ impl HyperlightVm {
193191 orig_rsp : rsp_gp,
194192 interrupt_handle,
195193 page_size : 0 , // Will be set in `initialise`
196- mem_mgr : None ,
197- host_funcs : None ,
198194
199195 next_slot : mem_regions. len ( ) as u32 ,
200196 sandbox_regions : mem_regions,
@@ -229,13 +225,11 @@ impl HyperlightVm {
229225 peb_addr : RawPtr ,
230226 seed : u64 ,
231227 page_size : u32 ,
232- mem_mgr : SandboxMemoryManager < HostSharedMemory > ,
228+ mem_mgr : & mut SandboxMemoryManager < HostSharedMemory > ,
233229 host_funcs : Arc < Mutex < FunctionRegistry > > ,
234230 max_guest_log_level : Option < LevelFilter > ,
235231 #[ cfg( gdb) ] dbg_mem_access_fn : Arc < Mutex < SandboxMemoryManager < HostSharedMemory > > > ,
236232 ) -> Result < ( ) > {
237- self . mem_mgr = Some ( mem_mgr) ;
238- self . host_funcs = Some ( host_funcs) ;
239233 self . page_size = page_size as usize ;
240234
241235 let max_guest_log_level: u64 = match max_guest_log_level {
@@ -259,6 +253,8 @@ impl HyperlightVm {
259253 self . vm . set_regs ( & regs) ?;
260254
261255 self . run (
256+ mem_mgr,
257+ host_funcs,
262258 #[ cfg( gdb) ]
263259 dbg_mem_access_fn,
264260 ) ?;
@@ -269,6 +265,8 @@ impl HyperlightVm {
269265 #[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
270266 pub ( crate ) fn dispatch_call_from_host (
271267 & mut self ,
268+ mem_mgr : & mut SandboxMemoryManager < HostSharedMemory > ,
269+ host_funcs : Arc < Mutex < FunctionRegistry > > ,
272270 dispatch_func_addr : RawPtr ,
273271 #[ cfg( gdb) ] dbg_mem_access_fn : Arc < Mutex < SandboxMemoryManager < HostSharedMemory > > > ,
274272 ) -> Result < ( ) > {
@@ -285,6 +283,8 @@ impl HyperlightVm {
285283 self . vm . set_fpu ( & CommonFpu :: default ( ) ) ?;
286284
287285 self . run (
286+ mem_mgr,
287+ host_funcs,
288288 #[ cfg( gdb) ]
289289 dbg_mem_access_fn,
290290 ) ?;
@@ -325,61 +325,10 @@ impl HyperlightVm {
325325 & self . mmap_regions
326326 }
327327
328- #[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
329- fn handle_io ( & mut self , port : u16 , data : Vec < u8 > ) -> Result < ( ) > {
330- if data. is_empty ( ) {
331- log_then_return ! ( "no data was given in IO interrupt" ) ;
332- }
333-
334- #[ allow( clippy:: get_first) ]
335- let val = u32:: from_le_bytes ( [
336- data. get ( 0 ) . copied ( ) . unwrap_or ( 0 ) ,
337- data. get ( 1 ) . copied ( ) . unwrap_or ( 0 ) ,
338- data. get ( 2 ) . copied ( ) . unwrap_or ( 0 ) ,
339- data. get ( 3 ) . copied ( ) . unwrap_or ( 0 ) ,
340- ] ) ;
341-
342- #[ cfg( feature = "mem_profile" ) ]
343- {
344- // We need to handle the borrow checker issue where we need both:
345- // - &mut MemMgrWrapper (from self.mem_mgr.as_mut())
346- // - &mut dyn Hypervisor (from self)
347- // We'll use a temporary approach to extract the mem_mgr temporarily
348- let mem_mgr_option = self . mem_mgr . take ( ) ;
349- let mut mem_mgr =
350- mem_mgr_option. ok_or_else ( || new_error ! ( "mem_mgr not initialized" ) ) ?;
351- let host_funcs = self
352- . host_funcs
353- . as_ref ( )
354- . ok_or_else ( || new_error ! ( "host_funcs not initialized" ) ) ?
355- . clone ( ) ;
356-
357- handle_outb ( & mut mem_mgr, host_funcs, port, val, self ) ?;
358-
359- // Put the mem_mgr back
360- self . mem_mgr = Some ( mem_mgr) ;
361- }
362-
363- #[ cfg( not( feature = "mem_profile" ) ) ]
364- {
365- let mem_mgr = self
366- . mem_mgr
367- . as_mut ( )
368- . ok_or_else ( || new_error ! ( "mem_mgr not initialized" ) ) ?;
369- let host_funcs = self
370- . host_funcs
371- . as_ref ( )
372- . ok_or_else ( || new_error ! ( "host_funcs not initialized" ) ) ?
373- . clone ( ) ;
374-
375- handle_outb ( mem_mgr, host_funcs, port, val) ?;
376- }
377-
378- Ok ( ( ) )
379- }
380-
381328 fn run (
382329 & mut self ,
330+ mem_mgr : & mut SandboxMemoryManager < HostSharedMemory > ,
331+ host_funcs : Arc < Mutex < FunctionRegistry > > ,
383332 #[ cfg( gdb) ] dbg_mem_access_fn : Arc < Mutex < SandboxMemoryManager < HostSharedMemory > > > ,
384333 ) -> Result < ( ) > {
385334 // ===== KILL() TIMING POINT 1: Between guest function calls =====
@@ -425,7 +374,7 @@ impl HyperlightVm {
425374
426375 // Handle the guest trace data if any
427376 #[ cfg( feature = "trace_guest" ) ]
428- if let Err ( e) = self . handle_trace ( & mut tc ) {
377+ if let Err ( e) = tc . handle_trace ( & self . vm . regs ( ) ? , mem_mgr ) {
429378 // If no trace data is available, we just log a message and continue
430379 // Is this the right thing to do?
431380 log:: debug!( "Error handling guest trace: {:?}" , e) ;
@@ -469,7 +418,28 @@ impl HyperlightVm {
469418 Ok ( VmExit :: Halt ( ) ) => {
470419 break Ok ( ( ) ) ;
471420 }
472- Ok ( VmExit :: IoOut ( port, data) ) => self . handle_io ( port, data) ?,
421+ Ok ( VmExit :: IoOut ( port, data) ) => {
422+ if data. is_empty ( ) {
423+ log_then_return ! ( "no data was given in IO interrupt" ) ;
424+ }
425+
426+ #[ allow( clippy:: get_first) ]
427+ let val: u32 = u32:: from_le_bytes ( [
428+ data. get ( 0 ) . copied ( ) . unwrap_or ( 0 ) ,
429+ data. get ( 1 ) . copied ( ) . unwrap_or ( 0 ) ,
430+ data. get ( 2 ) . copied ( ) . unwrap_or ( 0 ) ,
431+ data. get ( 3 ) . copied ( ) . unwrap_or ( 0 ) ,
432+ ] ) ;
433+ handle_outb (
434+ mem_mgr,
435+ host_funcs. clone ( ) ,
436+ port,
437+ val,
438+ & self . vm . regs ( ) ?,
439+ #[ cfg( feature = "mem_profile" ) ]
440+ & mut self . trace_info ,
441+ ) ?;
442+ }
473443 Ok ( VmExit :: MmioRead ( addr) ) => {
474444 let all_regions = self
475445 . sandbox_regions
@@ -491,17 +461,9 @@ impl HyperlightVm {
491461 ) ) ;
492462 }
493463 None => {
494- match & self . mem_mgr {
495- Some ( mem_mgr) => {
496- if !mem_mgr. check_stack_guard ( ) ? {
497- break Err ( HyperlightError :: StackOverflow ( ) ) ;
498- }
499- }
500- None => {
501- break Err ( new_error ! ( "Memory manager not initialized" ) ) ;
502- }
503- }
504-
464+ // if !self.mem_mgr.check_stack_guard()? {
465+ // break Err(HyperlightError::StackOverflow());
466+ // }
505467 break Err ( new_error ! ( "MMIO READ access address {:#x}" , addr) ) ;
506468 }
507469 }
@@ -527,15 +489,8 @@ impl HyperlightVm {
527489 ) ) ;
528490 }
529491 None => {
530- match & self . mem_mgr {
531- Some ( mem_mgr) => {
532- if !mem_mgr. check_stack_guard ( ) ? {
533- break Err ( HyperlightError :: StackOverflow ( ) ) ;
534- }
535- }
536- None => {
537- break Err ( new_error ! ( "Memory manager not initialized" ) ) ;
538- }
492+ if mem_mgr. check_stack_guard ( ) ? {
493+ break Err ( HyperlightError :: StackOverflow ( ) ) ;
539494 }
540495
541496 break Err ( new_error ! ( "MMIO WRITE access address {:#x}" , addr) ) ;
@@ -803,27 +758,6 @@ impl HyperlightVm {
803758 filename,
804759 ) )
805760 }
806-
807- #[ cfg( feature = "mem_profile" ) ]
808- pub ( crate ) fn vm_regs ( & self ) -> Result < CommonRegisters > {
809- self . vm . regs ( )
810- }
811-
812- #[ cfg( feature = "trace_guest" ) ]
813- fn handle_trace ( & mut self , tc : & mut crate :: sandbox:: trace:: TraceContext ) -> Result < ( ) > {
814- let regs = self . vm . regs ( ) ?;
815- tc. handle_trace (
816- & regs,
817- self . mem_mgr . as_mut ( ) . ok_or_else ( || {
818- new_error ! ( "Memory manager is not initialized before handling trace" )
819- } ) ?,
820- )
821- }
822-
823- #[ cfg( feature = "mem_profile" ) ]
824- pub ( crate ) fn trace_info_mut ( & mut self ) -> & mut MemTraceInfo {
825- & mut self . trace_info
826- }
827761}
828762
829763impl Drop for HyperlightVm {
0 commit comments