What's Changed
Added
- Windows on ARM64 support using the WHP backend by @cshung in #1638
- Virtqueue-based host-guest communication. Per-direction virtqueue configuration is available through
SandboxConfigurationandSandboxBuilder, with allocations included in scratch sizing by @andreiltd in #1793 and #1794 - Shared virtqueue framing with a 12-byte
MsgHeaderand external byte values, plusExternalValueSourceimplementations forRecvChainandSegmentsby @andreiltd in #1792, #1793, and #1794 - Producer batch completion without notification, and segmented payload assembly and extraction without flattening by @andreiltd in #1793 and #1794
MailboxValue, which defines the transport mailbox's allowed wire values, andvirtq::canonical::validate_canon_prefix, which validates a bounded available descriptor prefix by @andreiltd in #1891- Retained guest
BytesandByteChunkspreserve contents and pointers across snapshot capture, restore, and cloning by @andreiltd in #1891 - Namespaced application metadata on immutable snapshots by @ludfjig in #1860
- Support overriding the guest log level when building or restoring initialized snapshots by @jprendes in #1833
- Guest paging operations and AArch64 system-register macros in
hyperlight-guestby @andreiltd in #1889 - Architecture-independent page fault and undefined instruction exception hooks in
hyperlight-guest-binby @syntactically in #1877 - Guest virtual memory support for lazily zero-initialized regions and in-place mapping modification by @syntactically in #1873 and #1874
Changed
- Breaking: All guest logs and host and guest function calls now go through virtqueues. Virtqueue rings and pools occupy host-owned scratch before page tables, and canonical virtqueue rings are stored in versioned OCI transport layers. Retained-buffer checkpoints use ABI 6 and config schema v3, which rejects snapshots without transport state. Existing snapshots must be regenerated by @andreiltd in #1793, #1794, and #1891
- Breaking:
VirtqProducer::resetandGuestContext::prepare_snapshotare unsafe. Peers must stay stopped with no live consumer-side chain handles until their consumers are reset or replaced by @andreiltd in #1793 and #1794 - Breaking: Snapshot checkpoints reject host function calls. Violations poison the sandbox by @andreiltd in #1896
Sandboxis the primary initialized sandbox type and is reached throughhyperlight_host::Sandboxorhyperlight_host::sandbox::Sandbox.MultiUseSandboxremains as a deprecated alias, andsandbox::initialized_multi_useremains as a deprecated public path by @jprendes in #1866hyperlight_guest_bin::exception::arch, previously available on amd64 only, has been deprecated in favour of the new architecture-independent exception handling hooks. The new interfaces are significantly more limited, but more portable; they will be extended in the future by @syntactically in #1877- ELF loading respects program header virtual addresses for non-PIE guest binaries by @cshung in #1530
- Host virtqueue access uses checked copies and atomics across mapped scratch. Snapshot admission checks geometry, canonical rings, and distinct, aligned H2G pool slots. Consumers validate descriptors and payload accesses during use by @andreiltd in #1793 and #1794
- Virtqueue producers use concrete
SlotPoolallocation andBufferLeaseownership.BufferMapsupplies complete owners exposing initialized bytes by @andreiltd in #1793 ChainBuilder::build()allocates readable and writable requests.writable_avail()reserves available upper-tier slots within the descriptor budget. It may add zero slots to a nonempty chain by @andreiltd in #1793- Guest transport aliases follow buffer ownership. Restored buffers keep captured backing while their scratch slots become reusable by @andreiltd in #1891
- Running snapshots checkpoint dirty virtqueues before capture. Ordinary calls keep their deferred result path by @andreiltd in #1794
- Keep registered Rust guest return values typed until transport encoding so external byte results avoid intermediate FlatBuffer copies by @andreiltd in #1794
- Use the reclaimed stack pages to raise the default G2H and H2G pools to 12 and 8 pages by @andreiltd in #1794
- C guests may omit
c_guest_dispatch_functionwhen they do not need custom fallback dispatch by @ludfjig in #1848 - Expose C guest
ByteChunksvalues as pointer and length arrays, and return typedhl_ReturnValueobjects from C guest functions throughhl_result_from_*constructors by @andreiltd in #1792 - Guest tracing skips its per-call and per-callsite work while the guest log level is
OFF.hyperlight_guest_tracing::is_trace_enabledreports whether the configured level is aboveOFFrather than whether the tracing state was allocated by @jprendes in #1840 - MSHV: vCPU creation reads the partition's XSAVE format once. This removes one hypercall from every restore by @ludfjig in #1912
Removed
- Legacy stack I/O, its
GuestHandlemethods, and its sandbox configuration and builder options by @andreiltd in #1794 - Embedded byte payload tables and their value-union variants by @andreiltd in #1794
RunPooland the run-specificAllocError::InvalidAlignvariant by @andreiltd in #1793
Fixed
- Reserve 48 KiB for guest exception stacks and metadata to cover debug paging walks by @andreiltd in #1891
- AMD64 exception handlers clear the direction flag before calling Rust by @andreiltd in #1882
- Use a stronger TLB invalidation barrier when updating guest page tables by @syntactically in #1876
- The
gdbfeature is now a no-op in release builds by @ludfjig in #1886 - Use checked arithmetic and conversions in
push_bufferas defense in depth by @JM00NJ in #1820 and #1825 - Use a 16 KiB-aligned default scratch size for Apple Silicon compatibility by @andreiltd in #1793
- Guest virtqueue copies reject overlapping buffers before accessing memory by @andreiltd in #1793
- Linear-time segment consumption for fragmented virtqueue messages by @andreiltd in #1794
- Allow reclaimed virtqueue completions to span multiple ring reuse cycles by @andreiltd in #1794
- Virtqueue consumers return errors when payload copies or runtime bookkeeping cannot be allocated by @andreiltd in #1794
- Keep sandboxes usable after an H2G request exceeds available virtqueue capacity, or when G2H calls exhaust reply capacity by @andreiltd in #1794
- Snapshot checkpoints ignore idle cancellation and clear partial abort state by @andreiltd in #1794
- Reject incompatible transport snapshots before changing sandbox state by @andreiltd in #1794
- Allow guest host-return conversions to call or log to the host by @andreiltd in #1794
Sandbox::from_snapshotnow honours the guest log level set viaSandboxConfiguration::set_max_guest_log_levelinstead of ignoring it and falling back toRUST_LOGby @sethryanrollins in #1699
Full Changelog (excl. dependencies)
- Fix crates.io publish detection by @jsturtevant in #1781
- Update community meetings to Monday's by @jsturtevant in #1779
- perf(snapshot): write the guest memory blob sparsely by @jprendes in #1788
- docs: add external byte stream proposal by @andreiltd in #1791
- docs: add HIP 0001 ring buffer proposal for Hyperlight I/O by @andreiltd in #1112
- docs: clarify host function access control in security.md by @JM00NJ in #1799
- feat: add external byte codecs by @andreiltd in #1792
- Fix ARM workflow runner routing by @simongdavies in #1814
- plumb
max_guest_log_levelthroughMultiUseSandbox::from_snapshotby @sethryanrollins in #1699 - Fix unused sandbox test import on ARM64 by @simongdavies in #1812
- Fix metrics test cancellation race by @simongdavies in #1816
- fix: use checked arithmetic in push_buffer (defense in depth) by @JM00NJ in #1820
- ci: add fuzz_push_pop_buffer to the CI fuzzing workflow by @JM00NJ in #1822
- feat: support guest log level overrides for initialized snapshots by @jprendes in #1833
- perf: skip guest tracing work while the log level is off by @jprendes in #1840
- fix: use try_into instead of as u64 cast in push_buffer by @JM00NJ in #1825
- feat: add virtqueue transport foundations by @andreiltd in #1793
- fix: adjust scratch size for benchmarks by @andreiltd in #1847
- feat: implement virtio based host-guest communication by @andreiltd in #1794
- ci: cut Miri test time from 16 minutes to 90 seconds by @jprendes in #1859
- Make ELF loading respect program header virtual addresses for non-PIE binaries by @cshung in #1530
- Add API for Snapshot metadata by @ludfjig in #1860
- Comment benchmark results on pull requests by @jprendes in #1529
- Map exact page-rounded lengths in simpleguest by @ludfjig in #1844
- Rename MultiUseSandbox to Sandbox by @jprendes in #1866
- [hip] Incremental snapshots by @ludfjig in #1823
- docs: rework virtual queue communication document by @andreiltd in #1869
- vmem: Add support for lazily zero-initialized memory regions by @syntactically in #1873
- vmem: Add function for modifying mappings in-place by @syntactically in #1874
- Weakly link c_guest_dispatch_function by @ludfjig in #1848
- vmem: Add stronger tlb invalidation barrier by @syntactically in #1876
- ci: redirect fuzzer stdout to /dev/null by @andreiltd in #1881
- fix: clear DF flag before calling exception handler by @andreiltd in #1882
- Fix failing nightly test due to missing guest binary by @ludfjig in #1885
- fix: Make the gdb feature a no-op in release builds. by @ludfjig in #1886
- ci: balance runner pools across vendors and persist fuzz corpus by @simongdavies in #1838
- refactor: share guest paging primitives by @andreiltd in #1889
- Compare pull requests against the right benchmark baseline by @jprendes in #1893
- Revert sparse snapshot blob writes (#1788) by @danbugs in #1898
- Compare pull requests against a baseline measured on the same machine by @jprendes in #1894
- feat(aarch64): add WHP backend for ARM64 Windows by @cshung in #1638
- Run Miri once per architecture, on the hosted runners by @jprendes in #1900
- Speed up full-window MSR restore audit by @jprendes in #1905
- Make sccache read-only outside main by @ludfjig in #1909
- Run fewer proptest cases to improve ci time by @ludfjig in #1908
- [hyperlight_guest_bin] Add page fault and undefined instruction hooks by @syntactically in #1877
- Remove cargo home chown steps by @ludfjig in #1911
- Hoist the XCOMP_BV read into MSHV vCPU creation by @ludfjig in #1912
- Save sysroot and Coverage caches only on main by @ludfjig in #1913
- feat: preserve virtual queue buffers across snapshots by @andreiltd in #1891
- feat: restrict guest capabilities during snapshot checkpoint by @andreiltd in #1896
Full Changelog (dependencies)
- chore(deps): bump crate-ci/typos from 1.49.0 to 1.50.1 by @dependabot[bot] in #1797
- chore(deps): bump smallvec from 1.15.2 to 1.16.0 by @dependabot[bot] in #1800
- chore(deps): bump crossbeam-channel from 0.5.16 to 0.5.17 by @dependabot[bot] in #1808
- chore(deps): bump cc from 1.4.4 to 1.4.5 by @dependabot[bot] in #1806
- chore(deps): bump syn from 3.0.4 to 3.0.5 by @dependabot[bot] in #1805
- chore(deps): bump Swatinem/rust-cache from 2.9.1 to 2.9.2 by @dependabot[bot] in #1710
- chore(deps): bump crossbeam-queue from 0.3.13 to 0.3.14 by @dependabot[bot] in #1809
- chore(deps): update and group mshv crates together by @simongdavies in #1813
- chore(deps): bump actions-rust-lang/setup-rust-toolchain from 1.17.0 to 2.0.0 by @dependabot[bot] in #1818
- chore(deps): bump the wasm-tools group across 1 directory with 3 updates by @dependabot[bot] in #1780
- Configure Dependabot cooldown and Windows crate groups by @simongdavies in #1821
- chore(deps): bump bitflags from 2.13.1 to 2.13.2 by @dependabot[bot] in #1830
- chore(deps): bump wat from 1.258.0 to 1.259.0 by @dependabot[bot] in #1828
- chore(deps): bump uuid from 1.26.0 to 1.26.1 by @dependabot[bot] in #1827
- chore(deps): bump docker/build-push-action from 7.3.0 to 7.4.0 by @dependabot[bot] in #1845
- chore(deps): bump cfg-if from 1.0.4 to 1.0.5 by @dependabot[bot] in #1853
- chore(deps): bump syn from 3.0.5 to 3.0.6 by @dependabot[bot] in #1852
- chore(deps): bump crate-ci/typos from 1.50.1 to 1.50.2 by @dependabot[bot] in #1846
- chore(deps): bump the wasm-tools group with 3 updates by @dependabot[bot] in #1841
- Update pinned nightly toolchain by @ludfjig in #1849
- chore(deps): bump rand from 0.10.2 to 0.10.3 by @dependabot[bot] in #1858
- chore(deps): bump opentelemetry-semantic-conventions from 0.32.1 to 0.33.0 by @dependabot[bot] in #1857
- chore(deps): bump cc from 1.4.6 to 1.4.7 by @dependabot[bot] in #1856
- chore(deps): bump thiserror from 2.0.20 to 2.0.21 by @dependabot[bot] in #1868
- chore(deps): bump crate-ci/typos from 1.50.2 to 1.50.3 by @dependabot[bot] in #1872
- chore(deps): bump cc from 1.4.7 to 1.5.1 by @dependabot[bot] in #1880
- chore(deps): bump smallvec from 1.16.1 to 1.16.2 by @dependabot[bot] in #1879
- chore(deps): bump wat from 1.259.0 to 1.260.0 by @dependabot[bot] in #1904
- Make benchmark report indicators configurable by @jprendes in #1910
- chore(deps): bump lazy_static from 1.5.0 to 1.5.1 by @dependabot[bot] in #1915
- chore(deps): bump wat from 1.260.0 to 1.261.0 by @dependabot[bot] in #1923
- chore(deps): bump cc from 1.5.1 to 1.6.0 by @dependabot[bot] in #1922
- chore(deps): bump libc from 0.2.189 to 0.2.190 by @dependabot[bot] in #1919
- chore: prepare release v0.18.0 by @danbugs in #1930
New Contributors
- @JM00NJ made their first contribution in #1799
- @sethryanrollins made their first contribution in #1699
Full Changelog: v0.17.0...v0.18.0