Skip to content

Commit 4320d54

Browse files
committed
fixup! Reset vcpu state
1 parent 5e5a976 commit 4320d54

File tree

1 file changed

+73
-38
lines changed

1 file changed

+73
-38
lines changed

src/hyperlight_host/src/hypervisor/hyperlight_vm.rs

Lines changed: 73 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,6 +1120,7 @@ mod debug {
11201120
mod 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

Comments
 (0)