Repository navigation
Conversation
session_lifecycle typed `detach /system/bin/hangupholder` as 32 key presses back to back, 64 set-1 bytes, into QEMU's PS/2 queue, which holds 16 and drops the rest without a word. A guest the host starves drains it late, so on loaded hosts the shell got `detach /pholder` (#1057) or `/sysngupholder` (#1150) and the row stalled waiting for the holder. Where the keys drop, staged deterministically on the dev host: the whole line sent as one `input-send-event`, so QEMU queues it before any vCPU reads port 0x60. ps2server read 20 bytes in all: Ctrl+N's 4 and 16 of the line's 64, with every byte it read decoded (bytes = keys, 0 undecoded, 0 overruns). The other 48 never reached the guest. Typed one QMP call per key on an idle host, it read all 68. The guest loses nothing it is given; the harness typed past the device. Each key now goes once the panel has changed since the one before, so at most one key's press and release, and a space's, are in the queue. A key the panel never shows within a liveness ceiling reds by name. `a-command-typed-through-qmp-arrives-truncated-under-host-load` is closed: its exit asked where the keys drop and for the fix there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The overflow-wedge record still described the kernel's i8042 ISR. One session_lifecycle boot on jan-pc overflowed QEMU's queue on purpose and the input path delivered the next line whole; recorded as one boot, which the record's rate does not let decide anything. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r0 of #1169 at f7569c4Architecture. The diagnosis is sound, and the fix belongs in the harness. QEMU's 16-byte PS/2 queue drops bytes once it is full. In The problem is that the condition being waited on is not the event the code says it is. BLOCKERS
SUGGESTIONS
Evidence
SEND BACK |
…'s clock - The comparison was the whole screen, and the taskbar's readout redraws every second, so a tick answered for a key that never arrived. Only the screen's top half is compared now: the terminal is the only window, at the top-left margin, and the taskbar is at the bottom. - A space moves the terminal's inverse-cell cursor like any key, so its exemption goes and every key is waited for. - The first key waits for one frame seen twice, so the window's own first paint is not taken for it. - `QmpInput::keys` says that QEMU's PS/2 queue holds 16 bytes. - The wedge record's count was read off the last line printed before the spawn; by guest timestamps it is 86, 4 + 16 + 2 + 64, one queue of the batch kept and every later byte taken. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r1 of #1169 at a0fb2d9ArchitectureUnchanged from r0. The harness paces a host-side injector to QEMU's 16-byte PS/2 queue, using a local Previous blockers
S1 (the Evidence
FindingsSUGGESTION S1.
That is at most 8 bytes, under the queue's 16, so nothing is lost. But the comment and the PR body's "at most one key's press and release" claim more than the code guarantees. A cheap fix is to word the comment as what it does: LAND |
Problem
session_lifecycletypeddetach /system/bin/hangupholderas 32 key presses back to back: 64set-1 bytes into QEMU's PS/2 queue, which holds 16 and drops the rest without a word. A guest the
host starves drains it late, so on loaded hosts the shell got
detach /pholder(#1057) or/sysngupholder(#1150), and the row stalled waiting for the holder(
issues/a-command-typed-through-qmp-arrives-truncated-under-host-load.md).Where the keys drop
Two stagings with scratch hooks, neither committed:
input-send-event, on the dev host (before the rule moved x86 guests tojan-pc). QEMU queues the line before any vCPU reads port 0x60, so this is the worst case of a
starved guest. ps2server, saying its counters every wake, read 20 bytes: Ctrl+N's 4 and 16 of the
line's 64, every one decoded (bytes = keys, 0 undecoded, 0 overruns). The shell got a truncated
line.
The guest loses nothing it is given; the harness typed past the device.
Change
The line is typed one key at a time, each once the screen's top half has changed since the key
before. Every key, a space included, moves the terminal's inverse-cell cursor, so at most one key's
press and release are in the queue. Only the top half is compared: Ctrl+N's terminal is the only
window and sits at the top-left, while the taskbar's readout at the bottom redraws every second
whatever is typed and would acknowledge a key the guest never saw. Before the first key the frame
must hold still once, so the window's own first paint is not taken for a key. A key the panel never
shows within 10 s (a liveness ceiling) reds by name: "the panel never changed after {key} of
{text} was typed".
Evidence
On jan-pc (KVM), through
qemu-remote.sh:session_lifecycleata0fb2d9e2, this head: PASS, exit 0 (r1remote-ps2-r1.log). At3610f2d50, round 0's version: PASS (r0remote-ps2.log.gz).d0dc31069(scratch branch, this head with the tenth key,y, neverpressed): FAIL, exit 1, "the panel never changed after "y" of "detach /system/bin/hangupholder" was
typed", 16 s in. The taskbar's clock ticked during that wait, so the comparison ignores it.
Enter and typed the line paced: PASS. 132 key events had been typed up to the holder's spawn and
ps2server had read 86 bytes (4 + 16 + 2 + 64), so the batch was nearly all dropped by QEMU. The input path then went
on and delivered the paced line whole. That is one boot of
issues/the-console-input-path-can-stop-after-a-ps2-overflow.md's staging shape on the currentuserland ps2server, recorded there.
Logs: r0 https://github.com/ToyOSOrg/evidence/tree/5c1afc674a269ba801b3852a76f9818d46b4f80f/pr-1169/r0,
r1 https://github.com/ToyOSOrg/evidence/tree/51bd55331bf447c6e4dbdf6e5e1b34019934cc84/pr-1169/r1
Checks
cargo test --test toyos-build --no-run: exit 0. No host test reaches the typing; the guest runsabove are its evidence.
🤖 Generated with Claude Code