Login
Check-in [90f09b3221]
Login

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

Overview
Comment:Merge 5.2 and 5.3 (x86_64): one device dispatcher, and a 16550 UART on ports

Reviewed against docs/tasks/5.2.md; verdict merge for both slices.

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: 90f09b3221ba5da445392736593994778c7e0a27757b1ec086f50d7d9af7d322
User & Date: x86-1-glint 2026-11-09 21:04:15.114
Context
2026-11-09
21:05
docs/boots: 5.3's emulated UART, recorded

Claim: the boots page gains 5.2/5.3's milestone. The test guest prints through a 16550 at port 0x3f8, emulated by Glint's device dispatcher, and keeps one line on the console call.

Passage: the maintainer's 'more ascii animations of glint as it progresses, please' (ocx-console 40c80385db).

Demonstration: the cast is the file bin/glint-run wrote on x86-1 at trunk 90f09b3221 for the command in its entry, which exited 0. Its log shows the guest's lines in order and 'VM: guest powered off'.

Size: one cast, one entry in boots.js.

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

21:04
Merge 5.2 and 5.3 (x86_64): one device dispatcher, and a 16550 UART on ports

Reviewed against docs/tasks/5.2.md; verdict merge for both slices.

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

21:04
5.3 (x86_64): An emulated 16550 UART on ports

Claim: Glint::Uart16550 is enough of a 16550 for a polling guest, registered with 5.2's dispatcher at ports 0x3f8-0x3ff in hypervisor mode. THR writes go to Glint's console through 4.5's filter. LSR always reports THRE and TEMT, and IIR reads no interrupt pending. IER, LCR, MCR, SCR and the divisor latches (under DLAB) hold what was written, and RBR reads 0 with data-ready clear; input comes in Phase 6. The test guest now writes its lines through the UART, polling LSR and then writing THR. It keeps one line on GLINT_CONSOLE_WRITE, 'test guest: console call works', so 4.4's path stays tested. guest/test/README.md documents both.

Passage: Hailperin ยง7.5.2, paraphrased: a trapped device access becomes emulation. Phase 5's demo: the test guest prints through the emulated UART.

Demonstration: on x86-1, bin/glint-run x86_64 --mode hypervisor --guest build/x86_64/guest/test.efi printed 'test guest: started' and 'test guest: PSCI version 0x0000000000000002' through the UART, then 'test guest: console call works' through the call, then 'VM: guest powered off' and the prompt. spec/uart16550_spec.cr drives the model over a fake console: THR filtering, LSR, DLAB, IIR. spec/run/uart16550_spec.cr checks the boot's order. With the dispatcher, vcpu, guest-call, guest-build and image-check specs and the phase 4, 5.1 and vcpu boots: 47 examples, 0 failures, 4 pending (aarch64). The 16550 register layout follows QEMU 11.1.2 hw/char/serial.c. Codex wrote it from docs/tasks/5.2.md; the reviewer made no changes. Review notes: each guest byte costs at least two VM exits (LSR poll, THR write) against 4.4's limit of 1000, which a chattier guest will reach. And Vcpu#serve tests the SVM exit code 0x7b directly; 4.3a should move that behind the vCPU's reason.

Size: +104/-4 non-spec lines; largest newly linked function Devices.register, 1,554 bytes; BOOTX64.EFI 201,216 to 209,408 bytes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KMXZyLk8eDgCjvQ9hX Leaf check-in: 4a2fb0fb6a user: x86-1-glint tags: slice/5.2-5.3-x86_64

20:31
Task 5.2 and 5.3 (x86_64): one device dispatcher, and a 16550 UART on ports

Claim: docs/tasks/5.2.md hands out 5.2 (a fixed, heap-free table of device ranges in two spaces, guest-physical and I/O ports, with dispatch) and 5.3 (a polling 16550 at 0x3f8), as two check-ins on one branch. The test guest prints through the UART, keeping one line on GLINT_CONSOLE_WRITE. On x86_64 only the port space is used: a memory access of unknown size is refused, not guessed, until the maintainer answers glint b142e85cea.

Passage: docs/WORKFLOW.md, Handing out a slice, step 1.

Demonstration: QEMU 11.1.2 svm.h lines 30-39 give the IOIO exit-info bits, and svm_helper.c lines 718-725 put the next RIP in EXITINFO2 and the port in bits 16-31.

Size: one new task.

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

Changes
Unified Diff Side-by-Side Diff Patch
Added boot/devices.cr.
Changes to boot/guest_calls.cr.
Added boot/port_io.cr.
Added boot/uart16550.cr.
Changes to boot/vcpu.cr.
Changes to guest/test/README.md.
Changes to guest/test/call_x86_64.S.
Changes to guest/test/main.cr.
Added spec/devices_spec.cr.
Added spec/port_io_spec.cr.
Added spec/run/uart16550_spec.cr.
Added spec/uart16550_spec.cr.
Changes to spec/vcpu_spec.cr.