Skip to content

Commit 3ec2a45

Browse files
committed
Closes #1076: Code refactor to set trace context in run_vcpu function.
Signed-off-by: Shailesh Vashishth <shavashishth@gmail.com>
1 parent 713fccb commit 3ec2a45

5 files changed

Lines changed: 42 additions & 10 deletions

File tree

src/hyperlight_host/src/hypervisor/hyperlight_vm.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ use std::sync::{Arc, Mutex};
2727

2828
use log::LevelFilter;
2929
use tracing::{Span, instrument};
30-
#[cfg(feature = "trace_guest")]
31-
use tracing_opentelemetry::OpenTelemetrySpanExt;
3230

3331
#[cfg(gdb)]
3432
use super::gdb::arch::VcpuStopReasonError;
@@ -623,13 +621,13 @@ impl HyperlightVm {
623621
{
624622
Ok(VmExit::Cancelled())
625623
} else {
626-
#[cfg(feature = "trace_guest")]
627-
tc.setup_guest_trace(Span::current().context());
628-
629624
// ==== KILL() TIMING POINT 3: Before calling run() ====
630625
// If kill() is called and ran to completion BEFORE this line executes:
631626
// - Will still do a VM entry, but signals will be sent until VM exits
632-
let result = self.vm.run_vcpu();
627+
let result = self.vm.run_vcpu(
628+
#[cfg(feature = "trace_guest")]
629+
&mut tc,
630+
);
633631

634632
// End current host trace by closing the current span that captures traces
635633
// happening when a guest exits and re-enters.

src/hyperlight_host/src/hypervisor/virtual_machine/kvm.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ use kvm_bindings::{kvm_debugregs, kvm_fpu, kvm_regs, kvm_sregs, kvm_userspace_me
2222
use kvm_ioctls::Cap::UserMemory;
2323
use kvm_ioctls::{Kvm, VcpuExit, VcpuFd, VmFd};
2424
use tracing::{Span, instrument};
25+
#[cfg(feature = "trace_guest")]
26+
use tracing_opentelemetry::OpenTelemetrySpanExt;
2527

2628
#[cfg(gdb)]
2729
use crate::hypervisor::gdb::{DebugError, DebuggableVm};
@@ -33,6 +35,8 @@ use crate::hypervisor::virtual_machine::{
3335
VmExit,
3436
};
3537
use crate::mem::memory_region::MemoryRegion;
38+
#[cfg(feature = "trace_guest")]
39+
use crate::sandbox::trace::TraceContext as SandboxTraceContext;
3640

3741
/// Return `true` if the KVM API is available, version 12, and has UserMemory capability, or `false` otherwise
3842
#[instrument(skip_all, parent = Span::current(), level = "Trace")]
@@ -117,7 +121,13 @@ impl VirtualMachine for KvmVm {
117121
.map_err(|e| UnmapMemoryError::Hypervisor(e.into()))
118122
}
119123

120-
fn run_vcpu(&mut self) -> std::result::Result<VmExit, RunVcpuError> {
124+
fn run_vcpu(
125+
&mut self,
126+
#[cfg(feature = "trace_guest")] tc: &mut SandboxTraceContext,
127+
) -> std::result::Result<VmExit, RunVcpuError> {
128+
#[cfg(feature = "trace_guest")]
129+
tc.setup_guest_trace(Span::current().context());
130+
121131
match self.vcpu_fd.run() {
122132
Ok(VcpuExit::Hlt) => Ok(VmExit::Halt()),
123133
Ok(VcpuExit::IoOut(port, data)) => Ok(VmExit::IoOut(port, data.to_vec())),

src/hyperlight_host/src/hypervisor/virtual_machine/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ use crate::hypervisor::regs::{
2525
CommonDebugRegs, CommonFpu, CommonRegisters, CommonSpecialRegisters,
2626
};
2727
use crate::mem::memory_region::MemoryRegion;
28+
#[cfg(feature = "trace_guest")]
29+
use crate::sandbox::trace::TraceContext as SandboxTraceContext;
2830

2931
/// KVM (Kernel-based Virtual Machine) functionality (linux)
3032
#[cfg(kvm)]
@@ -287,7 +289,10 @@ pub(crate) trait VirtualMachine: Debug + Send {
287289

288290
/// Runs the vCPU until it exits.
289291
/// Note: this function should not emit any traces or spans as it is called after guest span is setup
290-
fn run_vcpu(&mut self) -> std::result::Result<VmExit, RunVcpuError>;
292+
fn run_vcpu(
293+
&mut self,
294+
#[cfg(feature = "trace_guest")] tc: &mut SandboxTraceContext,
295+
) -> std::result::Result<VmExit, RunVcpuError>;
291296

292297
/// Get regs
293298
#[allow(dead_code)]

src/hyperlight_host/src/hypervisor/virtual_machine/mshv.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ use mshv_bindings::{
3030
};
3131
use mshv_ioctls::{Mshv, VcpuFd, VmFd};
3232
use tracing::{Span, instrument};
33+
#[cfg(feature = "trace_guest")]
34+
use tracing_opentelemetry::OpenTelemetrySpanExt;
3335

3436
#[cfg(gdb)]
3537
use crate::hypervisor::gdb::{DebugError, DebuggableVm};
@@ -41,6 +43,8 @@ use crate::hypervisor::virtual_machine::{
4143
VmExit,
4244
};
4345
use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
46+
#[cfg(feature = "trace_guest")]
47+
use crate::sandbox::trace::TraceContext as SandboxTraceContext;
4448

4549
/// Determine whether the HyperV for Linux hypervisor API is present
4650
/// and functional.
@@ -121,7 +125,12 @@ impl VirtualMachine for MshvVm {
121125
.map_err(|e| UnmapMemoryError::Hypervisor(e.into()))
122126
}
123127

124-
fn run_vcpu(&mut self) -> std::result::Result<VmExit, RunVcpuError> {
128+
fn run_vcpu(
129+
&mut self,
130+
#[cfg(feature = "trace_guest")] tc: &mut SandboxTraceContext,
131+
) -> std::result::Result<VmExit, RunVcpuError> {
132+
#[cfg(feature = "trace_guest")]
133+
tc.setup_guest_trace(Span::current().context());
125134
const HALT_MESSAGE: hv_message_type = hv_message_type_HVMSG_X64_HALT;
126135
const IO_PORT_INTERCEPT_MESSAGE: hv_message_type =
127136
hv_message_type_HVMSG_X64_IO_PORT_INTERCEPT;

src/hyperlight_host/src/hypervisor/virtual_machine/whp.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ limitations under the License.
1717
use std::os::raw::c_void;
1818

1919
use hyperlight_common::mem::PAGE_SIZE_USIZE;
20+
use tracing::Span;
21+
#[cfg(feature = "trace_guest")]
22+
use tracing_opentelemetry::OpenTelemetrySpanExt;
2023
use windows::Win32::Foundation::{FreeLibrary, HANDLE};
2124
use windows::Win32::System::Hypervisor::*;
2225
use windows::Win32::System::LibraryLoader::*;
@@ -38,6 +41,8 @@ use crate::hypervisor::virtual_machine::{
3841
};
3942
use crate::hypervisor::wrappers::HandleWrapper;
4043
use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
44+
#[cfg(feature = "trace_guest")]
45+
use crate::sandbox::trace::TraceContext as SandboxTraceContext;
4146

4247
#[allow(dead_code)] // Will be used for runtime hypervisor detection
4348
pub(crate) fn is_hypervisor_present() -> bool {
@@ -239,7 +244,12 @@ impl VirtualMachine for WhpVm {
239244
}
240245

241246
#[expect(non_upper_case_globals, reason = "Windows API constant are lower case")]
242-
fn run_vcpu(&mut self) -> std::result::Result<VmExit, RunVcpuError> {
247+
fn run_vcpu(
248+
&mut self,
249+
#[cfg(feature = "trace_guest")] tc: &mut SandboxTraceContext,
250+
) -> std::result::Result<VmExit, RunVcpuError> {
251+
#[cfg(feature = "trace_guest")]
252+
tc.setup_guest_trace(Span::current().context());
243253
let mut exit_context: WHV_RUN_VP_EXIT_CONTEXT = Default::default();
244254

245255
unsafe {

0 commit comments

Comments
 (0)