@@ -72,9 +72,7 @@ use super::memory_region::{
7272 MemoryRegionVecBuilder ,
7373} ;
7474use super :: shared_mem:: { ExclusiveSharedMemory , SharedMemory } ;
75- use crate :: error:: HyperlightError :: {
76- GuestOffsetIsInvalid , MemoryRequestTooBig , MemoryRequestTooSmall ,
77- } ;
75+ use crate :: error:: HyperlightError :: { MemoryRequestTooBig , MemoryRequestTooSmall } ;
7876use crate :: sandbox:: SandboxConfiguration ;
7977use crate :: { Result , new_error} ;
8078
@@ -568,68 +566,70 @@ impl SandboxMemoryLayout {
568566 /// Note: `shared_mem` may have been modified, even if `Err` was returned
569567 /// from this function.
570568 #[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ]
571- pub ( crate ) fn write (
572- & self ,
573- shared_mem : & mut ExclusiveSharedMemory ,
574- guest_offset : usize ,
575- //TODO: Unused remove
576- _size : usize ,
577- ) -> Result < ( ) > {
569+ pub ( crate ) fn write_peb ( & self , mem : & mut [ u8 ] ) -> Result < ( ) > {
570+ let guest_offset = SandboxMemoryLayout :: BASE_ADDRESS ;
571+
572+ fn write_u64 ( mem : & mut [ u8 ] , offset : usize , value : u64 ) -> Result < ( ) > {
573+ if offset + 8 > mem. len ( ) {
574+ return Err ( new_error ! (
575+ "Cannot write to offset {} in slice of len {}" ,
576+ offset,
577+ mem. len( )
578+ ) ) ;
579+ }
580+ mem[ offset..offset + 8 ] . copy_from_slice ( & u64:: to_ne_bytes ( value) ) ;
581+ Ok ( ( ) )
582+ }
583+
578584 macro_rules! get_address {
579585 ( $something: ident) => {
580586 u64 :: try_from( guest_offset + self . $something) ?
581587 } ;
582588 }
583589
584- if guest_offset != SandboxMemoryLayout :: BASE_ADDRESS
585- && guest_offset != shared_mem. base_addr ( )
586- {
587- return Err ( GuestOffsetIsInvalid ( guest_offset) ) ;
588- }
589-
590590 // Start of setting up the PEB. The following are in the order of the PEB fields
591591
592- // Skip guest_dispatch_function_ptr_offset because it is set by the guest
593-
594- // Skip code, is set when loading binary
595- // skip outb and outb context, is set when running in_proc
596-
597592 // Set up input buffer pointer
598- shared_mem. write_u64 (
593+ write_u64 (
594+ mem,
599595 self . get_input_data_size_offset ( ) ,
600596 self . sandbox_memory_config
601597 . get_input_data_size ( )
602598 . try_into ( ) ?,
603599 ) ?;
604- shared_mem. write_u64 (
600+ write_u64 (
601+ mem,
605602 self . get_input_data_pointer_offset ( ) ,
606603 self . get_input_data_buffer_gva ( ) ,
607604 ) ?;
608605
609606 // Set up output buffer pointer
610- shared_mem. write_u64 (
607+ write_u64 (
608+ mem,
611609 self . get_output_data_size_offset ( ) ,
612610 self . sandbox_memory_config
613611 . get_output_data_size ( )
614612 . try_into ( ) ?,
615613 ) ?;
616- shared_mem. write_u64 (
614+ write_u64 (
615+ mem,
617616 self . get_output_data_pointer_offset ( ) ,
618617 self . get_output_data_buffer_gva ( ) ,
619618 ) ?;
620619
621620 // Set up init data pointer
622- shared_mem. write_u64 (
621+ write_u64 (
622+ mem,
623623 self . get_init_data_size_offset ( ) ,
624624 ( self . get_unaligned_memory_size ( ) - self . init_data_offset ) . try_into ( ) ?,
625625 ) ?;
626626 let addr = get_address ! ( init_data_offset) ;
627- shared_mem . write_u64 ( self . get_init_data_pointer_offset ( ) , addr) ?;
627+ write_u64 ( mem , self . get_init_data_pointer_offset ( ) , addr) ?;
628628
629629 // Set up heap buffer pointer
630630 let addr = get_address ! ( guest_heap_buffer_offset) ;
631- shared_mem . write_u64 ( self . get_heap_size_offset ( ) , self . heap_size . try_into ( ) ?) ?;
632- shared_mem . write_u64 ( self . get_heap_pointer_offset ( ) , addr) ?;
631+ write_u64 ( mem , self . get_heap_size_offset ( ) , self . heap_size . try_into ( ) ?) ?;
632+ write_u64 ( mem , self . get_heap_pointer_offset ( ) , addr) ?;
633633
634634 // Set up the file_mappings descriptor in the PEB.
635635 // - The `size` field holds the number of valid FileMappingInfo
0 commit comments