Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
460b3a2
Revert "Remove unused multi-root snapshot plumbing"
syntactically Jun 25, 2026
e4b834d
[nix] Make devShells.default work for more than just x86_64-linux
syntactically May 26, 2026
c1152c4
Only pass `page_size` to `HyperlightVm` once
syntactically May 10, 2026
21ce8c3
[aarch64] Fix stub compilation
syntactically May 10, 2026
dabd5a6
[hyperlight_libc] Support building picolibc for aarch64
syntactically May 10, 2026
be6214c
[simpleguest] cfg-gate functions that do not compile on aarch64
syntactically May 10, 2026
2efc393
Rename MAX_{GPA,GVA} to SCRATCH_TOP_{GPA,GVA}
syntactically May 18, 2026
09c44f7
Justfile: add support for compiling for aarch64
syntactically May 23, 2026
84e6473
HyperlightVm: allow hypervisor backends to implement reset_vcpu
syntactically May 23, 2026
0b22865
[hyperlight_guest_bin] Make `init_stack` architecture-independent
syntactically May 23, 2026
bcb454a
Extract UpdateParentTable from amd64 arch-specific to generic vmem code
syntactically May 26, 2026
8b74b00
aarch64: add memory layout
syntactically May 26, 2026
b4214f4
hyperlight_guest_bin: move exposed virtual memory operations to arch-…
syntactically May 26, 2026
80f9710
aarch64: add virtual memory operations
syntactically May 26, 2026
d4a8523
[hyperlight_host] aarch64: add basic register handling for KVM
syntactically May 26, 2026
d8df6a4
[hyperlight_guest_bin] aarch64: support MMIO exits
syntactically May 26, 2026
a46fc7d
[hyperlight_guest] aarch64: Implement simple physical page allocator
syntactically May 26, 2026
ed25f9a
[hyperlight_guest_bin] aarch64: add basic exception handlers
syntactically May 26, 2026
959e413
[hyperlight_guest_bin] aarch64: add initialisation/dispatch assembly …
syntactically May 26, 2026
859b8c4
[hyperlight_host] aarch64: initial KVM implementation
syntactically May 26, 2026
417ec2c
[tests] aarch64: remove amd64-isms from enabled tests
syntactically May 26, 2026
7fcd260
aarch64: support running Clippy
syntactically Jun 9, 2026
96f5c91
[ci] Set up GitHub workflows for aarch64 KVM
syntactically Jun 8, 2026
c38a608
libc: copy includes/stdio from picolibc
syntactically Jun 25, 2026
8361179
Update cargo-hyperlight to 0.1.12
syntactically Jun 25, 2026
40eae63
[snapshot/file] Remove Serde mirror structures for system registers
syntactically Jun 25, 2026
3c8f3d4
[tests] Remove assumption that loading an aarch64 snapshot should error
syntactically Jun 25, 2026
bcd6d5d
[nix] Update flake.nix for the unreleased version of piet used by tra…
syntactically Jun 25, 2026
ea98d03
[ci] Switch dep_fuzzing to have its matrix in the calling workflow
syntactically Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 44 additions & 6 deletions .github/workflows/ValidatePullRequest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,13 @@ jobs:
strategy:
fail-fast: true
matrix:
arch: [X64, arm64]
config: [debug, release]
uses: ./.github/workflows/dep_build_guests.yml
secrets: inherit
with:
docs_only: ${{ needs.docs-pr.outputs.docs-only }}
arch: ${{ matrix.arch }}
config: ${{ matrix.config }}

# Code checks (fmt, clippy, MSRV) - runs in parallel with build-guests
Expand Down Expand Up @@ -92,14 +94,27 @@ jobs:
fail-fast: true
matrix:
hypervisor: ['hyperv-ws2025', mshv3, kvm]
cpu: [amd, intel]
cpu: [amd, intel, apple]
arch: [X64, arm64]
config: [debug, release]
exclude:
- cpu: apple
hypervisor: hyperv-ws2025
- cpu: apple
hypervisor: mshv3
- cpu: amd
arch: arm64
- cpu: intel
arch: arm64
- cpu: apple
arch: X64
uses: ./.github/workflows/dep_build_test.yml
secrets: inherit
with:
with:
docs_only: ${{ needs.docs-pr.outputs.docs-only }}
hypervisor: ${{ matrix.hypervisor }}
cpu: ${{ matrix.cpu }}
arch: ${{ matrix.arch }}
config: ${{ matrix.config }}

# Run examples - needs guest artifacts, runs in parallel with build-test
Expand All @@ -115,14 +130,27 @@ jobs:
fail-fast: true
matrix:
hypervisor: ['hyperv-ws2025', mshv3, kvm]
cpu: [amd, intel]
cpu: [amd, intel, apple]
arch: [X64, arm64]
config: [debug, release]
exclude:
- cpu: apple
hypervisor: hyperv-ws2025
- cpu: apple
hypervisor: mshv3
- cpu: amd
arch: arm64
- cpu: intel
arch: arm64
- cpu: apple
arch: X64
uses: ./.github/workflows/dep_run_examples.yml
secrets: inherit
with:
docs_only: ${{ needs.docs-pr.outputs.docs-only }}
hypervisor: ${{ matrix.hypervisor }}
cpu: ${{ matrix.cpu }}
arch: ${{ matrix.arch }}
config: ${{ matrix.config }}

fuzzing:
Expand All @@ -133,12 +161,22 @@ jobs:
# and a skipped dependency transitively skips all downstream jobs.
# See: https://github.com/actions/runner/issues/2205
if: ${{ !cancelled() && !failure() }}
strategy:
matrix:
target: ['fuzz_host_print', 'fuzz_guest_call', 'fuzz_host_call', 'fuzz_guest_estimate_trace_event', 'fuzz_guest_trace']
arch: [X64, arm64]
exclude:
- arch: arm64
target: fuzz_guest_trace
- arch: arm64
target: fuzz_guest_estimate_trace_event
uses: ./.github/workflows/dep_fuzzing.yml
secrets: inherit
with:
targets: '["fuzz_host_print", "fuzz_guest_call", "fuzz_host_call", "fuzz_guest_estimate_trace_event", "fuzz_guest_trace"]' # Pass as a JSON array
max_total_time: 300 # 5 minutes in seconds
docs_only: ${{ needs.docs-pr.outputs.docs-only }}
secrets: inherit
max_total_time: 300 # 5 minutes in seconds
arch: ${{ matrix.arch }}
target: ${{ matrix.target }}

spelling:
name: spell check with typos
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/dep_benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,13 @@ jobs:
- name: Download Rust guests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: rust-guests-release
name: rust-guests-X64-release
path: src/tests/rust_guests/bin/release/

- name: Download C guests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: c-guests-release
name: c-guests-X64-release
path: src/tests/c_guests/bin/release/

- name: Build
Expand Down
28 changes: 21 additions & 7 deletions .github/workflows/dep_build_guests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ on:
required: false
type: string
default: "false"
arch:
description: CPU architecture for the build (passed from caller matrix)
required: true
type: string
config:
description: Build configuration (debug or release)
required: true
Expand All @@ -29,7 +33,17 @@ jobs:
build-guests:
if: ${{ inputs.docs_only == 'false' }}
timeout-minutes: 15
runs-on: [self-hosted, Linux, X64, "1ES.Pool=hld-kvm-amd", "JobId=build-guests-${{ inputs.config }}-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }}"]
runs-on: ${{ fromJson(
format('["self-hosted", "Linux", "{0}", "{1}" {2}]',
inputs.arch,
inputs.arch == 'X64' && '1ES.Pool=hld-kvm-amd' || 'ubuntu-24.04',
inputs.arch == 'X64' && format(', "JobId=build-guests-{0}-{1}-{2}-{3}"',
inputs.config,
github.run_id,
github.run_number,
github.run_attempt)
|| ''
)) }}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

Expand All @@ -52,12 +66,12 @@ jobs:
with:
path: |
src/tests/rust_guests/target/sysroot
key: sysroot-linux-${{ inputs.config }}-${{ hashFiles('rust-toolchain.toml') }}
key: sysroot-linux-${{ inputs.arch }}-${{ inputs.config }}-${{ hashFiles('rust-toolchain.toml') }}

- name: Rust cache
uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
with:
shared-key: "guests-${{ inputs.config }}"
shared-key: "guests-${{ inputs.arch }}-${{ inputs.config }}"
cache-on-failure: "true"
# Only save on main as caches are not shared across branches.
# https://docs.github.com/en/actions/reference/workflows-and-actions/dependency-caching#restrictions-for-accessing-a-cache
Expand All @@ -82,7 +96,7 @@ jobs:
- name: Upload Rust guests
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: rust-guests-${{ inputs.config }}
name: rust-guests-${{ inputs.arch }}-${{ inputs.config }}
path: |
src/tests/rust_guests/bin/${{ inputs.config }}/
retention-days: 1
Expand All @@ -91,13 +105,13 @@ jobs:
- name: Upload C guests
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: c-guests-${{ inputs.config }}
name: c-guests-${{ inputs.arch }}-${{ inputs.config }}
path: src/tests/c_guests/bin/${{ inputs.config }}/
retention-days: 1
if-no-files-found: error

- name: Upload interface.wasm
if: inputs.config == 'debug'
if: inputs.config == 'debug' && inputs.arch == 'X64'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: interface-wasm
Expand All @@ -106,7 +120,7 @@ jobs:
if-no-files-found: error

- name: Upload twoworlds.wasm
if: inputs.config == 'debug'
if: inputs.config == 'debug' && inputs.arch == 'X64'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: twoworlds-wasm
Expand Down
28 changes: 16 additions & 12 deletions .github/workflows/dep_build_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ on:
required: true
type: string
cpu:
description: CPU vendor for the build (passed from caller matrix)
required: true
type: string
arch:
description: CPU architecture for the build (passed from caller matrix)
required: true
type: string
Expand All @@ -39,14 +43,11 @@ jobs:
if: ${{ inputs.docs_only == 'false' }}
timeout-minutes: 45
runs-on: ${{ fromJson(
format('["self-hosted", "{0}", "X64", "1ES.Pool=hld-{1}-{2}", "JobId=build-and-test-{3}-{4}-{5}-{6}"]',
inputs.hypervisor == 'hyperv-ws2025' && 'Windows' || 'Linux',
inputs.hypervisor == 'hyperv-ws2025' && 'win2025' || inputs.hypervisor == 'mshv3' && 'azlinux3-mshv' || inputs.hypervisor,
inputs.cpu,
inputs.config,
github.run_id,
github.run_number,
github.run_attempt)) }}
format('["self-hosted", "{0}", "{1}", {2} {3}]',
inputs.hypervisor == 'hyperv-ws2025' && 'Windows' || 'Linux',
inputs.arch,
inputs.arch == 'X64' && format('"1ES.Pool=hld-{0}-{1}"', inputs.hypervisor == 'hyperv-ws2025' && 'win2025' || inputs.hypervisor == 'mshv3' && 'azlinux3-mshv' || inputs.hypervisor, inputs.cpu) || inputs.hypervisor == 'kvm' && '"kvm", "ubuntu-24.04"' || '',
inputs.arch == 'X64' && format(', "JobId=build-and-test-{0}-{1}-{2}-{3}"', inputs.config, github.run_id, github.run_number, github.run_attempt) || '')) }}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

Expand All @@ -64,7 +65,7 @@ jobs:
- name: Rust cache
uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
with:
shared-key: "${{ runner.os }}-${{ inputs.hypervisor }}-${{ inputs.config }}"
shared-key: "${{ inputs.arch }}-${{ runner.os }}-${{ inputs.hypervisor }}-${{ inputs.config }}"
cache-on-failure: "true"
# Only save on main as caches are not shared across branches.
# https://docs.github.com/en/actions/reference/workflows-and-actions/dependency-caching#restrictions-for-accessing-a-cache
Expand All @@ -73,13 +74,13 @@ jobs:
- name: Download Rust guests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: rust-guests-${{ inputs.config }}
name: rust-guests-${{ inputs.arch }}-${{ inputs.config }}
path: src/tests/rust_guests/bin/${{ inputs.config }}/

- name: Download C guests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: c-guests-${{ inputs.config }}
name: c-guests-${{ inputs.arch }}-${{ inputs.config }}
path: src/tests/c_guests/bin/${{ inputs.config }}/

- name: Download interface.wasm
Expand Down Expand Up @@ -119,22 +120,25 @@ jobs:
just test ${{ inputs.config }} ${{ inputs.hypervisor == 'mshv3' && 'mshv3' || 'kvm' }}

- name: Run Rust tests with hw-interrupts
if: runner.arch == 'X64'
run: |
# with hw-interrupts feature enabled (+ explicit driver on Linux)
just test ${{ inputs.config }} ${{ runner.os == 'Linux' && (inputs.hypervisor == 'mshv3' && 'mshv3,hw-interrupts' || 'kvm,hw-interrupts') || 'hw-interrupts' }}

- name: Run Rust Gdb tests
if: runner.arch == 'X64'
env:
RUST_LOG: debug
run: just test-rust-gdb-debugging ${{ inputs.config }}

- name: Run Rust Crashdump tests
if: runner.arch == 'X64'
env:
RUST_LOG: debug
run: just test-rust-crashdump ${{ inputs.config }}

- name: Run Rust Tracing tests
if: runner.os == 'Linux'
if: runner.arch == 'X64' && runner.os == 'Linux'
env:
RUST_LOG: debug
run: just test-rust-tracing ${{ inputs.config }}
25 changes: 18 additions & 7 deletions .github/workflows/dep_fuzzing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ on:
description: Maximum total time for the fuzz run in seconds
required: true
type: number
targets:
target:
description: Fuzz targets to run
required: true
type: string
arch:
description: Architecture on which to fuzz
required: true
type: string
docs_only:
description: Skip fuzzing if docs only
required: false
Expand All @@ -23,10 +27,17 @@ permissions:
jobs:
fuzz:
if: ${{ inputs.docs_only == 'false' }}
runs-on: [ self-hosted, Linux, X64, "1ES.Pool=hld-kvm-amd", "JobId=fuzz-${{ matrix.target }}-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }}" ]
strategy:
matrix:
target: ${{ fromJson(inputs.targets) }}
runs-on: ${{ fromJson(
format('["self-hosted", "Linux", "{0}", "{1}" {2}]',
inputs.arch,
inputs.arch == 'X64' && '1ES.Pool=hld-kvm-amd' || 'ubuntu-24.04',
inputs.arch == 'X64' && format(', "JobId=fuzz-{0}-{1}-{2}-{3}"',
inputs.target,
github.run_id,
github.run_number,
github.run_attempt)
|| ''
)) }}
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
Expand All @@ -40,14 +51,14 @@ jobs:
- name: Download Rust guests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: rust-guests-release
name: rust-guests-${{ inputs.arch }}-release
path: src/tests/rust_guests/bin/release/

- name: Install cargo-fuzz
run: command -v cargo-fuzz >/dev/null 2>&1 || cargo install cargo-fuzz

- name: Run Fuzzing
run: just fuzz-timed ${{ matrix.target }} ${{ inputs.max_total_time }}
run: just fuzz-timed ${{ inputs.target }} ${{ inputs.max_total_time }}
working-directory: src/hyperlight_host

- name: Upload Crash Artifacts
Expand Down
23 changes: 12 additions & 11 deletions .github/workflows/dep_run_examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ on:
required: true
type: string
cpu:
description: CPU vendor for the build (passed from caller matrix)
required: true
type: string
arch:
description: CPU architecture for the build (passed from caller matrix)
required: true
type: string
Expand All @@ -39,14 +43,11 @@ jobs:
if: ${{ inputs.docs_only == 'false' }}
timeout-minutes: 15
runs-on: ${{ fromJson(
format('["self-hosted", "{0}", "X64", "1ES.Pool=hld-{1}-{2}", "JobId=run-examples-{3}-{4}-{5}-{6}"]',
inputs.hypervisor == 'hyperv-ws2025' && 'Windows' || 'Linux',
inputs.hypervisor == 'hyperv-ws2025' && 'win2025' || inputs.hypervisor == 'mshv3' && 'azlinux3-mshv' || inputs.hypervisor,
inputs.cpu,
inputs.config,
github.run_id,
github.run_number,
github.run_attempt)) }}
format('["self-hosted", "{0}", "{1}", {2} {3}]',
inputs.hypervisor == 'hyperv-ws2025' && 'Windows' || 'Linux',
inputs.arch,
inputs.arch == 'X64' && format('"1ES.Pool=hld-{0}-{1}"', inputs.hypervisor == 'hyperv-ws2025' && 'win2025' || inputs.hypervisor == 'mshv3' && 'azlinux3-mshv' || inputs.hypervisor, inputs.cpu) || inputs.hypervisor == 'kvm' && '"kvm", "ubuntu-24.04"' || '',
inputs.arch == 'X64' && format(', "JobId=run-examples-{0}-{1}-{2}-{3}"', inputs.config, github.run_id, github.run_number, github.run_attempt) || '')) }}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

Expand All @@ -64,19 +65,19 @@ jobs:
- name: Rust cache
uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
with:
shared-key: "${{ runner.os }}-${{ inputs.hypervisor }}-${{ inputs.config }}"
shared-key: "${{ inputs.arch }}-${{ runner.os }}-${{ inputs.hypervisor }}-${{ inputs.config }}"
save-if: "false"

- name: Download Rust guests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: rust-guests-${{ inputs.config }}
name: rust-guests-${{ inputs.arch }}-${{ inputs.config }}
path: src/tests/rust_guests/bin/${{ inputs.config }}/

- name: Download C guests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: c-guests-${{ inputs.config }}
name: c-guests-${{ inputs.arch }}-${{ inputs.config }}
path: src/tests/c_guests/bin/${{ inputs.config }}/

- name: Run Rust examples - windows
Expand Down
Loading
Loading