<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=GSP_and_GSP-RM</id>
	<title>GSP and GSP-RM - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=GSP_and_GSP-RM"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=GSP_and_GSP-RM&amp;action=history"/>
	<updated>2026-10-12T06:58:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://open-iov.org/index.php?title=GSP_and_GSP-RM&amp;diff=23977&amp;oldid=prev</id>
		<title>WikiBot: Fix repository links: point to the cgit tree URLs</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=GSP_and_GSP-RM&amp;diff=23977&amp;oldid=prev"/>
		<updated>2026-10-12T04:40:55Z</updated>

		<summary type="html">&lt;p&gt;Fix repository links: point to the cgit tree URLs&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:40, 12 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l3&quot;&gt;Line 3:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= GSP and GSP-RM =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= GSP and GSP-RM =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;'''What this page is.''' The GPU System Processor hosts NVIDIA's Resource Manager in firmware; since Turing, the guest driver's management path is ''talking to that firmware'', not to silicon. This page explains that architecture and the interface the project emulates. Condensed from [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/03-architecture/03-gsp-and-gsp-rm.md &amp;lt;code&amp;gt;../docs/03-architecture/03-gsp-and-gsp-rm.md&amp;lt;/code&amp;gt;]; the docs tree wins on disagreement.&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;'''What this page is.''' The GPU System Processor hosts NVIDIA's Resource Manager in firmware; since Turing, the guest driver's management path is ''talking to that firmware'', not to silicon. This page explains that architecture and the interface the project emulates. Condensed from [https://git.vgpu.io/open-iov&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.git&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tree&lt;/ins&gt;/docs/03-architecture/03-gsp-and-gsp-rm.md &amp;lt;code&amp;gt;../docs/03-architecture/03-gsp-and-gsp-rm.md&amp;lt;/code&amp;gt;]; the docs tree wins on disagreement.&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Status: 2026-10-12, tree &amp;lt;code&amp;gt;master @ 2f066727&amp;lt;/code&amp;gt;. Tags: &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; proven with the stock guest driver; &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; partial; &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt; current blocker; &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt; designed end state.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Status: 2026-10-12, tree &amp;lt;code&amp;gt;master @ 2f066727&amp;lt;/code&amp;gt;. Tags: &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; proven with the stock guest driver; &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; partial; &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt; current blocker; &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt; designed end state.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23943:rev-23977 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=GSP_and_GSP-RM&amp;diff=23943&amp;oldid=prev</id>
		<title>WikiBot: Carry the site-wide About/licensing message on every page (2026-10-12)</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=GSP_and_GSP-RM&amp;diff=23943&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:46Z</updated>

		<summary type="html">&lt;p&gt;Carry the site-wide About/licensing message on every page (2026-10-12)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:29, 12 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{About message}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= GSP and GSP-RM =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= GSP and GSP-RM =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23863:rev-23943 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=GSP_and_GSP-RM&amp;diff=23863&amp;oldid=prev</id>
		<title>WikiBot: Add page from tracked wiki source (2026 IA update)</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=GSP_and_GSP-RM&amp;diff=23863&amp;oldid=prev"/>
		<updated>2026-10-12T04:22:10Z</updated>

		<summary type="html">&lt;p&gt;Add page from tracked wiki source (2026 IA update)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= GSP and GSP-RM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''What this page is.''' The GPU System Processor hosts NVIDIA's Resource Manager in firmware; since Turing, the guest driver's management path is ''talking to that firmware'', not to silicon. This page explains that architecture and the interface the project emulates. Condensed from [https://git.vgpu.io/open-iov/blob/master/docs/03-architecture/03-gsp-and-gsp-rm.md &amp;lt;code&amp;gt;../docs/03-architecture/03-gsp-and-gsp-rm.md&amp;lt;/code&amp;gt;]; the docs tree wins on disagreement.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Status: 2026-10-12, tree &amp;lt;code&amp;gt;master @ 2f066727&amp;lt;/code&amp;gt;. Tags: &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; proven with the stock guest driver; &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; partial; &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt; current blocker; &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt; designed end state.&lt;br /&gt;
&lt;br /&gt;
== 1. What the GSP is ==&lt;br /&gt;
&lt;br /&gt;
The '''GSP''' is a small embedded RISC-V processor (RV64IMAC) inside NVIDIA GPUs. It runs a firmware image (for the 570.144 generation, a ~28 MB ELF) that contains, among other things, a full port of NVIDIA's '''Resource Manager (RM)''' — the component that owns GPU initialization, memory, engines, interrupts and scheduling.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;   ┌──────────────────────────── GUEST ────────────────────────────┐&lt;br /&gt;
   │  nvidia.ko                                                   │&lt;br /&gt;
   │    RM client path ── RPC ──┐                                  │&lt;br /&gt;
   │    GSP boot code           │                                  │&lt;br /&gt;
   └────────────────────────────┼──────────────────────────────────┘&lt;br /&gt;
                                │  shared memory queues + doorbells&lt;br /&gt;
   ┌────────────────────────────┼──────────────────────────────────┐&lt;br /&gt;
   │  GSP (firmware, RISC-V)    │                                   │&lt;br /&gt;
   │    RM core (RMCore)  ◄─────┘                                   │&lt;br /&gt;
   │    RM API  (object model, clients, handles)                    │&lt;br /&gt;
   │    Resource server (resserv): allocation &amp;amp;amp; lifetime            │&lt;br /&gt;
   │    memory manager, GMMU, FIFO/runlist, interrupts, PMU         │&lt;br /&gt;
   └───────────────────────────────────────────────────────────────┘&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A driver as complex as NVIDIA's is not written to program silicon directly; it is written to talk to an RM, and on modern GPUs a copy of the RM runs on the GSP. The driver is therefore an '''RM client''': it issues requests, receives callbacks, and observes state through a well-defined protocol.&lt;br /&gt;
&lt;br /&gt;
== 2. The boot handshake we emulate ==&lt;br /&gt;
&lt;br /&gt;
The guest driver boots the GSP exactly as it would on bare metal:&lt;br /&gt;
&lt;br /&gt;
# '''WPR setup''' — carve a firmware-protected region of VRAM and write descriptors into BAR0 registers ([[WPR Management|&amp;lt;code&amp;gt;WPR-Management.md&amp;lt;/code&amp;gt;]]).&lt;br /&gt;
# '''FWSEC''' — the driver verifies firmware signatures.&lt;br /&gt;
# '''Booter''' — the boot ROM consumes the firmware image.&lt;br /&gt;
# '''RISCV start''' — the RISC-V core begins executing the firmware.&lt;br /&gt;
# '''GSP init done''' — the firmware signals readiness through a status mailbox; the driver proceeds to initialization RPCs.&lt;br /&gt;
&lt;br /&gt;
The emulation implements '''stage completion''' rather than the stages themselves — legitimate because the only observable to the driver is the state machine it polls. The same handshake has also been run against real firmware on the physical backend: the firmware comes up, delivers its first status events, serves the static configuration, and stays live until the unload RPC releases it ([[Physical GPU Backend and Guest Wiring|&amp;lt;code&amp;gt;Physical-GPU-Backend.md&amp;lt;/code&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
== 3. The transport: message queues and RPC ==&lt;br /&gt;
&lt;br /&gt;
GSP-RM's transport is a shared-memory message queue pair:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  guest system memory (allocated by the guest driver, registered with us)&lt;br /&gt;
  ┌───────────────────────────────┐&lt;br /&gt;
  │ command queue (guest -&amp;amp;gt; GSP)  │  element ring, 4 KB elements&lt;br /&gt;
  ├───────────────────────────────┤&lt;br /&gt;
  │ status queue  (GSP -&amp;amp;gt; guest)  │  element ring&lt;br /&gt;
  └───────────────────────────────┘&lt;br /&gt;
     + a page table describing the queue pages (the buffer is&lt;br /&gt;
       non-contiguous: each page is an independent allocation)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each element begins with a transport header followed by an '''RPC message''' whose 32-byte header carries header version, length, function, result and sequence number. Observations worth knowing (all verified against the stock guest):&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; covers the fixed part of the message, not variable payloads — do not use it to bound a payload;&lt;br /&gt;
* function numbers are a flat enum shared by several protocols (&amp;lt;code&amp;gt;SET_GUEST_SYSTEM_INFO&amp;lt;/code&amp;gt; 1, &amp;lt;code&amp;gt;FREE&amp;lt;/code&amp;gt; 10, &amp;lt;code&amp;gt;GET_GSP_STATIC_INFO&amp;lt;/code&amp;gt; 65, &amp;lt;code&amp;gt;GSP_RM_CONTROL&amp;lt;/code&amp;gt; 76, &amp;lt;code&amp;gt;GSP_RM_ALLOC&amp;lt;/code&amp;gt; 103, ...);&lt;br /&gt;
* replies must be matched to request sequence numbers — the driver runs a reply-matching state machine, and a slow reply is indistinguishable from a hang.&lt;br /&gt;
&lt;br /&gt;
== 4. RMCore, the RM API and the resource server ==&lt;br /&gt;
&lt;br /&gt;
Three RM concepts make every log readable:&lt;br /&gt;
&lt;br /&gt;
* '''RMCore''' — the object system. Everything is an object with a class (a 32-bit class ID), a handle in a per-client handle space, and a parent object forming a tree rooted at a client. Traces of &amp;lt;code&amp;gt;GSP_RM_ALLOC&amp;lt;/code&amp;gt; are object creation; traces of &amp;lt;code&amp;gt;GSP_RM_CONTROL&amp;lt;/code&amp;gt; are method calls on objects.&lt;br /&gt;
* '''RM API''' — how in-kernel components (and user space via ioctls) allocate objects and call controls, with an implicit-handle and an explicit-handle variant. For a GSP client, part of the API becomes RPCs while some calls are handled locally; memory objects, for example, are allocated locally by the client RM.&lt;br /&gt;
* '''Resource server (resserv)''' — the allocation authority: it owns handle spaces, enforces privileges and tracks object lifetimes.&lt;br /&gt;
&lt;br /&gt;
== 5. The client/server split (and why page tables matter) ==&lt;br /&gt;
&lt;br /&gt;
Modern RM is client/server: the '''client''' (guest &amp;lt;code&amp;gt;nvidia.ko&amp;lt;/code&amp;gt;) owns per-process state and submits work; the '''server''' (GSP-RM) owns GPU-global state — routing, page tables, scheduling domains, engine configuration. For virtualized setups the client tells the server which VA ranges the server owns, and the server manages the deeper page-table levels for those ranges. The client hands over the '''physical addresses of its page-table levels''' plus the VA ranges they cover; on real hardware the server then fills in the lower levels for server-owned ranges and the client never writes them.&lt;br /&gt;
&lt;br /&gt;
This is a central fact for the execution work: when the guest's UVM asks the &amp;quot;GPU&amp;quot; to map memory, the mapping is expected to materialize in page tables that only the server side can write — which is us ([[UVM in the Guest|&amp;lt;code&amp;gt;UVM-in-the-Guest.md&amp;lt;/code&amp;gt;]], [[Introduction to GMMU|&amp;lt;code&amp;gt;Introduction-to-GMMU.md&amp;lt;/code&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
== 6. Event channels and notifications ==&lt;br /&gt;
&lt;br /&gt;
Beyond request/reply, the guest needs asynchronous events: event objects registered with a notification configuration (an MSI-X vector or a memory &amp;quot;semaphore&amp;quot; the GPU can write), completion events when channels finish work or errors occur, delivered as a strict bit/handle/state triple on the exact vector. The emulation's MSI-X path is emulation thread → &amp;lt;code&amp;gt;eventfd&amp;lt;/code&amp;gt; → KVM → guest vector, with the pending-bit array emulated so a masked vector's interrupt is not lost.&lt;br /&gt;
&lt;br /&gt;
== 7. What we emulate today ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Layer&lt;br /&gt;
! State&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| GSP boot state machine&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
| stages complete; the driver's poll loop is satisfied&lt;br /&gt;
|-&lt;br /&gt;
| Message queue transport&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
| including the non-contiguous page table for the queue buffer&lt;br /&gt;
|-&lt;br /&gt;
| RPC request/reply&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
| every function the driver uses during init is answered; unknown functions get a well-formed success reply&lt;br /&gt;
|-&lt;br /&gt;
| Static info tables&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt;&lt;br /&gt;
| device/FB/BUS/INTR/GMMU tables carry plausible reference values; the engine inventory is complete and agrees with the class list&lt;br /&gt;
|-&lt;br /&gt;
| Controls during init&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt;&lt;br /&gt;
| ~160 distinct control IDs observed per CUDA run; a small set is special-cased with real values and reply fidelity for the consumed fields keeps improving&lt;br /&gt;
|-&lt;br /&gt;
| Object creation&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt;&lt;br /&gt;
| handles/parameters are echoed consistently (zeroing the request parameters corrupts the caller); there is no server-side object model yet&lt;br /&gt;
|-&lt;br /&gt;
| Page tables for server-owned ranges&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt;&lt;br /&gt;
| contract received and recorded; leaf population is the execution work&lt;br /&gt;
|-&lt;br /&gt;
| Event/notification delivery&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt;&lt;br /&gt;
| MSI-X works; richer event semantics land with forwarding&lt;br /&gt;
|-&lt;br /&gt;
| Firmware behaviour (routing, scheduling, real execution)&lt;br /&gt;
| &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt;&lt;br /&gt;
| the execution frontier — see [[The Execution Frontier|&amp;lt;code&amp;gt;Execution-Frontier.md&amp;lt;/code&amp;gt;]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Where the firmware knowledge lives ==&lt;br /&gt;
&lt;br /&gt;
* [[GSP 570.144W Firmware Analysis|&amp;lt;code&amp;gt;GSP-570.144W-Firmware-Analysis.md&amp;lt;/code&amp;gt;]] — how the 28.5 MB image was decompiled and mapped.&lt;br /&gt;
* [[Address Reference|&amp;lt;code&amp;gt;Address-Reference.md&amp;lt;/code&amp;gt;]] — firmware-side address tables.&lt;br /&gt;
* [[RPC Message Format|&amp;lt;code&amp;gt;RPC-Message-Format.md&amp;lt;/code&amp;gt;]], [[GSP RPC Emulation|&amp;lt;code&amp;gt;GSP-RPC-Emulation.md&amp;lt;/code&amp;gt;]] — historical RPC analysis (superseded; kept for the record).&lt;br /&gt;
* [[WPR Management|&amp;lt;code&amp;gt;WPR-Management.md&amp;lt;/code&amp;gt;]] — write-protected region semantics.&lt;br /&gt;
* [[The vGSP Execution Plane (vEP)|The execution plane]] and [[The Execution Frontier|the execution frontier]] — what turns this protocol into real work on real hardware.&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>