@@ -48,13 +48,15 @@ use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
4848use crate :: mem:: mgr:: SandboxMemoryManager ;
4949use crate :: mem:: ptr:: { GuestPtr , RawPtr } ;
5050use crate :: mem:: shared_mem:: HostSharedMemory ;
51+ #[ cfg( gdb) ]
52+ use crate :: new_error;
5153use crate :: sandbox:: host_funcs:: FunctionRegistry ;
5254use crate :: sandbox:: outb:: handle_outb;
5355#[ cfg( feature = "mem_profile" ) ]
5456use crate :: sandbox:: trace:: MemTraceInfo ;
5557#[ cfg( crashdump) ]
5658use crate :: sandbox:: uninitialized:: SandboxRuntimeConfig ;
57- use crate :: { Result , debug, log_then_return, new_error } ;
59+ use crate :: { Result , debug, log_then_return} ;
5860
5961#[ cfg( gdb) ]
6062mod debug {
@@ -261,8 +263,6 @@ pub(crate) struct HypervWindowsDriver {
261263 entrypoint : u64 ,
262264 orig_rsp : GuestPtr ,
263265 interrupt_handle : Arc < dyn InterruptHandleImpl > ,
264- mem_mgr : Option < SandboxMemoryManager < HostSharedMemory > > ,
265- host_funcs : Option < Arc < Mutex < FunctionRegistry > > > ,
266266
267267 sandbox_regions : Vec < MemoryRegion > , // Initially mapped regions when sandbox is created
268268 mmap_regions : Vec < MemoryRegion > , // Later mapped regions
@@ -335,8 +335,6 @@ impl HypervWindowsDriver {
335335 entrypoint,
336336 orig_rsp : GuestPtr :: try_from ( RawPtr :: from ( rsp) ) ?,
337337 interrupt_handle : interrupt_handle. clone ( ) ,
338- mem_mgr : None ,
339- host_funcs : None ,
340338 sandbox_regions : mem_regions,
341339 mmap_regions : Vec :: new ( ) ,
342340 #[ cfg( gdb) ]
@@ -408,14 +406,11 @@ impl Hypervisor for HypervWindowsDriver {
408406 peb_address : RawPtr ,
409407 seed : u64 ,
410408 page_size : u32 ,
411- mem_mgr : SandboxMemoryManager < HostSharedMemory > ,
412- host_funcs : Arc < Mutex < FunctionRegistry > > ,
409+ mem_mgr : & mut SandboxMemoryManager < HostSharedMemory > ,
410+ host_funcs : & Arc < Mutex < FunctionRegistry > > ,
413411 max_guest_log_level : Option < LevelFilter > ,
414412 #[ cfg( gdb) ] dbg_mem_access_hdl : Arc < Mutex < SandboxMemoryManager < HostSharedMemory > > > ,
415413 ) -> Result < ( ) > {
416- self . mem_mgr = Some ( mem_mgr) ;
417- self . host_funcs = Some ( host_funcs) ;
418-
419414 let max_guest_log_level: u64 = match max_guest_log_level {
420415 Some ( level) => level as u64 ,
421416 None => self . get_max_log_level ( ) . into ( ) ,
@@ -440,6 +435,8 @@ impl Hypervisor for HypervWindowsDriver {
440435 VirtualCPU :: run (
441436 self . as_mut_hypervisor ( ) ,
442437 interrupt_handle,
438+ mem_mgr,
439+ host_funcs,
443440 #[ cfg( gdb) ]
444441 dbg_mem_access_hdl,
445442 )
@@ -463,6 +460,8 @@ impl Hypervisor for HypervWindowsDriver {
463460 fn dispatch_call_from_host (
464461 & mut self ,
465462 dispatch_func_addr : RawPtr ,
463+ mem_mgr : & mut SandboxMemoryManager < HostSharedMemory > ,
464+ host_funcs : & Arc < Mutex < FunctionRegistry > > ,
466465 #[ cfg( gdb) ] dbg_mem_access_hdl : Arc < Mutex < SandboxMemoryManager < HostSharedMemory > > > ,
467466 ) -> Result < ( ) > {
468467 // Reset general purpose registers, then set RIP and RSP
@@ -481,6 +480,8 @@ impl Hypervisor for HypervWindowsDriver {
481480 VirtualCPU :: run (
482481 self . as_mut_hypervisor ( ) ,
483482 interrupt_handle,
483+ mem_mgr,
484+ host_funcs,
484485 #[ cfg( gdb) ]
485486 dbg_mem_access_hdl,
486487 )
@@ -493,6 +494,8 @@ impl Hypervisor for HypervWindowsDriver {
493494 data : Vec < u8 > ,
494495 rip : u64 ,
495496 instruction_length : u64 ,
497+ mem_mgr : & mut SandboxMemoryManager < HostSharedMemory > ,
498+ host_funcs : & Arc < Mutex < FunctionRegistry > > ,
496499 ) -> Result < ( ) > {
497500 let mut padded = [ 0u8 ; 4 ] ;
498501 let copy_len = data. len ( ) . min ( 4 ) ;
@@ -501,37 +504,12 @@ impl Hypervisor for HypervWindowsDriver {
501504
502505 #[ cfg( feature = "mem_profile" ) ]
503506 {
504- // We need to handle the borrow checker issue where we need both:
505- // - &mut SandboxMemoryManager (from self.mem_mgr.as_mut())
506- // - &mut dyn Hypervisor (from self)
507- // We'll use a temporary approach to extract the mem_mgr temporarily
508- let mem_mgr_option = self . mem_mgr . take ( ) ;
509- let mut mem_mgr = mem_mgr_option
510- . ok_or_else ( || new_error ! ( "mem_mgr should be initialized before handling IO" ) ) ?;
511- let host_funcs = self
512- . host_funcs
513- . as_ref ( )
514- . ok_or_else ( || new_error ! ( "host_funcs should be initialized before handling IO" ) ) ?
515- . clone ( ) ;
516-
517- handle_outb ( & mut mem_mgr, host_funcs, self , port, val) ?;
518-
519- // Put the mem_mgr back
520- self . mem_mgr = Some ( mem_mgr) ;
507+ let regs = self . regs ( ) ?;
508+ let trace_info = self . trace_info_mut ( ) ;
509+ handle_outb ( mem_mgr, host_funcs, port, val, & regs, trace_info) ?;
521510 }
522-
523511 #[ cfg( not( feature = "mem_profile" ) ) ]
524512 {
525- let mem_mgr = self
526- . mem_mgr
527- . as_mut ( )
528- . ok_or_else ( || new_error ! ( "mem_mgr should be initialized before handling IO" ) ) ?;
529- let host_funcs = self
530- . host_funcs
531- . as_ref ( )
532- . ok_or_else ( || new_error ! ( "host_funcs should be initialized before handling IO" ) ) ?
533- . clone ( ) ;
534-
535513 handle_outb ( mem_mgr, host_funcs, port, val) ?;
536514 }
537515
@@ -879,25 +857,6 @@ impl Hypervisor for HypervWindowsDriver {
879857 Ok ( ( ) )
880858 }
881859
882- fn check_stack_guard ( & self ) -> Result < bool > {
883- if let Some ( mgr) = self . mem_mgr . as_ref ( ) {
884- mgr. check_stack_guard ( )
885- } else {
886- Err ( new_error ! ( "Memory manager is not initialized" ) )
887- }
888- }
889-
890- #[ cfg( feature = "trace_guest" ) ]
891- fn handle_trace ( & mut self , tc : & mut crate :: sandbox:: trace:: TraceContext ) -> Result < ( ) > {
892- let regs = self . regs ( ) ?;
893- tc. handle_trace (
894- & regs,
895- self . mem_mgr . as_mut ( ) . ok_or_else ( || {
896- new_error ! ( "Memory manager is not initialized before handling trace" )
897- } ) ?,
898- )
899- }
900-
901860 #[ cfg( feature = "mem_profile" ) ]
902861 fn trace_info_mut ( & mut self ) -> & mut MemTraceInfo {
903862 & mut self . trace_info
0 commit comments