diff options
Diffstat (limited to 'docs/03-architecture/09-full-system-picture.md')
| -rw-r--r-- | docs/03-architecture/09-full-system-picture.md | 666 |
1 files changed, 666 insertions, 0 deletions
diff --git a/docs/03-architecture/09-full-system-picture.md b/docs/03-architecture/09-full-system-picture.md new file mode 100644 index 0000000..0df0dd2 --- /dev/null +++ b/docs/03-architecture/09-full-system-picture.md @@ -0,0 +1,666 @@ +# The Full System Picture + +> **What this document is.** The visual, end-to-end picture of Open-IOV: every +> component in the finished system, how they interact, where the work actually +> executes, how tenancy is isolated and scheduled, how the design stays portable +> across driver and hardware versions, and how far each piece is from done. +> The other architecture documents explain *why*; this one shows *what* and +> *where*, all the way down. Diagrams are Mermaid and render on GitHub and in +> most Markdown viewers. + +**Status legend used throughout** (the project is honest about maturity): + +| Tag | Meaning | +|---|---| +| `[done]` | implemented and exercised with a stock guest driver | +| `[wip]` | implemented in part; actively being completed | +| `[planned]` | designed, not implemented | +| hardware/firmware | exists in the physical world; referenced, not built by us | +| vendor | NVIDIA components we interoperate with, unmodified | + +## 1. The end-state system map + +All components of the finished system, with the execution backend this project +has chosen (a module-owned GPU driven through its real GSP firmware; see +[`08-physical-gpu-integration.md`](08-physical-gpu-integration.md)). + +```mermaid +flowchart TB + subgraph VM["Guest VM - stock software, no Open-IOV code"] + APP["Applications<br/>CUDA / OpenGL / Vulkan / video"] + USR["Userspace stack<br/>libcuda, libcudart, libGLX, libvulkan"] + GKO["Stock nvidia.ko<br/>RM core + UVM + modeset/DRM"] + APP --> USR --> GKO + end + + subgraph HV["Hypervisor - KVM and QEMU"] + VFIO["VFIO mdev transport<br/>regions, mmap, eventfd / irqfd"] + IOMMU["IOMMU / IOMMUFD<br/>per-VM DMA address spaces"] + end + + subgraph MOD["open-iov-vfio.ko - the only host component"] + VDEV["Virtual device<br/>config space, BAR0/1/3, MSI-X"] + EMU["Emulation core<br/>GSP boot + GSP-RM RPC + objects"] + MEMM["Memory model<br/>VA to PA, pins, VRAM shadow, page tables"] + WORK["Work path<br/>pump, decode, translate, forward"] + BE["Execution backend<br/>real GSP session + RM client"] + VDEV --> EMU + EMU --> MEMM + EMU --> WORK + MEMM --> WORK + WORK --> BE + BE --> MEMM + end + + subgraph HW["Physical GPU"] + GSP["GSP firmware - the real RM server"] + ENG["Engines<br/>GR, CE pair, DEC, ENC"] + GMMU["GMMU and page tables"] + VRAM["VRAM + framebuffer"] + DB["BAR0 / USERD doorbells, MSI-X"] + end + + subgraph HOSTOS["Host OS"] + ND["Distribution nvidia.ko<br/>unmodified; unbound while the service owns the GPU"] + IGPU["Display on another GPU / integrated graphics"] + end + + GKO -->|"MMIO + DMA + MSI-X"| VFIO + VFIO --> VDEV + BE -->|"msgq + doorbells"| GSP + WORK -->|"real push streams on real channels"| ENG + BE --> GMMU + MEMM --> IOMMU + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef wip fill:#fff3cd,stroke:#9a7b1a + classDef plan fill:#f8d7da,stroke:#9a1a1a + classDef hw fill:#e2e8f0,stroke:#4a5568 + classDef vendor fill:#e7e0f5,stroke:#5a4a8a + + class VDEV,EMU done + class MEMM,WORK wip + class BE plan + class IOMMU,VFIO done + class GSP,ENG,GMMU,VRAM,DB hw + class ND,USR,GKO,APP vendor +``` + +**Reading the map.** The guest sees only a PCIe device. Everything between +that device and the physical engines is either emulated (control plane) or +translated (work plane) by one kernel module, with no daemon, no host userspace +and no modified driver on either side. The distribution `nvidia.ko` remains +installed and unmodified on the host; it is simply unbound from the GPU while +the service owns it, and the host's display runs on another GPU. + +## 2. The control plane: GSP emulation + +### 2.1 The GSP boot handshake + +The guest driver believes it boots a real GSP. The module completes the +observable boot stages itself and reports the status the driver polls. In the +end state, the *backend* additionally boots the physical GPU's real GSP for +work execution — the two sessions are independent. + +```mermaid +stateDiagram-v2 + direction LR + [*] --> PCIProbe + PCIProbe --> FWSEC: driver kicks boot + FWSEC --> Booter: FRTS status observed + Booter --> RISCV: WPR2 programmed + RISCV --> BootComplete: falcon reports running + BootComplete --> MsgqInit: queue setup in guest sysmem + MsgqInit --> RmInit: version, client, device, subdevice + RmInit --> Runtime: objects, vaspaces, channels + Runtime --> [*]: driver unload / reset + + note right of FWSEC + Emulated today: the module drives the + stage transitions and answers status + reads from the BAR0 shadow. The real + backend boots the physical GSP in + parallel [planned]. + end note +``` + +### 2.2 Guest initialization, end to end + +```mermaid +sequenceDiagram + autonumber + participant GD as Stock nvidia.ko, guest + participant DEV as Virtual device, BAR0 shadow + MSI-X + participant GE as GSP emulation thread + participant GRM as GSP-RM emulation + participant BE as Execution backend + + GD->>DEV: PCI probe, BAR setup, MSI-X enable + DEV-->>GD: config space and capability replies + GD->>DEV: boot kicks and WPR2 writes + DEV->>GE: stage transitions + GE-->>GD: falcon status - boot complete + GD->>GRM: message queues + RPCs - version, client, device + Note over GRM: every reply follows the fidelity ladder -<br/>status only, then coherent zeroed params,<br/>then coherent consumed values, then exact values + GRM-->>GD: coherent replies for consumed fields + GD->>GRM: object allocations, vaspaces, channels, CE caps + GRM-->>GD: handles, engine and class topology + GD->>GRM: UVM register GPU, page trees, context + GRM->>BE: resource needs - real memory, channels [planned] + BE-->>GRM: real objects and channels [planned] +``` + +### 2.3 RPC surface and object lifecycle + +```mermaid +flowchart LR + subgraph GUEST["Guest RM requests"] + A1["version / capability queries"] + A2["client, device, subdevice"] + A3["memory alloc + mmap descriptors"] + A4["vaspace + page-table contracts"] + A5["channels, CE caps, events"] + end + subgraph EMU["GSP-RM emulation"] + B1["dispatcher by function ID"] + B2["special-cased handlers - real values"] + B3["generic fallback - success + zeroed params"] + B4["object table - handles, params echoed"] + B5["reply fidelity checks"] + end + A1 --> B1 + A2 --> B1 + A3 --> B1 + A4 --> B1 + A5 --> B1 + B1 --> B2 + B1 --> B3 + B2 --> B4 + B3 --> B5 + B4 --> B5 + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef wip fill:#fff3cd,stroke:#9a7b1a + class B1,B2,B4 done + class B3,B5 wip +``` + +## 3. The memory model + +Guest work refers to GPU virtual addresses. The module must know which physical +pages they denote — for semaphores, push buffers, page trees, and (in the end +state) for programming the real GPU's MMU so hardware walks the same pages. + +```mermaid +flowchart LR + subgraph G["Guest"] + GVA["GPU virtual addresses<br/>client objects and mappings"] + GPT["Guest page tables<br/>incl. server-owned ranges"] + SYS["Guest system memory"] + VRS["VRAM objects - BAR1 aperture view"] + end + + subgraph MM["open-iov-vfio.ko memory model"] + DISC["Discovery<br/>structure walk + content scan + pins"] + PMAP["VA to PA map<br/>page-granular, merge rebuilds"] + SHAD["BAR1 VRAM shadow"] + PIN["Pin tables<br/>self-discovered + authoritative injected"] + end + + subgraph H["Host / hardware"] + DMA["VFIO DMA - read and write guest pages"] + RGMMU["Real GMMU tables<br/>same pages, real hardware walks"] + end + + GVA --> GPT --> SYS + GVA --> VRS + VRS --> SHAD + SYS --> DMA + GPT --> DISC + DISC --> PMAP + PIN --> PMAP + PMAP --> DMA + PMAP --> RGMMU + SYS -.->|"pinned and mapped once"| RGMMU + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef wip fill:#fff3cd,stroke:#9a7b1a + classDef plan fill:#f8d7da,stroke:#9a1a1a + class DISC,PMAP,DMA done + class PIN,SHAD wip + class RGMMU plan +``` + +The two contracts that make this possible without guest cooperation: + +* Channel memory descriptors the guest creates already carry **physical + addresses** (instance memory, method buffers, USERD, RAMFC, notifiers). +* The server-owned page-table contract (`COPY_SERVER_RESERVED_PDES`) gives the + page-table level physical addresses; the leaves are ours to populate. + +The remaining work is to derive every mapping from these protocol objects as +they are created, so a clean boot needs no external tooling. + +## 4. The work path + +### 4.1 Today: software-executed bridge + +```mermaid +flowchart LR + A["Guest push appended<br/>GPFIFO entry + doorbell"] --> B["Channel pump reads entry"] + B --> C{"Entry readable?"} + C -->|yes| D["Decode method stream"] + C -->|no| E["Rescue / reconstruct the page<br/>or resolve via pins"] + E --> D + D --> F["Execute understood work in software<br/>memsets, copies, semaphore releases"] + F --> G["Write releases and completions<br/>into guest memory"] + G --> H["Guest trackers advance"] + + D -.->|"planned"| I["Forward to a real engine"] + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef wip fill:#fff3cd,stroke:#9a7b1a + classDef plan fill:#f8d7da,stroke:#9a1a1a + class A,B,D done + class E,F,G,H wip + class I plan +``` + +This is a correctness bridge: it advances synchronization and memory +operations, and it is why the guest's initialization walks as far as it does +today. It cannot execute kernels. + +### 4.2 End state: forwarded work + +```mermaid +sequenceDiagram + autonumber + participant GU as Guest GPFIFO + doorbell + participant P as Channel pump + participant D as Decoder + participant M as Memory model + participant B as Execution backend + participant E as GPU engines + participant S as Guest trackers + + GU->>P: doorbell / put pointer advance + P->>D: read push entry + alt entry unreadable + D->>M: resolve or reconstruct the page + end + D->>D: parse the method stream + alt pure state or notification + D->>M: apply release, membar, fence directly + else real engine work + D->>B: translated submission + B->>E: real push stream on a real channel + E-->>B: completion or fault from hardware + B->>M: completion written into guest memory + end + M-->>S: tracker values advance +``` + +Fast paths (semaphores, fences, some memops) stay in the emulation in both +phases: they are microseconds in hardware and lose value by round-tripping +through the real GPU. + +### 4.3 How the GPU reaches runtime and executes work + +```mermaid +flowchart TB + subgraph BOOT["Guest view - emulated"] + A["Probe"] --> B["GSP boot stages"] + B --> C["GSP-RM init"] + C --> D["Objects, vaspaces, channels"] + D --> E["UVM register + page trees"] + E --> F["Context created, allocations mapped"] + F --> G["Pushes submitted"] + end + subgraph REAL["Backend view - real"] + R1["Module binds GPU, boots real GSP"] --> R2["Real RM client: device, vaspaces"] + R2 --> R3["Real channels and page tables"] + R3 --> R4["Guest VA mapped to same pages"] + R4 --> R5["Real submissions scheduled by GSP"] + R5 --> R6["Completion and faults relayed to guest"] + end + G -.->|"translation [planned]"| R4 + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef plan fill:#f8d7da,stroke:#9a1a1a + class A,B,C,D,E done + class F,G wip + class R1,R2,R3,R4,R5,R6 plan +``` + +## 5. Scheduling and multi-tenancy + +There is no hardware partitioning (no SR-IOV) on this GPU generation, so +tenancy is a **logical VF model**: each VM holds one mdev instance, and the +module gives each instance its own GSP-RM session, channels, page tables and +scheduling policy. “Per-VF GSP emulation” therefore means per-mdev emulation +context plus a per-mdev real GSP client in the backend. + +```mermaid +flowchart TB + subgraph TEN["Tenants"] + T1["VM A - mdev 1"] + T2["VM B - mdev 2"] + T3["VM C - mdev N"] + end + subgraph MOD["open-iov-vfio.ko"] + Q1["Emulation context 1<br/>BARs, queues, counters"] + Q2["Emulation context 2"] + Q3["Emulation context N"] + POL["Fairness policy [planned]<br/>time slices, quotas, priority, burst"] + C1["Real GSP client 1 [planned]"] + C2["Real GSP client 2 [planned]"] + C3["Real GSP client N [planned]"] + end + subgraph GPU["Physical GPU"] + SCHED["Real GSP scheduler<br/>engine contexts and runlists"] + GRC["GR contexts"] + CEC["CE contexts"] + end + T1 --> Q1 --> C1 + T2 --> Q2 --> C2 + T3 --> Q3 --> C3 + C1 --> POL + C2 --> POL + C3 --> POL + POL --> SCHED + SCHED --> GRC + SCHED --> CEC + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef wip fill:#fff3cd,stroke:#9a7b1a + classDef plan fill:#f8d7da,stroke:#9a1a1a + class Q1,Q2,Q3 done + class C1,C2,C3,POL,SCHED plan +``` + +**How multi-tenant performance works (and is intended to):** + +* Each tenant's *state* operations complete in the module on a fast path + (microseconds, no hardware round trip). +* Each tenant's *real work* runs on the physical engines at native speed; the + virtualization overhead is the submission translation plus completion relay, + which amortizes with work size. +* Fairness is a module-side policy on top of the firmware scheduler (time + slices, quotas). It must be measured, not assumed; the measurement harness is + planned with the performance ladder in + [`../05-operations/01-performance-correctness-security.md`](../05-operations/01-performance-correctness-security.md). + +## 6. Isolation: what is guaranteed, at which level + +```mermaid +flowchart TB + H1["Hardware IOMMU / SMMU<br/>per-VM DMA address spaces<br/>guarantee: memory isolation between VMs"] + H2["GPU MMU contexts - per client page tables [planned]<br/>guarantee: one tenant's engine work cannot address another's memory"] + V1["VFIO mdev boundary<br/>all device access mediated; config/BAR filtering<br/>guarantee: guest gets only its own device instance"] + M1["Module state separation<br/>per-mdev emulation context, queues, pins<br/>guarantee: no cross-tenant state pointers"] + P1["Policy and audit [planned]<br/>fairness, rate limits, side-channel review<br/>guarantee: performance isolation, adversarial robustness"] + + H1 --> V1 --> M1 + H2 --> P1 + M1 --> P1 +``` + +| Layer | Isolation strength | Status | +|---|---|---| +| IOMMU / SMMU between VMs | hardware-enforced | available today (hypervisor) | +| KVM memory and vCPU boundary | hypervisor-enforced | available today | +| VFIO mdev mediation (one device per tenant) | hypervisor-enforced | implemented | +| Per-mdev module state and emulation context | software-enforced | implemented | +| Per-client real page tables and GSP clients | software plus GPU MMU | planned | +| Performance isolation and side channels | policy | planned, must be measured | + +The honest statement: **memory isolation is guaranteed by hardware and the +hypervisor today**; *engine-level context separation and performance isolation* +are the parts this project must still build and audit. + +## 7. How the host kernel schedules the module + +```mermaid +flowchart LR + subgraph CTX["Caller contexts"] + QEMU["QEMU / VFIO ioctls and mmap"] + VCPU["vCPU exits on trapped MMIO"] + FW["Physical GSP messages - backend"] + USR["Debug interfaces - dev only"] + end + subgraph KERN["Linux execution contexts in the module"] + VF["VFIO callbacks"] + IRQ["IRQ handlers - physical MSI-X, eventfd signals"] + WQ["Workqueues - RPC, cleanup, bottom halves"] + KT["kthreads - GSP emulation per mdev, channel service"] + TM["Timers and poll loops - doorbells, housekeeping"] + end + QEMU --> VF --> WQ + VCPU --> VF + FW --> IRQ --> WQ + WQ --> KT + KT --> TM + KT --> WQ + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef plan fill:#f8d7da,stroke:#9a1a1a + class VF,IRQ,WQ,KT done + class TM plan +``` + +Design rules that keep this healthy: bounded stack frames (audited), no long +scans while holding service locks, blocking work in kthreads not in VFIO +callbacks, and never tearing down the module while a VM holds the device. + +## 8. Hypervisor integration: mdev, VFIO, KVM + +```mermaid +sequenceDiagram + autonumber + participant ORCH as Orchestrator / admin + participant SYS as Module + mdev sysfs + participant QEMU as QEMU with vfio-pci + participant KVM as KVM + participant GUEST as Guest kernel + + ORCH->>SYS: create mdev - type nvidia-nvidia-vgpu-turing, UUID + SYS-->>ORCH: /sys/bus/mdev/devices/uuid ready + QEMU->>SYS: open VFIO device, query regions and IRQ info + QEMU->>SYS: mmap BAR shadows - region index to vaddr + QEMU->>SYS: VFIO_DEVICE_SET_IRQS - eventfd per MSI-X vector + QEMU->>KVM: register irqfd for guest injection + QEMU->>KVM: map guest RAM - IOMMU / IOMMUFD + GUEST->>QEMU: MMIO access to the virtual BAR0 + QEMU->>SYS: region read or write, or direct shadow access + SYS-->>GUEST: MSI-X delivered via eventfd to irqfd to vCPU + ORCH->>SYS: destroy mdev after VM stops - reverse order +``` + +Key properties: the mdev is the *device instance*; VFIO is the *transport* +(region access, IRQ signalling, DMA bridging); KVM is the *delivery* (irqfd, +MMIO exits, vCPU scheduling). The module registers an emulated IOMMU device so +VFIO creates the group; guest memory access flows through the VFIO DMA +interface. Full detail in +[`06-host-module-and-hybrid-model.md`](06-host-module-and-hybrid-model.md). + +## 9. Component detail: BARs, engines, channels, GMMU + +```mermaid +flowchart LR + subgraph GV["Guest-visible device"] + CFG["PCI config space<br/>TU104 identity, BAR sizes, MSI-X caps"] + B0["BAR0 - 16 MB registers<br/>doorbell, mailbox, PBA"] + B1["BAR1 - 256 MB VRAM aperture"] + B3["BAR3 - 32 MB instance / PRAMIN window"] + MX["MSI-X - 32 vectors"] + end + subgraph MODS["Module shadow state"] + C0["Filtered config writes"] + S0["BAR0 shadow - boot state, doorbells"] + S1["BAR1 shadow - VRAM backing [wip]"] + S3["BAR3 shadow - instance memory"] + IR["Per-vector eventfd injection"] + end + subgraph CH["Channel machinery"] + GPF["GPFIFO - push entries"] + USR["USERD + doorbell tokens"] + RF["RAMFC + instance memory"] + MB["Method buffers"] + NOT["Notifiers and error buffers"] + end + subgraph EN["Engines"] + GR["GR - compute, grid launches"] + CE["CE pair - copies and UVM memops"] + DEC["DEC - video decode [planned]"] + ENC["ENC - video encode [planned]"] + RL["Runlist / TSG scheduling"] + end + subgraph MM["GMMU"] + HI["Page-directory hierarchy"] + LEAF["Leaf PTEs"] + SRV["Server-owned ranges"] + end + CFG --> C0 + B0 --> S0 --> GPF + B1 --> S1 + B3 --> S3 --> RF + MX --> IR + GPF --> USR + GPF --> RF + GPF --> MB + GPF --> NOT + USR --> GR + USR --> CE + CE --> RL + GR --> RL + RL --> ENC + RL --> DEC + S1 --> HI + S3 --> HI + HI --> LEAF + HI --> SRV + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef wip fill:#fff3cd,stroke:#9a7b1a + classDef plan fill:#f8d7da,stroke:#9a1a1a + class CFG,C0,B0,S0,B3,S3,MX,IR,GPF,USR,RF,MB,NOT,GR,CE,RL done + class B1,S1,HI,LEAF,SRV wip + class DEC,ENC plan +``` + +## 10. Portability: versions, hardware, hypervisors + +```mermaid +flowchart LR + A["Firmware / driver image"] -->|"CRC32 + SHA-256"| B["Firmware analyzer"] + B --> C["Version tables<br/>and YAML profiles"] + C --> D["Dynamic RPC dispatcher"] + C --> E["Hardware abstraction profiles"] + D --> F["Version-keyed handlers"] + E --> G["Architecture tables<br/>engine inventory, GMMU formats"] + F --> H["GSP-RM emulation"] + G --> H + H --> I["Same guest interface"] + J["New driver version<br/>or new GPU"] --> A + J --> K["Measurement + A/B against host oracle"] + K --> C + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef wip fill:#fff3cd,stroke:#9a7b1a + classDef plan fill:#f8d7da,stroke:#9a1a1a + class B done + class C,D,F done + class E,G,H wip + class K plan +``` + +The *interface* is the product: RPC/control inventories are measured, not +guessed; new versions enter by adding a profile and running the A/B workflow +(see [`../05-operations/02-debugging-and-maintenance-workflows.md`](../05-operations/02-debugging-and-maintenance-workflows.md)). +The execution backend is similarly version-keyed: the real GSP protocol is +spoken as a client, with the module carrying the small set of host-side calls +it needs. + +## 11. Performance: distance to bare metal + +```mermaid +flowchart LR + subgraph FAST["Emulated fast path - state only"] + A["Release, fence, membar"] --> B["Applied in the module"] + B --> C["microseconds; no GPU round trip;<br/>faster than hardware would be"] + end + subgraph DATA["Forwarded work path"] + D["Guest submission"] --> E["Decode + translate + submit"] + E --> F["Engine executes at native speed"] + F --> G["Completion relay"] + end + C -.-> H["Cost model: overhead is per submission,<br/>not per unit of work"] + G -.-> H + H -.-> I["Large copies and kernels amortize to near native;<br/>launch-bound workloads pay the translation"] + + classDef done fill:#d5f5d5,stroke:#1e7a1e + classDef plan fill:#f8d7da,stroke:#9a1a1a + class A,B,C done + class D,E,F,G,H,I plan +``` + +| Aspect | Expectation | Status | +|---|---|---| +| State/synchronization latency | low microseconds, no round trip | measured in debug logs | +| Copy bandwidth (large) | near native; DMA is DMA | not measured yet | +| Kernel launch overhead | translation cost per submission; amortized | not measured yet | +| Multi-tenant fairness | policy-controlled, measurable | policy planned | +| Bare-metal parity claim | only after the measurement ladder is green | see operations doc | + +We do not claim parity today, and the docs say so in plain words: the honest +claim is "initialization works; execution is in progress". + +## 12. Implementation and test status + +How far each component is from the finished system. "Tested" means exercised +against a stock guest driver with evidence in the repository. + +| Component | Implemented | Tested | Next step | +|---|---|---|---| +| mdev + VFIO device, config space, BARs, MSI-X | yes | yes | keep regression-free | +| GSP boot emulation (all stages) | yes | yes | unchanged under backend | +| GSP-RM message queues + RPC + controls | yes | yes | reply fidelity for remaining consumed fields | +| Object/alloc model (handles, echoes) | yes | yes | server-side object tracking where consumed | +| Engine/class topology (incl. async copy engine) | yes | yes | version profiles | +| Guest memory access + VA-to-PA discovery | partial | yes | protocol-derived discovery, no external pins | +| Push decode + semaphore completion | partial | yes | complete GR/compute encodings | +| Software execution bridge (memsets, copies, releases) | partial | yes | remains bridge only | +| Page-table population for server-owned ranges | no | no | design + validator, then implement | +| Execution backend (own GPU + real GSP) | no | no | device ownership, real GSP bring-up, RM client | +| Real work forwarding (GR and CE) | no | no | after backend bring-up | +| Fault semantics (buffers, replay, cancel) | no | no | after forwarding | +| Multi-tenant fairness policy | no | no | after multi-tenant forwarding | +| Version matrix (2+ driver families) | partial | partial | per-version profiles + A/B | +| Windows guest | no | no | after Linux execution path | +| Non-KVM transports (Xen, Argo, OpenXT) | no | no | transport interface + backend | +| aarch64 hosts (Grace, GB10) | no | no | architecture-neutral memory model | +| Debug interfaces (dev only) | yes | yes | gate destructive ones; production build | + +## 13. How the unmodified-driver guarantee is achieved + +* **Emulate what the guest observes, forward what it uses.** Every interface + the stock driver touches is answered by the module; every operation that must + be fast goes to real hardware. The guest never learns it is virtualized for + the CUDA/initialization path — it sees a TU104 whose GSP answers correctly. +* **Reply fidelity, not just status.** A reply whose fields the driver consumes + is only considered done when the values are coherent (status-only, then + coherent zeroed params, then coherent consumed fields, then exact values). + This is the mechanism that makes arbitrary graphics and CUDA stacks work + without per-application code. +* **No guest code, no paravirtual enlightenment, no patches.** The guest may + install whatever software it likes; the module presents physical hardware. + The planned execution backend keeps this property: the guest's work is + translated, never the guest's driver. + +## See also + +- [`01-system-overview.md`](01-system-overview.md) - principles and layers in prose +- [`06-host-module-and-hybrid-model.md`](06-host-module-and-hybrid-model.md) - the module, memory model, build contracts +- [`08-physical-gpu-integration.md`](08-physical-gpu-integration.md) - the chosen execution backend and its decision record +- [`../04-implementation/01-known-knowns-and-unknowns.md`](../04-implementation/01-known-knowns-and-unknowns.md) - gaps and plans +- [`../05-operations/01-performance-correctness-security.md`](../05-operations/01-performance-correctness-security.md) - measurement ladder, threat model |
