Skip to content

Commit 2b3f386

Browse files
authored
Deduplicate mem mgr and host functions from hv drivers (#1013)
* Remove mem_mgr and host_func from drivers struct Signed-off-by: Ludvig Liljenberg <[email protected]> * Remove Hypervisor::check_stack_guard and handle_trace Signed-off-by: Ludvig Liljenberg <[email protected]> * Cargo fmt Signed-off-by: Ludvig Liljenberg <[email protected]> * Dont pass hv to outb_handler Signed-off-by: Ludvig Liljenberg <[email protected]> --------- Signed-off-by: Ludvig Liljenberg <[email protected]>
1 parent 8b2c7f9 commit 2b3f386

File tree

9 files changed

+83
-209
lines changed

9 files changed

+83
-209
lines changed

src/hyperlight_host/src/hypervisor/hyperv_linux.rs

Lines changed: 13 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,6 @@ pub(crate) struct HypervLinuxDriver {
274274
orig_rsp: GuestPtr,
275275
entrypoint: u64,
276276
interrupt_handle: Arc<dyn InterruptHandleImpl>,
277-
mem_mgr: Option<SandboxMemoryManager<HostSharedMemory>>,
278-
host_funcs: Option<Arc<Mutex<FunctionRegistry>>>,
279277

280278
sandbox_regions: Vec<MemoryRegion>, // Initially mapped regions when sandbox is created
281279
mmap_regions: Vec<MemoryRegion>, // Later mapped regions
@@ -405,8 +403,6 @@ impl HypervLinuxDriver {
405403
entrypoint: entrypoint_ptr.absolute()?,
406404
orig_rsp: rsp_ptr,
407405
interrupt_handle: interrupt_handle.clone(),
408-
mem_mgr: None,
409-
host_funcs: None,
410406
#[cfg(gdb)]
411407
debug,
412408
#[cfg(gdb)]
@@ -467,13 +463,11 @@ impl Hypervisor for HypervLinuxDriver {
467463
peb_addr: RawPtr,
468464
seed: u64,
469465
page_size: u32,
470-
mem_mgr: SandboxMemoryManager<HostSharedMemory>,
471-
host_funcs: Arc<Mutex<FunctionRegistry>>,
466+
mem_mgr: &mut SandboxMemoryManager<HostSharedMemory>,
467+
host_funcs: &Arc<Mutex<FunctionRegistry>>,
472468
max_guest_log_level: Option<LevelFilter>,
473469
#[cfg(gdb)] dbg_mem_access_fn: Arc<Mutex<SandboxMemoryManager<HostSharedMemory>>>,
474470
) -> Result<()> {
475-
self.mem_mgr = Some(mem_mgr);
476-
self.host_funcs = Some(host_funcs);
477471
self.page_size = page_size as usize;
478472

479473
let max_guest_log_level: u64 = match max_guest_log_level {
@@ -501,6 +495,8 @@ impl Hypervisor for HypervLinuxDriver {
501495
VirtualCPU::run(
502496
self.as_mut_hypervisor(),
503497
interrupt_handle,
498+
mem_mgr,
499+
host_funcs,
504500
#[cfg(gdb)]
505501
dbg_mem_access_fn,
506502
)
@@ -545,6 +541,8 @@ impl Hypervisor for HypervLinuxDriver {
545541
fn dispatch_call_from_host(
546542
&mut self,
547543
dispatch_func_addr: RawPtr,
544+
mem_mgr: &mut SandboxMemoryManager<HostSharedMemory>,
545+
host_funcs: &Arc<Mutex<FunctionRegistry>>,
548546
#[cfg(gdb)] dbg_mem_access_fn: Arc<Mutex<SandboxMemoryManager<HostSharedMemory>>>,
549547
) -> Result<()> {
550548
// Reset general purpose registers, then set RIP and RSP
@@ -565,6 +563,8 @@ impl Hypervisor for HypervLinuxDriver {
565563
VirtualCPU::run(
566564
self.as_mut_hypervisor(),
567565
interrupt_handle,
566+
mem_mgr,
567+
host_funcs,
568568
#[cfg(gdb)]
569569
dbg_mem_access_fn,
570570
)
@@ -577,6 +577,8 @@ impl Hypervisor for HypervLinuxDriver {
577577
data: Vec<u8>,
578578
rip: u64,
579579
instruction_length: u64,
580+
mem_mgr: &mut SandboxMemoryManager<HostSharedMemory>,
581+
host_funcs: &Arc<Mutex<FunctionRegistry>>,
580582
) -> Result<()> {
581583
let mut padded = [0u8; 4];
582584
let copy_len = data.len().min(4);
@@ -585,37 +587,12 @@ impl Hypervisor for HypervLinuxDriver {
585587

586588
#[cfg(feature = "mem_profile")]
587589
{
588-
// We need to handle the borrow checker issue where we need both:
589-
// - &mut SandboxMemoryManager (from self.mem_mgr)
590-
// - &mut dyn Hypervisor (from self)
591-
// We'll use a temporary approach to extract the mem_mgr temporarily
592-
let mem_mgr_option = self.mem_mgr.take();
593-
let mut mem_mgr = mem_mgr_option
594-
.ok_or_else(|| new_error!("mem_mgr should be initialized before handling IO"))?;
595-
let host_funcs = self
596-
.host_funcs
597-
.as_ref()
598-
.ok_or_else(|| new_error!("host_funcs should be initialized before handling IO"))?
599-
.clone();
600-
601-
handle_outb(&mut mem_mgr, host_funcs, self, port, val)?;
602-
603-
// Put the mem_mgr back
604-
self.mem_mgr = Some(mem_mgr);
590+
let regs = self.regs()?;
591+
let trace_info = self.trace_info_mut();
592+
handle_outb(mem_mgr, host_funcs, port, val, &regs, trace_info)?;
605593
}
606-
607594
#[cfg(not(feature = "mem_profile"))]
608595
{
609-
let mem_mgr = self
610-
.mem_mgr
611-
.as_mut()
612-
.ok_or_else(|| new_error!("mem_mgr should be initialized before handling IO"))?;
613-
let host_funcs = self
614-
.host_funcs
615-
.as_ref()
616-
.ok_or_else(|| new_error!("host_funcs should be initialized before handling IO"))?
617-
.clone();
618-
619596
handle_outb(mem_mgr, host_funcs, port, val)?;
620597
}
621598

@@ -985,25 +962,6 @@ impl Hypervisor for HypervLinuxDriver {
985962
Ok(())
986963
}
987964

988-
fn check_stack_guard(&self) -> Result<bool> {
989-
if let Some(mgr) = self.mem_mgr.as_ref() {
990-
mgr.check_stack_guard()
991-
} else {
992-
Err(new_error!("Memory manager is not initialized"))
993-
}
994-
}
995-
996-
#[cfg(feature = "trace_guest")]
997-
fn handle_trace(&mut self, tc: &mut crate::sandbox::trace::TraceContext) -> Result<()> {
998-
let regs = self.regs()?;
999-
tc.handle_trace(
1000-
&regs,
1001-
self.mem_mgr.as_mut().ok_or_else(|| {
1002-
new_error!("Memory manager is not initialized before handling trace")
1003-
})?,
1004-
)
1005-
}
1006-
1007965
#[cfg(feature = "mem_profile")]
1008966
fn trace_info_mut(&mut self) -> &mut MemTraceInfo {
1009967
&mut self.trace_info

src/hyperlight_host/src/hypervisor/hyperv_windows.rs

Lines changed: 16 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
4848
use crate::mem::mgr::SandboxMemoryManager;
4949
use crate::mem::ptr::{GuestPtr, RawPtr};
5050
use crate::mem::shared_mem::HostSharedMemory;
51+
#[cfg(gdb)]
52+
use crate::new_error;
5153
use crate::sandbox::host_funcs::FunctionRegistry;
5254
use crate::sandbox::outb::handle_outb;
5355
#[cfg(feature = "mem_profile")]
5456
use crate::sandbox::trace::MemTraceInfo;
5557
#[cfg(crashdump)]
5658
use 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)]
6062
mod 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

Comments
 (0)