<?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=BAR_Emulation_Specification</id>
	<title>BAR Emulation Specification - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=BAR_Emulation_Specification"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=BAR_Emulation_Specification&amp;action=history"/>
	<updated>2026-10-12T06:35: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=BAR_Emulation_Specification&amp;diff=23962&amp;oldid=prev</id>
		<title>WikiBot: Fix repository links: point to the cgit tree URLs (git.vgpu.io/open-iov.git/tree/...)</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=BAR_Emulation_Specification&amp;diff=23962&amp;oldid=prev"/>
		<updated>2026-10-12T04:40:05Z</updated>

		<summary type="html">&lt;p&gt;Fix repository links: point to the cgit tree URLs (git.vgpu.io/open-iov.git/tree/...)&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;= BAR Emulation Specification (GSP 570.144W) =&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;= BAR Emulation Specification (GSP 570.144W) =&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.''' The &amp;lt;code&amp;gt;BAR_TRAP&amp;lt;/code&amp;gt; RPC (type 0x0A) described here is '''not used''': in emulation mode it returns &amp;lt;code&amp;gt;-ENOTSUPP&amp;lt;/code&amp;gt;, and BAR access is synchronous MMIO through the BAR shadow. Guest-visible BAR windows are BAR0 (16 MB register MMIO), BAR1 (256 MB VRAM aperture) and BAR3 (instance window). 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/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.''' The &amp;lt;code&amp;gt;BAR_TRAP&amp;lt;/code&amp;gt; RPC (type 0x0A) described here is '''not used''': in emulation mode it returns &amp;lt;code&amp;gt;-ENOTSUPP&amp;lt;/code&amp;gt;, and BAR access is synchronous MMIO through the BAR shadow. Guest-visible BAR windows are BAR0 (16 MB register MMIO), BAR1 (256 MB VRAM aperture) and BAR3 (instance window). 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/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-23933:rev-23962 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=BAR_Emulation_Specification&amp;diff=23933&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=BAR_Emulation_Specification&amp;diff=23933&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:41Z</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;= BAR Emulation Specification (GSP 570.144W) =&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;= BAR Emulation Specification (GSP 570.144W) =&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-23846:rev-23933 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=BAR_Emulation_Specification&amp;diff=23846&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=BAR_Emulation_Specification&amp;diff=23846&amp;oldid=prev"/>
		<updated>2026-10-12T04:09:58Z</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=BAR_Emulation_Specification&amp;amp;diff=23846&amp;amp;oldid=23834&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=BAR_Emulation_Specification&amp;diff=23834&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=BAR_Emulation_Specification&amp;diff=23834&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;bar-emulation-specification-gsp-570144w&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= BAR Emulation Specification (GSP 570.144W) =&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;
&amp;lt;span id=&amp;quot;key-addresses&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Key Addresses ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Component&lt;br /&gt;
! Address&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| BAR Trap Handler&lt;br /&gt;
| 0x04CB8188&lt;br /&gt;
| Main emulation logic (40 KB)&lt;br /&gt;
|-&lt;br /&gt;
| RPC Jump Table Entry&lt;br /&gt;
| 0x057675B7&lt;br /&gt;
| BAR_TRAP in secondary dispatcher&lt;br /&gt;
|-&lt;br /&gt;
| String: BAR1&lt;br /&gt;
| 0x0406570E, 0x04085DE0&lt;br /&gt;
| BAR1 identifier&lt;br /&gt;
|-&lt;br /&gt;
| String: Bar1Rest&lt;br /&gt;
| 0x040656DA&lt;br /&gt;
| BAR1 restore state&lt;br /&gt;
|-&lt;br /&gt;
| String: ForceBarAccess&lt;br /&gt;
| 0x040656F2&lt;br /&gt;
| Forced access control&lt;br /&gt;
|-&lt;br /&gt;
| String: Bar1Aperture&lt;br /&gt;
| 0x04065722&lt;br /&gt;
| Aperture configuration&lt;br /&gt;
|-&lt;br /&gt;
| Memory Allocator&lt;br /&gt;
| 0x429B450&lt;br /&gt;
| Arena for BAR backing store&lt;br /&gt;
|-&lt;br /&gt;
| Cache Management&lt;br /&gt;
| 0x429B428&lt;br /&gt;
| Flush/invalidate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;handler-state-machine&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Handler State Machine ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;main-loop-0x04cb8188&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Main Loop (0x04CB8188) ===&lt;br /&gt;
&lt;br /&gt;
The handler runs a continuous event loop processing BAR trap requests:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;while (true) {&lt;br /&gt;
    // Wait for trap event (bitmask in unaff_s5)&lt;br /&gt;
    event = wait_for_bar_event;&lt;br /&gt;
    &lt;br /&gt;
    switch (event &amp;amp; 0x3F) {&lt;br /&gt;
        case 0x01:  // BAR1 write access&lt;br /&gt;
            handle_bar1_write;&lt;br /&gt;
            break;&lt;br /&gt;
        case 0x02:  // BAR1 read access&lt;br /&gt;
            handle_bar1_read;&lt;br /&gt;
            break;&lt;br /&gt;
        case 0x08:  // Aperture configuration&lt;br /&gt;
            handle_aperture_config;&lt;br /&gt;
            break;&lt;br /&gt;
        case 0x10:  // ForceBarAccess&lt;br /&gt;
            handle_force_access;&lt;br /&gt;
            break;&lt;br /&gt;
        case 0x20:  // Bar1Rest (restore)&lt;br /&gt;
            handle_bar1_restore;&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            return ERROR_UNKNOWN_EVENT;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;event-bitmask&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Event Bitmask ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Event&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| BAR1_WRITE&lt;br /&gt;
| Guest VF wrote to BAR1&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| BAR1_READ&lt;br /&gt;
| Guest VF read from BAR1&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| APERTURE&lt;br /&gt;
| Aperture size/offset change&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| FORCE_ACCESS&lt;br /&gt;
| ForceBarAccess triggered&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| BAR1_REST&lt;br /&gt;
| Restore BAR1 state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;memory-management&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Memory Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;allocator-arena-0x429b450&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Allocator Arena (0x429B450) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Allocate backing store for BAR emulation&lt;br /&gt;
void *bar_alloc(size_t size) {&lt;br /&gt;
    // Calls UNK_ram_058A1A9C(0x429B450, size)&lt;br /&gt;
    // Returns pointer in 0x429B000 region&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Free backing store&lt;br /&gt;
void bar_free(void *ptr) {&lt;br /&gt;
    // Calls UNK_ram_05895BF4(0x429B428, ptr)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;allocation-sizes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Allocation Sizes ===&lt;br /&gt;
&lt;br /&gt;
* '''Standard BAR1 page''': 0x1000 (4 KB)&lt;br /&gt;
* '''Aperture buffer''': 0x40000 (256 KB) max&lt;br /&gt;
* '''Force access buffer''': 0x1000 (4 KB)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cache-coherency&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Cache Coherency ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Flush cache for DMA&lt;br /&gt;
void bar_cache_flush(void *addr, size_t size) {&lt;br /&gt;
    UNK_ram_05895BF4(0x429B428, addr);&lt;br /&gt;
    UNK_ram_05895BF4(0x429B428, addr + size);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bar1-emulation-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== BAR1 Emulation Logic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;write-path-event-0x01&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Write Path (Event 0x01) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int handle_bar1_write(bar_trap_t *trap) {&lt;br /&gt;
    // 1. Validate offset within aperture&lt;br /&gt;
    if (trap-&amp;gt;offset &amp;gt;= bar1_aperture_size)&lt;br /&gt;
        return ERROR_OVERFLOW;&lt;br /&gt;
    &lt;br /&gt;
    // 2. Check ForceBarAccess flag&lt;br /&gt;
    if (force_bar_access &amp;amp;&amp;amp; !(trap-&amp;gt;flags &amp;amp; FORCE_ALLOWED))&lt;br /&gt;
        return ERROR_PERMISSION;&lt;br /&gt;
    &lt;br /&gt;
    // 3. Translate to backing store&lt;br /&gt;
    uint8_t *backing = bar1_backing + trap-&amp;gt;offset;&lt;br /&gt;
    &lt;br /&gt;
    // 4. Perform write (1/2/4/8 bytes)&lt;br /&gt;
    switch (trap-&amp;gt;size) {&lt;br /&gt;
        case 1: *backing = trap-&amp;gt;value; break;&lt;br /&gt;
        case 2: *(uint16_t*)backing = trap-&amp;gt;value; break;&lt;br /&gt;
        case 4: *(uint32_t*)backing = trap-&amp;gt;value; break;&lt;br /&gt;
        case 8: *(uint64_t*)backing = trap-&amp;gt;value; break;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // 5. Flush to device if needed&lt;br /&gt;
    if (device_needs_flush)&lt;br /&gt;
        bar_cache_flush(backing, trap-&amp;gt;size);&lt;br /&gt;
    &lt;br /&gt;
    return OK;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;read-path-event-0x02&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Read Path (Event 0x02) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int handle_bar1_read(bar_trap_t *trap) {&lt;br /&gt;
    if (trap-&amp;gt;offset &amp;gt;= bar1_aperture_size)&lt;br /&gt;
        return ERROR_OVERFLOW;&lt;br /&gt;
    &lt;br /&gt;
    uint8_t *backing = bar1_backing + trap-&amp;gt;offset;&lt;br /&gt;
    &lt;br /&gt;
    switch (trap-&amp;gt;size) {&lt;br /&gt;
        case 1: *trap-&amp;gt;out_value = *backing; break;&lt;br /&gt;
        case 2: *trap-&amp;gt;out_value = *(uint16_t*)backing; break;&lt;br /&gt;
        case 4: *trap-&amp;gt;out_value = *(uint32_t*)backing; break;&lt;br /&gt;
        case 8: *trap-&amp;gt;out_value = *(uint64_t*)backing; break;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return OK;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;aperture-configuration-event-0x08&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Aperture Configuration (Event 0x08) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int handle_aperture_config(bar_config_t *cfg) {&lt;br /&gt;
    // Validate new aperture&lt;br /&gt;
    if (cfg-&amp;gt;size &amp;gt; MAX_APERTURE_SIZE)  // 0x40000&lt;br /&gt;
        return ERROR_INVALID;&lt;br /&gt;
    &lt;br /&gt;
    if (cfg-&amp;gt;offset &amp;amp; 0xFFF)  // Must be 4KB aligned&lt;br /&gt;
        return ERROR_ALIGNMENT;&lt;br /&gt;
    &lt;br /&gt;
    // Reallocate backing store if size changed&lt;br /&gt;
    if (cfg-&amp;gt;size != bar1_aperture_size) {&lt;br /&gt;
        void *new_backing = bar_alloc(cfg-&amp;gt;size);&lt;br /&gt;
        if (!new_backing) return ERROR_NOMEM;&lt;br /&gt;
        &lt;br /&gt;
        // Copy existing data&lt;br /&gt;
        memcpy(new_backing, bar1_backing, &lt;br /&gt;
               min(cfg-&amp;gt;size, bar1_aperture_size));&lt;br /&gt;
        &lt;br /&gt;
        bar_free(bar1_backing);&lt;br /&gt;
        bar1_backing = new_backing;&lt;br /&gt;
        bar1_aperture_size = cfg-&amp;gt;size;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    bar1_aperture_offset = cfg-&amp;gt;offset;&lt;br /&gt;
    return OK;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;forcebaraccess-event-0x10&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ForceBarAccess (Event 0x10) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int handle_force_access(force_access_t *fa) {&lt;br /&gt;
    // ForceBarAccess allows hypervisor to bypass VF permissions&lt;br /&gt;
    // Used for live migration, checkpoint/restore&lt;br /&gt;
    &lt;br /&gt;
    force_bar_access = fa-&amp;gt;enable;&lt;br /&gt;
    force_access_vf = fa-&amp;gt;vf_id;&lt;br /&gt;
    force_access_range = fa-&amp;gt;range;&lt;br /&gt;
    &lt;br /&gt;
    // Allocate shadow buffer for forced operations&lt;br /&gt;
    if (fa-&amp;gt;enable) {&lt;br /&gt;
        force_buffer = bar_alloc(0x1000);&lt;br /&gt;
        if (!force_buffer) return ERROR_NOMEM;&lt;br /&gt;
    } else {&lt;br /&gt;
        bar_free(force_buffer);&lt;br /&gt;
        force_buffer = NULL;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return OK;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bar1rest---state-restore-event-0x20&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bar1Rest - State Restore (Event 0x20) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int handle_bar1_restore(restore_state_t *rs) {&lt;br /&gt;
    // Restore BAR1 state from checkpoint&lt;br /&gt;
    // Used during VF live migration&lt;br /&gt;
    &lt;br /&gt;
    bar1_aperture_offset = rs-&amp;gt;aperture_offset;&lt;br /&gt;
    bar1_aperture_size = rs-&amp;gt;aperture_size;&lt;br /&gt;
    force_bar_access = rs-&amp;gt;force_access;&lt;br /&gt;
    &lt;br /&gt;
    // Restore backing store from serialized data&lt;br /&gt;
    if (rs-&amp;gt;backing_size &amp;gt; 0) {&lt;br /&gt;
        void *new_backing = bar_alloc(rs-&amp;gt;backing_size);&lt;br /&gt;
        if (!new_backing) return ERROR_NOMEM;&lt;br /&gt;
        &lt;br /&gt;
        memcpy(new_backing, rs-&amp;gt;backing_data, rs-&amp;gt;backing_size);&lt;br /&gt;
        bar_free(bar1_backing);&lt;br /&gt;
        bar1_backing = new_backing;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return OK;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;vgpu-io-integration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== vGPU-IO Integration ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kernel-bar-trap-registration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Kernel BAR Trap Registration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct gsp_bar_ops {&lt;br /&gt;
    int (*bar_trap)(struct gsp_device *gsp, &lt;br /&gt;
                    struct bar_trap_msg *msg);&lt;br /&gt;
    int (*configure_aperture)(struct gsp_device *gsp,&lt;br /&gt;
                              uint32_t vf_id,&lt;br /&gt;
                              uint64_t offset, uint64_t size);&lt;br /&gt;
    int (*force_access)(struct gsp_device *gsp,&lt;br /&gt;
                        uint32_t vf_id, bool enable);&lt;br /&gt;
    int (*save_state)(struct gsp_device *gsp,&lt;br /&gt;
                      uint32_t vf_id, void *buf, size_t *size);&lt;br /&gt;
    int (*restore_state)(struct gsp_device *gsp,&lt;br /&gt;
                         uint32_t vf_id, void *buf, size_t size);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const struct gsp_bar_ops gsp_bar_ops = {.bar_trap = gsp_bar_trap_handler,.configure_aperture = gsp_bar_config_aperture,.force_access = gsp_bar_force_access,.save_state = gsp_bar_save_state,.restore_state = gsp_bar_restore_state,&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;vf-bar-configuration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== VF BAR Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_vf_bar_init(struct gsp_vf *vf) {&lt;br /&gt;
    struct bar_config cfg = {.vf_id = vf-&amp;gt;id,.bar = 1,  // BAR1.aperture_offset = vf-&amp;gt;bar1_offset,.aperture_size = vf-&amp;gt;bar1_size,.flags = BAR_FLAG_COHERENT,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    return gsp_rpc_send(vf-&amp;gt;gsp, RPC_BAR_TRAP, &lt;br /&gt;
                        BAR_SUBCMD_CONFIG, &amp;amp;cfg, sizeof(cfg));&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;live-migration-support&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Live Migration Support ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Save BAR state for migration&lt;br /&gt;
int gsp_vf_bar_save(struct gsp_vf *vf, void *buf, size_t *size) {&lt;br /&gt;
    struct bar_save_msg msg = {.vf_id = vf-&amp;gt;id,.bar = 1,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    return gsp_rpc_send(vf-&amp;gt;gsp, RPC_BAR_TRAP,&lt;br /&gt;
                        BAR_SUBCMD_SAVE, &amp;amp;msg, sizeof(msg),&lt;br /&gt;
                        buf, size);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Restore BAR state on destination&lt;br /&gt;
int gsp_vf_bar_restore(struct gsp_vf *vf, void *buf, size_t size) {&lt;br /&gt;
    struct bar_restore_msg msg = {.vf_id = vf-&amp;gt;id,.bar = 1,.data = buf,.data_size = size,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    return gsp_rpc_send(vf-&amp;gt;gsp, RPC_BAR_TRAP,&lt;br /&gt;
                        BAR_SUBCMD_RESTORE, &amp;amp;msg, sizeof(msg));&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Error&lt;br /&gt;
! Code&lt;br /&gt;
! Recovery&lt;br /&gt;
|-&lt;br /&gt;
| OOM (0x51)&lt;br /&gt;
| Allocator exhausted&lt;br /&gt;
| Shrink aperture, retry&lt;br /&gt;
|-&lt;br /&gt;
| Timeout (0x1E)&lt;br /&gt;
| Cache flush timeout&lt;br /&gt;
| Reset BAR, reinitialize&lt;br /&gt;
|-&lt;br /&gt;
| Invalid (0x1F)&lt;br /&gt;
| Bad aperture config&lt;br /&gt;
| Validate alignment/size&lt;br /&gt;
|-&lt;br /&gt;
| Permission (0xFFFF)&lt;br /&gt;
| ForceAccess violation&lt;br /&gt;
| Check VF permissions&lt;br /&gt;
|-&lt;br /&gt;
| Overflow (0x25)&lt;br /&gt;
| Offset beyond aperture&lt;br /&gt;
| Bounds check in VF driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Debugging ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;key-registers-to-monitor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Key Registers to Monitor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;0x04296048: Global error flag (cRam0000000004296048)&lt;br /&gt;
0x0429B750: Error status (0x111300 offset)&lt;br /&gt;
0x429B428: Cache management base&lt;br /&gt;
0x429B450: Allocator arena base&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;log-strings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Log Strings ===&lt;br /&gt;
&lt;br /&gt;
Search for these in GSP logs:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;BAR1&amp;lt;/code&amp;gt; - BAR1 access&lt;br /&gt;
* &amp;lt;code&amp;gt;Bar1Rest&amp;lt;/code&amp;gt; - State restore&lt;br /&gt;
* &amp;lt;code&amp;gt;ForceBarAccess&amp;lt;/code&amp;gt; - Forced access&lt;br /&gt;
* &amp;lt;code&amp;gt;Bar1Aperture&amp;lt;/code&amp;gt; - Aperture changes&lt;br /&gt;
* &amp;lt;code&amp;gt;Bar1Size&amp;lt;/code&amp;gt; - Size queries&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;
* Handler: &amp;lt;code&amp;gt;FUN_ram_04cb8188_ram_04cb8188.c&amp;lt;/code&amp;gt; (40 KB)&lt;br /&gt;
* RPC Type: 0x0A (BAR_TRAP)&lt;br /&gt;
* Jump Table Entry: 0x057675B7&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>