<?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=Migration_Protocol</id>
	<title>Migration Protocol - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=Migration_Protocol"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=Migration_Protocol&amp;action=history"/>
	<updated>2026-10-12T06:35:54Z</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=Migration_Protocol&amp;diff=23984&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=Migration_Protocol&amp;diff=23984&amp;oldid=prev"/>
		<updated>2026-10-12T04:40:59Z</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;= Migration Protocol (RPC 0x0B) =&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;= Migration Protocol (RPC 0x0B) =&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 records the MIGRATE RPC (type 0x0B) as seen in firmware analysis; in emulation mode the MIGRATE RPC returns &amp;lt;code&amp;gt;-ENOTSUPP&amp;lt;/code&amp;gt;. The live migration implementation is [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/kernel/migration.c &amp;lt;code&amp;gt;../kernel/migration.c&amp;lt;/code&amp;gt;]; design and status are documented in [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/04-implementation &amp;lt;code&amp;gt;../docs/04-implementation/&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 records the MIGRATE RPC (type 0x0B) as seen in firmware analysis; in emulation mode the MIGRATE RPC returns &amp;lt;code&amp;gt;-ENOTSUPP&amp;lt;/code&amp;gt;. The live migration implementation is [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;/kernel/migration.c &amp;lt;code&amp;gt;../kernel/migration.c&amp;lt;/code&amp;gt;]; design and status are documented in [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/04-implementation &amp;lt;code&amp;gt;../docs/04-implementation/&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-23950:rev-23984 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=Migration_Protocol&amp;diff=23950&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=Migration_Protocol&amp;diff=23950&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:50Z</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;= Migration Protocol (RPC 0x0B) =&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;= Migration Protocol (RPC 0x0B) =&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-23856:rev-23950 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=Migration_Protocol&amp;diff=23856&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=Migration_Protocol&amp;diff=23856&amp;oldid=prev"/>
		<updated>2026-10-12T04:10:05Z</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=Migration_Protocol&amp;amp;diff=23856&amp;amp;oldid=23836&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=Migration_Protocol&amp;diff=23836&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=Migration_Protocol&amp;diff=23836&amp;oldid=prev"/>
		<updated>2026-10-12T03:58:31Z</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;migration-protocol-rpc-0x0b&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Migration Protocol (RPC 0x0B) =&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 MIGRATE RPC (type 0x0B) implements live migration for vGPU virtual functions. It uses '''dual jump tables''' for two-phase migration operations, accessed via the primary dispatcher at 0x057A1AC0.&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;
&amp;lt;span id=&amp;quot;migration-jump-tables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Migration Jump Tables ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;table-1-0x04179ed8-primary-migrate-branch-at-0x057a1bdc&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Table 1: 0x04179ED8 (Primary MIGRATE branch at 0x057A1BDC) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Index&lt;br /&gt;
! Target&lt;br /&gt;
! Decompiled&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x057A2344&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare - returns ID 0x14, checks flag at +0x7F9&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x057A2320&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x057A230C&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x057A22F8&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare - returns ID 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x057A2388&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x057A23D8&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x057A23AC&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x057A2478&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 0x057A2428&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 0x057A2454&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 0x057A2404&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 0x057A2364&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 1: Prepare variant&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 0x057A1F3C&lt;br /&gt;
| (dup)&lt;br /&gt;
| Duplicate entry&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 0x057A299C&lt;br /&gt;
| —&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 0x057A1F3C&lt;br /&gt;
| (dup)&lt;br /&gt;
| Duplicate entry&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 0x057A1F3C&lt;br /&gt;
| (dup)&lt;br /&gt;
| Duplicate entry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;table-2-0x04179fbc-primary-migrate-branch-at-0x057a1d5c&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Table 2: 0x04179FBC (Primary MIGRATE branch at 0x057A1D5C) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Index&lt;br /&gt;
! Target&lt;br /&gt;
! Decompiled&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x057A257C&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x057A25E4&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x057A24EC&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x057A2608&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x057A2534&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x057A25C0&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x057A24A4&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x057A259C&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 0x057A2510&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 0x057A2558&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 0x057A24C8&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 0x057A262C&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 2: Transfer&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 0x057A345C&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 3: Commit&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 0x057A36D8&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 3: Commit&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 0x057A35D8&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 3: Commit&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 0x057A3658&lt;br /&gt;
| ✅&lt;br /&gt;
| Phase 3: Commit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;migration-phases&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Migration Phases ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;phase-0-discovery-pre-migration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Phase 0: Discovery (Pre-migration) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Query VF migratability&lt;br /&gt;
int gsp_migrate_query(struct gsp_vf *vf, struct migrate_query *out) {&lt;br /&gt;
    migrate_payload_t payload = {.phase = MIGRATE_PHASE_QUERY,.subcmd = 0,.src_vf = vf-&amp;gt;id,.dst_vf = 0,&lt;br /&gt;
    };&lt;br /&gt;
    return gsp_rpc_send(vf-&amp;gt;gsp, RPC_MIGRATE, &amp;amp;payload, sizeof(payload), out, sizeof(*out));&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;phase-1-prepare-table-1-indices-0-11&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Phase 1: Prepare (Table 1, indices 0-11) ===&lt;br /&gt;
&lt;br /&gt;
'''Goal''': Quiesce VF, prepare memory state for transfer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Subcmd 3 (0x057A22F8) - Returns ID 0x10&lt;br /&gt;
int migrate_prepare_quiesce(vf_id) {&lt;br /&gt;
    // 1. Pause VF scheduling&lt;br /&gt;
    // 2. Flush pending commands&lt;br /&gt;
    // 3. Pin all VF memory&lt;br /&gt;
    // 4. Return quiesce token&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Subcmd 0 (0x057A2344) - Returns ID 0x14, checks flag at in_t1+0x7F9&lt;br /&gt;
int migrate_prepare_snapshot(vf_id, *token) {&lt;br /&gt;
    // 1. Snapshot VF register state&lt;br /&gt;
    // 2. Snapshot BAR configurations&lt;br /&gt;
    // 3. Snapshot WPR regions&lt;br /&gt;
    // 4. Snapshot page tables&lt;br /&gt;
    // 5. Return snapshot handle&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;phase-2-transfer-table-1-index-13-table-2-indices-0-11&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Phase 2: Transfer (Table 1 index 13, Table 2 indices 0-11) ===&lt;br /&gt;
&lt;br /&gt;
'''Goal''': Transfer memory pages to destination&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Table 2, subcmd 0 (0x057A257C)&lt;br /&gt;
int migrate_transfer_pages(vf_id, page_list, *progress) {&lt;br /&gt;
    // 1. Iterate page list&lt;br /&gt;
    // 2. For each page:&lt;br /&gt;
    //    a. Copy via DMA (0x0588F9C4)&lt;br /&gt;
    //    b. Verify checksum&lt;br /&gt;
    //    c. Mark page dirty if modified&lt;br /&gt;
    // 3. Return bytes transferred&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Table 2, subcmd 11 (0x057A262C) - Dirty page tracking&lt;br /&gt;
int migrate_track_dirty(vf_id, *dirty_bitmap) {&lt;br /&gt;
    // Return bitmap of pages dirtied since last transfer&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;phase-3-commit-table-2-indices-12-15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Phase 3: Commit (Table 2 indices 12-15) ===&lt;br /&gt;
&lt;br /&gt;
'''Goal''': Final synchronization, cutover to destination&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Subcmd 12 (0x057A345C)&lt;br /&gt;
int migrate_commit_finalize(vf_id, dst_vf_id) {&lt;br /&gt;
    // 1. Final dirty page transfer&lt;br /&gt;
    // 2. Transfer register state&lt;br /&gt;
    // 3. Activate destination VF&lt;br /&gt;
    // 4. Release source VF resources&lt;br /&gt;
    // 5. Notify completion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Subcmd 13 (0x057A36D8)&lt;br /&gt;
int migrate_commit_verify(vf_id, *verify_result) {&lt;br /&gt;
    // 1. Verify memory integrity&lt;br /&gt;
    // 2. Verify register state&lt;br /&gt;
    // 3. Verify device state&lt;br /&gt;
    // 4. Return PASS/FAIL&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;phase-4-cleanup-post-migration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Phase 4: Cleanup (Post-migration) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int migrate_cleanup(src_vf_id) {&lt;br /&gt;
    // 1. Release pinned memory&lt;br /&gt;
    // 2. Free snapshot buffers&lt;br /&gt;
    // 3. Remove WPR regions&lt;br /&gt;
    // 4. Destroy migration context&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;migration-message-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Migration Message Format ==&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;         // MIGRATE_PHASE_*&lt;br /&gt;
    uint32_t subcmd;        // Sub-command index (0-15 per table)&lt;br /&gt;
    uint64_t src_vf;        // Source VF ID&lt;br /&gt;
    uint64_t dst_vf;        // Destination VF ID&lt;br /&gt;
    uint64_t data_ptr;      // Data buffer (page list, bitmap, etc.)&lt;br /&gt;
    uint64_t data_size;     // Buffer size&lt;br /&gt;
    uint32_t flags;         // MIGRATE_LIVE, MIGRATE_POSTCOPY, etc.&lt;br /&gt;
    uint32_t reserved;&lt;br /&gt;
    uint64_t token;         // Opaque migration token&lt;br /&gt;
} __attribute__((packed)) migrate_payload_t;&lt;br /&gt;
&lt;br /&gt;
#define MIGRATE_PHASE_QUERY     0&lt;br /&gt;
#define MIGRATE_PHASE_PREPARE   1&lt;br /&gt;
#define MIGRATE_PHASE_TRANSFER  2&lt;br /&gt;
#define MIGRATE_PHASE_COMMIT    3&lt;br /&gt;
#define MIGRATE_PHASE_CLEANUP   4&lt;br /&gt;
&lt;br /&gt;
#define MIGRATE_FLAG_LIVE       (1&amp;lt;&amp;lt;0)    // Live migration&lt;br /&gt;
#define MIGRATE_FLAG_POSTCOPY   (1&amp;lt;&amp;lt;1)    // Post-copy mode&lt;br /&gt;
#define MIGRATE_FLAG_AUTO_COMMIT (1&amp;lt;&amp;lt;2)  // Auto-commit after transfer&lt;br /&gt;
#define MIGRATE_FLAG_VERIFY     (1&amp;lt;&amp;lt;3)    // Verify integrity&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;sub-command-descriptors-returned-by-handlers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Sub-Command Descriptors (Returned by Handlers) ==&lt;br /&gt;
&lt;br /&gt;
All migration handlers follow the primary dispatcher pattern:&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: 0x10, 0x14, etc.&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;
} migrate_descriptor_t;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''Known Subcmd IDs''': | Subcmd | ID | Phase | |--------|-----|-------| | 0x057A22F8 (Table1[3]) | 0x10 | Prepare | | 0x057A2344 (Table1[0]) | 0x14 | Prepare | | Others | TBD | Transfer/Commit |&lt;br /&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;migration-state-machine&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Migration State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;typedef enum {&lt;br /&gt;
    MIG_STATE_IDLE = 0,&lt;br /&gt;
    MIG_STATE_QUERY,&lt;br /&gt;
    MIG_STATE_PREPARE,&lt;br /&gt;
    MIG_STATE_TRANSFER,&lt;br /&gt;
    MIG_STATE_COMMIT,&lt;br /&gt;
    MIG_STATE_CLEANUP,&lt;br /&gt;
    MIG_STATE_FAILED,&lt;br /&gt;
    MIG_STATE_COMPLETED&lt;br /&gt;
} mig_state_t;&lt;br /&gt;
&lt;br /&gt;
struct gsp_migration {&lt;br /&gt;
    struct gsp_vf *vf;&lt;br /&gt;
    mig_state_t state;&lt;br /&gt;
    uint64_t token;&lt;br /&gt;
    uint64_t dst_vf;&lt;br /&gt;
    struct migrate_progress progress;&lt;br /&gt;
    struct completion comp;&lt;br /&gt;
    struct mutex lock;&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;migration-coordinator&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Migration Coordinator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_migration_start(struct gsp_vf *vf, uint64_t dst_vf) {&lt;br /&gt;
    struct gsp_migration *mig = kzalloc(sizeof(*mig), GFP_KERNEL);&lt;br /&gt;
    vf-&amp;gt;migration = mig;&lt;br /&gt;
    mig-&amp;gt;vf = vf;&lt;br /&gt;
    mig-&amp;gt;dst_vf = dst_vf;&lt;br /&gt;
    mig-&amp;gt;state = MIG_STATE_QUERY;&lt;br /&gt;
    &lt;br /&gt;
    // Phase 0: Query&lt;br /&gt;
    struct migrate_query qry;&lt;br /&gt;
    gsp_migrate_query(vf, &amp;amp;qry);&lt;br /&gt;
    if (!qry.migratable) return -EINVAL;&lt;br /&gt;
    &lt;br /&gt;
    // Phase 1: Prepare&lt;br /&gt;
    mig-&amp;gt;state = MIG_STATE_PREPARE;&lt;br /&gt;
    migrate_payload_t prep = {.phase = MIGRATE_PHASE_PREPARE,.subcmd = 3,  // Quiesce.src_vf = vf-&amp;gt;id,.dst_vf = dst_vf,&lt;br /&gt;
    };&lt;br /&gt;
    migrate_descriptor_t desc;&lt;br /&gt;
    gsp_rpc_send(vf-&amp;gt;gsp, RPC_MIGRATE, &amp;amp;prep, sizeof(prep), &amp;amp;desc, sizeof(desc));&lt;br /&gt;
    mig-&amp;gt;token = desc.subcmd_id;  // Use returned token&lt;br /&gt;
    &lt;br /&gt;
    // Phase 2: Transfer (iterative)&lt;br /&gt;
    mig-&amp;gt;state = MIG_STATE_TRANSFER;&lt;br /&gt;
    while (!gsp_migration_transfer_iter(mig)) {&lt;br /&gt;
        msleep(10);  // Throttle&lt;br /&gt;
        if (signal_pending(current)) break;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Phase 3: Commit&lt;br /&gt;
    mig-&amp;gt;state = MIG_STATE_COMMIT;&lt;br /&gt;
    migrate_payload_t commit = {.phase = MIGRATE_PHASE_COMMIT,.subcmd = 12,.src_vf = vf-&amp;gt;id,.dst_vf = dst_vf,.token = mig-&amp;gt;token,.flags = MIGRATE_FLAG_VERIFY,&lt;br /&gt;
    };&lt;br /&gt;
    gsp_rpc_send(vf-&amp;gt;gsp, RPC_MIGRATE, &amp;amp;commit, sizeof(commit), NULL, 0);&lt;br /&gt;
    &lt;br /&gt;
    // Phase 4: Cleanup&lt;br /&gt;
    mig-&amp;gt;state = MIG_STATE_CLEANUP;&lt;br /&gt;
    gsp_migration_cleanup(mig);&lt;br /&gt;
    &lt;br /&gt;
    mig-&amp;gt;state = MIG_STATE_COMPLETED;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;transfer-iteration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Transfer Iteration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;bool gsp_migration_transfer_iter(struct gsp_migration *mig) {&lt;br /&gt;
    migrate_payload_t xfer = {.phase = MIGRATE_PHASE_TRANSFER,.subcmd = 0,.src_vf = mig-&amp;gt;vf-&amp;gt;id,.dst_vf = mig-&amp;gt;dst_vf,.data_ptr = (uint64_t)mig-&amp;gt;progress.page_list,.data_size = mig-&amp;gt;progress.page_count * sizeof(uint64_t),.token = mig-&amp;gt;token,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    struct migrate_progress prog;&lt;br /&gt;
    int ret = gsp_rpc_send(mig-&amp;gt;vf-&amp;gt;gsp, RPC_MIGRATE, &lt;br /&gt;
                           &amp;amp;xfer, sizeof(xfer), &amp;amp;prog, sizeof(prog));&lt;br /&gt;
    &lt;br /&gt;
    if (ret) return true;  // Error = done&lt;br /&gt;
    &lt;br /&gt;
    mig-&amp;gt;progress.bytes_transferred += prog.bytes_transferred;&lt;br /&gt;
    mig-&amp;gt;progress.pages_transferred += prog.pages_transferred;&lt;br /&gt;
    mig-&amp;gt;progress.dirty_pages = prog.dirty_pages;&lt;br /&gt;
    &lt;br /&gt;
    // Check if more dirty pages to transfer&lt;br /&gt;
    if (prog.dirty_pages &amp;gt; 0 &amp;amp;&amp;amp; !(mig-&amp;gt;flags &amp;amp; MIGRATE_FLAG_POSTCOPY)) {&lt;br /&gt;
        return false;  // Continue iterating&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return true;  // Transfer complete&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;post-copy-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Post-Copy Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_migration_postcopy(struct gsp_migration *mig) {&lt;br /&gt;
    // Enable post-copy on destination&lt;br /&gt;
    migrate_payload_t pc = {.phase = MIGRATE_PHASE_TRANSFER,.subcmd = 11,  // Dirty tracking.src_vf = mig-&amp;gt;vf-&amp;gt;id,.dst_vf = mig-&amp;gt;dst_vf,.flags = MIGRATE_FLAG_POSTCOPY,.token = mig-&amp;gt;token,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    // Page fault handler on destination&lt;br /&gt;
    gsp_page_fault_handler = gsp_migration_page_fault;&lt;br /&gt;
    &lt;br /&gt;
    return gsp_rpc_send(mig-&amp;gt;vf-&amp;gt;gsp, RPC_MIGRATE, &amp;amp;pc, sizeof(pc), NULL, 0);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;integration-with-barwpr&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Integration with BAR/WPR ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bar-state-migration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BAR State Migration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_migration_bar_save(struct gsp_migration *mig) {&lt;br /&gt;
    // Save BAR1 aperture, force access state&lt;br /&gt;
    struct bar_save_msg bar_save = {.vf_id = mig-&amp;gt;vf-&amp;gt;id,.bar = 1,&lt;br /&gt;
    };&lt;br /&gt;
    return gsp_rpc_send(mig-&amp;gt;vf-&amp;gt;gsp, RPC_BAR_TRAP,&lt;br /&gt;
                        BAR_SUBCMD_SAVE, &amp;amp;bar_save, sizeof(bar_save),&lt;br /&gt;
                        mig-&amp;gt;bar_state_buf, &amp;amp;mig-&amp;gt;bar_state_size);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int gsp_migration_bar_restore(struct gsp_migration *mig) {&lt;br /&gt;
    // Restore BAR1 on destination&lt;br /&gt;
    struct bar_restore_msg bar_restore = {.vf_id = mig-&amp;gt;dst_vf,.bar = 1,.data = mig-&amp;gt;bar_state_buf,.data_size = mig-&amp;gt;bar_state_size,&lt;br /&gt;
    };&lt;br /&gt;
    return gsp_rpc_send(mig-&amp;gt;vf-&amp;gt;gsp, RPC_BAR_TRAP,&lt;br /&gt;
                        BAR_SUBCMD_RESTORE, &amp;amp;bar_restore, sizeof(bar_restore));&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;wpr-region-migration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== WPR Region Migration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_migration_wpr_save(struct gsp_migration *mig) {&lt;br /&gt;
    // Save WPR regions for VF&lt;br /&gt;
    migrate_payload_t wpr = {.phase = MIGRATE_PHASE_PREPARE,.subcmd = 4,  // WPR snapshot.src_vf = mig-&amp;gt;vf-&amp;gt;id,.dst_vf = mig-&amp;gt;dst_vf,.token = mig-&amp;gt;token,&lt;br /&gt;
    };&lt;br /&gt;
    return gsp_rpc_send(mig-&amp;gt;vf-&amp;gt;gsp, RPC_MIGRATE, &amp;amp;wpr, sizeof(wpr), NULL, 0);&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;
! Phase&lt;br /&gt;
! Error&lt;br /&gt;
! Recovery&lt;br /&gt;
|-&lt;br /&gt;
| Prepare&lt;br /&gt;
| EBUSY&lt;br /&gt;
| Wait, retry&lt;br /&gt;
|-&lt;br /&gt;
| Prepare&lt;br /&gt;
| ENOMEM&lt;br /&gt;
| Reduce snapshot size&lt;br /&gt;
|-&lt;br /&gt;
| Transfer&lt;br /&gt;
| ETIMEDOUT&lt;br /&gt;
| Checkpoint, retry&lt;br /&gt;
|-&lt;br /&gt;
| Transfer&lt;br /&gt;
| EIO&lt;br /&gt;
| Failover to post-copy&lt;br /&gt;
|-&lt;br /&gt;
| Commit&lt;br /&gt;
| EINVAL&lt;br /&gt;
| Rollback to source&lt;br /&gt;
|-&lt;br /&gt;
| Commit&lt;br /&gt;
| ENOSPC&lt;br /&gt;
| Expand destination&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;migration-trace-points&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Migration Trace Points ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;trace_gsp_mig_phase(vf_id, phase, subcmd, token);&lt;br /&gt;
trace_gsp_mig_transfer(vf_id, pages, bytes, dirty);&lt;br /&gt;
trace_gsp_mig_commit(vf_id, status, verify);&lt;br /&gt;
trace_gsp_mig_error(vf_id, phase, error);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;gsp-log-strings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== GSP Log Strings ===&lt;br /&gt;
&lt;br /&gt;
Search for migration-related strings in firmware:&lt;br /&gt;
&lt;br /&gt;
* Migration phase markers&lt;br /&gt;
* Page transfer progress&lt;br /&gt;
* Commit verification results&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 MIGRATE branches: 0x057A1BDC, 0x057A1D54&lt;br /&gt;
* Jump Table 1: 0x04179ED8 (16 entries)&lt;br /&gt;
* Jump Table 2: 0x04179FBC (16 entries)&lt;br /&gt;
* Decompiled handlers: 28 functions in decompiled/&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>