Skip to content

Commit 7aa0efa

Browse files
committed
Move setting up page-tables out of set_up_hypervisor_partition
Signed-off-by: Ludvig Liljenberg <[email protected]>
1 parent d0ea115 commit 7aa0efa

File tree

3 files changed

+52
-26
lines changed

3 files changed

+52
-26
lines changed

src/hyperlight_host/src/hypervisor/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,9 +564,29 @@ pub(crate) mod tests {
564564
let sandbox =
565565
UninitializedSandbox::new(GuestBinary::FilePath(filename.clone()), Some(config))?;
566566
let (_hshm, mut gshm) = sandbox.mgr.build();
567+
568+
let regions = gshm.layout.get_memory_regions(&gshm.shared_mem)?;
569+
570+
// Set up shared memory to calculate rsp_ptr
571+
#[cfg(feature = "init-paging")]
572+
let rsp_ptr = {
573+
use crate::mem::ptr::GuestPtr;
574+
let rsp_u64 = gshm.set_up_page_tables(&regions)?;
575+
let rsp_raw = RawPtr::from(rsp_u64);
576+
GuestPtr::try_from(rsp_raw)
577+
}?;
578+
#[cfg(not(feature = "init-paging"))]
579+
let rsp_ptr = {
580+
use crate::mem::ptr::GuestPtr;
581+
use crate::mem::ptr_offset::Offset;
582+
GuestPtr::try_from(Offset::from(0))
583+
}?;
584+
567585
let mut vm = set_up_hypervisor_partition(
568586
&mut gshm,
569587
&config,
588+
rsp_ptr,
589+
regions,
570590
#[cfg(any(crashdump, gdb))]
571591
&rt_cfg,
572592
)?;

src/hyperlight_host/src/mem/mgr.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,12 @@ where
107107
&mut self.shared_mem
108108
}
109109

110-
/// Set up the hypervisor partition in the given `SharedMemory` parameter
111-
/// `shared_mem`, with the given memory size `mem_size`
110+
/// Set up the page tables in the shared memory
112111
// TODO: This should perhaps happen earlier and use an
113112
// ExclusiveSharedMemory from the beginning.
114113
#[instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace")]
115114
#[cfg(feature = "init-paging")]
116-
pub(crate) fn set_up_shared_memory(
117-
&mut self,
118-
mem_size: u64,
119-
regions: &mut [MemoryRegion],
120-
) -> Result<u64> {
115+
pub(crate) fn set_up_page_tables(&mut self, regions: &[MemoryRegion]) -> Result<u64> {
121116
let rsp: u64 = self.layout.get_top_of_user_stack_offset() as u64
122117
+ SandboxMemoryLayout::BASE_ADDRESS as u64
123118
+ self.layout.stack_size as u64
@@ -126,6 +121,7 @@ where
126121
// test from `sandbox_host_tests` fails. We should investigate this further.
127122
// See issue #498 for more details.
128123
- 0x28;
124+
let mem_size = self.shared_mem.mem_size();
129125

130126
self.shared_mem.with_exclusivity(|shared_mem| {
131127
// Create PDL4 table with only 1 PML4E
@@ -154,8 +150,6 @@ where
154150
// We can use the memory size to calculate the number of PTs we need
155151
// We round up mem_size/2MB
156152

157-
let mem_size = usize::try_from(mem_size)?;
158-
159153
let num_pages: usize = mem_size.div_ceil(AMOUNT_OF_MEMORY_PER_PT);
160154

161155
// Create num_pages PT with 512 PTEs

src/hyperlight_host/src/sandbox/uninitialized_evolve.rs

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,7 @@ where
7373
) -> Result<ResSandbox>,
7474
{
7575
let (hshm, mut gshm) = u_sbox.mgr.build();
76-
let mut vm = set_up_hypervisor_partition(
77-
&mut gshm,
78-
&u_sbox.config,
79-
#[cfg(any(crashdump, gdb))]
80-
&u_sbox.rt_cfg,
81-
)?;
76+
8277
let outb_hdl = outb_handler_wrapper(hshm.clone(), u_sbox.host_funcs.clone());
8378

8479
let seed = {
@@ -99,6 +94,32 @@ where
9994
#[cfg(target_os = "linux")]
10095
setup_signal_handlers(&u_sbox.config)?;
10196

97+
let regions = gshm.layout.get_memory_regions(&gshm.shared_mem)?;
98+
99+
// Set up shared memory before stopping dirty page tracking to ensure page table setup is tracked
100+
#[cfg(feature = "init-paging")]
101+
let rsp_ptr = {
102+
let rsp_u64 = gshm.set_up_page_tables(&regions)?;
103+
let rsp_raw = RawPtr::from(rsp_u64);
104+
GuestPtr::try_from(rsp_raw)
105+
}?;
106+
#[cfg(not(feature = "init-paging"))]
107+
let rsp_ptr = GuestPtr::try_from(Offset::from(0))?;
108+
109+
// before entering VM (and before mapping memory into VM), stop tracking dirty pages from the host side
110+
let dirty_host_pages_idx = gshm
111+
.get_shared_mem_mut()
112+
.with_exclusivity(|e| e.stop_tracking_dirty_pages())??;
113+
114+
let mut vm = set_up_hypervisor_partition(
115+
&mut gshm,
116+
&u_sbox.config,
117+
rsp_ptr,
118+
regions,
119+
#[cfg(any(crashdump, gdb))]
120+
&u_sbox.rt_cfg,
121+
)?;
122+
102123
vm.initialise(
103124
peb_addr,
104125
seed,
@@ -150,19 +171,10 @@ pub(super) fn evolve_impl_multi_use(u_sbox: UninitializedSandbox) -> Result<Mult
150171
pub(crate) fn set_up_hypervisor_partition(
151172
mgr: &mut SandboxMemoryManager<GuestSharedMemory>,
152173
#[cfg_attr(target_os = "windows", allow(unused_variables))] config: &SandboxConfiguration,
174+
rsp_ptr: GuestPtr,
175+
regions: Vec<MemoryRegion>,
153176
#[cfg(any(crashdump, gdb))] rt_cfg: &SandboxRuntimeConfig,
154177
) -> Result<Box<dyn Hypervisor>> {
155-
#[cfg(feature = "init-paging")]
156-
let rsp_ptr = {
157-
let mut regions = mgr.layout.get_memory_regions(&mgr.shared_mem)?;
158-
let mem_size = u64::try_from(mgr.shared_mem.mem_size())?;
159-
let rsp_u64 = mgr.set_up_shared_memory(mem_size, &mut regions)?;
160-
let rsp_raw = RawPtr::from(rsp_u64);
161-
GuestPtr::try_from(rsp_raw)
162-
}?;
163-
#[cfg(not(feature = "init-paging"))]
164-
let rsp_ptr = GuestPtr::try_from(Offset::from(0))?;
165-
let regions = mgr.layout.get_memory_regions(&mgr.shared_mem)?;
166178
let base_ptr = GuestPtr::try_from(Offset::from(0))?;
167179
let pml4_ptr = {
168180
let pml4_offset_u64 = u64::try_from(SandboxMemoryLayout::PML4_OFFSET)?;

0 commit comments

Comments
 (0)