summaryrefslogtreecommitdiffstats
path: root/wiki/Execution-Frontier.md
diff options
context:
space:
mode:
Diffstat (limited to 'wiki/Execution-Frontier.md')
-rw-r--r--wiki/Execution-Frontier.md177
1 files changed, 177 insertions, 0 deletions
diff --git a/wiki/Execution-Frontier.md b/wiki/Execution-Frontier.md
new file mode 100644
index 0000000..fe21fda
--- /dev/null
+++ b/wiki/Execution-Frontier.md
@@ -0,0 +1,177 @@
+# The Execution Frontier
+
+> **What this page is.** The current leading edge of guest-facing execution:
+> the chain that must fire for a stock guest CUDA kernel to run on the
+> physical GPU, what has been proven about it, where it stops, how we know,
+> and the open lines of investigation and theories. It is evidence-led: every
+> statement carries a live observation, a decompilation finding, or a clearly
+> labelled theory. Condensed from
+> [`../docs/04-implementation/03-execution-frontier.md`](../docs/04-implementation/03-execution-frontier.md);
+> the docs tree wins on disagreement.
+
+Status: 2026-10-12 (source page dated 2026-10-06), tree `master @ 2f066727`.
+Tags: `[live]` observed; `[wip]` partial; `[wall]` current blocker; theories
+are labelled as such.
+
+## 1. The chain that should fire
+
+A guest CUDA launch becomes a **method stream** in a push buffer, referenced
+by a **GPFIFO ring entry**, announced by a **doorbell**. The host emulation
+decodes it and forwards an equivalent method stream to a real channel owned by
+the module's resource-manager session. The hardware **front-end** fetches and
+executes the methods, the launch descriptor (**QMD**) is materialised and read
+by the **GR engine**, the grid is dispatched to the SMs, and completion is
+published as **semaphores** the guest waits on.
+
+```text
+guest: builds launch + method stream
+ GPFIFO entry + doorbell
+ -> host: doorbell trap, decode, rebuild forward stream,
+ prewrite QMD, ring/USERD, doorbell
+ -> front-end: fetch GPFIFO entry (ring cursor advances)
+ -> front-end: execute methods (object bind, cache ops, report sem)
+ -> front-end: install inline QMD into the descriptor buffer
+ -> GR engine: read QMD through the channel's page tables
+ -> context switch loads the channel context (FECS/ucode)
+ -> GR: dispatch grid to the SMs
+ -> engine authors release semaphore + channel semaphore
+ -> host polls release, relays to guest; CUDA wakes
+```
+
+| # | Stage | State |
+|---|---|---|
+| 1 | Guest builds launch + method stream | `[live]` observed (stock driver, unmodified) |
+| 2 | GPFIFO entry + doorbell | `[live]` observed |
+| 3 | Host decode + forward stream + QMD prewrite + ring/USERD | `[live]` observed |
+| 4 | Front-end fetches the ring entry | `[live]` observed (ring cursor advances) |
+| 5 | Front-end executes methods | `[live]` observed (object bind, cache ops, report semaphore) |
+| 6 | **Inline-QMD install** (descriptor materialised) | `[wall]` not observed |
+| 7 | **Engine reads the QMD** | `[wall]` not observed |
+| 8 | Context switch loads the channel context | `[live]` context validity at dispatch is ruled in |
+| 9 | GR dispatches the grid to the SMs | never observed on this stack |
+| 10 | Engine authors release + channel semaphore | absent for forwarded launches |
+| 11 | Host relays completion; guest wakes | the guest waits and times out |
+
+**One-line summary:** the guest, the emulation, the forwarding path and the
+front-end are live; the **launch-descriptor install path** (stages 6–7) is the
+leading edge, and with it stages 9–11.
+
+## 2. Where the leading edge is
+
+A stock guest program now reaches its kernel launch and submits it through the
+forwarding path. On the wire the ring entry is consumed and the front-end
+methods run — but the launch descriptor is never materialised, the engine
+never reads a QMD, no engine-authored completion appears, and the guest blocks
+in its synchronisation wait.
+
+This is **not** a context-validity wall (ruled out at dispatch) and **not** a
+window-mapping wall for the descriptor destination (that install is accepted).
+The wall is the **form of the launch method stream**: what the front-end
+requires in order to install the inline descriptor, and what the engine
+requires in order to read and dispatch it.
+
+## 3. How we know (observables and their limits)
+
+| Observable | What it proves | What it does not prove |
+|---|---|---|
+| Ring entry consumed; ring cursor advances | the front-end is alive and fetching | nothing about the engine |
+| Method execution on the ladder channel | the front-end can execute the method vocabulary | **not** engine execution — these signals can be front-end-authored |
+| Descriptor buffer prewritten with a detectable sentinel | whether the descriptor was materialised after submission | a read does not modify memory; the sentinel detects installs, not reads |
+| Install sentinel unchanged after submit | the inline-install method did not run | it does not say why |
+| Engine-authored release word absent; poll times out | the engine did not complete the launch | it does not say whether the engine started |
+| No GR fault recorded | the engine did not raise this error | silence is not health: a skipped launch is silent by construction |
+| Channel instance context flag set | the channel is context-valid at dispatch | nothing about the descriptor path |
+
+**Consequence:** progress on this frontier must be measured by an
+**engine-authored** signal (the release word advancing) — not by front-end
+signals, which we have already learned to distinguish.
+
+## 4. What is exonerated (do not relitigate)
+
+* Context validity at dispatch — the channel's context is valid when the
+ launch is submitted (instance flag set).
+* The descriptor destination window mapping — installed in the engine's table
+ view at submit.
+* Front-end fetch and control-block alignment — the entry is consumed with the
+ host control block at offset 0.
+* The shared context-buffer one-shot rule — traced to a shared per-GPU buffer
+ already initialised in the same cycle; not the dispatch delta.
+* Parenting/TSG for the fetch — both variants fetch identically.
+* The copy-engine path — CE-class work, releases and fault relay are live
+ (default off); the GR path is a separate problem.
+
+## 5. The clear issues (ranked)
+
+**Issue A — the forwarded stream carries a verbatim guest prelude that cannot
+complete.** The forwarded stream includes a verbatim copy of the guest's
+prelude whose inline-data writes target addresses not present in the engine's
+view of the channel's page tables, and the referenced data is not relocated.
+The shorter, proven stream shape fires its tail (channel semaphore) but still
+does not schedule the descriptor.
+
+**Issue B — the descriptor-virtualization control method is absent.** The
+method that arms the inline-descriptor install path is not present in the
+forwarded stream. Fixing it should materialise the descriptor — falsifiable in
+one cycle by watching the sentinel and the engine-read signal.
+
+**Issue C — diagnostic hygiene.** The sentinel placed at word 0 overlaps real
+descriptor fields; it must be moved to an unused word so diagnostics do not
+perturb what they measure.
+
+## 6. Lines of investigation (live)
+
+1. **Restore the proven launch shape** as the baseline and **re-add the
+ virtualization control method** — one variable at a time, with the install
+ sentinel and the engine-read signal as the readout.
+2. **Relocate or drop the verbatim prelude** so inline-data writes target
+ addresses present in the engine's view, or replace it with the host-side
+ staging the proven shape already uses.
+3. **Move the sentinel** and re-run to confirm the readout is clean.
+4. **Diff against a known-good reference** — our own ladder dispatching a
+ descriptor built from the same source material, or a captured working
+ launch of the stock stack on the same GPU — converting the remaining work
+ from inference to differential.
+5. **Offline probing** of any rule the front-end or engine is believed to
+ require, using the firmware debugger before spending a supervised cycle
+ ([`Riscv-GSP-RM-Debugger.md`](Riscv-GSP-RM-Debugger.md)).
+
+## 7. Theories (labelled; not yet proven)
+
+* **T1 — the virtualization control is the gate.** The front-end will not
+ materialise an inline descriptor until the control method enables the
+ install path.
+* **T2 — materialise-then-read.** The engine only schedules a descriptor that
+ exists in its own view; an install targeting unmapped destinations aborts
+ silently rather than faulting.
+* **T3 — the verbatim prelude poisons the launch.** Its refused writes leave
+ the launch path unable to schedule the descriptor.
+* **T4 — relocation is the missing transform.** The guest's descriptor is
+ valid for the guest's view of memory; the forwarding path must relocate
+ referenced data into the channel's view before install.
+
+Each theory has a one-cycle falsifier: the install sentinel, the engine-read
+signal, and the engine-authored release, in that order.
+
+## 8. Claim discipline
+
+* **Engine-authored release is the only proof of execution.** Front-end
+ signals are necessary but not sufficient.
+* **Silence is not health.** No fault recorded does not mean no fault
+ occurred.
+* **Emulator verdicts are instruction/memory-level.** They bound behaviour,
+ never timing or device environment.
+* **A wall is closed only by an acceptance signal**, named before the
+ experiment.
+
+## 9. Related pages
+
+* [`Project-Status.md`](Project-Status.md) — the project-level ladder.
+* [`CUDA-Userspace-Driver.md`](CUDA-Userspace-Driver.md) — the guest-side
+ client path.
+* [`Physical-GPU-Backend.md`](Physical-GPU-Backend.md) — the backend the work
+ is forwarded to.
+* [`Execution-Plane.md`](Execution-Plane.md) — the execution layer's design.
+* [`Introduction-to-GMMU.md`](Introduction-to-GMMU.md) — page tables, QMDs and
+ the engines.
+* [`../docs/04-implementation/03-execution-frontier.md`](../docs/04-implementation/03-execution-frontier.md) —
+ the canonical, continuously-updated version with the full evidence tables.