@@ -22,6 +22,8 @@ use std::sync::atomic::{AtomicBool, Ordering};
2222
2323use log:: LevelFilter ;
2424use tracing:: { Span , instrument} ;
25+ #[ cfg( feature = "trace_guest" ) ]
26+ use windows:: Win32 :: System :: Hypervisor :: WHV_REGISTER_NAME ;
2527use windows:: Win32 :: System :: Hypervisor :: {
2628 WHV_MEMORY_ACCESS_TYPE , WHV_PARTITION_HANDLE , WHV_REGISTER_VALUE , WHV_RUN_VP_EXIT_CONTEXT ,
2729 WHV_RUN_VP_EXIT_REASON , WHV_X64_SEGMENT_REGISTER , WHV_X64_SEGMENT_REGISTER_0 ,
4143 std:: sync:: Mutex ,
4244} ;
4345
46+ #[ cfg( feature = "unwind_guest" ) ]
47+ use super :: TraceRegister ;
4448use super :: fpu:: { FP_TAG_WORD_DEFAULT , MXCSR_DEFAULT } ;
4549use super :: handlers:: { MemAccessHandlerWrapper , OutBHandlerWrapper } ;
4650use super :: surrogate_process:: SurrogateProcess ;
@@ -571,6 +575,19 @@ impl Debug for HypervWindowsDriver {
571575 }
572576}
573577
578+ #[ cfg( feature = "trace_guest" ) ]
579+ impl From < TraceRegister > for WHV_REGISTER_NAME {
580+ fn from ( r : TraceRegister ) -> Self {
581+ match r {
582+ TraceRegister :: RAX => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRax ,
583+ TraceRegister :: RCX => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRcx ,
584+ TraceRegister :: RIP => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRip ,
585+ TraceRegister :: RSP => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRsp ,
586+ TraceRegister :: RBP => windows:: Win32 :: System :: Hypervisor :: WHvX64RegisterRbp ,
587+ }
588+ }
589+ }
590+
574591impl Hypervisor for HypervWindowsDriver {
575592 #[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
576593 fn initialise (
@@ -1022,6 +1039,23 @@ impl Hypervisor for HypervWindowsDriver {
10221039
10231040 Ok ( ( ) )
10241041 }
1042+
1043+ #[ cfg( feature = "unwind_guest" ) ]
1044+ fn read_trace_reg ( & self , reg : TraceRegister ) -> Result < u64 > {
1045+ let register_names = [ WHV_REGISTER_NAME :: from ( reg) ] ;
1046+ let mut register_values: [ WHV_REGISTER_VALUE ; 1 ] = Default :: default ( ) ;
1047+ unsafe {
1048+ WHvGetVirtualProcessorRegisters (
1049+ self . get_partition_hdl ( ) ,
1050+ 0 ,
1051+ register_names. as_ptr ( ) ,
1052+ register_names. len ( ) as u32 ,
1053+ register_values. as_mut_ptr ( ) ,
1054+ ) ?;
1055+ // safety: all registers that we currently support are 64-bit
1056+ Ok ( register_values[ 0 ] . Reg64 )
1057+ }
1058+ }
10251059}
10261060
10271061impl Drop for HypervWindowsDriver {
0 commit comments