<?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=RPC_Message_Format</id>
	<title>RPC Message Format - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=RPC_Message_Format"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=RPC_Message_Format&amp;action=history"/>
	<updated>2026-10-12T06:55:38Z</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=RPC_Message_Format&amp;diff=23987&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=RPC_Message_Format&amp;diff=23987&amp;oldid=prev"/>
		<updated>2026-10-12T04:41:00Z</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:41, 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 RPC Message Format Specification =&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 RPC Message Format Specification =&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;'''Historical document — superseded.''' This page describes the legacy BAR0 mailbox RPC model: the 64-byte &amp;lt;code&amp;gt;GSPR&amp;lt;/code&amp;gt; magic header and the 12-type model below are '''not''' the path the guest driver uses. The live GSP-RM path is a message queue in guest system memory with 4 KB queue elements and a 32-byte RPC header (signature &amp;lt;code&amp;gt;0x43505256&amp;lt;/code&amp;gt;, header version &amp;lt;code&amp;gt;0x03000000&amp;lt;/code&amp;gt;); functions are a flat enum (&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, ...). Canonical documentation: [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;] and [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/06-host-module-and-hybrid-model.md &amp;lt;code&amp;gt;../docs/03-architecture/06-host-module-and-hybrid-model.md&amp;lt;/code&amp;gt;].&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;'''Historical document — superseded.''' This page describes the legacy BAR0 mailbox RPC model: the 64-byte &amp;lt;code&amp;gt;GSPR&amp;lt;/code&amp;gt; magic header and the 12-type model below are '''not''' the path the guest driver uses. The live GSP-RM path is a message queue in guest system memory with 4 KB queue elements and a 32-byte RPC header (signature &amp;lt;code&amp;gt;0x43505256&amp;lt;/code&amp;gt;, header version &amp;lt;code&amp;gt;0x03000000&amp;lt;/code&amp;gt;); functions are a flat enum (&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, ...). Canonical documentation: [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;] and [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/06-host-module-and-hybrid-model.md &amp;lt;code&amp;gt;../docs/03-architecture/06-host-module-and-hybrid-model.md&amp;lt;/code&amp;gt;].&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;== Overview ==&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;== Overview ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23953:rev-23987 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=RPC_Message_Format&amp;diff=23953&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=RPC_Message_Format&amp;diff=23953&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:51Z</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 RPC Message Format Specification =&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 RPC Message Format Specification =&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-23857:rev-23953 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=RPC_Message_Format&amp;diff=23857&amp;oldid=prev</id>
		<title>WikiBot: Re-sync page from tracked wiki source: fix cross-document links and diagram; refresh status</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=RPC_Message_Format&amp;diff=23857&amp;oldid=prev"/>
		<updated>2026-10-12T04:10:06Z</updated>

		<summary type="html">&lt;p&gt;Re-sync page from tracked wiki source: fix cross-document links and diagram; refresh status&lt;/p&gt;
&lt;a href=&quot;https://open-iov.org/index.php?title=RPC_Message_Format&amp;amp;diff=23857&amp;amp;oldid=23833&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=RPC_Message_Format&amp;diff=23833&amp;oldid=prev</id>
		<title>WikiBot: Remove unpaired blockquote tags left by reference cleanup</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=RPC_Message_Format&amp;diff=23833&amp;oldid=prev"/>
		<updated>2026-10-12T03:58:30Z</updated>

		<summary type="html">&lt;p&gt;Remove unpaired blockquote tags left by reference cleanup&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;gsp-rpc-message-format-specification&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= GSP RPC Message Format Specification =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The GSP firmware uses a dispatcher-based RPC system with two dispatchers:&lt;br /&gt;
&lt;br /&gt;
* '''Primary''' (0x057A1AC0): ALLOC, FREE, MAP, UNMAP, PIN, UNPIN, SCHEDULE, YIELD, NOTIFY, BAR_TRAP, MIGRATE, DEBUG&lt;br /&gt;
* '''Secondary''' (0x04ED39DC): Branch-based dispatch for all 11 types&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primary-dispatcher-call-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Primary Dispatcher Call Convention ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;entry-point&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Entry Point ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;FUN_ram_057a1ac0(&lt;br /&gt;
    uint32_t rpc_type,      // param_1: RPC type (0x01-0x0C)&lt;br /&gt;
    uint8_t  flags_a,       // param_2&lt;br /&gt;
    uint8_t  flags_b,       // param_3&lt;br /&gt;
    uint8_t  flags_c,       // param_4&lt;br /&gt;
    uint32_t *out_subcmd_id,// param_5: Returns sub-command ID&lt;br /&gt;
    uint8_t  *out_a,        // param_6: Echoes flags_b&lt;br /&gt;
    uint8_t  *out_b,        // param_7: Echoes flags_a&lt;br /&gt;
    uint8_t  *out_c         // param_8: Echoes flags_c&lt;br /&gt;
) -&amp;amp;gt; int64_t&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;rpc-type-to-sub-command-mapping&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== RPC Type to Sub-Command Mapping ===&lt;br /&gt;
&lt;br /&gt;
The primary dispatcher validates RPC type, then indexes into the 32-entry jump table at '''0x057A3AD8'''.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! RPC Type&lt;br /&gt;
! Name&lt;br /&gt;
! Subcmd Range&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| ALLOC&lt;br /&gt;
| 0-31&lt;br /&gt;
| Uses 0x057E94EC main&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| FREE&lt;br /&gt;
| 0-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| MAP&lt;br /&gt;
| —&lt;br /&gt;
| Uses secondary dispatcher&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| UNMAP&lt;br /&gt;
| 0-31&lt;br /&gt;
| Primary + secondary&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| PIN&lt;br /&gt;
| —&lt;br /&gt;
| Uses secondary dispatcher&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| UNPIN&lt;br /&gt;
| —&lt;br /&gt;
| Uses secondary dispatcher&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| SCHEDULE&lt;br /&gt;
| 0-31&lt;br /&gt;
| Uses 0x051EFBF4 main&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| YIELD&lt;br /&gt;
| —&lt;br /&gt;
| Uses secondary dispatcher&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| NOTIFY&lt;br /&gt;
| —&lt;br /&gt;
| Uses secondary dispatcher&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| BAR_TRAP&lt;br /&gt;
| —&lt;br /&gt;
| Uses 0x04CB8188&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| MIGRATE&lt;br /&gt;
| 0-15 x2&lt;br /&gt;
| Dual jump tables&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| DEBUG&lt;br /&gt;
| —&lt;br /&gt;
| Unimplemented&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sub-command-descriptor-returned-by-jump-table-handlers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Sub-Command Descriptor (Returned by Jump Table Handlers) ===&lt;br /&gt;
&lt;br /&gt;
Each sub-command handler at the jump table returns:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint32_t subcmd_id;     // Constant ID (e.g., 0x10, 0x14, 0x40)&lt;br /&gt;
    uint8_t  echo_flags_b;  // Copy of input flags_b&lt;br /&gt;
    uint8_t  echo_flags_a;  // Copy of input flags_a&lt;br /&gt;
    uint8_t  echo_flags_c;  // Copy of input flags_c&lt;br /&gt;
} __attribute__((packed)) subcmd_descriptor_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''Example: Subcmd 3 (0x057A1BCC)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Returns ID = 0x10&lt;br /&gt;
*out_subcmd_id = 0x10;&lt;br /&gt;
*out_a = flags_b;&lt;br /&gt;
*out_b = flags_a;&lt;br /&gt;
*out_c = flags_c;&lt;br /&gt;
return 0;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''Example: Subcmd 0 (0x057A1DB4)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Returns ID = 0x40&lt;br /&gt;
*out_subcmd_id = 0x40;&lt;br /&gt;
*out_a = flags_b;&lt;br /&gt;
*out_b = flags_a;&lt;br /&gt;
*out_c = flags_c;&lt;br /&gt;
return 0;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;secondary-dispatcher-call-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Secondary Dispatcher Call Convention ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;entry-point-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Entry Point ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;FUN_ram_04ed39dc(rpc_message_t *msg) -&amp;amp;gt; int64_t&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;message-structure-inferred&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Message Structure (Inferred) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint32_t rpc_type;      // 0x01-0x0B&lt;br /&gt;
    uint32_t sub_type;      // Sub-operation code&lt;br /&gt;
    uint64_t payload_ptr;   // Pointer to RPC-specific payload&lt;br /&gt;
    uint32_t payload_size;  // Size of payload&lt;br /&gt;
    uint32_t flags;         // Control flags&lt;br /&gt;
    uint64_t context;       // Opaque context&lt;br /&gt;
    uint32_t sequence;      // Sequence number&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
} __attribute__((packed)) rpc_message_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;branch-based-dispatch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Branch-Based Dispatch ===&lt;br /&gt;
&lt;br /&gt;
Secondary dispatcher uses &amp;lt;code&amp;gt;bgeu&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;bltu&amp;lt;/code&amp;gt; branches on &amp;lt;code&amp;gt;rpc_type&amp;lt;/code&amp;gt; register:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;assembly&amp;quot;&amp;gt;# Pseudocode&lt;br /&gt;
if (rpc_type &amp;amp;gt;= 0x0C) goto error;&lt;br /&gt;
switch(rpc_type):&lt;br /&gt;
  case 0x03: call MAP_handler_A;&lt;br /&gt;
  case 0x04: call UNMAP_handler_A;&lt;br /&gt;
  case 0x05: call PIN_handler_A (0x04ED34B8);&lt;br /&gt;
  case 0x06: call UNPIN_handler_A;&lt;br /&gt;
  case 0x07: call SCHEDULE_handler_A;&lt;br /&gt;
  case 0x08: call YIELD_handler_A;&lt;br /&gt;
  case 0x09: call NOTIFY_handler_A;&lt;br /&gt;
  case 0x0A: call BAR_TRAP_handler (0x057675B7);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;rpc-specific-payloads&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RPC-Specific Payloads ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;alloc-0x01---via-0x057e94ec&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ALLOC (0x01) - Via 0x057E94EC ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint64_t size;          // Allocation size in bytes&lt;br /&gt;
    uint32_t type;          // Memory type (VRAM, sysmem, etc.)&lt;br /&gt;
    uint32_t alignment;     // Alignment requirement&lt;br /&gt;
    uint64_t va_hint;       // Virtual address hint&lt;br /&gt;
    uint32_t flags;         // CACHE_COHERENT, UNCACHED, etc.&lt;br /&gt;
    uint32_t pid;           // Process ID&lt;br /&gt;
    uint32_t vf_id;         // VF ID (for vGPU)&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
    uint64_t *out_handle;   // Output: allocation handle&lt;br /&gt;
    uint64_t *out_va;       // Output: mapped virtual address&lt;br /&gt;
    uint64_t *out_pa;       // Output: physical address&lt;br /&gt;
} alloc_payload_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;map-0x03---handlers-0x05766ab7--0x05778a37&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== MAP (0x03) - Handlers 0x05766AB7 / 0x05778A37 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint64_t handle;        // Allocation handle from ALLOC&lt;br /&gt;
    uint64_t va;            // Target virtual address&lt;br /&gt;
    uint64_t size;          // Map size&lt;br /&gt;
    uint32_t prot;          // PROT_READ|PROT_WRITE|PROT_EXEC&lt;br /&gt;
    uint32_t flags;         // MAP_FIXED, MAP_SHARED, etc.&lt;br /&gt;
    uint32_t vf_id;         // Target VF&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
} map_payload_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;pin-0x05---handler-0x04ed34b8&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PIN (0x05) - Handler 0x04ED34B8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint64_t handle;        // Allocation handle&lt;br /&gt;
    uint64_t offset;        // Offset within allocation&lt;br /&gt;
    uint64_t size;          // Size to pin&lt;br /&gt;
    uint32_t vf_id;         // Target VF&lt;br /&gt;
    uint32_t flags;         // PIN_WRITE, PIN_READ, PIN_LONGTERM&lt;br /&gt;
    uint64_t *out_dma_addr; // Output: DMA address for device&lt;br /&gt;
} pin_payload_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;schedule-0x07---via-0x051efbf4--0x05767f37&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== SCHEDULE (0x07) - Via 0x051EFBF4 / 0x05767F37 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint32_t vf_id;         // VF to schedule&lt;br /&gt;
    uint32_t priority;      // Scheduling priority&lt;br /&gt;
    uint64_t time_slice_ns; // Time slice in nanoseconds&lt;br /&gt;
    uint32_t flags;         // PREEMPTIBLE, REALTIME, etc.&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
} schedule_payload_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bar_trap-0x0a---handler-0x04cb8188&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BAR_TRAP (0x0A) - Handler 0x04CB8188 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint32_t bar_index;     // BAR number (0-5)&lt;br /&gt;
    uint32_t trap_type;     // READ, WRITE, ATOMIC&lt;br /&gt;
    uint64_t offset;        // Offset within BAR&lt;br /&gt;
    uint64_t value;         // Value for writes&lt;br /&gt;
    uint32_t size;          // Access size (1,2,4,8)&lt;br /&gt;
    uint32_t vf_id;         // Trapping VF&lt;br /&gt;
    uint64_t *out_value;    // Output: read value&lt;br /&gt;
} bar_trap_payload_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;migrate-0x0b---dual-jump-tables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== MIGRATE (0x0B) - Dual Jump Tables ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint32_t phase;         // 0=prepare, 1=transfer, 2=commit, 3=cleanup&lt;br /&gt;
    uint32_t subcmd;        // Sub-command index (0-15 for each table)&lt;br /&gt;
    uint64_t src_vf;        // Source VF&lt;br /&gt;
    uint64_t dst_vf;        // Destination VF&lt;br /&gt;
    uint64_t data_ptr;      // Migration data buffer&lt;br /&gt;
    uint64_t data_size;     // Buffer size&lt;br /&gt;
    uint32_t flags;         // LIVE, POSTCOPY, etc.&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
} migrate_payload_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;wire-format-host--gsp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wire Format (Host → GSP) ==&lt;br /&gt;
&lt;br /&gt;
'''Legacy BAR0 mailbox format — not used by the guest driver.''' The current msgq header/element facts are in the note at the top of this page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;message-header-64-bytes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Message Header (64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint32_t magic;         // 0x47535052 (&amp;quot;GSPR&amp;quot;)&lt;br /&gt;
    uint32_t version;       // Protocol version (1)&lt;br /&gt;
    uint32_t rpc_type;      // 0x01-0x0C&lt;br /&gt;
    uint32_t sequence;      // Monotonic sequence&lt;br /&gt;
    uint64_t timestamp_ns;  // Submission timestamp&lt;br /&gt;
    uint32_t payload_size;  // Size of payload&lt;br /&gt;
    uint32_t flags;         // MSG_SYNC, MSG_ASYNC, MSG_NOREPLY&lt;br /&gt;
    uint64_t correlation_id;// For async matching&lt;br /&gt;
    uint64_t reserved[3];   // Padding to 64 bytes&lt;br /&gt;
} __attribute__((packed)) rpc_header_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;complete-message&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Complete Message ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;+------------------+&lt;br /&gt;
| rpc_header_t     |  64 bytes&lt;br /&gt;
+------------------+&lt;br /&gt;
| payload (varies) |  payload_size bytes&lt;br /&gt;
+------------------+&lt;br /&gt;
| padding to 256B  |  (alignment)&lt;br /&gt;
+------------------+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;response-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Response Format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;synchronous-response&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Synchronous Response ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    int64_t status;         // 0 = success, negative = error&lt;br /&gt;
    uint32_t rpc_type;      // Echo of request&lt;br /&gt;
    uint32_t sequence;      // Echo of request&lt;br /&gt;
    uint64_t timestamp_ns;  // Completion timestamp&lt;br /&gt;
    uint32_t payload_size;  // Response payload size&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
} __attribute__((packed)) rpc_response_header_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-codes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Error Codes ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| OK&lt;br /&gt;
| Success&lt;br /&gt;
|-&lt;br /&gt;
| -1 (0xFFFF)&lt;br /&gt;
| EPERM&lt;br /&gt;
| Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| -2 (0xFFFE)&lt;br /&gt;
| ENOENT&lt;br /&gt;
| Not found&lt;br /&gt;
|-&lt;br /&gt;
| -3 (0xFFFD)&lt;br /&gt;
| EINVAL&lt;br /&gt;
| Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| -6 (0xFFFA)&lt;br /&gt;
| ENODEV&lt;br /&gt;
| No such device&lt;br /&gt;
|-&lt;br /&gt;
| -12 (0xFFF4)&lt;br /&gt;
| ENOMEM&lt;br /&gt;
| Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| -16 (0xFFEE)&lt;br /&gt;
| EBUSY&lt;br /&gt;
| Resource busy&lt;br /&gt;
|-&lt;br /&gt;
| -22 (0xFFEA)&lt;br /&gt;
| EINVAL&lt;br /&gt;
| Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| -28 (0xFFE4)&lt;br /&gt;
| ENOSPC&lt;br /&gt;
| No space left&lt;br /&gt;
|-&lt;br /&gt;
| -37 (0xFFDB)&lt;br /&gt;
| ENOLCK&lt;br /&gt;
| No locks available&lt;br /&gt;
|-&lt;br /&gt;
| -56 (0xFFC8)&lt;br /&gt;
| EBADMSG&lt;br /&gt;
| Bad message&lt;br /&gt;
|-&lt;br /&gt;
| -84 (0xFFAC)&lt;br /&gt;
| EOVERFLOW&lt;br /&gt;
| Value too large&lt;br /&gt;
|-&lt;br /&gt;
| -90 (0xFFA6)&lt;br /&gt;
| ENOSTR&lt;br /&gt;
| Not a stream&lt;br /&gt;
|-&lt;br /&gt;
| -91 (0xFFA5)&lt;br /&gt;
| ENODATA&lt;br /&gt;
| No data available&lt;br /&gt;
|-&lt;br /&gt;
| -94 (0xFFA2)&lt;br /&gt;
| ENOSR&lt;br /&gt;
| Out of streams resources&lt;br /&gt;
|-&lt;br /&gt;
| -97 (0xFF9F)&lt;br /&gt;
| EPROTO&lt;br /&gt;
| Protocol error&lt;br /&gt;
|-&lt;br /&gt;
| -111 (0xFF91)&lt;br /&gt;
| ETIMEDOUT&lt;br /&gt;
| Connection timed out&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kernel-client-implementation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Kernel Client Implementation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;message-builder&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Message Builder ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;static int gsp_rpc_send(gsp_client_t *client, uint32_t rpc_type, &lt;br /&gt;
                        void *payload, size_t payload_size,&lt;br /&gt;
                        void *response, size_t *response_size) {&lt;br /&gt;
    rpc_header_t hdr = {.magic = 0x47535052,.version = 1,.rpc_type = rpc_type,.sequence = atomic_inc(&amp;amp;client-&amp;gt;seq),.timestamp_ns = ktime_get_ns,.payload_size = payload_size,.flags = MSG_SYNC,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    // Build complete message&lt;br /&gt;
    uint8_t msg[256];&lt;br /&gt;
    memcpy(msg, &amp;amp;hdr, sizeof(hdr));&lt;br /&gt;
    memcpy(msg + 64, payload, payload_size);&lt;br /&gt;
    &lt;br /&gt;
    // Submit to GSP doorbell&lt;br /&gt;
    return gsp_doorbell_ring(client-&amp;gt;gsp, msg, sizeof(msg));&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;doorbell-mechanism&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Doorbell Mechanism ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// GSP doorbell register (PCIe BAR0 + offset)&lt;br /&gt;
#define GSP_DOORBELL_OFFSET  0x1000&lt;br /&gt;
&lt;br /&gt;
static void gsp_doorbell_ring(gsp_device_t *gsp, void *msg, size_t len) {&lt;br /&gt;
    // Copy message to shared memory ring&lt;br /&gt;
    // Ring GSP doorbell&lt;br /&gt;
    writel(1, gsp-&amp;gt;bar0 + GSP_DOORBELL_OFFSET);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;async-completion&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Async Completion ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;notification-mechanism&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Notification Mechanism ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef struct {&lt;br /&gt;
    uint32_t rpc_type;&lt;br /&gt;
    uint32_t sequence;&lt;br /&gt;
    int64_t status;&lt;br /&gt;
    uint64_t timestamp_ns;&lt;br /&gt;
    uint32_t payload_size;&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
} async_completion_t;&lt;br /&gt;
&lt;br /&gt;
// Delivered via MSI-X or GSP notification queue&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;reference&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* Primary Dispatcher: 0x057A1AC0&lt;br /&gt;
* Secondary Dispatcher: 0x04ED39DC&lt;br /&gt;
* Jump Table: 0x057A3AD8 (32 entries)&lt;br /&gt;
* RPC Type Jump Table: 0x059BFEB0 (12 types)&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>