@@ -27,19 +27,23 @@ use super::handlers::DbgMemAccessHandlerWrapper;
2727use super :: handlers:: {
2828 MemAccessHandlerCaller , MemAccessHandlerWrapper , OutBHandlerCaller , OutBHandlerWrapper ,
2929} ;
30+ #[ cfg( mshv) ]
3031use super :: hyperv_linux:: MshvVm ;
3132#[ cfg( kvm) ]
3233use super :: kvm:: KvmVm ;
3334use super :: regs:: {
3435 CommonFpu , CommonRegisters , FP_CONTROL_WORD_DEFAULT , FP_TAG_WORD_DEFAULT , MXCSR_DEFAULT ,
3536} ;
3637use super :: vm:: Vm ;
38+ use super :: wrappers:: HandleWrapper ;
3739use super :: {
3840 HyperlightExit , HyperlightVm , CR0_AM , CR0_ET , CR0_MP , CR0_NE , CR0_PE , CR0_PG , CR0_WP ,
3941 CR4_OSFXSR , CR4_OSXMMEXCPT , CR4_PAE , EFER_LMA , EFER_LME , EFER_NX , EFER_SCE ,
4042} ;
4143#[ cfg( crashdump) ]
4244use crate :: hypervisor:: crashdump;
45+ #[ cfg( target_os = "windows" ) ]
46+ use crate :: hypervisor:: hyperv_windows:: WhpVm ;
4347use crate :: hypervisor:: hypervisor_handler:: HypervisorHandler ;
4448use crate :: mem:: memory_region:: { MemoryRegion , MemoryRegionFlags } ;
4549use crate :: mem:: ptr:: { GuestPtr , RawPtr } ;
@@ -324,13 +328,16 @@ impl HyperlightSandbox {
324328 entrypoint : u64 ,
325329 rsp : u64 ,
326330 #[ cfg( gdb) ] gdb_conn : Option < DebugCommChannel < DebugResponse , DebugMsg > > ,
331+ handle : HandleWrapper ,
327332 ) -> Result < Self > {
328333 #[ allow( unused_mut) ] // needs to be mutable when gdb is enabled
329334 let mut vm: Box < dyn Vm > = match hv {
330335 #[ cfg( kvm) ]
331336 HypervisorType :: Kvm => Box :: new ( KvmVm :: new ( ) ?) ,
332337 #[ cfg( mshv) ]
333338 HypervisorType :: Mshv => Box :: new ( MshvVm :: new ( ) ?) ,
339+ #[ cfg( target_os = "windows" ) ]
340+ HypervisorType :: Whp => Box :: new ( WhpVm :: new ( handle) ?) ,
334341 } ;
335342
336343 // Safety: We haven't called this before and the regions are valid
@@ -344,6 +351,8 @@ impl HyperlightSandbox {
344351 sregs. cr0 = CR0_PE | CR0_MP | CR0_ET | CR0_NE | CR0_AM | CR0_PG | CR0_WP ;
345352 sregs. efer = EFER_LME | EFER_LMA | EFER_SCE | EFER_NX ;
346353 sregs. cs . l = 1 ; // required for 64-bit mode
354+ sregs. cs . present = 1 ;
355+ sregs. cs . s = 1 ;
347356 vm. set_sregs ( & sregs) ?;
348357
349358 #[ cfg( gdb) ]
@@ -392,6 +401,8 @@ impl HyperlightVm for HyperlightSandbox {
392401 None => self . get_max_log_level ( ) . into ( ) ,
393402 } ;
394403
404+ println ! ( "Entrypoint: {:#x}" , self . entrypoint) ;
405+
395406 let regs = CommonRegisters {
396407 rip : self . entrypoint ,
397408 rsp : self . orig_rsp . absolute ( ) ?,
@@ -401,7 +412,7 @@ impl HyperlightVm for HyperlightSandbox {
401412 rdx : seed,
402413 r8 : page_size. into ( ) ,
403414 r9 : max_guest_log_level,
404-
415+ rflags : 1 << 1 ,
405416 ..Default :: default ( )
406417 } ;
407418 self . vm . set_regs ( & regs) ?;
@@ -430,7 +441,7 @@ impl HyperlightVm for HyperlightSandbox {
430441 let regs = CommonRegisters {
431442 rip : dispatch_func_addr. into ( ) ,
432443 rsp : self . orig_rsp . absolute ( ) ?,
433- rflags : 2 ,
444+ rflags : 1 << 1 ,
434445 ..Default :: default ( )
435446 } ;
436447 self . vm . set_regs ( & regs) ?;
@@ -532,7 +543,7 @@ impl HyperlightVm for HyperlightSandbox {
532543 } ) ?
533544 . call ( ) ?;
534545
535- log_then_return ! ( "MMIO access address {:#x}" , addr) ;
546+ log_then_return ! ( "MMIO READ access address {:#x}" , addr) ;
536547 }
537548 }
538549 }
@@ -564,7 +575,7 @@ impl HyperlightVm for HyperlightSandbox {
564575 } ) ?
565576 . call ( ) ?;
566577
567- log_then_return ! ( "MMIO access address {:#x}" , addr) ;
578+ log_then_return ! ( "MMIO WRITE access address {:#x}" , addr) ;
568579 }
569580 }
570581 }
@@ -648,6 +659,11 @@ impl HyperlightVm for HyperlightSandbox {
648659
649660 Ok ( ( ) )
650661 }
662+
663+ #[ cfg( target_os = "windows" ) ]
664+ fn get_partition_handle ( & self ) -> windows:: Win32 :: System :: Hypervisor :: WHV_PARTITION_HANDLE {
665+ self . vm . get_partition_handle ( )
666+ }
651667}
652668
653669/// The vCPU tried to access the given addr, b
0 commit comments