@@ -38,8 +38,8 @@ use mshv_bindings::{
38
38
use mshv_bindings:: {
39
39
hv_message_type, hv_message_type_HVMSG_GPA_INTERCEPT, hv_message_type_HVMSG_UNMAPPED_GPA,
40
40
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 ,
43
43
} ;
44
44
#[ cfg( mshv3) ]
45
45
use mshv_bindings:: {
@@ -61,7 +61,7 @@ use super::{
61
61
} ;
62
62
use crate :: hypervisor:: hypervisor_handler:: HypervisorHandler ;
63
63
use crate :: hypervisor:: HyperlightExit ;
64
- use crate :: mem :: memory_region :: { MemoryRegion , MemoryRegionFlags } ;
64
+ use crate :: sandbox :: sandbox_builder :: SandboxMemorySections ;
65
65
use crate :: mem:: ptr:: { GuestPtr , RawPtr } ;
66
66
#[ cfg( gdb) ]
67
67
use crate :: HyperlightError ;
@@ -289,10 +289,12 @@ pub(crate) fn is_hypervisor_present() -> bool {
289
289
/// called the Microsoft Hypervisor (MSHV)
290
290
pub ( super ) struct HypervLinuxDriver {
291
291
_mshv : Mshv ,
292
+ // TODO(danbugs:297): remove
293
+ #[ allow( dead_code) ]
292
294
vm_fd : VmFd ,
293
295
vcpu_fd : VcpuFd ,
294
296
entrypoint : u64 ,
295
- mem_regions : Vec < MemoryRegion > ,
297
+ mem_sections : SandboxMemorySections ,
296
298
orig_rsp : GuestPtr ,
297
299
298
300
#[ cfg( gdb) ]
@@ -312,7 +314,7 @@ impl HypervLinuxDriver {
312
314
/// `initialise` to do it for you.
313
315
#[ instrument( skip_all, parent = Span :: current( ) , level = "Trace" ) ]
314
316
pub ( super ) fn new (
315
- mem_regions : Vec < MemoryRegion > ,
317
+ mem_sections : SandboxMemorySections ,
316
318
entrypoint_ptr : GuestPtr ,
317
319
rsp_ptr : GuestPtr ,
318
320
pml4_ptr : GuestPtr ,
@@ -377,18 +379,19 @@ impl HypervLinuxDriver {
377
379
( None , None )
378
380
} ;
379
381
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
+ // })?;
384
387
385
388
Self :: setup_initial_sregs ( & mut vcpu_fd, pml4_ptr. absolute ( ) ?) ?;
386
389
387
390
Ok ( Self {
388
391
_mshv : mshv,
389
392
vm_fd,
390
393
vcpu_fd,
391
- mem_regions ,
394
+ mem_sections ,
392
395
entrypoint : entrypoint_ptr. absolute ( ) ?,
393
396
orig_rsp : rsp_ptr,
394
397
@@ -433,7 +436,7 @@ impl Debug for HypervLinuxDriver {
433
436
f. field ( "Entrypoint" , & self . entrypoint )
434
437
. field ( "Original RSP" , & self . orig_rsp ) ;
435
438
436
- for region in & self . mem_regions {
439
+ for region in self . mem_sections . iter ( ) {
437
440
f. field ( "Memory Region" , & region) ;
438
441
}
439
442
@@ -457,9 +460,9 @@ impl Hypervisor for HypervLinuxDriver {
457
460
#[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level = "Trace" ) ]
458
461
fn initialise (
459
462
& mut self ,
460
- peb_addr : RawPtr ,
463
+ hyperlight_peb_guest_memory_region_address : u64 ,
464
+ hyperlight_peb_guest_memory_region_size : u64 ,
461
465
seed : u64 ,
462
- page_size : u32 ,
463
466
outb_hdl : OutBHandlerWrapper ,
464
467
mem_access_hdl : MemAccessHandlerWrapper ,
465
468
hv_handler : Option < HypervisorHandler > ,
@@ -477,9 +480,9 @@ impl Hypervisor for HypervLinuxDriver {
477
480
rflags : 2 , //bit 1 of rlags is required to be set
478
481
479
482
// 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 ( ) ,
483
486
r9 : max_guest_log_level,
484
487
485
488
..Default :: default ( )
@@ -615,20 +618,24 @@ impl Hypervisor for HypervLinuxDriver {
615
618
INVALID_GPA_ACCESS_MESSAGE => {
616
619
let mimo_message = m. to_memory_info ( ) ?;
617
620
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)?;
619
623
crate :: debug!(
620
624
"mshv MMIO invalid GPA access -Details: Address: {} \n {:#?}" ,
621
625
gpa,
622
626
& self
623
627
) ;
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)
632
639
}
633
640
// The only case an intercept exit is expected is when debugging is enabled
634
641
// and the intercepts are installed
@@ -662,10 +669,11 @@ impl Hypervisor for HypervLinuxDriver {
662
669
self as & mut dyn Hypervisor
663
670
}
664
671
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
+ // }
669
677
670
678
#[ cfg( gdb) ]
671
679
fn handle_debug (
@@ -713,71 +721,73 @@ impl Hypervisor for HypervLinuxDriver {
713
721
}
714
722
}
715
723
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(
781
791
regions. build ( ) ,
782
792
entrypoint_ptr,
783
793
rsp_ptr,
@@ -786,5 +796,5 @@ mod tests {
786
796
None ,
787
797
)
788
798
. unwrap ( ) ;
789
- }
790
- }
799
+ // }
800
+ // }
0 commit comments