Skip to content

Commit 1d620ce

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 5e406fd commit 1d620ce

File tree

5 files changed

+43
-8
lines changed

5 files changed

+43
-8
lines changed

src/hyperlight_host/src/hypervisor/hyperlight_vm.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -623,13 +623,13 @@ impl HyperlightVm {
623623
{
624624
Ok(VmExit::Cancelled())
625625
} else {
626-
#[cfg(feature = "trace_guest")]
627-
tc.setup_guest_trace(Span::current().context());
628-
629626
// ==== KILL() TIMING POINT 3: Before calling run() ====
630627
// If kill() is called and ran to completion BEFORE this line executes:
631628
// - Will still do a VM entry, but signals will be sent until VM exits
632-
let result = self.vm.run_vcpu();
629+
let result = self.vm.run_vcpu(
630+
#[cfg(feature = "trace_guest")]
631+
&mut tc,
632+
);
633633

634634
// End current host trace by closing the current span that captures traces
635635
// 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: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@ use std::fmt::Debug;
1818
use std::sync::OnceLock;
1919

2020
use tracing::{Span, instrument};
21+
#[cfg(feature = "trace_guest")]
22+
use tracing_opentelemetry::OpenTelemetrySpanExt;
2123

2224
#[cfg(gdb)]
2325
use crate::hypervisor::gdb::DebugError;
2426
use crate::hypervisor::regs::{
2527
CommonDebugRegs, CommonFpu, CommonRegisters, CommonSpecialRegisters,
2628
};
2729
use crate::mem::memory_region::MemoryRegion;
30+
#[cfg(feature = "trace_guest")]
31+
use crate::sandbox::trace::TraceContext as SandboxTraceContext;
2832

2933
/// KVM (Kernel-based Virtual Machine) functionality (linux)
3034
#[cfg(kvm)]
@@ -287,7 +291,10 @@ pub(crate) trait VirtualMachine: Debug + Send {
287291

288292
/// Runs the vCPU until it exits.
289293
/// 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>;
294+
fn run_vcpu(
295+
&mut self,
296+
#[cfg(feature = "trace_guest")] tc: &mut SandboxTraceContext,
297+
) -> std::result::Result<VmExit, RunVcpuError>;
291298

292299
/// Get regs
293300
#[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: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
use std::os::raw::c_void;
1818

1919
use hyperlight_common::mem::PAGE_SIZE_USIZE;
20+
#[cfg(feature = "trace_guest")]
21+
use tracing_opentelemetry::OpenTelemetrySpanExt;
2022
use windows::Win32::Foundation::{FreeLibrary, HANDLE};
2123
use windows::Win32::System::Hypervisor::*;
2224
use windows::Win32::System::LibraryLoader::*;
@@ -38,6 +40,8 @@ use crate::hypervisor::virtual_machine::{
3840
};
3941
use crate::hypervisor::wrappers::HandleWrapper;
4042
use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
43+
#[cfg(feature = "trace_guest")]
44+
use crate::sandbox::trace::TraceContext as SandboxTraceContext;
4145

4246
#[allow(dead_code)] // Will be used for runtime hypervisor detection
4347
pub(crate) fn is_hypervisor_present() -> bool {
@@ -239,7 +243,12 @@ impl VirtualMachine for WhpVm {
239243
}
240244

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

245254
unsafe {

0 commit comments

Comments
 (0)