@@ -38,8 +38,8 @@ use mshv_bindings::{
3838use mshv_bindings:: {
3939 hv_message_type, hv_message_type_HVMSG_GPA_INTERCEPT, hv_message_type_HVMSG_UNMAPPED_GPA,
4040 hv_message_type_HVMSG_X64_HALT, hv_message_type_HVMSG_X64_IO_PORT_INTERCEPT, hv_register_assoc,
41- hv_register_name_HV_X64_REGISTER_RIP, hv_register_value, mshv_user_mem_region ,
42- FloatingPointUnit , SegmentRegister , SpecialRegisters , StandardRegisters ,
41+ hv_register_name_HV_X64_REGISTER_RIP, hv_register_value, FloatingPointUnit , SegmentRegister ,
42+ SpecialRegisters , StandardRegisters ,
4343} ;
4444#[ cfg( mshv3) ]
4545use mshv_bindings:: {
@@ -61,7 +61,7 @@ use super::{
6161} ;
6262use crate :: hypervisor:: hypervisor_handler:: HypervisorHandler ;
6363use crate :: hypervisor:: HyperlightExit ;
64- use crate :: mem :: memory_region :: { MemoryRegion , MemoryRegionFlags } ;
64+ use crate :: sandbox :: sandbox_builder :: SandboxMemorySections ;
6565use crate :: mem:: ptr:: { GuestPtr , RawPtr } ;
6666#[ cfg( gdb) ]
6767use crate :: HyperlightError ;
@@ -289,10 +289,12 @@ pub(crate) fn is_hypervisor_present() -> bool {
289289/// called the Microsoft Hypervisor (MSHV)
290290pub ( super ) struct HypervLinuxDriver {
291291 _mshv : Mshv ,
292+ // TODO(danbugs:297): remove
293+ #[ allow( dead_code) ]
292294 vm_fd : VmFd ,
293295 vcpu_fd : VcpuFd ,
294296 entrypoint : u64 ,
295- mem_regions : Vec < MemoryRegion > ,
297+ mem_sections : SandboxMemorySections ,
296298 orig_rsp : GuestPtr ,
297299
298300 #[ cfg( gdb) ]
@@ -312,7 +314,7 @@ impl HypervLinuxDriver {
312314 /// `initialise` to do it for you.
313315 #[ instrument( skip_all, parent = Span :: current( ) , level = "Trace" ) ]
314316 pub ( super ) fn new (
315- mem_regions : Vec < MemoryRegion > ,
317+ mem_sections : SandboxMemorySections ,
316318 entrypoint_ptr : GuestPtr ,
317319 rsp_ptr : GuestPtr ,
318320 pml4_ptr : GuestPtr ,
@@ -377,18 +379,19 @@ impl HypervLinuxDriver {
377379 ( None , None )
378380 } ;
379381
380- mem_regions. iter ( ) . try_for_each ( |region| {
381- let mshv_region = region. to_owned ( ) . into ( ) ;
382- vm_fd. map_user_memory ( mshv_region)
383- } ) ?;
382+ // TODO(danbugs:297): bring back
383+ // mem_sections.iter().try_for_each(|region| {
384+ // let mshv_region = region.to_owned().into();
385+ // vm_fd.map_user_memory(mshv_region)
386+ // })?;
384387
385388 Self :: setup_initial_sregs ( & mut vcpu_fd, pml4_ptr. absolute ( ) ?) ?;
386389
387390 Ok ( Self {
388391 _mshv : mshv,
389392 vm_fd,
390393 vcpu_fd,
391- mem_regions ,
394+ mem_sections ,
392395 entrypoint : entrypoint_ptr. absolute ( ) ?,
393396 orig_rsp : rsp_ptr,
394397
@@ -433,7 +436,7 @@ impl Debug for HypervLinuxDriver {
433436 f. field ( "Entrypoint" , & self . entrypoint )
434437 . field ( "Original RSP" , & self . orig_rsp ) ;
435438
436- for region in & self . mem_regions {
439+ for region in self . mem_sections . iter ( ) {
437440 f. field ( "Memory Region" , & region) ;
438441 }
439442
@@ -457,9 +460,9 @@ impl Hypervisor for HypervLinuxDriver {
457460 #[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
458461 fn initialise (
459462 & mut self ,
460- peb_addr : RawPtr ,
463+ hyperlight_peb_guest_memory_region_address : u64 ,
464+ hyperlight_peb_guest_memory_region_size : u64 ,
461465 seed : u64 ,
462- page_size : u32 ,
463466 outb_hdl : OutBHandlerWrapper ,
464467 mem_access_hdl : MemAccessHandlerWrapper ,
465468 hv_handler : Option < HypervisorHandler > ,
@@ -477,9 +480,9 @@ impl Hypervisor for HypervLinuxDriver {
477480 rflags : 2 , //bit 1 of rlags is required to be set
478481
479482 // function args
480- rcx : peb_addr . into ( ) ,
481- rdx : seed ,
482- r8 : page_size . into ( ) ,
483+ rcx : hyperlight_peb_guest_memory_region_address . into ( ) ,
484+ rdx : hyperlight_peb_guest_memory_region_size . into ( ) ,
485+ r8 : seed . into ( ) ,
483486 r9 : max_guest_log_level,
484487
485488 ..Default :: default ( )
@@ -615,20 +618,24 @@ impl Hypervisor for HypervLinuxDriver {
615618 INVALID_GPA_ACCESS_MESSAGE => {
616619 let mimo_message = m. to_memory_info ( ) ?;
617620 let gpa = mimo_message. guest_physical_address ;
618- let access_info = MemoryRegionFlags :: try_from ( mimo_message) ?;
621+ // TODO(danbugs:297): bring back
622+ // let access_info = MemoryRegionFlags::try_from(mimo_message)?;
619623 crate :: debug!(
620624 "mshv MMIO invalid GPA access -Details: Address: {} \n {:#?}" ,
621625 gpa,
622626 & self
623627 ) ;
624- match self . get_memory_access_violation (
625- gpa as usize ,
626- & self . mem_regions ,
627- access_info,
628- ) {
629- Some ( access_info_violation) => access_info_violation,
630- None => HyperlightExit :: Mmio ( gpa) ,
631- }
628+ // TODO(danbugs:297): bring back
629+ // match self.get_memory_access_violation(
630+ // gpa as usize,
631+ // &self.mem_regions,
632+ // access_info,
633+ // ) {
634+ // Some(access_info_violation) => access_info_violation,
635+ // None => HyperlightExit::Mmio(gpa),
636+ // }
637+
638+ HyperlightExit :: Mmio ( gpa)
632639 }
633640 // The only case an intercept exit is expected is when debugging is enabled
634641 // and the intercepts are installed
@@ -662,10 +669,11 @@ impl Hypervisor for HypervLinuxDriver {
662669 self as & mut dyn Hypervisor
663670 }
664671
665- #[ cfg( crashdump) ]
666- fn get_memory_regions ( & self ) -> & [ MemoryRegion ] {
667- & self . mem_regions
668- }
672+ // TODO(danbugs:297): bring back
673+ // #[cfg(crashdump)]
674+ // fn get_memory_regions(&self) -> &[MemoryRegion] {
675+ // &self.mem_sections
676+ // }
669677
670678 #[ cfg( gdb) ]
671679 fn handle_debug (
@@ -713,71 +721,73 @@ impl Hypervisor for HypervLinuxDriver {
713721 }
714722}
715723
716- impl Drop for HypervLinuxDriver {
717- #[ instrument( skip_all, parent = Span :: current( ) , level = "Trace" ) ]
718- fn drop ( & mut self ) {
719- for region in & self . mem_regions {
720- let mshv_region: mshv_user_mem_region = region. to_owned ( ) . into ( ) ;
721- match self . vm_fd . unmap_user_memory ( mshv_region) {
722- Ok ( _) => ( ) ,
723- Err ( e) => error ! ( "Failed to unmap user memory in HyperVOnLinux ({:?})" , e) ,
724- }
725- }
726- }
727- }
728-
729- #[ cfg( test) ]
730- mod tests {
731- use super :: * ;
732- use crate :: mem:: memory_region:: MemoryRegionVecBuilder ;
733- use crate :: mem:: shared_mem:: { ExclusiveSharedMemory , SharedMemory } ;
734-
735- #[ rustfmt:: skip]
736- const CODE : [ u8 ; 12 ] = [
737- 0xba , 0xf8 , 0x03 , /* mov $0x3f8, %dx */
738- 0x00 , 0xd8 , /* add %bl, %al */
739- 0x04 , b'0' , /* add $'0', %al */
740- 0xee , /* out %al, (%dx) */
741- /* send a 0 to indicate we're done */
742- 0xb0 , b'\0' , /* mov $'\0', %al */
743- 0xee , /* out %al, (%dx) */
744- 0xf4 , /* HLT */
745- ] ;
746-
747- fn shared_mem_with_code (
748- code : & [ u8 ] ,
749- mem_size : usize ,
750- load_offset : usize ,
751- ) -> Result < Box < ExclusiveSharedMemory > > {
752- if load_offset > mem_size {
753- log_then_return ! (
754- "code load offset ({}) > memory size ({})" ,
755- load_offset,
756- mem_size
757- ) ;
758- }
759- let mut shared_mem = ExclusiveSharedMemory :: new ( mem_size) ?;
760- shared_mem. copy_from_slice ( code, load_offset) ?;
761- Ok ( Box :: new ( shared_mem) )
762- }
763-
764- #[ test]
765- fn create_driver ( ) {
766- if !super :: is_hypervisor_present ( ) {
767- return ;
768- }
769- const MEM_SIZE : usize = 0x3000 ;
770- let gm = shared_mem_with_code ( CODE . as_slice ( ) , MEM_SIZE , 0 ) . unwrap ( ) ;
771- let rsp_ptr = GuestPtr :: try_from ( 0 ) . unwrap ( ) ;
772- let pml4_ptr = GuestPtr :: try_from ( 0 ) . unwrap ( ) ;
773- let entrypoint_ptr = GuestPtr :: try_from ( 0 ) . unwrap ( ) ;
774- let mut regions = MemoryRegionVecBuilder :: new ( 0 , gm. base_addr ( ) ) ;
775- regions. push_page_aligned (
776- MEM_SIZE ,
777- MemoryRegionFlags :: READ | MemoryRegionFlags :: WRITE | MemoryRegionFlags :: EXECUTE ,
778- crate :: mem:: memory_region:: MemoryRegionType :: Code ,
779- ) ;
780- super :: HypervLinuxDriver :: new (
724+ // TODO(danbugs:297): bring back
725+ // impl Drop for HypervLinuxDriver {
726+ // #[instrument(skip_all, parent = Span::current(), level = "Trace")]
727+ // fn drop(&mut self) {
728+ // for region in self.mem_sections.iter() {
729+ // let mshv_region: mshv_user_mem_region = region.to_owned().into();
730+ // match self.vm_fd.unmap_user_memory(mshv_region) {
731+ // Ok(_) => (),
732+ // Err(e) => error!("Failed to unmap user memory in HyperVOnLinux ({:?})", e),
733+ // }
734+ // }
735+ // }
736+ // }
737+
738+ // TODO(danbugs:297): bring back
739+ // #[cfg(test)]
740+ // mod tests {
741+ // use super::*;
742+ // use crate::mem::memory_region::MemoryRegionVecBuilder;
743+ // use crate::mem::shared_mem::{ExclusiveSharedMemory, SharedMemory};
744+ //
745+ // #[rustfmt::skip]
746+ // const CODE: [u8; 12] = [
747+ // 0xba, 0xf8, 0x03, /* mov $0x3f8, %dx */
748+ // 0x00, 0xd8, /* add %bl, %al */
749+ // 0x04, b'0', /* add $'0', %al */
750+ // 0xee, /* out %al, (%dx) */
751+ // /* send a 0 to indicate we're done */
752+ // 0xb0, b'\0', /* mov $'\0', %al */
753+ // 0xee, /* out %al, (%dx) */
754+ // 0xf4, /* HLT */
755+ // ];
756+ //
757+ // fn shared_mem_with_code(
758+ // code: &[u8],
759+ // mem_size: usize,
760+ // load_offset: usize,
761+ // ) -> Result<Box<ExclusiveSharedMemory>> {
762+ // if load_offset > mem_size {
763+ // log_then_return!(
764+ // "code load offset ({}) > memory size ({})",
765+ // load_offset,
766+ // mem_size
767+ // );
768+ // }
769+ // let mut shared_mem = ExclusiveSharedMemory::new(mem_size)?;
770+ // shared_mem.copy_from_slice(code, load_offset)?;
771+ // Ok(Box::new(shared_mem))
772+ // }
773+ //
774+ // #[test]
775+ // fn create_driver() {
776+ // if !super::is_hypervisor_present() {
777+ // return;
778+ // }
779+ // const MEM_SIZE: usize = 0x3000;
780+ // let gm = shared_mem_with_code(CODE.as_slice(), MEM_SIZE, 0).unwrap();
781+ // let rsp_ptr = GuestPtr::try_from(0).unwrap();
782+ // let pml4_ptr = GuestPtr::try_from(0).unwrap();
783+ // let entrypoint_ptr = GuestPtr::try_from(0).unwrap();
784+ // let mut regions = MemoryRegionVecBuilder::new(0, gm.base_addr());
785+ // regions.push_page_aligned(
786+ // MEM_SIZE,
787+ // MemoryRegionFlags::READ | MemoryRegionFlags::WRITE | MemoryRegionFlags::EXECUTE,
788+ // crate::mem::memory_region::MemoryRegionType::Code,
789+ // );
790+ // super::HypervLinuxDriver::new(
781791 regions. build ( ) ,
782792 entrypoint_ptr,
783793 rsp_ptr,
@@ -786,5 +796,5 @@ mod tests {
786796 None ,
787797 )
788798 . unwrap ( ) ;
789- }
790- }
799+ // }
800+ // }
0 commit comments