Skip to content

Commit 9c14144

Browse files
committed
[trace-host] remove TraceRegister and use X86_64Regs instead
Signed-off-by: Doru Blânzeanu <[email protected]>
1 parent 7084845 commit 9c14144

File tree

11 files changed

+178
-121
lines changed

11 files changed

+178
-121
lines changed
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/*
2+
Copyright 2025 The Hyperlight Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
#[cfg(mshv2)]
18+
extern crate mshv_bindings2 as mshv_bindings;
19+
#[cfg(mshv3)]
20+
extern crate mshv_bindings3 as mshv_bindings;
21+
22+
#[cfg(kvm)]
23+
use kvm_bindings::kvm_regs;
24+
#[cfg(any(mshv2, mshv3))]
25+
use mshv_bindings::StandardRegisters;
26+
27+
/// Struct that contains the x86_64 core registers
28+
#[allow(dead_code)]
29+
#[derive(Debug, Default)]
30+
pub(crate) struct X86_64Regs {
31+
pub(crate) rax: u64,
32+
pub(crate) rbx: u64,
33+
pub(crate) rcx: u64,
34+
pub(crate) rdx: u64,
35+
pub(crate) rsi: u64,
36+
pub(crate) rdi: u64,
37+
pub(crate) rbp: u64,
38+
pub(crate) rsp: u64,
39+
pub(crate) r8: u64,
40+
pub(crate) r9: u64,
41+
pub(crate) r10: u64,
42+
pub(crate) r11: u64,
43+
pub(crate) r12: u64,
44+
pub(crate) r13: u64,
45+
pub(crate) r14: u64,
46+
pub(crate) r15: u64,
47+
pub(crate) rip: u64,
48+
pub(crate) rflags: u64,
49+
}
50+
51+
#[cfg(kvm)]
52+
impl From<kvm_regs> for X86_64Regs {
53+
#[inline(always)]
54+
fn from(regs: kvm_regs) -> Self {
55+
X86_64Regs {
56+
rax: regs.rax,
57+
rbx: regs.rbx,
58+
rcx: regs.rcx,
59+
rdx: regs.rdx,
60+
rdi: regs.rdi,
61+
rsi: regs.rsi,
62+
rsp: regs.rsp,
63+
rbp: regs.rbp,
64+
r8: regs.r8,
65+
r9: regs.r9,
66+
r10: regs.r10,
67+
r11: regs.r11,
68+
r12: regs.r12,
69+
r13: regs.r13,
70+
r14: regs.r14,
71+
r15: regs.r15,
72+
rip: regs.rip,
73+
rflags: regs.rflags,
74+
}
75+
}
76+
}
77+
78+
#[cfg(mshv)]
79+
impl From<StandardRegisters> for X86_64Regs {
80+
#[inline(always)]
81+
fn from(regs: StandardRegisters) -> Self {
82+
X86_64Regs {
83+
rax: regs.rax,
84+
rbx: regs.rbx,
85+
rcx: regs.rcx,
86+
rdx: regs.rdx,
87+
rdi: regs.rdi,
88+
rsi: regs.rsi,
89+
rsp: regs.rsp,
90+
rbp: regs.rbp,
91+
r8: regs.r8,
92+
r9: regs.r9,
93+
r10: regs.r10,
94+
r11: regs.r11,
95+
r12: regs.r12,
96+
r13: regs.r13,
97+
r14: regs.r14,
98+
r15: regs.r15,
99+
rip: regs.rip,
100+
rflags: regs.rflags,
101+
}
102+
}
103+
}
104+
105+
#[cfg(target_os = "windows")]
106+
impl From<WHvGeneralRegisters> for X86_64Regs {
107+
#[inline(always)]
108+
fn from(regs: WHvGeneralRegisters) -> Self {
109+
X86_64Regs {
110+
rax: regs.rax,
111+
rbx: regs.rbx,
112+
rcx: regs.rcx,
113+
rdx: regs.rdx,
114+
rdi: regs.rdi,
115+
rsi: regs.rsi,
116+
rsp: regs.rsp,
117+
rbp: regs.rbp,
118+
r8: regs.r8,
119+
r9: regs.r9,
120+
r10: regs.r10,
121+
r11: regs.r11,
122+
r12: regs.r12,
123+
r13: regs.r13,
124+
r14: regs.r14,
125+
r15: regs.r15,
126+
rip: regs.rip,
127+
rflags: regs.rflags,
128+
}
129+
}
130+
}

src/hyperlight_host/src/hypervisor/gdb/hyperv_debug.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use std::collections::HashMap;
1919
use windows::Win32::System::Hypervisor::WHV_VP_EXCEPTION_CONTEXT;
2020

2121
use super::arch::{MAX_NO_OF_HW_BP, vcpu_stop_reason};
22-
use super::{GuestDebug, SW_BP_SIZE, VcpuStopReason, X86_64Regs};
22+
use super::{GuestDebug, SW_BP_SIZE, VcpuStopReason};
23+
use crate::hypervisor::arch::X86_64Regs;
2324
use crate::hypervisor::windows_hypervisor_platform::VMProcessor;
2425
use crate::hypervisor::wrappers::{WHvDebugRegisters, WHvGeneralRegisters};
2526
use crate::{HyperlightError, Result, new_error};

src/hyperlight_host/src/hypervisor/gdb/kvm_debug.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ use kvm_bindings::{
2323
use kvm_ioctls::VcpuFd;
2424

2525
use super::arch::{MAX_NO_OF_HW_BP, SW_BP_SIZE, vcpu_stop_reason};
26-
use super::{GuestDebug, VcpuStopReason, X86_64Regs};
26+
use super::{GuestDebug, VcpuStopReason};
27+
use crate::hypervisor::arch::X86_64Regs;
2728
use crate::{HyperlightError, Result, new_error};
2829

2930
/// KVM Debug struct

src/hyperlight_host/src/hypervisor/gdb/mod.rs

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use thiserror::Error;
4646
use x86_64_target::HyperlightSandboxTarget;
4747

4848
use super::InterruptHandle;
49+
use crate::hypervisor::arch::X86_64Regs;
4950
use crate::mem::layout::SandboxMemoryLayout;
5051
use crate::mem::shared_mem::HostSharedMemory;
5152
use crate::sandbox::mem_mgr::MemMgrWrapper;
@@ -88,29 +89,6 @@ impl From<GdbTargetError> for TargetError<GdbTargetError> {
8889
}
8990
}
9091

91-
/// Struct that contains the x86_64 core registers
92-
#[derive(Debug, Default)]
93-
pub(crate) struct X86_64Regs {
94-
pub(crate) rax: u64,
95-
pub(crate) rbx: u64,
96-
pub(crate) rcx: u64,
97-
pub(crate) rdx: u64,
98-
pub(crate) rsi: u64,
99-
pub(crate) rdi: u64,
100-
pub(crate) rbp: u64,
101-
pub(crate) rsp: u64,
102-
pub(crate) r8: u64,
103-
pub(crate) r9: u64,
104-
pub(crate) r10: u64,
105-
pub(crate) r11: u64,
106-
pub(crate) r12: u64,
107-
pub(crate) r13: u64,
108-
pub(crate) r14: u64,
109-
pub(crate) r15: u64,
110-
pub(crate) rip: u64,
111-
pub(crate) rflags: u64,
112-
}
113-
11492
/// Defines the possible reasons for which a vCPU can be stopped when debugging
11593
#[derive(Debug)]
11694
pub enum VcpuStopReason {

src/hyperlight_host/src/hypervisor/gdb/mshv_debug.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ use mshv_bindings::{
3333
use mshv_ioctls::VcpuFd;
3434

3535
use super::arch::{MAX_NO_OF_HW_BP, SW_BP_SIZE, vcpu_stop_reason};
36-
use super::{GuestDebug, VcpuStopReason, X86_64Regs};
36+
use super::{GuestDebug, VcpuStopReason};
37+
use crate::hypervisor::arch::X86_64Regs;
3738
use crate::{HyperlightError, Result, new_error};
3839

3940
#[derive(Debug, Default)]

src/hyperlight_host/src/hypervisor/gdb/x86_64_target.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ use gdbstub::target::ext::section_offsets::{Offsets, SectionOffsets};
3131
use gdbstub::target::{Target, TargetError, TargetResult};
3232
use gdbstub_arch::x86::X86_64_SSE as GdbTargetArch;
3333

34-
use super::{DebugCommChannel, DebugMsg, DebugResponse, GdbTargetError, X86_64Regs};
34+
use super::{DebugCommChannel, DebugMsg, DebugResponse, GdbTargetError};
3535
use crate::hypervisor::InterruptHandle;
36+
use crate::hypervisor::arch::X86_64Regs;
3637

3738
/// Gdbstub target used by the gdbstub crate to provide GDB protocol implementation
3839
pub(crate) struct HyperlightSandboxTarget {

src/hyperlight_host/src/hypervisor/hyperv_linux.rs

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,11 @@ use mshv_bindings::{
4848
hv_partition_property_code_HV_PARTITION_PROPERTY_SYNTHETIC_PROC_FEATURES,
4949
hv_partition_synthetic_processor_features,
5050
};
51-
#[cfg(feature = "trace_guest")]
52-
use mshv_bindings::{
53-
hv_register_name, hv_register_name_HV_X64_REGISTER_RAX, hv_register_name_HV_X64_REGISTER_RBP,
54-
hv_register_name_HV_X64_REGISTER_RCX, hv_register_name_HV_X64_REGISTER_RSP,
55-
};
5651
use mshv_ioctls::{Mshv, VcpuFd, VmFd};
5752
use tracing::{Span, instrument};
5853
#[cfg(crashdump)]
5954
use {super::crashdump, std::path::Path};
6055

61-
#[cfg(feature = "trace_guest")]
62-
use super::TraceRegister;
6356
use super::fpu::{FP_CONTROL_WORD_DEFAULT, FP_TAG_WORD_DEFAULT, MXCSR_DEFAULT};
6457
#[cfg(gdb)]
6558
use super::gdb::{
@@ -73,6 +66,8 @@ use super::{
7366
use super::{HyperlightExit, Hypervisor, InterruptHandle, LinuxInterruptHandle, VirtualCPU};
7467
#[cfg(gdb)]
7568
use crate::HyperlightError;
69+
#[cfg(feature = "trace_guest")]
70+
use crate::hypervisor::arch::X86_64Regs;
7671
use crate::hypervisor::get_memory_access_violation;
7772
use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
7873
use crate::mem::ptr::{GuestPtr, RawPtr};
@@ -93,7 +88,8 @@ mod debug {
9388

9489
use super::mshv_bindings::hv_x64_exception_intercept_message;
9590
use super::{HypervLinuxDriver, *};
96-
use crate::hypervisor::gdb::{DebugMsg, DebugResponse, VcpuStopReason, X86_64Regs};
91+
use crate::hypervisor::arch::X86_64Regs;
92+
use crate::hypervisor::gdb::{DebugMsg, DebugResponse, VcpuStopReason};
9793
use crate::mem::shared_mem::HostSharedMemory;
9894
use crate::sandbox::mem_mgr::MemMgrWrapper;
9995
use crate::{Result, new_error};
@@ -564,19 +560,6 @@ impl Debug for HypervLinuxDriver {
564560
}
565561
}
566562

567-
#[cfg(feature = "trace_guest")]
568-
impl From<TraceRegister> for hv_register_name {
569-
fn from(r: TraceRegister) -> Self {
570-
match r {
571-
TraceRegister::RAX => hv_register_name_HV_X64_REGISTER_RAX,
572-
TraceRegister::RCX => hv_register_name_HV_X64_REGISTER_RCX,
573-
TraceRegister::RIP => hv_register_name_HV_X64_REGISTER_RIP,
574-
TraceRegister::RSP => hv_register_name_HV_X64_REGISTER_RSP,
575-
TraceRegister::RBP => hv_register_name_HV_X64_REGISTER_RBP,
576-
}
577-
}
578-
}
579-
580563
impl Hypervisor for HypervLinuxDriver {
581564
#[instrument(err(Debug), skip_all, parent = Span::current(), level = "Trace")]
582565
fn initialise(
@@ -1161,14 +1144,8 @@ impl Hypervisor for HypervLinuxDriver {
11611144
}
11621145

11631146
#[cfg(feature = "trace_guest")]
1164-
fn read_trace_reg(&self, reg: TraceRegister) -> Result<u64> {
1165-
let mut assoc = [hv_register_assoc {
1166-
name: reg.into(),
1167-
..Default::default()
1168-
}];
1169-
self.vcpu_fd.get_reg(&mut assoc)?;
1170-
// safety: all registers that we currently support are 64-bit
1171-
unsafe { Ok(assoc[0].value.reg64) }
1147+
fn read_regs(&self) -> Result<X86_64Regs> {
1148+
Ok(X86_64Regs::from(self.vcpu_fd.get_regs()?))
11721149
}
11731150

11741151
#[cfg(feature = "trace_guest")]

src/hyperlight_host/src/hypervisor/hyperv_windows.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ use {
4141
crate::HyperlightError,
4242
};
4343

44-
#[cfg(feature = "trace_guest")]
45-
use super::TraceRegister;
4644
use super::fpu::{FP_TAG_WORD_DEFAULT, MXCSR_DEFAULT};
4745
use super::surrogate_process::SurrogateProcess;
4846
use super::surrogate_process_manager::*;
@@ -54,6 +52,8 @@ use super::{
5452
EFER_LMA, EFER_LME, EFER_NX, EFER_SCE,
5553
};
5654
use super::{HyperlightExit, Hypervisor, InterruptHandle, VirtualCPU};
55+
#[cfg(feature = "trace_guest")]
56+
use crate::hypervisor::arch::X86_64Regs;
5757
use crate::hypervisor::fpu::FP_CONTROL_WORD_DEFAULT;
5858
use crate::hypervisor::get_memory_access_violation;
5959
use crate::hypervisor::wrappers::WHvGeneralRegisters;
@@ -77,7 +77,8 @@ mod debug {
7777

7878
use super::{HypervWindowsDriver, *};
7979
use crate::Result;
80-
use crate::hypervisor::gdb::{DebugMsg, DebugResponse, VcpuStopReason, X86_64Regs};
80+
use crate::hypervisor::arch::X86_64Regs;
81+
use crate::hypervisor::gdb::{DebugMsg, DebugResponse, VcpuStopReason};
8182
use crate::mem::shared_mem::HostSharedMemory;
8283
use crate::sandbox::mem_mgr::MemMgrWrapper;
8384

@@ -1094,15 +1095,9 @@ impl Hypervisor for HypervWindowsDriver {
10941095
}
10951096

10961097
#[cfg(feature = "trace_guest")]
1097-
fn read_trace_reg(&self, reg: TraceRegister) -> Result<u64> {
1098+
fn read_trace_reg(&self) -> Result<X86_64Regs> {
10981099
let regs = self.processor.get_regs()?;
1099-
match reg {
1100-
TraceRegister::RAX => Ok(regs.rax),
1101-
TraceRegister::RCX => Ok(regs.rcx),
1102-
TraceRegister::RIP => Ok(regs.rip),
1103-
TraceRegister::RSP => Ok(regs.rsp),
1104-
TraceRegister::RBP => Ok(regs.rbp),
1105-
}
1100+
Ok(X86_64Regs::from(regs))
11061101
}
11071102

11081103
#[cfg(feature = "trace_guest")]

src/hyperlight_host/src/hypervisor/kvm.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ use tracing::{Span, instrument};
2727
#[cfg(crashdump)]
2828
use {super::crashdump, std::path::Path};
2929

30-
#[cfg(feature = "trace_guest")]
31-
use super::TraceRegister;
3230
use super::fpu::{FP_CONTROL_WORD_DEFAULT, FP_TAG_WORD_DEFAULT, MXCSR_DEFAULT};
3331
#[cfg(gdb)]
3432
use super::gdb::{DebugCommChannel, DebugMsg, DebugResponse, GuestDebug, KvmDebug, VcpuStopReason};
@@ -40,6 +38,8 @@ use super::{
4038
use super::{HyperlightExit, Hypervisor, InterruptHandle, LinuxInterruptHandle, VirtualCPU};
4139
#[cfg(gdb)]
4240
use crate::HyperlightError;
41+
#[cfg(feature = "trace_guest")]
42+
use crate::hypervisor::arch::X86_64Regs;
4343
use crate::hypervisor::get_memory_access_violation;
4444
use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
4545
use crate::mem::ptr::{GuestPtr, RawPtr};
@@ -83,9 +83,8 @@ mod debug {
8383
use kvm_bindings::kvm_debug_exit_arch;
8484

8585
use super::KVMDriver;
86-
use crate::hypervisor::gdb::{
87-
DebugMsg, DebugResponse, GuestDebug, KvmDebug, VcpuStopReason, X86_64Regs,
88-
};
86+
use crate::hypervisor::arch::X86_64Regs;
87+
use crate::hypervisor::gdb::{DebugMsg, DebugResponse, GuestDebug, KvmDebug, VcpuStopReason};
8988
use crate::mem::shared_mem::HostSharedMemory;
9089
use crate::sandbox::mem_mgr::MemMgrWrapper;
9190
use crate::{Result, new_error};
@@ -1038,15 +1037,8 @@ impl Hypervisor for KVMDriver {
10381037
}
10391038

10401039
#[cfg(feature = "trace_guest")]
1041-
fn read_trace_reg(&self, reg: TraceRegister) -> Result<u64> {
1042-
let regs = self.vcpu_fd.get_regs()?;
1043-
Ok(match reg {
1044-
TraceRegister::RAX => regs.rax,
1045-
TraceRegister::RCX => regs.rcx,
1046-
TraceRegister::RIP => regs.rip,
1047-
TraceRegister::RSP => regs.rsp,
1048-
TraceRegister::RBP => regs.rbp,
1049-
})
1040+
fn read_regs(&self) -> Result<X86_64Regs> {
1041+
Ok(X86_64Regs::from(self.vcpu_fd.get_regs()?))
10501042
}
10511043

10521044
#[cfg(feature = "trace_guest")]

0 commit comments

Comments
 (0)