summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--STATE-CURRENT.md56
-rw-r--r--wiki/.publish-manifest.json110
-rw-r--r--wiki/Execution-Frontier.md48
-rw-r--r--wiki/Execution-Plane.md21
-rw-r--r--wiki/FAQ.md18
-rw-r--r--wiki/Graphics-Execution.md58
-rw-r--r--wiki/Host-Module.md15
-rw-r--r--wiki/OpenGL.md33
-rw-r--r--wiki/Physical-GPU-Backend.md15
-rw-r--r--wiki/Project-Goals.md7
-rw-r--r--wiki/Project-Plan.md23
-rw-r--r--wiki/Project-Status.md35
-rw-r--r--wiki/System-Overview.md23
13 files changed, 263 insertions, 199 deletions
diff --git a/STATE-CURRENT.md b/STATE-CURRENT.md
index 2fb0241..3cf5c30 100644
--- a/STATE-CURRENT.md
+++ b/STATE-CURRENT.md
@@ -1,5 +1,61 @@
# Open-IOV Current State
+> **Snapshot: 2026-11-15 ~13:55 (SESSION 157 continued; HEAD `692a7eb0` ==
+> `vgpu/master`; the working tree carries only the campaign parameter file
+> `tools/guest-diag/params-r1624.txt`; supersedes the 2026-11-14 ~10:55 entry
+> below).**
+> The graphics front moved two rungs since the last snapshot: the **MME
+> multi-part gate closed** (multi-frame keep-windows; the part-launch poison
+> eliminated; the 2799-word pack completes; `MME-PACK-REARM` fires; the fixed-CB
+> region is aliased; the released calls run macros through to `DRAW_IAB`,
+> `mac=0x22`), and the **DS stage image is authored and live**. The DS gate was
+> pinned precisely: the synthesized prelude's j1 override is overwritten at
+> execution time by the window's own later `0x2054` slot-1 bind pair, so the
+> module now authors a 640-B VTG SPH at `family+0x900` (`SPH-AUTHOR ... first
+> word 020a0481 w6=0000f00f`) and **rewrites the window's own slot-1 pair
+> operand** to that page (`SPH-SLOT1-REWRITE old=0x01e00300 new=0x01e00900`,
+> `692a7eb0`). The DS latch now reads the authored image for both vertex
+> slots: `DS-IMAGE st0 w0=020a0481 code=ff007321 st1 w0=020a0481
+> code=ff007321`, and the DS value fell **`0x86040626 -> 0x84000420`**
+> (`M_PIPE_STAGE TI` + SPH5/SPH10/SPH18) — reproduced on two boots (c749,
+> c754). A hostile second-family window (a 640-B candidate with `w6=0`, whose
+> range overlaps `+0x900`) is guarded: the candidate scan rejects `w6==0` and
+> falls back to the builtin image (c748's `badf1201` poison class).
+>
+> **What remains is the draw-issue call and the stores.** The 728-B draw
+> window's released macros are `0x33/0x39/0x1/0x0`; `DRAW_IAB` (`mac=0x22`) is
+> not among them, so the draws still do not store (`output retirement wait:
+> 0/1030`, `wrote=0`, `px0=0`). c716 ran `0x22` on a 324-B window whose held
+> calls had been released by a cross-lane `MME-PACK-REARM` before the launch;
+> the next levers are the 324-B window class or the window's own call/SA slot
+> census. Fixes along the way: the pump atomic-sleep hoist (the r707e VAS
+> verify moved out of `svc.chan_lock`, with `in_atomic()` guards — c741 showed
+> the `BUG: scheduling while atomic`), the DDX ring-head tracker decode
+> (`sema_ddx_tracker_auth`) plus the `sema_gr_scan_top` raise to 12 GiB, the
+> default-off MME pack carrier, and `timeout -k` in the mission tooling.
+>
+> **X/GL start remains the run-rate limiter.** The per-boot first-generation
+> lottery is frequent: c756 reached authoring/pack-parts only, c757/c758 saw no
+> chain (and c753 none) — the follow-up A/B boots mostly did not survive X plus
+> the draw-synth window. Remaining named gates: the stage type/context bits
+> (SPH5/SPH10/SPH18), the `mac=0x22` call and stores, then the window/screen
+> present.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's red
+> class is D2H-stage with release-discipline fixes staged; the SESSION 143
+> Vulkan fence regression is not re-measured.
+>
+> Live at check (read-only): host uptime 3 h 53 m (fresh boot 2026-11-15
+> ~10:03); `vgsp` loaded (refcount 0) + mdev
+> `c0ba3c27-7923-4131-a127-759315bd7e72` + QEMU cycle c758 (PID 41318, 12 GiB
+> file-backed guest, kvmfr ivshmem, since 13:27); display-channel polls
+> advancing (X alive); `gl_frames` 2/2 black (`px0=0`); `nvidia-smi` reports no
+> GPU (the claim is held); pstore empty; no Xid/Oops; no reboot during the
+> check. The open-iov.org wiki was refreshed alongside this snapshot (11 pages,
+> revs 24155-24165; 68 pages audited, 0 problems).
+>
> **Snapshot: 2026-11-14 ~10:55 (SESSION 157 continued; HEAD `339da842` ==
> `vgpu/master`; working tree clean; supersedes the 2026-11-13 ~11:10 entry
> below).**
diff --git a/wiki/.publish-manifest.json b/wiki/.publish-manifest.json
index eb6b430..284637d 100644
--- a/wiki/.publish-manifest.json
+++ b/wiki/.publish-manifest.json
@@ -64,11 +64,11 @@
},
"FAQ": {
"file": "FAQ.wiki",
- "new_revid": 24149,
- "old_revid": 24138,
- "source_sha": "e4f67b8e33bc3243",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:20Z",
+ "new_revid": 24157,
+ "old_revid": 24149,
+ "source_sha": "d3693204ba2e2047",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:13Z",
"title": "FAQ"
},
"GMMU Multi-Tenant Protection": {
@@ -127,11 +127,11 @@
},
"Graphics Execution": {
"file": "Graphics-Execution.wiki",
- "new_revid": 24145,
- "old_revid": 24134,
- "source_sha": "7270693e3ff2d8f8",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:14Z",
+ "new_revid": 24158,
+ "old_revid": 24145,
+ "source_sha": "0bec237d98b7f442",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:13Z",
"title": "Graphics Execution"
},
"Guest Driver Lifecycle: A Field Guide": {
@@ -226,11 +226,11 @@
},
"OpenGL": {
"file": "OpenGL.wiki",
- "new_revid": 24146,
- "old_revid": 24135,
- "source_sha": "d7cf31994f4f175f",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:16Z",
+ "new_revid": 24160,
+ "old_revid": 24146,
+ "source_sha": "08c583681fea9d54",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:14Z",
"title": "OpenGL"
},
"Performance": {
@@ -244,38 +244,38 @@
},
"Physical GPU Backend and Guest Wiring": {
"file": "Physical-GPU-Backend.wiki",
- "new_revid": 24151,
- "old_revid": 24140,
- "source_sha": "21240b6fe98f105c",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:23Z",
+ "new_revid": 24161,
+ "old_revid": 24151,
+ "source_sha": "2fd146b3a6c7a2e2",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:15Z",
"title": "Physical GPU Backend and Guest Wiring"
},
"Project Goals": {
"file": "Project-Goals.wiki",
- "new_revid": 24152,
- "old_revid": 24141,
- "source_sha": "b1ce8081b88564b4",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:25Z",
+ "new_revid": 24162,
+ "old_revid": 24152,
+ "source_sha": "33b028e78eeec590",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:15Z",
"title": "Project Goals"
},
"Project Plan": {
"file": "Project-Plan.wiki",
- "new_revid": 24153,
- "old_revid": 24142,
- "source_sha": "0cb4313944736f12",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:26Z",
+ "new_revid": 24163,
+ "old_revid": 24153,
+ "source_sha": "49a3a98f1b8de158",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:16Z",
"title": "Project Plan"
},
"Project Status": {
"file": "Project-Status.wiki",
- "new_revid": 24144,
- "old_revid": 24133,
- "source_sha": "4ac8dcb2cf7e27ff",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:13Z",
+ "new_revid": 24164,
+ "old_revid": 24144,
+ "source_sha": "ed9bb8b3c0d564f5",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:16Z",
"title": "Project Status"
},
"RPC Message Format": {
@@ -289,11 +289,11 @@
},
"System Overview": {
"file": "System-Overview.wiki",
- "new_revid": 24154,
- "old_revid": 24143,
- "source_sha": "3c1d9ea91e55ad1d",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:27Z",
+ "new_revid": 24165,
+ "old_revid": 24154,
+ "source_sha": "3fa9fc93813ae23a",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:17Z",
"title": "System Overview"
},
"Template:About message": {
@@ -325,11 +325,11 @@
},
"The Execution Frontier": {
"file": "Execution-Frontier.wiki",
- "new_revid": 24147,
- "old_revid": 24136,
- "source_sha": "d20ea2d0fe872b06",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:17Z",
+ "new_revid": 24155,
+ "old_revid": 24147,
+ "source_sha": "1376a274a45b302c",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:11Z",
"title": "The Execution Frontier"
},
"The Guest Stack and CUDASW": {
@@ -343,20 +343,20 @@
},
"The Host Module (vgsp.ko)": {
"file": "Host-Module.wiki",
- "new_revid": 24150,
- "old_revid": 24139,
- "source_sha": "01db3c718be37c24",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:22Z",
+ "new_revid": 24159,
+ "old_revid": 24150,
+ "source_sha": "cc9ef114a2cdcf4c",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:14Z",
"title": "The Host Module (vgsp.ko)"
},
"The vGSP Execution Plane (vEP)": {
"file": "Execution-Plane.wiki",
- "new_revid": 24148,
- "old_revid": 24137,
- "source_sha": "d9a53fc06056cb90",
- "summary": "2026-11-14 status refresh: direct-GL submission decoded (macro-driven), push rescues land, draw-state push reaches the engine; MME multi-part completion is the wall; X start lottery is the limiter",
- "timestamp": "2026-11-14T15:54:19Z",
+ "new_revid": 24156,
+ "old_revid": 24148,
+ "source_sha": "4303167a355bf82f",
+ "summary": "2026-11-15 status refresh: DS stage image authored+live (st0=st1=020a0481; DS 0x86040626->0x84000420, two boots); draw-issue mac=0x22 and stores remain; X start lottery limits the run rate",
+ "timestamp": "2026-11-15T19:09:12Z",
"title": "The vGSP Execution Plane (vEP)"
},
"UVM in the Guest": {
diff --git a/wiki/Execution-Frontier.md b/wiki/Execution-Frontier.md
index 5f0acfc..1425aaf 100644
--- a/wiki/Execution-Frontier.md
+++ b/wiki/Execution-Frontier.md
@@ -14,8 +14,7 @@
> [`../docs/04-implementation/03-execution-frontier.md`](../docs/04-implementation/03-execution-frontier.md);
> the docs tree wins on disagreement.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree.
+Status: 2026-11-15, tree `master @ 692a7eb0`.
Tags: `[live]` observed; `[wip]` partial; `[wall]` current blocker; theories
are labelled as such.
@@ -120,16 +119,20 @@ keep-windows land, the part-launch poison is eliminated (the client's own
real fault; they are redirected to a mapped scratch slot), the 2799-word pack
completes (2799/2799), the first `MME-PACK-REARM` fires, the fixed-CB region
is aliased, and `DRAW_IAB` (`mac=0x22`) runs with the SPH-BIND prelude intact
-(84 words) and the DS stage VAs populated. What is missing is
-**window/screen pixels through the NVIDIA path**: the DS stage-0/1 image is
-the last named gate (the synthesized binds read `family+0x900`, which is zero
-in the live family page, while the client's VTG SPH image is at
-`family+0x600`), so the draw never stores (`wrote=0`, `px0=0`); the
-window/screen present path is unproven, glxgears' window is black, and a
-synchronous window draw wedges X on some boots. The per-boot binding and X
-first-generation start lottery are now the dominant throughput limiter. The
-guest Vulkan pipeline's inline-to-memory upload arm is its gap. The full
-picture lives on [`Graphics-Execution.md`](Graphics-Execution.md).
+(84 words) and the DS stage VAs populated. The **DS stage-0/1 image is now
+authored and live**: a VTG SPH at `family+0x900` (`SPH-AUTHOR`, first word
+`020a0481`) is what both vertex slots fetch (`DS-IMAGE st0=st1=020a0481
+code=ff007321`), the window's own later slot-1 bind is rewritten to it, and
+the DS value fell `0x86040626 -> 0x84000420` (reproduced on two boots). What
+is missing is **window/screen pixels through the NVIDIA path**: the remaining
+DS bits are stage type/context (SPH5/SPH10/SPH18), the 728-B draw window's
+released macros (`0x33/0x39/0x1/0x0`) do not include `DRAW_IAB` (`mac=0x22`),
+so the draw still does not store (`wrote=0`, `px0=0`); the window/screen
+present path is unproven, glxgears' window is black, and a synchronous window
+draw wedges X on some boots. The per-boot binding and X first-generation
+start lottery are now the dominant throughput limiter. The guest Vulkan
+pipeline's inline-to-memory upload arm is its gap. The full picture lives on
+[`Graphics-Execution.md`](Graphics-Execution.md).
No breadth beyond these is claimed: Windows guests, migration and performance
numbers remain planned.
@@ -198,10 +201,12 @@ captures and reaches the engine. The MME chain now completes and executes the
draw macro: multi-frame keep-windows land, the 2799-word pack completes, the
first `MME-PACK-REARM` fires, the fixed-CB region is aliased, and `DRAW_IAB`
(`mac=0x22`) runs with the SPH-BIND prelude intact and the DS stage VAs
-populated. The remaining gap is the **DS stage-0/1 image** (the synthesized
-binds read `family+0x900`, which is zero in the live family page, while the
-client's VTG SPH image is at `family+0x600`; the `+0x600` bind is in flight)
-so the draw stores. glxgears' window is black, a window draw wedges X on some
+populated. The **DS stage-0/1 image is now authored and live** (a VTG SPH at
+`family+0x900`, fetched by both vertex slots as `st0=st1=020a0481`; DS fell
+`0x86040626 -> 0x84000420`, reproduced on two boots); the remaining bits are
+stage type/context (SPH5/SPH10/SPH18), and the 728-B window's released macros
+(`0x33/0x39/0x1/0x0`) do not include the `DRAW_IAB` call, so the draws still
+do not store. glxgears' window is black, a window draw wedges X on some
boots, and the per-boot binding plus X first-generation start lottery is the
dominant throughput limiter
([`Graphics-Execution.md`](Graphics-Execution.md)).
@@ -218,11 +223,12 @@ dominant throughput limiter
4. **Hold the acceptance battery** — vector-add, matrix-multiply and the
transformer kernel; each entry is accepted only on its own verification
output (`bad=0` + `STATUS OK`).
-5. **The graphics pixel frontier** — finish the DS stage-0/1 image bind
- (`family+0x600`) so the executed `DRAW_IAB` macro stores (`wrote>0`) at the
- bound render target, then make the window/screen present land, and reduce
- the per-boot binding/X start lottery so the proven off-screen frames become
- window pixels; the lanes, the walls and the milestone ladder are on
+5. **The graphics pixel frontier** — the DS stage image is authored and live
+ for both vertex slots; next get the draw-issue `DRAW_IAB` (`mac=0x22`) call
+ into the window so it stores (`wrote>0`) at the bound render target, then
+ make the window/screen present land, and reduce the per-boot binding/X
+ start lottery so the proven off-screen frames become window pixels; the
+ lanes, the walls and the milestone ladder are on
[`Graphics-Execution.md`](Graphics-Execution.md).
## 7. Theories, resolved
diff --git a/wiki/Execution-Plane.md b/wiki/Execution-Plane.md
index 7f6dd6b..567f41c 100644
--- a/wiki/Execution-Plane.md
+++ b/wiki/Execution-Plane.md
@@ -8,8 +8,7 @@
> when the two disagree, the docs tree wins. Front door:
> [`../docs/README.md`](../docs/README.md).
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[live]` proven with the
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` proven with the
stock guest driver; `[gated]` implemented, default-off or parameter-gated;
`[wip]` partial; `[wall]` current blocker; `[target]` named success latch;
`[planned]` designed, not built.
@@ -166,13 +165,17 @@ guest: push + QMD + GPFIFO entry + doorbell (BAR0 0x88704)
chain now completes and executes the draw macro: multi-frame keep-windows
land, the 2799-word pack completes, the first `MME-PACK-REARM` fires, the
fixed-CB region is aliased, and `DRAW_IAB` (`mac=0x22`) runs with the
- SPH-BIND prelude intact (84 words) and the DS stage VAs populated. No
- non-black **window/screen** frame has been produced through the NVIDIA path
- yet: the remaining gate is the DS stage-0/1 image (the synthesized binds
- read `family+0x900`, zero in the live family page, while the client's VTG
- SPH image is at `family+0x600`), so the draw never stores (`wrote=0`,
- `px0=0`); the window/screen present is unproven, and the per-boot binding
- plus X first-generation lottery is the throughput limiter. Those are the
+ SPH-BIND prelude intact (84 words) and the DS stage VAs populated. The DS
+ stage-0/1 image is now authored and live: a VTG SPH at `family+0x900`
+ (first word `020a0481`) is fetched by both vertex slots
+ (`DS-IMAGE st0=st1=020a0481`; DS fell `0x86040626 -> 0x84000420`,
+ reproduced on two boots). No non-black **window/screen** frame has been
+ produced through the NVIDIA path yet: the remaining DS bits are stage
+ type/context (SPH5/SPH10/SPH18), the 728-B draw window's released macros
+ (`0x33/0x39/0x1/0x0`) do not include the `DRAW_IAB` call, so the draw never
+ stores (`wrote=0`, `px0=0`); the window/screen present is unproven, and the
+ per-boot binding plus X first-generation lottery is the throughput limiter.
+ Those are the
named blockers. The lanes and the ladder are on
[`Graphics-Execution.md`](Graphics-Execution.md).
diff --git a/wiki/FAQ.md b/wiki/FAQ.md
index 37179ee..1035c5f 100644
--- a/wiki/FAQ.md
+++ b/wiki/FAQ.md
@@ -5,8 +5,7 @@
> [`../docs/09-reference/glossary-and-faq.md`](../docs/09-reference/glossary-and-faq.md);
> the docs tree wins on disagreement.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree.
+Status: 2026-11-15, tree `master @ 692a7eb0`.
## Project and positioning
@@ -57,12 +56,15 @@ captures and reaches the engine. The MME chain now completes and executes the
draw macro: multi-frame keep-windows land, the 2799-word pack completes, the
first `MME-PACK-REARM` fires, the fixed-CB region is aliased, and `DRAW_IAB`
(`mac=0x22`) runs with the SPH-BIND prelude intact and the DS stage VAs
-populated. Window and screen pixels are still the wall: the remaining gate is
-the DS stage-0/1 image (the synthesized binds read `family+0x900`, zero in
-the live family page, while the client's VTG SPH image is at `family+0x600`),
-so the draw never stores, glxgears' window is black, and the per-boot binding
-plus X first-generation start lottery is the throughput limiter. The guest
-Vulkan pipeline runs end to end (device
+populated. The DS stage-0/1 image is now authored and live: a VTG SPH at
+`family+0x900` (first word `020a0481`) is fetched by both vertex slots
+(`st0=st1=020a0481`), and the DS value fell `0x86040626 -> 0x84000420`
+(reproduced on two boots). Window and screen pixels are still the wall: the
+remaining DS bits are stage type/context (SPH5/SPH10/SPH18), the 728-B draw
+window's released macros (`0x33/0x39/0x1/0x0`) do not include the `DRAW_IAB`
+call, so the draw never stores, glxgears' window is black, and the per-boot
+binding plus X first-generation start lottery is the throughput limiter. The
+guest Vulkan pipeline runs end to end (device
→ command buffer → fence → readback) but frames are black. See
[`OpenGL.md`](OpenGL.md), [`Vulkan.md`](Vulkan.md) and
[`Graphics-Execution.md`](Graphics-Execution.md).
diff --git a/wiki/Graphics-Execution.md b/wiki/Graphics-Execution.md
index 5fd4943..31ad576 100644
--- a/wiki/Graphics-Execution.md
+++ b/wiki/Graphics-Execution.md
@@ -12,8 +12,7 @@
> [`../docs/04-implementation/04-real-render-walls.md`](../docs/04-implementation/04-real-render-walls.md)
> (the measured walls); the docs tree wins on disagreement.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[live]` observed end to
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` observed end to
end; `[wip]` partially built; `[wall]` current blocker; `[target]` defined
success state; `[planned]` designed, not built.
@@ -124,14 +123,19 @@ fidelity:
broke its kept/final count (`444ae2c1`), and the stage block was silently
skipped by a double-counted budget; with both fixed the prelude emits 84
words and the DS stage VAs populate (one validated boot carried the full
- post-REARM chain, `mac=0x22` and `DS 86040624`). The remaining gap is the
- **DS stage-0/1 image**: the synthesized binds read `family+0x900` (zero in
- the live family page) while the client's VTG SPH image is at
- `family+0x600`, so binding `+0x600` is the in-flight change. Stores still
- miss (`wrote=0`, `px0=0`), the window/screen present is still the frontier
- (§6), and the per-boot binding lottery (the GL client usually rides the X
- channel in indirect mode, and X start keeps a first-generation lottery) is
- the throughput limiter.
+ post-REARM chain, `mac=0x22` and `DS 86040624`). The **DS stage-0/1 image is
+ now authored and live**: the module writes a VTG SPH at `family+0x900`
+ (`SPH-AUTHOR`, first word `020a0481`), rewrites the window's own later
+ `0x2054` slot-1 bind to the authored page (`SPH-SLOT1-REWRITE`), and the DS
+ latch reads the authored image for both vertex slots (`DS-IMAGE
+ st0=st1=020a0481 code=ff007321`; the DS value fell
+ `0x86040626 -> 0x84000420`), reproduced on two boots. The remaining DS bits
+ are stage type/context (SPH5/SPH10/SPH18); the `DRAW_IAB` (`mac=0x22`) call
+ does not run in the 728-B draw window, whose released macros are
+ `0x33/0x39/0x1/0x0`, so stores still miss (`wrote=0`, `px0=0`). The
+ window/screen present is still the frontier (§6), and the per-boot binding
+ lottery (the GL client usually rides the X channel in indirect mode, and X
+ start keeps a first-generation lottery) is the throughput limiter.
## 4. The channel and object picture
@@ -190,9 +194,10 @@ swaps, and the GR backend no longer times out (the pair-close/pair-safe
frames and captured videos (45.4 s and 50 s), the RM write-lock holder
(Xorg in the DDX vidheap scrub wait) is fixed (`df6e71bb`), the X
DDX/ScreenInit stability walls are closed, and the direct-GL ring/USERD
- machinery is hardened. The MME pack now completes and the draw macro runs;
- the next step is the DS stage image so the draw stores, then the
- window/screen present path.
+ machinery is hardened. The MME pack completes and the draw macro runs, and
+ the authored DS stage image is live for both vertex slots; the next step is
+ the draw-issue macro (`mac=0x22`) and the stores, then the window/screen
+ present path.
During bring-up the module also carries a **diagnostics-only mirror** for apps
that spin on a shared progress word; it exists so a run can proceed while the
@@ -212,12 +217,17 @@ requires it switched off, along with any external poke.
MME overlay (`GR LAUNCH submitted` + OK). The 2799-word pack completes
(2799/2799), the first `MME-PACK-REARM` fires (engine-global completion
plus keep-done-across-recycle), the fixed-CB region is aliased, the
- released calls run macros, and `DRAW_IAB` (`mac=0x22`) executes. The
- prelude now emits 84 words and the DS stage VAs populate; the last named
- gate is the **DS stage-0/1 image**: the synthesized binds read
- `family+0x900` (zero in the live family page) while the client's VTG SPH
- image is at `family+0x600`, so the `+0x600` bind is in flight. Stores
- still miss (`wrote=0`, `px0=0`). Closed on the way: the QMD-carrier theory
+ released calls run macros, and `DRAW_IAB` (`mac=0x22`) executes on the 324-B
+ window class after a cross-lane `MME-PACK-REARM`. The **DS stage-0/1 image
+ is now authored and live**: a VTG SPH is written at `family+0x900`
+ (`SPH-AUTHOR`, first word `020a0481`) and the window's own `0x2054` slot-1
+ bind is rewritten to it (`SPH-SLOT1-REWRITE`), so the DS latch reads
+ `st0=st1=020a0481 code=ff007321` and the DS value falls
+ `0x86040626 -> 0x84000420` (reproduced on two boots). The remaining gates
+ are the stage type/context bits (SPH5/SPH10/SPH18) and the draw-issue call:
+ the 728-B draw window's released macros are `0x33/0x39/0x1/0x0`, the
+ `DRAW_IAB` (`mac=0x22`) call does not run, and stores still miss
+ (`wrote=0`, `px0=0`). Closed on the way: the QMD-carrier theory
(refuted: no QMD bit in the entry format, no QMD magic in 256 MiB BAR1)
and RT routing (the clear targets RT0 while the window binds RT1; RT0 bind
verified 16x with correct target/geometry, still 61/61 `wrote=0`). The
@@ -288,8 +298,9 @@ requires it switched off, along with any external poke.
| Multi-part MME keep-window: multi-frame windows admitted; the 2799-word pack completes (2799/2799) | `[live]` |
| Part-launch poison eliminated: client `SET_REPORT_SEMAPHORE`/`SET_NOTIFY` targets redirected to a mapped scratch slot (49 cycles, 0 poison, 0 MMU faults) | `[live]` |
| First `MME-PACK-REARM` captured (engine-global completion plus keep-done-across-recycle); fixed-CB region aliased; released calls run macros | `[live]` |
-| `DRAW_IAB` (`mac=0x22`) executes; SPH-BIND prelude emits 84 words; DS stage VAs populate | `[live]` (single validated boot) |
-| DS stage-0/1 image (synthesized binds read `family+0x900` = zero; the client's VTG SPH image is at `family+0x600`) | `[wall]` — `+0x600` bind in flight |
+| `DRAW_IAB` (`mac=0x22`) executes on the 324-B window class after a cross-lane `MME-PACK-REARM`; SPH-BIND prelude emits 84 words; DS stage VAs populate | `[live]` |
+| DS stage-0/1 image: a VTG SPH is authored at `family+0x900` and the window's own slot-1 bind rewritten to it; the DS latch reads `st0=st1=020a0481` (`0x86040626 -> 0x84000420`, two boots) | `[live]` |
+| Remaining DS bits (stage type/context: SPH5/SPH10/SPH18); the 728-B draw window's released macros (`0x33/0x39/0x1/0x0`) do not include `DRAW_IAB` (`mac=0x22`); stores `wrote=0` | `[wall]` |
| Window/screen present produces non-black window pixels | `[wall]` |
| X screen-init first-generation lottery (`modeNum` parity; only an immediately-post-boot X passes DDX DMA init; dominant throughput limiter) | `[wip]` |
| Non-black screen pixels from the emulated vGPU's 3D pipeline | `[wall]` |
@@ -306,8 +317,9 @@ requires it switched off, along with any external poke.
rendered-frame claim. GZDoom reaching `V_Init: allocate screen` proves the
client's GL init and the direct-GL GR lane, not the game loop or a
presented frame; the client's draw-state push reaches the engine, the MME
- program completes and the draw macro executes, but the DS stage image is
- not yet right, so its draws do not store and the window stays black.
+ program completes and the draw macro executes, and the authored DS stage
+ image is fetched by both vertex slots, but the 728-B window's draw-issue
+ call and the stores are still missing, so the window stays black.
* The engine-zero-write (NOWRITE) campaign is not a rendering result: it and
the draw census together proved the submission is macro-driven (no
method-grammar draw header exists), that RT routing is not the cause, and
diff --git a/wiki/Host-Module.md b/wiki/Host-Module.md
index 4557dbe..fa0b5a9 100644
--- a/wiki/Host-Module.md
+++ b/wiki/Host-Module.md
@@ -6,8 +6,7 @@
> source: [`../docs/03-architecture/06-host-module-and-hybrid-model.md`](../docs/03-architecture/06-host-module-and-hybrid-model.md);
> the docs tree wins on disagreement with this page.
>
-> Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes
-> in the working tree. Tags: `[live]` observed with
+> Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` observed with
> the stock guest driver; `[wip]` demonstrated live, being productized;
> `[gated]` implemented default-off behind supervised gates; `[wall]` known
> blocking limit; `[target]` designed, not built; `[planned]` roadmap.
@@ -142,10 +141,14 @@ engine with the golden MME overlay. The MME chain now completes and executes
the draw macro: multi-frame keep-windows land, the 2799-word pack completes,
the first `MME-PACK-REARM` fires, the fixed-CB region is aliased, and
`DRAW_IAB` (`mac=0x22`) runs with the SPH-BIND prelude intact and the DS stage
-VAs populated. The remaining GL gap is the DS stage-0/1 image (the synthesized
-binds read `family+0x900`, zero in the live family page, while the client's
-VTG SPH image is at `family+0x600`) and the window/screen present path, which
-currently stays black or wedges X.
+VAs populated. The DS stage-0/1 image is now authored and live: a VTG SPH at
+`family+0x900` (`SPH-AUTHOR`, first word `020a0481`) is fetched by both vertex
+slots, with the window's own slot-1 bind rewritten to it
+(`SPH-SLOT1-REWRITE`; DS `0x86040626 -> 0x84000420`, two boots). The remaining
+GL gap is the stage type/context bits (SPH5/SPH10/SPH18) plus the 728-B
+window's draw-issue call (`mac=0x22` is not among its released macros), so the
+draws still do not store, and the window/screen present path, which currently
+stays black or wedges X.
## 6. Debug parameters
diff --git a/wiki/OpenGL.md b/wiki/OpenGL.md
index 3d04e8e..f07765f 100644
--- a/wiki/OpenGL.md
+++ b/wiki/OpenGL.md
@@ -12,8 +12,7 @@
> [`../docs/03-architecture/02-guest-stack-and-cudasw.md`](../docs/03-architecture/02-guest-stack-and-cudasw.md)
> (the guest stack). The docs tree wins on disagreement.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[live]` observed with the
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` observed with the
stock guest driver; `[wip]` partial; `[wall]` current blocker; `[target]`
defined success state.
@@ -103,8 +102,9 @@ Rated honestly, against the milestone ladder in the plan:
| Multi-part MME keep-window: multi-frame windows admitted; the 2799-word pack completes (2799/2799) | `[live]` |
| Part-launch poison eliminated: client `SET_REPORT_SEMAPHORE`/`SET_NOTIFY` targets redirected to a mapped scratch slot (49 cycles, 0 poison, 0 MMU faults) | `[live]` |
| First `MME-PACK-REARM` captured (engine-global completion plus keep-done-across-recycle); fixed-CB region aliased; released calls run macros | `[live]` |
-| `DRAW_IAB` (`mac=0x22`) executes; SPH-BIND prelude emits 84 words; DS stage VAs populate | `[live]` (single validated boot) |
-| DS stage-0/1 image (synthesized binds read `family+0x900` = zero; the client's VTG SPH image is at `family+0x600`) | `[wall]` — `+0x600` bind in flight |
+| `DRAW_IAB` (`mac=0x22`) executes on the 324-B window class after a cross-lane `MME-PACK-REARM`; SPH-BIND prelude emits 84 words; DS stage VAs populate | `[live]` |
+| DS stage-0/1 image: a VTG SPH is authored at `family+0x900` and the window's own slot-1 bind rewritten to it; the DS latch reads `st0=st1=020a0481` (`0x86040626 -> 0x84000420`, two boots) | `[live]` |
+| Remaining DS bits (stage type/context: SPH5/SPH10/SPH18); the 728-B draw window's released macros (`0x33/0x39/0x1/0x0`) do not include `DRAW_IAB` (`mac=0x22`); stores `wrote=0` | `[wall]` |
| Window/screen present produces non-black screen pixels | `[wall]` |
| X screen-init first-generation lottery (`modeNum` parity; only an immediately-post-boot X passes DDX DMA init; dominant throughput limiter) | `[wip]` |
| 60 fps sustained, no forcing (M-GL4) | `[target]` |
@@ -139,13 +139,16 @@ client's draw-state push opens, captures and reaches the engine. The MME chain
now completes and executes the draw macro: multi-frame keep-windows land, the
2799-word pack completes (2799/2799), the first `MME-PACK-REARM` fires, the
fixed-CB region is aliased, and `DRAW_IAB` (`mac=0x22`) runs with the SPH-BIND
-prelude intact (84 words) and the DS stage VAs populated. The remaining gates
-are the **DS stage-0/1 image** (the synthesized binds read `family+0x900`,
-which is zero in the live family page, while the client's VTG SPH image is at
-`family+0x600`; the `+0x600` bind is in flight) so the draw stores, the
-window/screen present path (glxgears' window is black and a window draw can
-wedge X), and the per-boot binding/X first-generation start lottery — then the
-first rendered screen frame.
+prelude intact (84 words) and the DS stage VAs populated. The **DS stage-0/1
+image is now authored and live** (a VTG SPH at `family+0x900`, first word
+`020a0481`, with the window's own slot-1 bind rewritten to it): the DS latch
+reads `st0=st1=020a0481 code=ff007321` and the DS value falls
+`0x86040626 -> 0x84000420`, reproduced on two boots. The remaining gates are
+the stage type/context bits (SPH5/SPH10/SPH18), the draw-issue call (the
+728-B window's released macros are `0x33/0x39/0x1/0x0`, not `DRAW_IAB`), so
+the draw still does not store, the window/screen present path (glxgears'
+window is black and a window draw can wedge X), and the per-boot binding/X
+first-generation start lottery — then the first rendered screen frame.
## 6. What is not claimed
@@ -154,10 +157,10 @@ first rendered screen frame.
videos (45.4 s and 50 s) come from the off-screen pbuffer path (pbuffer ->
sysmem -> kvmfr ivshmem -> host reader), not from a windowed X screen
capture. The client's draw-state push reaches the engine, the MME program
- completes and the draw macro executes, but the DS stage image is not yet
- right so the draw never stores, a synchronous window draw wedges X, and X
- start retains a per-boot first-generation lottery. Those are the current
- walls.
+ completes and the draw macro executes, and the authored DS stage image is
+ fetched by both vertex slots; but the 728-B window's draw-issue call and the
+ stores are still missing, a synchronous window draw can wedge X, and X start
+ retains a per-boot first-generation lottery. Those are the current walls.
* GZDoom reaching `V_Init: allocate screen` is not a rendered-frame claim; it
proves the client's GL init and the direct-GL GR lane, not the game loop or
a presented frame.
diff --git a/wiki/Physical-GPU-Backend.md b/wiki/Physical-GPU-Backend.md
index ad033be..f050b1d 100644
--- a/wiki/Physical-GPU-Backend.md
+++ b/wiki/Physical-GPU-Backend.md
@@ -5,8 +5,7 @@
> guest-facing emulation. Canonical sources: [`../docs/03-architecture/08-physical-gpu-integration.md`](../docs/03-architecture/08-physical-gpu-integration.md)
> and [`../docs/03-architecture/11-physical-backend-guest-wiring.md`](../docs/03-architecture/11-physical-backend-guest-wiring.md); the docs tree wins on disagreement.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[live]` proven with the
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` proven with the
stock guest driver; `[gated]` implemented default-off; `[wip]` partially
built; `[wall]` current blocker; `[target]` planned end state.
@@ -110,7 +109,7 @@ FAIL a failed mutating operation parks the device in a locked fail-safe;
| Host RM client and first real engine work (static config, real objects, 4 KiB CE copy) | done `[live]` |
| Guest-copy forwarding, deferred release, hardware-primary copies, engine-authored relay, fault relay | verified live (seams parameterised and fail-open); the staged-transfer class is under repair `[live]` |
| CUDA kernel execution (`vectorAdd` and further clients) | done `[live]` — stock guest CUDA clients (vector-add, matrix-multiply, transformer) execute on the physical engine with verified results and engine-authored completions relayed to the guest |
-| Graphics method-stream execution (verbatim 3D replay, synthesized launches, direct-GL client channels) | `[wip]` — the engine retires real graphics streams, the display/KMS stack registers and X + stock GLX are green (the DDX/ScreenInit stability walls are closed, X green >10 minutes), captured GL sections execute, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes and the `DRAW_IAB` macro executes, and the first non-black GPU-rendered frames are captured off-screen; the DS stage image (so the draw stores) and the window/screen present are the frontier ([`Graphics-Execution.md`](Graphics-Execution.md)) |
+| Graphics method-stream execution (verbatim 3D replay, synthesized launches, direct-GL client channels) | `[wip]` — the engine retires real graphics streams, the display/KMS stack registers and X + stock GLX are green (the DDX/ScreenInit stability walls are closed, X green >10 minutes), captured GL sections execute, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes, the `DRAW_IAB` macro executes, and the DS stage image is authored and live for both vertex slots (`st0=st1=020a0481`), and the first non-black GPU-rendered frames are captured off-screen; the remaining draw-issue `mac=0x22`/stores and the window/screen present are the frontier ([`Graphics-Execution.md`](Graphics-Execution.md)) |
## 7. The execution frontier
@@ -131,10 +130,12 @@ the DDX 3D replay executes, captured GL sections execute on the engine, and
the first non-black GPU-rendered frames are proven (500/500 off-screen frames
per run plus captured videos); the direct-GL submission is fully decoded
(macro-driven) and its draw-state push reaches the engine, the MME pack
-completes and the `DRAW_IAB` macro executes, so the remaining graphics gates
-are the DS stage image (so the draw stores), the window/screen present, and
-the per-boot binding/X first-generation start lottery before non-black window
-pixels. The remaining
+completes, the `DRAW_IAB` macro executes, and the DS stage image is authored
+and live for both vertex slots (`st0=st1=020a0481`; DS `0x86040626 ->
+0x84000420`, two boots), so the remaining graphics gates are the stage
+type/context bits plus the draw-issue call and stores, the window/screen
+present, and the per-boot binding/X first-generation start lottery before
+non-black window pixels. The remaining
compute work is the staged-transfer class (under repair), the every-boot
acceptance campaign, and per-guest execution isolation — see
[`Execution-Frontier.md`](Execution-Frontier.md) and
diff --git a/wiki/Project-Goals.md b/wiki/Project-Goals.md
index 6d9e15a..f041aa1 100644
--- a/wiki/Project-Goals.md
+++ b/wiki/Project-Goals.md
@@ -10,8 +10,7 @@
> [`Execution-Frontier.md`](Execution-Frontier.md) and
> [`Graphics-Execution.md`](Graphics-Execution.md).
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[live]` working with the
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` working with the
stock guest driver; `[wip]` in progress; `[planned]` designed, not built;
`[target]` bring-up ahead; `[non-goal]` explicitly out of scope.
@@ -47,12 +46,12 @@ drivers, no license.**
## 3. Goals and their status
-| Goal | What success looks like | Status (2026-11-14) |
+| Goal | What success looks like | Status (2026-11-15) |
|---|---|---|
| Stock guest driver initialisation | The unmodified driver probes, initialises and enumerates as on bare metal (`nvidia-smi`) | `[live]` — TU104 reference platform |
| Full CUDA driver-API surface | Context creation, allocation, copies, free, destroy complete with correct results | `[live]` — the driver-API smoke prints `ALL OK`; the 64-byte payload round-trips |
| CUDA kernel execution on real hardware | Verified guest kernels execute on the physical GPU, with engine-authored completions waking the guest | `[live]` — vector-add, matrix-multiply and transformer clients green on fresh boots; the staged-transfer class, the every-boot acceptance campaign and per-guest isolation are in progress ([`Execution-Frontier.md`](Execution-Frontier.md)) |
-| OpenGL (3D graphics) | Stock guest GL applications render real pixels through the emulated vGPU | `[wip]` — the display/KMS stack and X run, the stock NVIDIA GLX path is fully green (`glxinfo -B` rc 0, OpenGL 4.6.0 direct, `glxgears` ~520 FPS), the 2D path is green, the DDX 3D replay executes, the X DDX/ScreenInit stability walls are closed (X green >10 minutes), captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes and the `DRAW_IAB` macro executes, and the first non-black GPU-rendered frames plus captured videos (45.4 s and 50 s) are proven off-screen; GZDoom reaches `V_Init`. Window/screen pixels remain the frontier: the DS stage image is the last named gate before stores, the window/screen present is unproven, and the per-boot binding/X first-generation lottery is the throughput limiter ([`OpenGL.md`](OpenGL.md)) |
+| OpenGL (3D graphics) | Stock guest GL applications render real pixels through the emulated vGPU | `[wip]` — the display/KMS stack and X run, the stock NVIDIA GLX path is fully green (`glxinfo -B` rc 0, OpenGL 4.6.0 direct, `glxgears` ~520 FPS), the 2D path is green, the DDX 3D replay executes, the X DDX/ScreenInit stability walls are closed (X green >10 minutes), captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes, the `DRAW_IAB` macro executes, the DS stage image is authored and live for both vertex slots (`st0=st1=020a0481`), and the first non-black GPU-rendered frames plus captured videos (45.4 s and 50 s) are proven off-screen; GZDoom reaches `V_Init`. Window/screen pixels remain the frontier: the remaining DS stage type/context bits and the draw-issue `mac=0x22`/stores are the last named gates before window pixels, the window/screen present is unproven, and the per-boot binding/X first-generation lottery is the throughput limiter ([`OpenGL.md`](OpenGL.md)) |
| Vulkan | Stock guest Vulkan applications render real pixels | `[wip]` — the pipeline runs end to end (device → command buffer → fence → readback); frames are black — program delivery and program-VA mapping are the frontier ([`Vulkan.md`](Vulkan.md)) |
| Windows guests (DirectX, CUDA) | A stock WDDM driver and stock D3D/CUDA applications run in Windows guests | `[target]` — not started; same emulation target ([`DirectX.md`](DirectX.md)) |
| Video (NVENC/NVDEC) | Encode/decode through the emulated device | `[planned]` |
diff --git a/wiki/Project-Plan.md b/wiki/Project-Plan.md
index 293e6c6..9f8b55d 100644
--- a/wiki/Project-Plan.md
+++ b/wiki/Project-Plan.md
@@ -15,8 +15,7 @@
> [`../docs/06-portability/03-device-validation-and-porting-sequence.md`](../docs/06-portability/03-device-validation-and-porting-sequence.md);
> the docs tree wins on disagreement.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[done]`, `[active]`,
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[done]`, `[active]`,
`[ahead]` — the plan's own state vocabulary, distinct from the goal tags.
## 1. How the plan works
@@ -41,11 +40,11 @@ itself:
## 2. The phases
-| Phase | What it delivers | Exit gate | State (2026-11-14) |
+| Phase | What it delivers | Exit gate | State (2026-11-15) |
|---|---|---|---|
| **P0 — Platform** | Emulated vGPU device, GSP boot and GSP-RM emulation, stock guest driver initialisation | Driver-API smoke green (`ALL OK`) = evaluation rung 2 | `[done]` |
| **P1 — First execution (compute)** | Guest CUDA kernels executing on the physical GPU, with engine-authored completions; then hardening | Verified clients + engine-authored completion = rung 3 core; hardening: staged-transfer class, every-boot acceptance, per-guest isolation | `[active]` — execution green; hardening in progress |
-| **P2 — Graphics execution** | OpenGL/Vulkan draw commands executed by the physical 3D pipeline and delivered as readable pixels | The graphics ladder: M-GL1 client context-init executes; M-GL2 `glxgears` non-black; M-GL3 GZDoom GL non-black through the mdev | `[active]` — between M-GL1 and M-GL2 with M-GL2's off-screen half proven: the display/KMS and DDX replay machinery work, X + stock GLX are green, the first non-black GPU-rendered frames and videos are captured, the X DDX/ScreenInit stability walls are closed, captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes and the `DRAW_IAB` macro executes; the remaining walls are the DS stage image (so the draw stores), the window/screen present, and the per-boot binding/X first-generation start lottery |
+| **P2 — Graphics execution** | OpenGL/Vulkan draw commands executed by the physical 3D pipeline and delivered as readable pixels | The graphics ladder: M-GL1 client context-init executes; M-GL2 `glxgears` non-black; M-GL3 GZDoom GL non-black through the mdev | `[active]` — between M-GL1 and M-GL2 with M-GL2's off-screen half proven: the display/KMS and DDX replay machinery work, X + stock GLX are green, the first non-black GPU-rendered frames and videos are captured, the X DDX/ScreenInit stability walls are closed, captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes, the `DRAW_IAB` macro executes, the DS stage image is authored and live for both vertex slots (`st0=st1=020a0481`); the remaining walls are the remaining DS stage type/context bits, the draw-issue `mac=0x22`/stores, the window/screen present, and the per-boot binding/X first-generation start lottery |
| **P3 — Sustained and multi-tenant** | Frame rates without assistance; multiple VMs sharing the GPU with measured fairness; soak-stable operation | Graphics M-GL4 (60 fps, no forcing) and M-GL5 (two VMs, two mdevs); CUDA battery + soak; per-guest execution isolation = rungs 4/5 | `[ahead]` |
| **P4 — Breadth** | Video (NVENC/NVDEC), Windows/DirectX guests, live migration, non-KVM hypervisor transports | Per-case bring-up gates plus the matrix's evidence expectations | `[ahead]` |
| **P5 — Scale and portability** | New GPU generations and driver families carried forward; published performance programme | A profile + measured delta per version, validated on hardware; A/B numbers published per the measurement contract | `[ahead]` |
@@ -67,13 +66,15 @@ Ranked, in dependency order:
draw header), and the client's draw-state push reaches the engine with the
golden MME overlay. The MME pack then completes and `DRAW_IAB` (`mac=0x22`)
executes with the SPH-BIND prelude intact and the DS stage VAs populated.
- The named walls are the **DS stage-0/1 image** (the synthesized binds read
- `family+0x900`, zero in the live family page, while the client's VTG SPH
- image is at `family+0x600`; the `+0x600` bind is in flight), the
- window/screen present path (glxgears' window is black and a window draw
- wedges X), the per-boot binding/X first-generation start lottery (even
- `modeNum` required; now the dominant throughput limiter), and then
- non-black window frames.
+ The **DS stage-0/1 image is now authored and live** (a VTG SPH at
+ `family+0x900`, first word `020a0481`; the window's own slot-1 bind is
+ rewritten to it; DS `0x86040626 -> 0x84000420`, two boots). The named walls
+ are the remaining DS stage type/context bits (SPH5/SPH10/SPH18) plus the
+ draw-issue call (the 728-B window's released macros are `0x33/0x39/0x1/0x0`,
+ not `DRAW_IAB`), the window/screen present path (glxgears' window is black
+ and a window draw wedges X), the per-boot binding/X first-generation start
+ lottery (even `modeNum` required; now the dominant throughput limiter), and
+ then non-black window frames.
Full detail:
[`Graphics-Execution.md`](Graphics-Execution.md) §6.
2. **Compute hardening (P1).** The staged-transfer class (failure modes proven,
diff --git a/wiki/Project-Status.md b/wiki/Project-Status.md
index 445b00d..b63d6aa 100644
--- a/wiki/Project-Status.md
+++ b/wiki/Project-Status.md
@@ -10,8 +10,7 @@
> (the execution frontier). When this page and the docs disagree, the docs tree
> wins.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[live]` proven with the
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` proven with the
stock guest driver; `[gated]` implemented, default-off or behind supervised
gates; `[wip]` partially implemented; `[wall]` current blocker; `[target]`
named success state; `[planned]` designed, not built.
@@ -29,30 +28,7 @@ named success state; `[planned]` designed, not built.
| Physical backend on real hardware (module-owned GPU running its real GSP-RM) | `[live]` boot, RPC session, object creation, copy-engine work and GR execution proven — the verified guest CUDA kernel clients execute through this backend, and graphics method streams execute on the engine ([`Graphics-Execution.md`](Graphics-Execution.md)) |
| Display and KMS on the emulated vGPU (nvidia-modeset/NvKms, `/dev/dri`, X) | `[live]` in the campaign configuration — the emulated display engine serves the guest's display push-buffer channels (notifier plus `UPDATE -> FINISHED`), nvidia-modeset/NvKms registers (`/dev/dri/card0`, `renderD128`, `fb0`), `nvidia-smi -L` enumerates and X settles. The X DDX idle-DMA/ScreenInit, USERD-latch lifetime, re-probe-thrash, Xorg kernel-mode-spin and flip-event walls were closed (X green for >10 minutes in a validated window); what remains is the per-boot **first-generation X start lottery**, which by 11-13/11-14 was the dominant throughput limiter for the graphics A/B runs (only an X started immediately after boot passes DDX DMA init; long stretches of dead starts, one green first-start boot). The display-capability seam is parameterised ([`Graphics-Execution.md`](Graphics-Execution.md)) |
| Multi-tenant isolation (mdev per VM, per-context page directories) | `[wip]` device-level coexistence works — multiple mediated devices with different emulated VRAM sizes and multiple guests coexist (two guests demonstrated); per-guest execution isolation for simultaneous CUDA guests is in progress |
-| OpenGL (3D graphics) | `[wip]` — the display/KMS stack registers, X and the stock NVIDIA GLX path are fully green (`glxinfo -B` returns 0 with OpenGL 4.6.0 and direct rendering; `glxgears` renders ~520 FPS with the emulated GPU's NVIDIA renderer), and the **first non-black GPU-rendered output** is proven: the pbuffer frame path produced 500/500 non-black 640x480 frames per run and captured videos (45.4 s on 2026-11-11; a 50 s 640x480 h264 capture on 2026-11-12). GZDoom reaches `V_Init: allocate screen` with its GL 4.6.0 context whenever the shared nvClip `modeNum` is even. **The direct-GL submission is now fully decoded:** no client push carries a method-grammar draw header — the channel's 9 NV906F entries tile one contiguous buffer and its per-frame work is carried as rewritten data-block blobs plus small state pushes (324/476/728 B) that invoke MME macros (the QMD-carrier hypothesis was tested and refuted). A content-gated FB-shadow rescue and a LOW-band rescue recover the recycled pushes: the client's draw-state push now opens a C597 section, is captured and marked for the verbatim 3D lane (the first direct-GL stream3d marks), and reaches the engine (`GR LAUNCH submitted`/`OK`, golden MME overlay accepted). **The MME chain now completes and executes the draw macro.** The multi-part
-keep-window mechanism won multi-frame windows; the part-launch poison was
-eliminated (the real fault was the client's own
-`SET_REPORT_SEMAPHORE`/`SET_NOTIFY` writes to client VAs that the host scratch
-page-table pool remaps — redirected to a mapped scratch slot; 49 cycles with
-zero poison and zero MMU faults); the 2799-word pack completes (2799/2799);
-engine-global completion plus keep-done-across-recycle produced the first
-`MME-PACK-REARM`; the fixed-CB region is aliased; and the released calls run
-macros through to **`DRAW_IAB` (`mac=0x22`)**. Two synthesized-prelude defects
-were then fixed: the SPH-BIND prelude self-destructed because an auto-dropped
-run broke its kept/final count (`444ae2c1`), and the stage block was silently
-skipped by a double-counted budget; with both fixed the prelude emits 84 words
-and the DS stage VAs populate (one validated boot carried the full post-REARM
-chain, `mac=0x22` and `DS 86040624`). The remaining gap is the **DS stage-0/1
-image**: the synthesized binds read `family+0x900` (zero in the live family
-page). Binding `family+0x600` was tried and poisons the DS (`badf1201`) because
-the engine-visible alias shadow there is the client's SASS upload, not an SPH
-header; the next step is authoring a VTG SPH at an engine-visible VA the
-client does not overwrite (`family+0x900`). Stores still miss (`wrote=0`,
-`px0=0`); the
-window/screen present path is unproven; and the per-boot binding lottery (the
-GL client usually rides the X channel in indirect mode, and X start keeps a
-first-generation lottery) is the throughput limiter
-([`OpenGL.md`](OpenGL.md)) |
+| OpenGL (3D graphics) | `[wip]` — the display/KMS stack registers, X and the stock NVIDIA GLX path are fully green (`glxinfo -B` returns 0 with OpenGL 4.6.0 and direct rendering; `glxgears` renders ~520 FPS with the emulated GPU's NVIDIA renderer), and the **first non-black GPU-rendered output** is proven: the pbuffer frame path produced 500/500 non-black 640x480 frames per run and captured videos (45.4 s on 2026-11-11; a 50 s 640x480 h264 capture on 2026-11-12). GZDoom reaches `V_Init: allocate screen` with its GL 4.6.0 context whenever the shared nvClip `modeNum` is even. **The direct-GL submission is now fully decoded:** no client push carries a method-grammar draw header — the channel's 9 NV906F entries tile one contiguous buffer and its per-frame work is carried as rewritten data-block blobs plus small state pushes (324/476/728 B) that invoke MME macros (the QMD-carrier hypothesis was tested and refuted). A content-gated FB-shadow rescue and a LOW-band rescue recover the recycled pushes: the client's draw-state push now opens a C597 section, is captured and marked for the verbatim 3D lane (the first direct-GL stream3d marks), and reaches the engine (`GR LAUNCH submitted`/`OK`, golden MME overlay accepted). **The MME chain now completes and executes the draw macro.** The multi-part keep-window mechanism won multi-frame windows; the part-launch poison was eliminated (the real fault was the client's own `SET_REPORT_SEMAPHORE`/`SET_NOTIFY` writes to client VAs that the host scratch page-table pool remaps — redirected to a mapped scratch slot; 49 cycles with zero poison and zero MMU faults); the 2799-word pack completes (2799/2799); engine-global completion plus keep-done-across-recycle produced the first `MME-PACK-REARM`; the fixed-CB region is aliased; and the released calls run macros through to **`DRAW_IAB` (`mac=0x22`)**. Two synthesized-prelude defects were then fixed: the SPH-BIND prelude self-destructed because an auto-dropped run broke its kept/final count (`444ae2c1`), and the stage block was silently skipped by a double-counted budget; with both fixed the prelude emits 84 words and the DS stage VAs populate (one validated boot carried the full post-REARM chain, `mac=0x22` and `DS 86040624`). **The DS stage-0/1 image is now authored and live**: a VTG SPH is written at `family+0x900` (`SPH-AUTHOR`, first word `020a0481`), the window's own later `0x2054` slot-1 bind is rewritten to the authored page (`SPH-SLOT1-REWRITE`), and the DS latch reads the authored image for both vertex slots (`DS-IMAGE st0=st1=020a0481 code=ff007321`; the DS value fell `0x86040626 -> 0x84000420`), reproduced on two boots. The remaining DS bits are stage type/context (SPH5/SPH10/SPH18), and the **`DRAW_IAB` (`mac=0x22`)** call does not run in the 728-B draw window (its released macros are `0x33/0x39/0x1/0x0`), so stores still miss (`wrote=0`, `px0=0`); the window/screen present path is unproven; and the per-boot binding lottery (the GL client usually rides the X channel in indirect mode, and X start keeps a first-generation lottery) is the throughput limiter ([`OpenGL.md`](OpenGL.md)) |
| Vulkan (3D/compute) | `[wip]` — the guest Vulkan pipeline runs end to end on the emulated vGPU (device, allocation, pipeline, command buffer, fence, queue submit, readback) and the engine executes translated launches; frames are still black — program delivery and program-VA mapping are the frontier ([`Vulkan.md`](Vulkan.md)) |
| DirectX / Windows guests | `[planned]` (target) — no Windows guest booted yet; the architecture is the same emulation target ([`DirectX.md`](DirectX.md)) |
| Video (NVENC/NVDEC) | `[planned]` |
@@ -105,9 +81,10 @@ GPU-rendered frames are proven off-screen (the pbuffer path produced a
500-frame 45.4 s video on 2026-11-11 and a 50 s capture on 2026-11-12), and
GZDoom reaches its screen-allocation stage with GL 4.6.0 on an even modeNum.
The direct-GL submission is fully decoded, the MME multi-part program now
-completes and the draw macro executes, but windowed/screen pixels remain the
-frontier (the DS stage image is the last named gate before stores, and X start
-keeps a first-generation lottery) — see [`OpenGL.md`](OpenGL.md). The
+completes and the draw macro executes, and the DS stage image is authored and
+live for both vertex slots; but windowed/screen pixels remain the frontier
+(the draw-issue `mac=0x22` and the stores are the next named gates, and X
+start keeps a first-generation lottery) — see [`OpenGL.md`](OpenGL.md). The
risc-v-gsp-rm-debugger workbench
([`Riscv-GSP-RM-Debugger.md`](Riscv-GSP-RM-Debugger.md)) is the host-side
tooling used to study the firmware side of that frontier.
diff --git a/wiki/System-Overview.md b/wiki/System-Overview.md
index 74adf71..8d85b10 100644
--- a/wiki/System-Overview.md
+++ b/wiki/System-Overview.md
@@ -7,8 +7,7 @@
> and [`../docs/03-architecture/10-interaction-and-scheduling.md`](../docs/03-architecture/10-interaction-and-scheduling.md)
> for the full picture); the docs tree wins on disagreement.
-Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in
-the working tree. Tags: `[live]` proven with the
+Status: 2026-11-15, tree `master @ 692a7eb0`. Tags: `[live]` proven with the
stock guest driver; `[gated]` implemented default-off; `[wip]` partial;
`[wall]` current blocker; `[target]` designed end state.
@@ -157,15 +156,17 @@ RPC from the guest to "firmware":
now completes and executes the draw macro: multi-frame keep-windows land,
the 2799-word pack completes, the first `MME-PACK-REARM` fires, the
fixed-CB region is aliased, and `DRAW_IAB` (`mac=0x22`) runs with the
- SPH-BIND prelude intact and the DS stage VAs populated. The remaining gate
- is the DS stage-0/1 image (the synthesized binds read `family+0x900`, zero
- in the live family page, while the client's VTG SPH image is at
- `family+0x600`), so the draw never stores (`wrote=0`, `px0=0`). The
- window/screen present is unproven (a window draw can wedge X and glxgears'
- window is black), and the per-boot binding plus X first-generation start
- lottery is the dominant throughput limiter, so the remaining gate is the
- DS stage image plus the window/screen present before the first non-black
- window frame
+ SPH-BIND prelude intact and the DS stage VAs populated. The DS stage-0/1
+ image is now authored and live: a VTG SPH at `family+0x900` (first word
+ `020a0481`) is fetched by both vertex slots (`st0=st1=020a0481`; DS
+ `0x86040626 -> 0x84000420`, two boots). The remaining gates are the stage
+ type/context bits (SPH5/SPH10/SPH18) plus the draw-issue call (the 728-B
+ window's released macros are `0x33/0x39/0x1/0x0`, not `DRAW_IAB`), so the
+ draw still does not store (`wrote=0`, `px0=0`); the window/screen present
+ is unproven (a window draw can wedge X and glxgears' window is black), and
+ the per-boot binding plus X first-generation start lottery is the dominant
+ throughput limiter, so the remaining gates are the draw-issue/store and
+ the window/screen present before the first non-black window frame
([`OpenGL.md`](OpenGL.md), [`Vulkan.md`](Vulkan.md)).
## 6. Where the detail lives