Skip to content

Commit a32e8b4

Browse files
committed
fix mem_mgr not initialized when tracing enabled
Signed-off-by: Doru Blânzeanu <dblnz@pm.me>
1 parent 75f1e88 commit a32e8b4

File tree

6 files changed

+39
-57
lines changed

6 files changed

+39
-57
lines changed

src/hyperlight_host/src/hypervisor/hyperv_linux.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -609,24 +609,11 @@ impl Hypervisor for HypervLinuxDriver {
609609
};
610610
self.vcpu_fd.set_regs(&regs)?;
611611

612-
// Extract mem_mgr to avoid borrowing conflicts
613-
let mem_mgr = self
614-
.mem_mgr
615-
.take()
616-
.ok_or_else(|| new_error!("mem_mgr should be initialized"))?;
617-
618-
let result = VirtualCPU::run(
612+
VirtualCPU::run(
619613
self.as_mut_hypervisor(),
620-
&mem_mgr,
621614
#[cfg(gdb)]
622615
dbg_mem_access_fn,
623-
);
624-
625-
// Put mem_mgr back
626-
self.mem_mgr = Some(mem_mgr);
627-
result?;
628-
629-
Ok(())
616+
)
630617
}
631618

632619
#[instrument(err(Debug), skip_all, parent = Span::current(), level = "Trace")]
@@ -664,7 +651,6 @@ impl Hypervisor for HypervLinuxDriver {
664651
fn dispatch_call_from_host(
665652
&mut self,
666653
dispatch_func_addr: RawPtr,
667-
mem_mgr: &MemMgrWrapper<HostSharedMemory>,
668654
#[cfg(gdb)] dbg_mem_access_fn: DbgMemAccessHandlerWrapper,
669655
) -> Result<()> {
670656
// Reset general purpose registers, then set RIP and RSP
@@ -688,7 +674,6 @@ impl Hypervisor for HypervLinuxDriver {
688674
// run
689675
VirtualCPU::run(
690676
self.as_mut_hypervisor(),
691-
mem_mgr,
692677
#[cfg(gdb)]
693678
dbg_mem_access_fn,
694679
)?;
@@ -1162,6 +1147,14 @@ impl Hypervisor for HypervLinuxDriver {
11621147
Ok(())
11631148
}
11641149

1150+
fn check_stack_guard(&self) -> Result<bool> {
1151+
if let Some(mgr) = self.mem_mgr.as_ref() {
1152+
mgr.check_stack_guard()
1153+
} else {
1154+
Err(new_error!("Memory manager is not initialized"))
1155+
}
1156+
}
1157+
11651158
#[cfg(feature = "trace_guest")]
11661159
fn read_trace_reg(&self, reg: TraceRegister) -> Result<u64> {
11671160
let mut assoc = [hv_register_assoc {

src/hyperlight_host/src/hypervisor/hyperv_windows.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -623,24 +623,11 @@ impl Hypervisor for HypervWindowsDriver {
623623
};
624624
self.processor.set_general_purpose_registers(&regs)?;
625625

626-
// Extract mem_mgr to avoid borrowing conflicts
627-
let mem_mgr = self
628-
.mem_mgr
629-
.take()
630-
.ok_or_else(|| new_error!("mem_mgr should be initialized"))?;
631-
632-
let result = VirtualCPU::run(
626+
VirtualCPU::run(
633627
self.as_mut_hypervisor(),
634-
&mem_mgr,
635628
#[cfg(gdb)]
636629
dbg_mem_access_hdl,
637-
);
638-
639-
// Put mem_mgr back
640-
self.mem_mgr = Some(mem_mgr);
641-
result?;
642-
643-
Ok(())
630+
)
644631
}
645632

646633
#[instrument(err(Debug), skip_all, parent = Span::current(), level = "Trace")]
@@ -662,7 +649,6 @@ impl Hypervisor for HypervWindowsDriver {
662649
fn dispatch_call_from_host(
663650
&mut self,
664651
dispatch_func_addr: RawPtr,
665-
mem_mgr: &MemMgrWrapper<HostSharedMemory>,
666652
#[cfg(gdb)] dbg_mem_access_hdl: DbgMemAccessHandlerWrapper,
667653
) -> Result<()> {
668654
// Reset general purpose registers, then set RIP and RSP
@@ -684,7 +670,6 @@ impl Hypervisor for HypervWindowsDriver {
684670

685671
VirtualCPU::run(
686672
self.as_mut_hypervisor(),
687-
mem_mgr,
688673
#[cfg(gdb)]
689674
dbg_mem_access_hdl,
690675
)?;
@@ -1094,6 +1079,14 @@ impl Hypervisor for HypervWindowsDriver {
10941079
Ok(())
10951080
}
10961081

1082+
fn check_stack_guard(&self) -> Result<bool> {
1083+
if let Some(mgr) = self.mem_mgr.as_ref() {
1084+
mgr.check_stack_guard()
1085+
} else {
1086+
Err(new_error!("Memory manager is not initialized"))
1087+
}
1088+
}
1089+
10971090
#[cfg(feature = "trace_guest")]
10981091
fn read_trace_reg(&self, reg: TraceRegister) -> Result<u64> {
10991092
let regs = self.processor.get_regs()?;

src/hyperlight_host/src/hypervisor/kvm.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -492,24 +492,11 @@ impl Hypervisor for KVMDriver {
492492
};
493493
self.vcpu_fd.set_regs(&regs)?;
494494

495-
// Extract mem_mgr to avoid borrowing conflicts
496-
let mem_mgr = self
497-
.mem_mgr
498-
.take()
499-
.ok_or_else(|| new_error!("mem_mgr should be initialized"))?;
500-
501-
let result = VirtualCPU::run(
495+
VirtualCPU::run(
502496
self.as_mut_hypervisor(),
503-
&mem_mgr,
504497
#[cfg(gdb)]
505498
dbg_mem_access_fn,
506-
);
507-
508-
// Put mem_mgr back
509-
self.mem_mgr = Some(mem_mgr);
510-
result?;
511-
512-
Ok(())
499+
)
513500
}
514501

515502
#[instrument(err(Debug), skip_all, parent = Span::current(), level = "Trace")]
@@ -555,7 +542,6 @@ impl Hypervisor for KVMDriver {
555542
fn dispatch_call_from_host(
556543
&mut self,
557544
dispatch_func_addr: RawPtr,
558-
mem_mgr: &MemMgrWrapper<HostSharedMemory>,
559545
#[cfg(gdb)] dbg_mem_access_fn: DbgMemAccessHandlerWrapper,
560546
) -> Result<()> {
561547
// Reset general purpose registers, then set RIP and RSP
@@ -578,7 +564,6 @@ impl Hypervisor for KVMDriver {
578564
// run
579565
VirtualCPU::run(
580566
self.as_mut_hypervisor(),
581-
mem_mgr,
582567
#[cfg(gdb)]
583568
dbg_mem_access_fn,
584569
)?;
@@ -1012,6 +997,14 @@ impl Hypervisor for KVMDriver {
1012997
Ok(())
1013998
}
1014999

1000+
fn check_stack_guard(&self) -> Result<bool> {
1001+
if let Some(mgr) = self.mem_mgr.as_ref() {
1002+
mgr.check_stack_guard()
1003+
} else {
1004+
Err(new_error!("Memory manager is not initialized"))
1005+
}
1006+
}
1007+
10151008
#[cfg(feature = "trace_guest")]
10161009
fn read_trace_reg(&self, reg: TraceRegister) -> Result<u64> {
10171010
let regs = self.vcpu_fd.get_regs()?;

src/hyperlight_host/src/hypervisor/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ pub(crate) trait Hypervisor: Debug + Send {
170170
fn dispatch_call_from_host(
171171
&mut self,
172172
dispatch_func_addr: RawPtr,
173-
mem_mgr: &MemMgrWrapper<HostSharedMemory>,
174173
#[cfg(gdb)] dbg_mem_access_fn: DbgMemAccessHandlerWrapper,
175174
) -> Result<()>;
176175

@@ -269,6 +268,9 @@ pub(crate) trait Hypervisor: Debug + Send {
269268
unimplemented!()
270269
}
271270

271+
/// Check stack guard to see if the stack is still valid
272+
fn check_stack_guard(&self) -> Result<bool>;
273+
272274
/// Read a register for trace/unwind purposes
273275
#[cfg(feature = "trace_guest")]
274276
fn read_trace_reg(&self, reg: TraceRegister) -> Result<u64>;
@@ -289,7 +291,6 @@ impl VirtualCPU {
289291
#[instrument(err(Debug), skip_all, parent = Span::current(), level = "Trace")]
290292
pub(crate) fn run(
291293
hv: &mut dyn Hypervisor,
292-
mem_mgr: &MemMgrWrapper<HostSharedMemory>,
293294
#[cfg(gdb)] dbg_mem_access_fn: Arc<Mutex<dyn DbgMemAccessHandlerCaller>>,
294295
) -> Result<()> {
295296
loop {
@@ -311,7 +312,7 @@ impl VirtualCPU {
311312
#[cfg(crashdump)]
312313
crashdump::generate_crashdump(hv)?;
313314

314-
handle_mem_access(mem_mgr)?;
315+
handle_mem_access(hv)?;
315316

316317
log_then_return!("MMIO access address {:#x}", addr);
317318
}

src/hyperlight_host/src/sandbox/initialized_multi_use.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,6 @@ impl MultiUseSandbox {
230230

231231
self.vm.dispatch_call_from_host(
232232
self.dispatch_ptr.clone(),
233-
&self.mem_mgr,
234233
#[cfg(gdb)]
235234
self.dbg_mem_access_fn.clone(),
236235
)?;

src/hyperlight_host/src/sandbox/mem_access.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,19 @@ use std::sync::{Arc, Mutex};
1919

2020
use tracing::{Span, instrument};
2121

22+
#[cfg(gdb)]
2223
use super::mem_mgr::MemMgrWrapper;
2324
use crate::error::HyperlightError::StackOverflow;
25+
use crate::hypervisor::Hypervisor;
2426
#[cfg(gdb)]
2527
use crate::hypervisor::handlers::{DbgMemAccessHandlerCaller, DbgMemAccessHandlerWrapper};
28+
#[cfg(gdb)]
2629
use crate::mem::shared_mem::HostSharedMemory;
2730
use crate::{Result, log_then_return};
2831

2932
#[instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace")]
30-
pub(crate) fn handle_mem_access(wrapper: &MemMgrWrapper<HostSharedMemory>) -> Result<()> {
31-
if !wrapper.check_stack_guard()? {
33+
pub(crate) fn handle_mem_access(hv: &dyn Hypervisor) -> Result<()> {
34+
if !hv.check_stack_guard()? {
3235
log_then_return!(StackOverflow());
3336
}
3437

0 commit comments

Comments
 (0)