gfx: the chosen resolution reaches every head, and the greeting stops racing
Two things.
**The F8 resolution now applies to the other displays as well.** It already
reached them once vgpud started -- that was the last commit but one -- but not
before: choosing 1024x768 changed the screen it was chosen on and left the
other at 1280x800, so the menu and then the splash appeared on it as a small
rectangle in the middle of a larger black one. Which is a fair reading of "the
resolution change is not changing resolution".
The resolution offered in that menu is a statement about the machine's display,
not about one adapter of it, so both stages before vgpud now follow it:
the loader mirrors_match() puts every mirror GOP into the primary's mode,
called from mirrors_show() so it cannot be forgotten at a new
call site. Two integer comparisons in the common case.
the kernel setup_scanout() takes gfx's dimensions over GET_DISPLAY_INFO's.
Same argument as vgpud's bring_up(): the host window's size is
a fact about QEMU, and the console's mode is the one somebody
chose.
**And the greeting is no longer a race.** "Welcome to SchOS!" was printed after
every job had been started, including the shell on the console -- so which of
the two reached the screen first was up to the scheduler, and it went both ways
about evenly. A boot that sometimes greets you above the prompt and sometimes
below it does not read as two orderings of one boot; it reads as a line printed
by mistake.
schinitd now holds back the job that owns the console -- `own_tty`, which is
exactly the job whose output lands there -- until after the greeting is
written. That is enough to settle it: this process writes the line, and only
then asks PID 1 to spawn the shell, so the fork has not happened yet. Nothing
waits on it that was not already waiting.
Verified: F8 -> Resolution -> 1024x768 -> boot, with the virtio head
screendumped over QMP at three points during startup and once at the prompt --
1024x768 throughout, and byte-identical to the stdvga head. Three consecutive
boots put the greeting at the same offset, ahead of the prompt every time.
Both supported configurations: one boot each, no traps, no panics, socktest and
memfdtest green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
182cc76588
commit
9ab8a7a426
4 changed files with 95 additions and 1 deletions
|
|
@ -138,6 +138,15 @@ system information, the splash, each segment of the kernel load. Blt rather
|
|||
than a second framebuffer to draw into, because a virtio GOP does not have one
|
||||
— the same fact that made a virtio-only machine reboot-loop.
|
||||
|
||||
Each stage puts the other displays into the mode the F8 menu chose, rather than
|
||||
leaving them in whatever the firmware picked. Without that, choosing 1024×768
|
||||
changed the screen it was chosen on and left the other one at 1280×800, showing
|
||||
the menu and then the splash as a small rectangle in the middle of a larger
|
||||
black one. The loader sets the mode on each mirror GOP; the kernel's virtio
|
||||
driver takes `gfx`'s dimensions over `GET_DISPLAY_INFO`'s, for the same reason
|
||||
`vgpud` does — the host window's size is a fact about QEMU, not about the
|
||||
machine.
|
||||
|
||||
**The kernel.** `display_mirror_console()` copies the console's newly-drawn
|
||||
rows to the display class whenever that is a *different screen*. Cheap because
|
||||
`gfx` remembers which rows those were: a line of boot text is one cell-row
|
||||
|
|
|
|||
Loading…
Reference in a new issue