Skip to content

Commit 4a30d2c

Browse files
cshungCopilot
andcommitted
refactor: make GuestMemoryRegion a GPA-to-GVA mapping
Change GuestMemoryRegion::HostBaseType from () to usize so that GuestMemoryRegion becomes a proper mapping: host_region carries guest physical addresses (GPA) and guest_region carries guest virtual addresses (GVA). For identity-mapped regions both are the same. For non-PIE code the Code region's guest_region is overridden to the ELF-declared virtual address. Remove the guest_virt_addr field from MemoryRegion_ since its role is now served by the guest_region/host_region split in GuestMemoryRegion. Use checked_add for the code VA overlap check. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6f20a05d-6bee-4e2e-b320-12f8d9759bbc Signed-off-by: cshung <3410332+cshung@users.noreply.github.com>
1 parent 1082c5e commit 4a30d2c

11 files changed

Lines changed: 28 additions & 29 deletions

File tree

src/hyperlight_host/src/hypervisor/crashdump.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,6 @@ mod test {
474474
let ptr = dummy_vec.as_ptr() as usize;
475475
let regions = vec![CrashDumpRegion {
476476
guest_region: 0x1000..0x2000,
477-
guest_virt_addr: 0x1000,
478477
host_region: ptr..ptr + dummy_vec.len(),
479478
flags: MemoryRegionFlags::READ | MemoryRegionFlags::WRITE,
480479
region_type: crate::mem::memory_region::MemoryRegionType::Code,

src/hyperlight_host/src/hypervisor/gdb/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,6 @@ mod tests {
426426
guest_mmap_regions: vec![MemoryRegion {
427427
host_region: mapped_mem as usize..mapped_mem.wrapping_add(size) as usize,
428428
guest_region: BASE_VIRT..BASE_VIRT + size,
429-
guest_virt_addr: BASE_VIRT,
430429
flags: MemoryRegionFlags::READ | MemoryRegionFlags::EXECUTE,
431430
region_type: MemoryRegionType::Heap,
432431
}],

src/hyperlight_host/src/hypervisor/hyperlight_vm/x86_64.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,15 +1495,15 @@ mod tests {
14951495
let pt_buf = GuestPageTableBuffer::new(pt_base_gpa as usize);
14961496

14971497
for rgn in layout
1498-
.get_memory_regions_::<GuestMemoryRegion>(())
1498+
.get_memory_regions_::<GuestMemoryRegion>(SandboxMemoryLayout::BASE_ADDRESS)
14991499
.unwrap()
15001500
.iter()
15011501
{
15021502
let readable = rgn.flags.contains(MemoryRegionFlags::READ);
15031503
let writable = rgn.flags.contains(MemoryRegionFlags::WRITE);
15041504
let executable = rgn.flags.contains(MemoryRegionFlags::EXECUTE);
15051505
let mapping = Mapping {
1506-
phys_base: rgn.guest_region.start as u64,
1506+
phys_base: rgn.host_region.start as u64,
15071507
virt_base: rgn.guest_region.start as u64,
15081508
len: rgn.guest_region.len() as u64,
15091509
kind: MappingKind::Basic(BasicMapping {

src/hyperlight_host/src/mem/layout.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -580,10 +580,16 @@ impl SandboxMemoryLayout {
580580
let load_addr = self.get_guest_code_address() as u64;
581581
let code_virt_base = if is_pie { load_addr } else { elf_base_va };
582582

583-
let mut regions = self.get_memory_regions_::<GuestMemoryRegion>(())?;
583+
let mut regions = self.get_memory_regions_::<GuestMemoryRegion>(Self::BASE_ADDRESS)?;
584584

585585
if !is_pie {
586-
let code_virt_end = code_virt_base + loaded_size;
586+
let code_virt_end = code_virt_base.checked_add(loaded_size).ok_or_else(|| {
587+
new_error!(
588+
"Code mapping overflow: base {:#x} + size {:#x}",
589+
code_virt_base,
590+
loaded_size
591+
)
592+
})?;
587593
for rgn in regions.iter() {
588594
if rgn.region_type == MemoryRegionType::Code {
589595
continue;
@@ -603,10 +609,12 @@ impl SandboxMemoryLayout {
603609
}
604610
}
605611

606-
// Set the Code region's guest_virt_addr to code_virt_base.
612+
// Override the Code region's GVA (guest_region) to code_virt_base.
613+
// host_region retains the GPA from the builder.
607614
for rgn in regions.iter_mut() {
608615
if rgn.region_type == MemoryRegionType::Code {
609-
rgn.guest_virt_addr = code_virt_base as usize;
616+
let len = rgn.guest_region.len();
617+
rgn.guest_region = code_virt_base as usize..(code_virt_base as usize + len);
610618
}
611619
}
612620

src/hyperlight_host/src/mem/memory_region.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -282,24 +282,26 @@ impl MemoryRegionKind for HostGuestMemoryRegion {
282282
pub(crate) struct GuestMemoryRegion {}
283283

284284
impl MemoryRegionKind for GuestMemoryRegion {
285-
type HostBaseType = ();
285+
type HostBaseType = usize;
286286

287-
fn add(_base: Self::HostBaseType, _size: usize) -> Self::HostBaseType {}
287+
fn add(base: Self::HostBaseType, size: usize) -> Self::HostBaseType {
288+
base + size
289+
}
288290
}
289291

290292
/// represents a single memory region inside the guest. All memory within a region has
291293
/// the same memory permissions
292294
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
293295
pub struct MemoryRegion_<K: MemoryRegionKind> {
294-
/// the range of guest physical addresses
296+
/// The range of guest addresses. For `GuestMemoryRegion` this is
297+
/// the guest virtual address range (GVA). For `HostGuestMemoryRegion`
298+
/// and `CrashDumpMemoryRegion` this is the guest physical address
299+
/// range (GPA) or GVA depending on the variant.
295300
pub guest_region: Range<usize>,
296-
/// the guest virtual address at which this region should be mapped.
297-
/// For identity-mapped regions this equals `guest_region.start`.
298-
/// For non-PIE code it is the ELF's declared virtual address.
299-
pub guest_virt_addr: usize,
300-
/// the range of host memory addresses
301-
///
302-
/// Note that Range<()> = () x () = ().
301+
/// The range of host-side addresses. For `HostGuestMemoryRegion` this
302+
/// is the host virtual address range (HVA). For `GuestMemoryRegion`
303+
/// this is the guest physical address range (GPA). For
304+
/// `CrashDumpMemoryRegion` this is the HVA.
303305
pub host_region: Range<K::HostBaseType>,
304306
/// memory access flags for the given region
305307
pub flags: MemoryRegionFlags,
@@ -360,7 +362,6 @@ impl<K: MemoryRegionKind> MemoryRegionVecBuilder<K> {
360362
let host_end = <K as MemoryRegionKind>::add(self.host_base_virt_addr, size);
361363
self.regions.push(MemoryRegion_ {
362364
guest_region: self.guest_base_phys_addr..guest_end,
363-
guest_virt_addr: self.guest_base_phys_addr,
364365
host_region: self.host_base_virt_addr..host_end,
365366
flags,
366367
region_type,
@@ -375,7 +376,6 @@ impl<K: MemoryRegionKind> MemoryRegionVecBuilder<K> {
375376
let guest_start = last_region.guest_region.end;
376377
let new_region = MemoryRegion_ {
377378
guest_region: guest_start..guest_start + size,
378-
guest_virt_addr: guest_start,
379379
host_region: last_region.host_region.end..host_end,
380380
flags,
381381
region_type,

src/hyperlight_host/src/mem/mgr.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,6 @@ impl SandboxMemoryManager<HostSharedMemory> {
650650

651651
regions.push(CrashDumpRegion {
652652
guest_region: virt_base..virt_end,
653-
guest_virt_addr: virt_base,
654653
host_region: host_base..host_base + host_len,
655654
flags,
656655
region_type,

src/hyperlight_host/src/mem/shared_mem.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,6 @@ fn mapping_at(
514514

515515
MemoryRegion {
516516
guest_region: guest_base..(guest_base + size),
517-
guest_virt_addr: guest_base,
518517
host_region: s.host_region_base()
519518
..<HostGuestMemoryRegion as MemoryRegionKind>::add(s.host_region_base(), size),
520519
region_type,

src/hyperlight_host/src/sandbox/file_mapping.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ impl PreparedFileMapping {
164164
Ok(MemoryRegion {
165165
host_region: host_base..host_end,
166166
guest_region: guest_start..guest_end,
167-
guest_virt_addr: guest_start,
168167
flags: MemoryRegionFlags::READ | MemoryRegionFlags::EXECUTE,
169168
region_type: MemoryRegionType::MappedFile,
170169
})
@@ -185,7 +184,6 @@ impl PreparedFileMapping {
185184
host_region: *mmap_base as usize
186185
..(*mmap_base as usize).wrapping_add(*mmap_size),
187186
guest_region: guest_start..guest_end,
188-
guest_virt_addr: guest_start,
189187
flags: MemoryRegionFlags::READ | MemoryRegionFlags::EXECUTE,
190188
region_type: MemoryRegionType::MappedFile,
191189
})

src/hyperlight_host/src/sandbox/initialized_multi_use.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1587,7 +1587,6 @@ mod tests {
15871587
MemoryRegion {
15881588
host_region: mem.host_region_base()..mem.host_region_end(),
15891589
guest_region: guest_base..(guest_base + len),
1590-
guest_virt_addr: guest_base,
15911590
flags,
15921591
region_type: MemoryRegionType::Heap,
15931592
}

src/hyperlight_host/src/sandbox/snapshot/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,8 @@ impl Snapshot {
385385
};
386386

387387
let mapping = Mapping {
388-
phys_base: rgn.guest_region.start as u64,
389-
virt_base: rgn.guest_virt_addr as u64,
388+
phys_base: rgn.host_region.start as u64,
389+
virt_base: rgn.guest_region.start as u64,
390390
len: rgn.guest_region.len() as u64,
391391
kind,
392392
};

0 commit comments

Comments
 (0)