@@ -22,6 +22,8 @@ use std::string::String;
2222use hyperlight_common:: mem:: PAGE_SIZE_USIZE ;
2323use tracing:: { instrument, Span } ;
2424use windows:: Win32 :: Foundation :: HANDLE ;
25+ #[ cfg( feature = "trace_guest" ) ]
26+ use windows:: Win32 :: System :: Hypervisor :: WHV_REGISTER_NAME ;
2527use windows:: Win32 :: System :: Hypervisor :: {
2628 WHvX64RegisterCr0 , WHvX64RegisterCr3 , WHvX64RegisterCr4 , WHvX64RegisterCs , WHvX64RegisterEfer ,
2729 WHV_MEMORY_ACCESS_TYPE , WHV_PARTITION_HANDLE , WHV_REGISTER_VALUE , WHV_RUN_VP_EXIT_CONTEXT ,
@@ -34,6 +36,8 @@ use super::surrogate_process::SurrogateProcess;
3436use super :: surrogate_process_manager:: * ;
3537use super :: windows_hypervisor_platform:: { VMPartition , VMProcessor } ;
3638use super :: wrappers:: WHvFPURegisters ;
39+ #[ cfg( feature = "unwind_guest" ) ]
40+ use super :: TraceRegister ;
3741use super :: {
3842 windows_hypervisor_platform as whp, HyperlightExit , Hypervisor , VirtualCPU , CR0_AM , CR0_ET ,
3943 CR0_MP , CR0_NE , CR0_PE , CR0_PG , CR0_WP , CR4_OSFXSR , CR4_OSXMMEXCPT , CR4_PAE , EFER_LMA ,
@@ -303,6 +307,19 @@ impl Debug for HypervWindowsDriver {
303307 }
304308}
305309
310+ #[ cfg( feature = "trace_guest" ) ]
311+ impl From < TraceRegister > for WHV_REGISTER_NAME {
312+ fn from ( r : TraceRegister ) -> Self {
313+ match r {
314+ TraceRegister :: RAX => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRax ,
315+ TraceRegister :: RCX => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRcx ,
316+ TraceRegister :: RIP => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRip ,
317+ TraceRegister :: RSP => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRsp ,
318+ TraceRegister :: RBP => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRbp ,
319+ }
320+ }
321+ }
322+
306323impl Hypervisor for HypervWindowsDriver {
307324 #[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
308325 fn initialise (
@@ -547,6 +564,23 @@ impl Hypervisor for HypervWindowsDriver {
547564 self . processor . get_partition_hdl ( )
548565 }
549566
567+ #[ cfg( feature = "unwind_guest" ) ]
568+ fn read_trace_reg ( & self , reg : TraceRegister ) -> Result < u64 > {
569+ let register_names = [ WHV_REGISTER_NAME :: from ( reg) ] ;
570+ let mut register_values: [ WHV_REGISTER_VALUE ; 1 ] = Default :: default ( ) ;
571+ unsafe {
572+ WHvGetVirtualProcessorRegisters (
573+ self . get_partition_hdl ( ) ,
574+ 0 ,
575+ register_names. as_ptr ( ) ,
576+ register_names. len ( ) as u832 ,
577+ register_values. as_mut_ptr ( ) ,
578+ ) ;
579+ // safety: all registers that we currently support are 64-bit
580+ register_values[ 0 ] . Reg64
581+ }
582+ }
583+
550584 #[ instrument( skip_all, parent = Span :: current( ) , level = "Trace" ) ]
551585 fn as_mut_hypervisor ( & mut self ) -> & mut dyn Hypervisor {
552586 self as & mut dyn Hypervisor
0 commit comments