Login
Check-in [14ce9dcac0]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Merge 6.5a (ii) part 2b: the guest firmware starts an EFI application

Reviewed against docs/tasks/6.5a-ii-split.md part 2b; verdict merge. Glint places the application's file at 0x40800000 and names it in /chosen/glint,efi-app; the firmware loads it at 0x40400000 with 2a's shared PE loader, installs one loaded-image protocol whose callbacks compare the handle with the one installed before touching it, passes /chosen/bootargs as UCS-2 load options, and calls it. The application has an all-BSS .data and needs no workaround. In the release build the firmware's largest function is 1,752 bytes and guest_efi_main 152. 353 changed non-spec lines with the README: over the ~250 aim, under the 400 stop. Codex ran, after the last change, the aarch64 boot suite in BQ2's seed (39 examples) and the x86_64 one (31), 0 failures each, and the host suite (1,423, 0 failures). The reviewer booted it in the seed: 'efi app: started', 'efi app: devicetree found', 'efi app: load options "console=ttyAMA0"', 'VM: guest powered off'; exit 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KMXZyLk8eDgCjvQ9hX

Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 14ce9dcac007f38347ce5d063def4ae8cfec46a031cab7e53944a31cbceea215
User & Date: x86-1-glint 2026-11-11 05:42:05.755
Context
2026-11-11
05:42
docs/boots: the guest firmware starting an EFI application, recorded

Claim: the boots page gains 6.5a (ii) part 2: the guest's UEFI firmware loads and starts an EFI application, which finds the devicetree and its load options. Passage: the maintainer's request for a recording at each milestone (ocx-console 40c80385db). Demonstration: the cast is the file bin/glint-run wrote on x86-1 at the merge 14ce9dcac0's tree, built inside BQ2's seed; it exited 0 with the lines the entry quotes. Size: one cast, one page entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KMXZyLk8eDgCjvQ9hX check-in: bcf1a57610 user: x86-1-glint tags: trunk

05:42
Merge 6.5a (ii) part 2b: the guest firmware starts an EFI application

Reviewed against docs/tasks/6.5a-ii-split.md part 2b; verdict merge. Glint places the application's file at 0x40800000 and names it in /chosen/glint,efi-app; the firmware loads it at 0x40400000 with 2a's shared PE loader, installs one loaded-image protocol whose callbacks compare the handle with the one installed before touching it, passes /chosen/bootargs as UCS-2 load options, and calls it. The application has an all-BSS .data and needs no workaround. In the release build the firmware's largest function is 1,752 bytes and guest_efi_main 152. 353 changed non-spec lines with the README: over the ~250 aim, under the 400 stop. Codex ran, after the last change, the aarch64 boot suite in BQ2's seed (39 examples) and the x86_64 one (31), 0 failures each, and the host suite (1,423, 0 failures). The reviewer booted it in the seed: 'efi app: started', 'efi app: devicetree found', 'efi app: load options "console=ttyAMA0"', 'VM: guest powered off'; exit 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KMXZyLk8eDgCjvQ9hX check-in: 14ce9dcac0 user: x86-1-glint tags: trunk

05:40
Claim: Part 2b starts an EFI application under the Arm guest firmware. Glint transports raw PE bytes through /chosen/glint,efi-app; firmware uses Part 2a's shared PeLoader, installs one loaded-image protocol and UCS-2 bootargs, calls the app and powers off after return. HandleProtocol/OpenProtocol compare the installed handle by identity before touching it. The app keeps all-BSS .data, without a data-byte workaround. Part 3 is not started.

Passage: MOS4/5 section 7.2, paraphrase because the text is absent: a virtual machine should present the behavior software expects from hardware. UEFI 2.10's system-table and loaded-image interface is shared through boot/efi.cr; U-Boot 2026.07 include/efi_api.h and lib/efi_loader/efi_boottime.c supply the local ABI/GUID and handle/open reference. Linux libstub compatibility remains unverified until 6.7a.

Demonstration: In BQ2's seed, crystal spec spec/run --example aarch64: 39 examples, 0 failures/errors/pending after the final change; firmware/app targeted boots: 6 examples, 0 failures; image/header checks filtered to aarch64: 2 examples, 0 failures; host/loader/small-target checks: 17 examples, 0 failures; source-initializer check: 1 example, 0 failures. Outside it, crystal spec spec/run --example x86_64: 31 examples, 0 failures/errors/pending; full crystal spec with ZEPHYR_SRC and LD_LIBRARY_PATH=/usr/lib64: 1423 examples, 0 failures/errors, 62 pending. crystal tool format --check passes. The app prints "efi app: started", "efi app: devicetree found", "efi app: load options \"console=ttyAMA0\"", then "VM: guest powered off" (52 KiB backed). Entry objdump shows relative BL to guest_efi_main at 0x126c. Firmware/app have no ELF relocations. The source initializer checker now understands compile-time annotations while still rejecting executable module statements. All aarch64 builds/runs used BQ2's seed; x86 builds/runs were outside it. Required full boot suites ran serially.

Size: 300 additions, 53 removals outside specs/fixtures, 353 changed lines including 75 README additions/removals; net +247. Above the approximate 250-line target, below the 400-line stop. Both maintained Glint PE sizes unchanged: aarch64 275456 bytes, x86_64 258560 bytes. Firmware remains 20992 bytes; new app 8704 bytes. llvm-nm on release firmware: largest GuestEFI.application 1752 bytes, Fdt.walk 1072, install 812, load 700, guest_efi_main 152; all below 2048. App main 532. Maintained Glint's largest pre-existing Matcher.result stays 8404 bytes Arm / 11410 x86; no new/increased function exceeds 2048 in those builds. An optional full Glint --release link fails on undefined memmove from unchanged NativeTable.build; no successful linked release Glint is claimed. The requested external report records this and execution/search qualifications. Leaf check-in: bcac3a9d7f user: x86-1-glint tags: slice/6.5a-ii-2b

05:24
Merge 6.5a (ii) part 2a: the PE header fix and a shared PE loader

Reviewed against docs/tasks/6.5a-ii-split.md part 2a; verdict merge. A section with no raw data now gets PointerToRawData 0 (efi.lds computes it; crt0.S writes it), as the PE format specifies. Linking the same objects with the old and new header gives byte-identical results for all nine maintained images, so only all-BSS guests change; 3.6's parser is unchanged and its spec now covers both header shapes. boot/pe_loader.cr holds the section copy and DIR64 relocation that GuestSpace#load did, over caller-supplied memory, for the guest firmware to share in 2b. 196 changed non-spec lines, 87 of them removals; net +22. Codex ran, after the last change, the aarch64 boot suite in BQ2's seed (38 examples) and the x86_64 one outside it (31), 0 failures each, the full host suite (1,419 examples, 0 failures), and the format check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KMXZyLk8eDgCjvQ9hX check-in: 935da91f88 user: x86-1-glint tags: trunk

Changes
Unified Diff Side-by-Side Diff Patch
Changes to boot/efi.cr.
Changes to boot/guest_fdt.cr.
Changes to boot/guest_image.cr.
Changes to boot/vcpu.cr.
Changes to guest/efi/README.md.
Added guest/efi/application.cr.
Changes to guest/efi/entry_aarch64.S.
Changes to guest/efi/main.cr.
Changes to guest/efi/table.cr.
Added guest/test/efi_app.cr.
Added guest/test/efi_entry.S.
Added spec/guest_efi_application_spec.cr.
Changes to spec/guest_efi_spec.cr.
Changes to spec/image_initialization_spec.cr.
Changes to spec/run/guest_efi_spec.cr.
Changes to src/glint/run/esp.cr.
Changes to src/glint/run/runner.cr.
Changes to tools/glint_build.cr.
Changes to tools/glint_run.cr.