@@ -1120,6 +1120,7 @@ mod debug {
11201120mod tests {
11211121 use std:: sync:: { Arc , Mutex } ;
11221122
1123+ use hyperlight_common:: vmem:: { self , BasicMapping , Mapping , MappingKind } ;
11231124 use rand:: Rng ;
11241125
11251126 use super :: * ;
@@ -1128,9 +1129,9 @@ mod tests {
11281129 use crate :: hypervisor:: regs:: { CommonSegmentRegister , CommonTableRegister , MXCSR_DEFAULT } ;
11291130 #[ cfg( target_os = "windows" ) ]
11301131 use crate :: hypervisor:: wrappers:: HandleWrapper ;
1131- use crate :: mem:: exe:: LoadInfo ;
11321132 use crate :: mem:: layout:: SandboxMemoryLayout ;
1133- use crate :: mem:: mgr:: SandboxMemoryManager ;
1133+ use crate :: mem:: memory_region:: { GuestMemoryRegion , MemoryRegionFlags } ;
1134+ use crate :: mem:: mgr:: { GuestPageTableBuffer , SandboxMemoryManager } ;
11341135 use crate :: mem:: ptr:: RawPtr ;
11351136 use crate :: mem:: ptr_offset:: Offset ;
11361137 use crate :: mem:: shared_mem:: ExclusiveSharedMemory ;
@@ -1473,24 +1474,68 @@ mod tests {
14731474 xsave
14741475 }
14751476
1476- fn hyperlight_vm ( code : & [ u8 ] ) -> Result < HyperlightVm > {
1477+ fn hyperlight_vm ( code : & [ u8 ] ) -> HyperlightVm {
14771478 let config: SandboxConfiguration = Default :: default ( ) ;
14781479 #[ cfg( crashdump) ]
14791480 let rt_cfg: SandboxRuntimeConfig = Default :: default ( ) ;
14801481
1481- let layout = SandboxMemoryLayout :: new ( config, code. len ( ) , 4096 , 0 , 0 , None ) ? ;
1482+ let mut layout = SandboxMemoryLayout :: new ( config, code. len ( ) , 4096 , 4096 , 0 , None ) . unwrap ( ) ;
14821483
1483- let mem_size = layout. get_memory_size ( ) ? ;
1484- let eshm = ExclusiveSharedMemory :: new ( mem_size ) ? ;
1484+ let pt_base_gpa = SandboxMemoryLayout :: BASE_ADDRESS + layout. get_pt_offset ( ) ;
1485+ let pt_buf = GuestPageTableBuffer :: new ( pt_base_gpa ) ;
14851486
1486- let stack_cookie = [ 0u8 ; 16 ] ;
1487- let mem_mgr = SandboxMemoryManager :: new (
1488- layout,
1489- eshm,
1490- RawPtr :: from ( 0 ) ,
1491- Some ( Offset :: from ( 0 ) ) ,
1492- stack_cookie,
1493- ) ;
1487+ for rgn in layout
1488+ . get_memory_regions_ :: < GuestMemoryRegion > ( ( ) )
1489+ . unwrap ( )
1490+ . iter ( )
1491+ {
1492+ let readable = rgn. flags . contains ( MemoryRegionFlags :: READ ) ;
1493+ let writable = rgn. flags . contains ( MemoryRegionFlags :: WRITE )
1494+ || rgn. flags . contains ( MemoryRegionFlags :: STACK_GUARD ) ;
1495+ let executable = rgn. flags . contains ( MemoryRegionFlags :: EXECUTE ) ;
1496+ let mapping = Mapping {
1497+ phys_base : rgn. guest_region . start as u64 ,
1498+ virt_base : rgn. guest_region . start as u64 ,
1499+ len : rgn. guest_region . len ( ) as u64 ,
1500+ kind : MappingKind :: BasicMapping ( BasicMapping {
1501+ readable,
1502+ writable,
1503+ executable,
1504+ } ) ,
1505+ } ;
1506+ unsafe { vmem:: map ( & pt_buf, mapping) } ;
1507+ }
1508+
1509+ let mut pt_size_mapped = 0 ;
1510+ while pt_buf. size ( ) > pt_size_mapped {
1511+ let mapping = Mapping {
1512+ phys_base : ( pt_base_gpa + pt_size_mapped) as u64 ,
1513+ virt_base : ( hyperlight_common:: layout:: SNAPSHOT_PT_GVA + pt_size_mapped) as u64 ,
1514+ len : ( pt_buf. size ( ) - pt_size_mapped) as u64 ,
1515+ kind : MappingKind :: BasicMapping ( BasicMapping {
1516+ readable : true ,
1517+ writable : true ,
1518+ executable : false ,
1519+ } ) ,
1520+ } ;
1521+ unsafe { vmem:: map ( & pt_buf, mapping) } ;
1522+ pt_size_mapped = pt_buf. size ( ) ;
1523+ }
1524+
1525+ let pt_bytes = pt_buf. into_bytes ( ) ;
1526+ layout. set_pt_size ( pt_bytes. len ( ) ) ;
1527+
1528+ let mem_size = layout. get_memory_size ( ) . unwrap ( ) ;
1529+ let mut eshm = ExclusiveSharedMemory :: new ( mem_size) . unwrap ( ) ;
1530+ eshm. copy_from_slice ( & pt_bytes, layout. get_pt_offset ( ) )
1531+ . unwrap ( ) ;
1532+ eshm. copy_from_slice ( code, layout. get_guest_code_offset ( ) )
1533+ . unwrap ( ) ;
1534+
1535+ let load_addr = RawPtr :: from ( layout. get_guest_code_address ( ) as u64 ) ;
1536+ let mut mem_mgr =
1537+ SandboxMemoryManager :: new ( layout, eshm, load_addr, Some ( Offset :: from ( 0 ) ) , [ 0u8 ; 16 ] ) ;
1538+ mem_mgr. write_memory_layout ( ) . unwrap ( ) ;
14941539
14951540 let ( mut hshm, mut gshm) = mem_mgr. build ( ) ;
14961541
@@ -1499,30 +1544,19 @@ mod tests {
14991544 & config,
15001545 #[ cfg( any( crashdump, gdb) ) ]
15011546 & rt_cfg,
1502- LoadInfo :: dummy ( ) ,
1503- ) ?;
1504-
1505- // Write code
1506- let code_offset = layout. get_guest_code_offset ( ) ;
1507- hshm. shared_mem . copy_from_slice ( code, code_offset) ?;
1508-
1509- let seed = {
1510- let mut rng = rand:: rng ( ) ;
1511- rng. random :: < u64 > ( )
1512- } ;
1513- let peb_addr = {
1514- let peb_u64 = u64:: try_from ( gshm. layout . peb_address ) ?;
1515- RawPtr :: from ( peb_u64)
1516- } ;
1547+ crate :: mem:: exe:: LoadInfo :: dummy ( ) ,
1548+ )
1549+ . unwrap ( ) ;
15171550
1518- let page_size = u32:: try_from ( page_size:: get ( ) ) ?;
1551+ let seed = rand:: rng ( ) . random :: < u64 > ( ) ;
1552+ let peb_addr = RawPtr :: from ( u64:: try_from ( gshm. layout . peb_address ) . unwrap ( ) ) ;
1553+ let page_size = u32:: try_from ( page_size:: get ( ) ) . unwrap ( ) ;
15191554
15201555 #[ cfg( gdb) ]
15211556 let dbg_mem_access_hdl = Arc :: new ( Mutex :: new ( hshm. clone ( ) ) ) ;
15221557
15231558 let host_funcs = Arc :: new ( Mutex :: new ( FunctionRegistry :: default ( ) ) ) ;
15241559
1525- // Run the VM
15261560 vm. initialise (
15271561 peb_addr,
15281562 seed,
@@ -1532,14 +1566,15 @@ mod tests {
15321566 None ,
15331567 #[ cfg( gdb) ]
15341568 dbg_mem_access_hdl. clone ( ) ,
1535- ) ?;
1536- Ok ( vm)
1569+ )
1570+ . unwrap ( ) ;
1571+ vm
15371572 }
15381573
15391574 #[ test]
15401575 fn reset_vcpu_simple ( ) {
15411576 const CODE : [ u8 ; 1 ] = [ 0xf4 ] ; // hlt
1542- let hyperlight_vm = hyperlight_vm ( & CODE ) . unwrap ( ) ;
1577+ let hyperlight_vm = hyperlight_vm ( & CODE ) ;
15431578 let available_hv = * get_available_hypervisor ( ) . as_ref ( ) . unwrap ( ) ;
15441579
15451580 // Set all vCPU state to dirty values
@@ -1757,7 +1792,7 @@ mod tests {
17571792 0xf4 , // hlt
17581793 ] ;
17591794
1760- let hyperlight_vm = hyperlight_vm ( & CODE ) . unwrap ( ) ;
1795+ let hyperlight_vm = hyperlight_vm ( & CODE ) ;
17611796
17621797 // After run, check registers match expected dirty state
17631798 let regs = hyperlight_vm. vm . regs ( ) . unwrap ( ) ;
@@ -1905,7 +1940,7 @@ mod tests {
19051940 0xf4 , // hlt
19061941 ] ;
19071942
1908- let hyperlight_vm = hyperlight_vm ( & CODE ) . unwrap ( ) ;
1943+ let hyperlight_vm = hyperlight_vm ( & CODE ) ;
19091944
19101945 // After run, check FPU state matches expected dirty values
19111946 let fpu = hyperlight_vm. vm . fpu ( ) . unwrap ( ) ;
@@ -2001,7 +2036,7 @@ mod tests {
20012036 0xf4 , // hlt
20022037 ] ;
20032038
2004- let hyperlight_vm = hyperlight_vm ( code) . unwrap ( ) ;
2039+ let hyperlight_vm = hyperlight_vm ( code) ;
20052040
20062041 // Verify debug registers are dirty
20072042 let debug_regs = hyperlight_vm. vm . debug_regs ( ) . unwrap ( ) ;
@@ -2058,7 +2093,7 @@ mod tests {
20582093 0xf4 , // hlt
20592094 ] ;
20602095
2061- let hyperlight_vm = hyperlight_vm ( code) . unwrap ( ) ;
2096+ let hyperlight_vm = hyperlight_vm ( code) ;
20622097
20632098 // Get the expected defaults
20642099 let defaults = CommonSpecialRegisters :: standard_64bit_defaults ( hyperlight_vm. pml4_addr ) ;
0 commit comments