Skip to content

Commit 076c024

Browse files
committed
[common,host/mem] added user memory offset to PEB
W/ this, now the guest can access that memory region. Signed-off-by: danbugs <[email protected]>
1 parent 8a68a7e commit 076c024

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/hyperlight_common/src/mem.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pub struct HyperlightPEB {
4646
pub code_ptr: u64,
4747
pub input_stack: GuestMemoryRegion,
4848
pub output_stack: GuestMemoryRegion,
49+
pub user_memory: GuestMemoryRegion,
4950
pub guest_heap: GuestMemoryRegion,
5051
pub guest_stack: GuestStack,
5152
}

src/hyperlight_host/src/mem/layout.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ pub(crate) struct SandboxMemoryLayout {
8787
peb_code_pointer_offset: usize,
8888
peb_input_data_offset: usize,
8989
peb_output_data_offset: usize,
90+
peb_user_memory_offset: usize,
9091
peb_heap_data_offset: usize,
9192
peb_guest_stack_data_offset: usize,
9293

@@ -140,6 +141,10 @@ impl Debug for SandboxMemoryLayout {
140141
"Output Data Offset",
141142
&format_args!("{:#x}", self.peb_output_data_offset),
142143
)
144+
.field(
145+
"User Memory Offset",
146+
&format_args!("{:#x}", self.peb_user_memory_offset),
147+
)
143148
.field(
144149
"Guest Heap Offset",
145150
&format_args!("{:#x}", self.peb_heap_data_offset),
@@ -235,6 +240,7 @@ impl SandboxMemoryLayout {
235240
let peb_code_pointer_offset = peb_offset + offset_of!(HyperlightPEB, code_ptr);
236241
let peb_input_data_offset = peb_offset + offset_of!(HyperlightPEB, input_stack);
237242
let peb_output_data_offset = peb_offset + offset_of!(HyperlightPEB, output_stack);
243+
let peb_user_memory_offset = peb_offset + offset_of!(HyperlightPEB, user_memory);
238244
let peb_heap_data_offset = peb_offset + offset_of!(HyperlightPEB, guest_heap);
239245
let peb_guest_stack_data_offset = peb_offset + offset_of!(HyperlightPEB, guest_stack);
240246

@@ -270,6 +276,7 @@ impl SandboxMemoryLayout {
270276
peb_code_pointer_offset,
271277
peb_input_data_offset,
272278
peb_output_data_offset,
279+
peb_user_memory_offset,
273280
peb_heap_data_offset,
274281
peb_guest_stack_data_offset,
275282
sandbox_memory_config: cfg,
@@ -293,6 +300,13 @@ impl SandboxMemoryLayout {
293300
self.peb_output_data_offset
294301
}
295302

303+
/// Get the offset in guest memory to the user memory size
304+
#[instrument(skip_all, parent = Span::current(), level= "Trace")]
305+
pub(super) fn get_user_memory_size_offset(&self) -> usize {
306+
// The user memory size is the first field in the `GuestMemoryRegion` struct
307+
self.peb_user_memory_offset
308+
}
309+
296310
/// Get the offset in guest memory to the minimum guest stack address.
297311
#[instrument(skip_all, parent = Span::current(), level= "Trace")]
298312
fn get_min_guest_stack_address_offset(&self) -> usize {
@@ -329,6 +343,14 @@ impl SandboxMemoryLayout {
329343
self.get_output_data_size_offset() + size_of::<u64>()
330344
}
331345

346+
/// Get the offset in guest memory to the user memory pointer.
347+
#[instrument(skip_all, parent = Span::current(), level= "Trace")]
348+
pub(super) fn get_user_memory_pointer_offset(&self) -> usize {
349+
// The user memory pointer is immediately after the user memory size field,
350+
// which is a `u64`.
351+
self.get_user_memory_size_offset() + size_of::<u64>()
352+
}
353+
332354
/// Get the offset in guest memory to the start of output data.
333355
///
334356
/// This function exists to accommodate the macro that generates C API
@@ -745,6 +767,14 @@ impl SandboxMemoryLayout {
745767
let addr = get_address!(output_data_buffer_offset);
746768
shared_mem.write_u64(self.get_output_data_pointer_offset(), addr)?;
747769

770+
// Set up user memory pointer
771+
shared_mem.write_u64(
772+
self.get_user_memory_size_offset(),
773+
(self.get_unaligned_memory_size() - self.user_memory_offset).try_into()?,
774+
)?;
775+
let addr = get_address!(user_memory_offset);
776+
shared_mem.write_u64(self.get_user_memory_pointer_offset(), addr)?;
777+
748778
// Set up heap buffer pointer
749779
let addr = get_address!(guest_heap_buffer_offset);
750780
shared_mem.write_u64(self.get_heap_size_offset(), self.heap_size.try_into()?)?;

0 commit comments

Comments
 (0)