<?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=CUDA_Userspace_Driver</id>
	<title>CUDA Userspace Driver - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=CUDA_Userspace_Driver"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=CUDA_Userspace_Driver&amp;action=history"/>
	<updated>2026-10-12T06:35:37Z</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=CUDA_Userspace_Driver&amp;diff=23963&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=CUDA_Userspace_Driver&amp;diff=23963&amp;oldid=prev"/>
		<updated>2026-10-12T04:40:06Z</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;= CUDA Userspace Driver (&amp;lt;code&amp;gt;libcuda.so&amp;lt;/code&amp;gt;) — Analysis Deep Dive =&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;= CUDA Userspace Driver (&amp;lt;code&amp;gt;libcuda.so&amp;lt;/code&amp;gt;) — Analysis Deep Dive =&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;'''Status (2026-10-12, honest).''' The analysis covers the whole library for driver 570.144 and the tooling is version-agnostic. The ''control plane'' gets the stock guest stack through &amp;lt;code&amp;gt;cuInit&amp;lt;/code&amp;gt;, device enumeration, &amp;lt;code&amp;gt;cuCtxCreate&amp;lt;/code&amp;gt; and the full driver-API smoke test — allocation, copies, free and destroy complete end to end (&amp;lt;code&amp;gt;ALL OK&amp;lt;/code&amp;gt;; the 64-byte payload round-trips exactly). The ''data plane'' decodes guest push buffers and executes the memory and semaphore work it understands; CUDA kernel launches are forwarded to the physical execution path, where a launch reaches the engine queue (front-end deposit and scheduling are observed) but an engine-authored release is not yet observed. Green runs are not yet reproducible on every boot — an open issue, tracked in the repository. Canonical detail: [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/01-architecture.md &amp;lt;code&amp;gt;01-architecture.md&amp;lt;/code&amp;gt;] through &amp;lt;code&amp;gt;08&amp;lt;/code&amp;gt;; reading order [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/READ-ME-FIRST.md &amp;lt;code&amp;gt;../userspace/cuda/READ-ME-FIRST.md&amp;lt;/code&amp;gt;]; front door [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/README.md &amp;lt;code&amp;gt;../docs/README.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;'''Status (2026-10-12, honest).''' The analysis covers the whole library for driver 570.144 and the tooling is version-agnostic. The ''control plane'' gets the stock guest stack through &amp;lt;code&amp;gt;cuInit&amp;lt;/code&amp;gt;, device enumeration, &amp;lt;code&amp;gt;cuCtxCreate&amp;lt;/code&amp;gt; and the full driver-API smoke test — allocation, copies, free and destroy complete end to end (&amp;lt;code&amp;gt;ALL OK&amp;lt;/code&amp;gt;; the 64-byte payload round-trips exactly). The ''data plane'' decodes guest push buffers and executes the memory and semaphore work it understands; CUDA kernel launches are forwarded to the physical execution path, where a launch reaches the engine queue (front-end deposit and scheduling are observed) but an engine-authored release is not yet observed. Green runs are not yet reproducible on every boot — an open issue, tracked in the repository. Canonical detail: [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;/userspace/cuda/docs/01-architecture.md &amp;lt;code&amp;gt;01-architecture.md&amp;lt;/code&amp;gt;] through &amp;lt;code&amp;gt;08&amp;lt;/code&amp;gt;; reading order [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;/userspace/cuda/READ-ME-FIRST.md &amp;lt;code&amp;gt;../userspace/cuda/READ-ME-FIRST.md&amp;lt;/code&amp;gt;]; front door [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/README.md &amp;lt;code&amp;gt;../docs/README.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;== 1. What it is ==&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;== 1. What it is ==&lt;/div&gt;&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-l114&quot;&gt;Line 114:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 114:&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;! What it gives you&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;! What it gives you&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/READ-ME-FIRST.md &amp;lt;code&amp;gt;../userspace/cuda/READ-ME-FIRST.md&amp;lt;/code&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;| [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;/userspace/cuda/READ-ME-FIRST.md &amp;lt;code&amp;gt;../userspace/cuda/READ-ME-FIRST.md&amp;lt;/code&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;div&gt;| the reading order, fast recipes, and the two findings that change how you debug&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;| the reading order, fast recipes, and the two findings that change how you debug&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/01-architecture.md &amp;lt;code&amp;gt;../userspace/cuda/docs/01-architecture.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/01-architecture.md &amp;lt;code&amp;gt;../userspace/cuda/docs/01-architecture.md&amp;lt;/code&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;div&gt;| the full layer/object/sync/memory model&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;| the full layer/object/sync/memory model&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/02-build-and-execution.md &amp;lt;code&amp;gt;../userspace/cuda/docs/02-build-and-execution.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/02-build-and-execution.md &amp;lt;code&amp;gt;../userspace/cuda/docs/02-build-and-execution.md&amp;lt;/code&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;div&gt;| build model, embedded device code, init/threading, what it touches&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;| build model, embedded device code, init/threading, what it touches&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/03-driver-and-gpu-interface.md &amp;lt;code&amp;gt;../userspace/cuda/docs/03-driver-and-gpu-interface.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/03-driver-and-gpu-interface.md &amp;lt;code&amp;gt;../userspace/cuda/docs/03-driver-and-gpu-interface.md&amp;lt;/code&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;div&gt;| the emulation contract: nodes, ioctls, classes, controls, channels, UVM&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;| the emulation contract: nodes, ioctls, classes, controls, channels, UVM&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/04-virtualization-and-emulation.md &amp;lt;code&amp;gt;../userspace/cuda/docs/04-virtualization-and-emulation.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/04-virtualization-and-emulation.md &amp;lt;code&amp;gt;../userspace/cuda/docs/04-virtualization-and-emulation.md&amp;lt;/code&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;div&gt;| NVIDIA vGPU vs Open-IOV, anti-fragility, performance, security&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;| NVIDIA vGPU vs Open-IOV, anti-fragility, performance, security&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/05-570.144-decompilation.md &amp;lt;code&amp;gt;../userspace/cuda/docs/05-570.144-decompilation.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/05-570.144-decompilation.md &amp;lt;code&amp;gt;../userspace/cuda/docs/05-570.144-decompilation.md&amp;lt;/code&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;div&gt;| the binary map, the crash resolution, and the current engine-topology blocker&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;| the binary map, the crash resolution, and the current engine-topology blocker&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/06-tooling.md &amp;lt;code&amp;gt;../userspace/cuda/docs/06-tooling.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/06-tooling.md &amp;lt;code&amp;gt;../userspace/cuda/docs/06-tooling.md&amp;lt;/code&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;div&gt;| every tool, its usage and its cost&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;| every tool, its usage and its cost&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/07-version-upgrade-playbook.md &amp;lt;code&amp;gt;../userspace/cuda/docs/07-version-upgrade-playbook.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/07-version-upgrade-playbook.md &amp;lt;code&amp;gt;../userspace/cuda/docs/07-version-upgrade-playbook.md&amp;lt;/code&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;div&gt;| re-running the analysis on a new driver version&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;| re-running the analysis on a new driver version&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/userspace/cuda/docs/08-virtualization-approaches.md &amp;lt;code&amp;gt;../userspace/cuda/docs/08-virtualization-approaches.md&amp;lt;/code&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;| [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;/userspace/cuda/docs/08-virtualization-approaches.md &amp;lt;code&amp;gt;../userspace/cuda/docs/08-virtualization-approaches.md&amp;lt;/code&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;div&gt;| forwarding options and the honest current stage&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;| forwarding options and the honest current stage&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;|-&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;|-&lt;/div&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;| [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/README.md &amp;lt;code&amp;gt;../docs/README.md&amp;lt;/code&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;| [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/README.md &amp;lt;code&amp;gt;../docs/README.md&amp;lt;/code&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;div&gt;| the project documentation front door&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;| the project documentation front door&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;|}&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;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23934:rev-23963 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=CUDA_Userspace_Driver&amp;diff=23934&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=CUDA_Userspace_Driver&amp;diff=23934&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:42Z</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;= CUDA Userspace Driver (&amp;lt;code&amp;gt;libcuda.so&amp;lt;/code&amp;gt;) — Analysis Deep Dive =&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;= CUDA Userspace Driver (&amp;lt;code&amp;gt;libcuda.so&amp;lt;/code&amp;gt;) — Analysis Deep Dive =&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-23847:rev-23934 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=CUDA_Userspace_Driver&amp;diff=23847&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=CUDA_Userspace_Driver&amp;diff=23847&amp;oldid=prev"/>
		<updated>2026-10-12T04:09:59Z</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=CUDA_Userspace_Driver&amp;amp;diff=23847&amp;amp;oldid=23843&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=CUDA_Userspace_Driver&amp;diff=23843&amp;oldid=prev</id>
		<title>WikiBot: Remove internal document references</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=CUDA_Userspace_Driver&amp;diff=23843&amp;oldid=prev"/>
		<updated>2026-10-12T03:59:35Z</updated>

		<summary type="html">&lt;p&gt;Remove internal document references&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;cuda-userspace-driver-libcudaso--analysis-deep-dive&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= CUDA Userspace Driver (&amp;lt;code&amp;gt;libcuda.so&amp;lt;/code&amp;gt;) — Analysis Deep Dive =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1-what-it-is&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. What it is ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libcuda.so.1.1&amp;lt;/code&amp;gt; is the userspace half of the CUDA driver: the library an application or language runtime loads to talk to a GPU. For 570.144 it is a '''single, fully stripped, position-independent shared object of about 71 MB''':&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Exports&lt;br /&gt;
| 659 (public &amp;lt;code&amp;gt;cu*&amp;lt;/code&amp;gt; API plus internal/legacy entry points)&lt;br /&gt;
|-&lt;br /&gt;
| Imports&lt;br /&gt;
| 243 — libc/libpthread/libdl/librt only; no NVIDIA userspace dependency on the CUDA path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x179ec0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;0xe94c63&amp;lt;/code&amp;gt; (13.7 MB); 29,494 functions found by full analysis (28,925 with unwind tables)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.rodata&amp;lt;/code&amp;gt;&lt;br /&gt;
| ~53 MB — error strings, dispatch/version tables, '''embedded device code'''&lt;br /&gt;
|-&lt;br /&gt;
| CUDA note&lt;br /&gt;
| CUDA 12.8; supported kernel-driver ABIs &amp;lt;code&amp;gt;[470, 535, 550, 560, 565, 570]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Two entry surfaces coexist: the '''public driver API''' (&amp;lt;code&amp;gt;cuInit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cuCtxCreate_v2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cuMemAlloc_v2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cuLaunchKernel&amp;lt;/code&amp;gt;, …) and the '''entry-table API''' — &amp;lt;code&amp;gt;cuGetExportTable&amp;lt;/code&amp;gt;, a 128-bit-UUID-keyed lookup that hands internal tables to the CUDA runtime (&amp;lt;code&amp;gt;libcudart&amp;lt;/code&amp;gt;), tooling and interposition libraries. Tables are versioned by a leading &amp;lt;code&amp;gt;struct_size&amp;lt;/code&amp;gt; field and are append-only.&lt;br /&gt;
The library embeds '''device code''' — cubins for memcpy/memset kernels, the graph scheduler, syscall trampolines and preemption-handler assembly — and loads it through its own module machinery, so a stripped &amp;lt;code&amp;gt;libcuda.so&amp;lt;/code&amp;gt; still contains many small ELF images in &amp;lt;code&amp;gt;.rodata&amp;lt;/code&amp;gt;. The CUDA ''runtime'' (&amp;lt;code&amp;gt;libcudart&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;cuda*&amp;lt;/code&amp;gt; API) is a separate stock library that bottoms out in &amp;lt;code&amp;gt;libcuda&amp;lt;/code&amp;gt;; it also calls through the entry tables, so a guest failure in a &amp;lt;code&amp;gt;cuda*&amp;lt;/code&amp;gt; call may reach driver code through a different door than the public &amp;lt;code&amp;gt;cu*&amp;lt;/code&amp;gt; entry point.&lt;br /&gt;
'''Open-IOV requires this library unmodified.''' In the guest it links against the guest's stock &amp;lt;code&amp;gt;nvidia.ko&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;nvidia-uvm.ko&amp;lt;/code&amp;gt; exactly as on bare metal; there is no &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt; shim and no patch. Instrumentation uses &amp;lt;code&amp;gt;ptrace&amp;lt;/code&amp;gt; or kernel-side tracing, because the RM client issues raw &amp;lt;code&amp;gt;syscall(SYS_ioctl)&amp;lt;/code&amp;gt; rather than libc &amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;span id=&amp;quot;2-layer-model&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Layer model ==&lt;br /&gt;
&lt;br /&gt;
The library is strictly layered, and the boundaries are where the emulation interfaces live:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;application / libcudart&lt;br /&gt;
      | public cu* API or UUID entry tables&lt;br /&gt;
      v&lt;br /&gt;
generated wrappers -&amp;amp;gt; API layer -&amp;amp;gt; CUDA internal engine&lt;br /&gt;
                                      |-- driver-model layer (RM) -&amp;amp;gt; /dev/nvidia* ioctls&lt;br /&gt;
                                      |-- hardware layer (QMD/method encoding)&lt;br /&gt;
                                      |     -&amp;amp;gt; GPU queues, doorbells&lt;br /&gt;
                                      |-- UVM userspace (managed memory) -&amp;amp;gt; /dev/nvidia-uvm&lt;br /&gt;
                                      '-- JIT/ELF (PTX-&amp;amp;gt;SASS, cubin loading)&lt;br /&gt;
kernel driver + GSP-RM + GPU&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Generated wrappers and API layer.''' A master export list (name, platform flags, CUDA version introduced) generates the exported symbols, wrappers, tool callbacks and &amp;lt;code&amp;gt;cuGetProcAddress&amp;lt;/code&amp;gt; tables (&amp;lt;code&amp;gt;_vN&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;_ptsz&amp;lt;/code&amp;gt; variants are part of that data). Below it, the hand-written layer reads the per-thread context stack, validates state, takes one context lock, calls one engine function and returns a &amp;lt;code&amp;gt;CUresult&amp;lt;/code&amp;gt; — the semantic work is always one layer down.&lt;br /&gt;
* '''Internal engine.''' Owns the object graph: process globals (init state, kernel-client handle, device list), device (chip/caps/limits, vtables), context (memory/channel/stream managers, QMD pools, ISR thread), stream, module/function, memory objects, events/graphs/libraries.&lt;br /&gt;
* '''Driver-model layer.''' Selected at initialization behind one function table: the '''RM backend''' (the one Open-IOV cares about) plus SoC, Amodel, MPS and WDDM. It turns engine operations into RM controls and object allocations over &amp;lt;code&amp;gt;/dev/nvidia*&amp;lt;/code&amp;gt;, and owns the '''driver-ABI adaptation''' layer — one instance per supported kernel-driver ABI, chosen at &amp;lt;code&amp;gt;cuInit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Hardware layer.''' Chip-specific method/QMD/semaphore/doorbell encoders selected by compute capability. The userspace driver ''builds'' the GPU command streams; the kernel driver allocates, maps, schedules and services interrupts.&lt;br /&gt;
* '''Synchronization model.''' Three primitives explain most of it: the '''tracking semaphore''' (per-channel counter of completed pushes), the '''marker''' (&amp;amp;quot;all work before this point&amp;amp;quot;) and the '''QMD semaphore''' (released when a grid completes). Blocking waits use a per-context ISR thread and a DPC queue.&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-what-it-touches-in-a-guest&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. What it touches in a guest ==&lt;br /&gt;
&lt;br /&gt;
This is the emulation contract.&lt;br /&gt;
'''Device nodes.''' &amp;lt;code&amp;gt;/dev/nvidiactl&amp;lt;/code&amp;gt; (process-wide control: version negotiation, client creation, GPU attach, OS events, exported-object fds), &amp;lt;code&amp;gt;/dev/nvidiaN&amp;lt;/code&amp;gt; (per-GPU: object alloc/free, RM controls, memory alloc/map, event allocation), &amp;lt;code&amp;gt;/dev/nvidia-uvm&amp;lt;/code&amp;gt; (managed memory and page migration) and &amp;lt;code&amp;gt;/dev/nvidia-vgpuN&amp;lt;/code&amp;gt; (vGPU plugin node; NVIDIA's own vGPU stack only, not used by stock CUDA paths).&lt;br /&gt;
'''ioctls.''' The control device uses &amp;lt;code&amp;gt;_IOWR('F', cmd, …)&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_CARD_INFO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;210&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_CHECK_VERSION_STR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;212&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_ATTACH_GPUS_TO_FD&amp;lt;/code&amp;gt;. RM escapes include &amp;lt;code&amp;gt;0x2b&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_RM_ALLOC&amp;lt;/code&amp;gt; ('''the main object-allocation path'''), &amp;lt;code&amp;gt;0x2a&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_RM_CONTROL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x29&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_RM_FREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x4e&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;0x4f&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_RM_MAP_MEMORY&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;UNMAP_MEMORY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x57&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;0x58&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_RM_MAP_MEMORY_DMA&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;UNMAP_MEMORY_DMA&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;0x4a&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;NV_ESC_RM_VID_HEAP_CONTROL&amp;lt;/code&amp;gt;. The request word &amp;lt;code&amp;gt;rsi=0xc030462b&amp;lt;/code&amp;gt; in a crash dump decodes to &amp;amp;quot;allocating an RM object with a 48-byte payload&amp;amp;quot;.&lt;br /&gt;
'''RM objects/classes.''' Every RM call names a class. Observed for 570.144 on an emulated TU104: &amp;lt;code&amp;gt;NV01_ROOT&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0x0&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;NV01_DEVICE_0&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0x80&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;NV20_SUBDEVICE_0&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0x2080&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;NV01_EVENT&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;KEPLER_CHANNEL_GROUP_A&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0xa06c&amp;lt;/code&amp;gt;), a channel-group/runlist object (&amp;lt;code&amp;gt;0x9067&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;TURING_CHANNEL_GPFIFO_A&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0xc46f&amp;lt;/code&amp;gt;, the channel), &amp;lt;code&amp;gt;TURING_COMPUTE_A&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0xc5c0&amp;lt;/code&amp;gt;, the compute engine object), plus memory (&amp;lt;code&amp;gt;0x3e&amp;lt;/code&amp;gt;) and VA-space classes. The observed &amp;lt;code&amp;gt;cuCtxCreate&amp;lt;/code&amp;gt; order is root → device → subdevice → events → channel group → channel-group object → memory → channel → control &amp;lt;code&amp;gt;NV0080_CTRL_CMD_FIFO_GET_CHANNELLIST&amp;lt;/code&amp;gt; → compute object → engine registration.&lt;br /&gt;
'''Controls.''' Device/GPU info (&amp;lt;code&amp;gt;GPU_GET_ENGINES&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GPU_GET_CLASSLIST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GPU_GET_VIRTUALIZATION_MODE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FB_GET_INFO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CE_GET_CAPS&amp;lt;/code&amp;gt;, …), FIFO/channels (&amp;lt;code&amp;gt;NV0080_CTRL_CMD_FIFO_GET_CHANNELLIST&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;0x80170d&amp;lt;/code&amp;gt;, GPFIFO scheduling, timeslices, &amp;lt;code&amp;gt;GET_CLASS_ENGINEID&amp;lt;/code&amp;gt;), GR/context switches, memory, events and interrupts, vGPU/licensing queries, and perf/clocks. The driver tolerates unknown-but-successful controls; it only fails when a ''specific reply field'' is consumed and wrong.&lt;br /&gt;
'''Memory.''' VA reservation (&amp;lt;code&amp;gt;NV_ESC_RM_VID_HEAP_CONTROL&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;NVOS32&amp;lt;/code&amp;gt;), backing allocation (vidmem/sysmem, pinned host memory, imported handles, UVM) and mapping (&amp;lt;code&amp;gt;NVOS33&amp;lt;/code&amp;gt; into the process, &amp;lt;code&amp;gt;NVOS46&amp;lt;/code&amp;gt; into a device VA space). All guest memory CUDA uses is either an RM allocation backed by emulated VRAM/BAR1 or pinned guest RAM the GPU must DMA to.&lt;br /&gt;
'''Channels, GPFIFO, USERD, doorbells.''' A channel is a GPFIFO (array of pushbuffer descriptors) plus engine objects. The driver allocates the GPFIFO, error notifier and (Volta and later) the USERD itself, passing the handles to the channel allocation; submission writes the GPFIFO put pointer into USERD and rings a doorbell token returned by the channel allocation. Pushbuffers are method streams terminated by a tracking-semaphore release and a new GPFIFO entry; the host emulation decodes them as such.&lt;br /&gt;
'''Synchronization below the API.''' Semaphores (plain GPU-visible memory values), 4 KB per-channel error notifiers, OS events (kernel objects used to wake blocked threads), interrupts routed through the kernel driver, and a trap handler for debuggers and &amp;lt;code&amp;gt;device-side assert&amp;lt;/code&amp;gt;.&lt;br /&gt;
'''UVM and GSP-RM.''' When UVM is available the driver registers GPUs, VA spaces, channels and managed allocations and pushes UVM semaphores into the same streams; without it CUDA degrades to zero-copy. GSP-RM changes nothing from userspace — it still issues RM ioctls; inside the kernel driver controls become GSP-RM RPCs, which Open-IOV's host module answers.&lt;br /&gt;
&amp;lt;span id=&amp;quot;4-why-forwarding-matters-and-where-we-are&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Why forwarding matters, and where we are ==&lt;br /&gt;
&lt;br /&gt;
The performance budget is dominated by '''push-buffer execution''', '''synchronization latency''' and (once, at setup) '''control-plane latency'''. Only forwarding ''real work'' to the physical GPU meets the first two; software execution of state/memory ops is a correctness bridge, not the data plane.&lt;br /&gt;
* '''Stated architecture:''' ''emulate the interface, pass through the work, never patch anyone.'' Prototype the host-RM/GSP proxy first for correctness, measure, then move the hot path to direct submission if the budgets demand it — work path abstracted from day one.&lt;br /&gt;
* '''Control plane today:''' GSP-RM emulation, RPC handling, BAR/PCI/MSI-X emulation and object/control replies are implemented; the stock guest stack gets through &amp;lt;code&amp;gt;cuInit&amp;lt;/code&amp;gt; and device enumeration into &amp;lt;code&amp;gt;cuCtxCreate&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Current blocker:''' &amp;lt;code&amp;gt;cuCtxCreate&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;rc=999&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;CUDA_ERROR_UNKNOWN&amp;lt;/code&amp;gt;) because the class-filtered engine list is missing the async copy engine &amp;lt;code&amp;gt;COPY14&amp;lt;/code&amp;gt; (descriptor &amp;lt;code&amp;gt;0x793ceb0e&amp;lt;/code&amp;gt;, instance 14, client type &amp;lt;code&amp;gt;0x38&amp;lt;/code&amp;gt;, class &amp;lt;code&amp;gt;0xc9b5&amp;lt;/code&amp;gt;). The oracle list has 7 engines (GR, CE0.CE4, &amp;lt;code&amp;gt;COPY14&amp;lt;/code&amp;gt;); the guest list has 6. The driver silently skips engines with no per-(class, instance) database entry, then reads a zeroed secondary record and rolls back; what builds that database entry is the open question.&lt;br /&gt;
* '''Data plane today:''' the host module decodes guest push buffers as method streams and '''executes the small work it understands itself''' — memsets, copies and semaphore releases. '''No CUDA kernel has been forwarded yet.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;5-the-crash-path-lesson-replies-are-consumed-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. The crash-path lesson: replies are consumed data ==&lt;br /&gt;
&lt;br /&gt;
The old deterministic &amp;lt;code&amp;gt;cuCtxCreate&amp;lt;/code&amp;gt; segfault at &amp;lt;code&amp;gt;libcuda+0x453f90&amp;lt;/code&amp;gt; shows why reply coherence matters. The engine-registration hook allocates a &amp;lt;code&amp;gt;TURING_COMPUTE_A&amp;lt;/code&amp;gt; object with &amp;lt;code&amp;gt;pAllocParms&amp;lt;/code&amp;gt; pointing at the caller's own '''8-byte stack local''' and &amp;lt;code&amp;gt;paramsSize = 0&amp;lt;/code&amp;gt;; the guest driver does not honour &amp;lt;code&amp;gt;paramsSize&amp;lt;/code&amp;gt;, so it reads '''16-byte''' class params starting there (the upper 8 bytes are the hook's saved &amp;lt;code&amp;gt;rbp&amp;lt;/code&amp;gt;) and copies 16 bytes of reply params back over the same buffer. With the old zeroed reply that copy-back zeroed the saved &amp;lt;code&amp;gt;rbp&amp;lt;/code&amp;gt;; the function's epilogue then loaded &amp;lt;code&amp;gt;rbp = 0&amp;lt;/code&amp;gt; and its next access — reloading a pointer from &amp;lt;code&amp;gt;[rbp-0x38]&amp;lt;/code&amp;gt; — faulted at &amp;lt;code&amp;gt;0xffffffffffffffc8&amp;lt;/code&amp;gt; (the store was the kernel's &amp;lt;code&amp;gt;copy_to_user&amp;lt;/code&amp;gt;).&lt;br /&gt;
'''The fix:''' echo the request's params back, forcing only &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;NV_OK&amp;lt;/code&amp;gt;; the copy-back then writes exactly the bytes it read, and the fault disappears — the same thing the real GSP-RM does for these in/out params.&lt;br /&gt;
'''The general rule:''' the userspace library is a ''consumer of emulated data''. A wrong reply is worse than a slow one. Work up the reply-fidelity ladder — status-only → coherent zeroed params → coherent values for consumed fields → exact values — and validate each rung with the A/B oracle.&lt;br /&gt;
&amp;lt;span id=&amp;quot;6-how-to-look-things-up&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. How to look things up ==&lt;br /&gt;
&lt;br /&gt;
The toolchain is version-agnostic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;tools/cudatool.py info|exports|functions|nearest|crash|delta &amp;amp;lt;lib&amp;amp;gt;&lt;br /&gt;
tools/callwalk.py &amp;amp;lt;callgraph.tsv&amp;amp;gt; callers|callees|chain..&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''&amp;lt;code&amp;gt;cudatool.py&amp;lt;/code&amp;gt;''' — build id/sections/exports/ABI note (&amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt;), symbol map (&amp;lt;code&amp;gt;exports&amp;lt;/code&amp;gt;), function ranges from &amp;lt;code&amp;gt;.eh_frame_hdr&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;functions&amp;lt;/code&amp;gt;), containing function and nearest export for an address (&amp;lt;code&amp;gt;nearest&amp;lt;/code&amp;gt;), dmesg &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt; to file vaddr (&amp;lt;code&amp;gt;crash&amp;lt;/code&amp;gt;), and an interface-level diff (&amp;lt;code&amp;gt;delta&amp;lt;/code&amp;gt;).&lt;br /&gt;
* '''&amp;lt;code&amp;gt;callwalk.py&amp;lt;/code&amp;gt;''' — caller/callee trees and shortest call paths over the callgraph index.&lt;br /&gt;
* '''Annotated corpus''' — &amp;lt;code&amp;gt;570.144/annotations/names.tsv&amp;lt;/code&amp;gt; (our name map; exports exact, internals grow over time) and &amp;lt;code&amp;gt;subsystems.tsv&amp;lt;/code&amp;gt;; corpus headers carry the recovered name, file address and direct callers/callees.&lt;br /&gt;
'''Address convention (read this before citing an offset).''' Public docs cite '''file virtual addresses''' as &amp;lt;code&amp;gt;libcuda+0x..&amp;lt;/code&amp;gt;. Ghidra loads these binaries at image base &amp;lt;code&amp;gt;0x100000&amp;lt;/code&amp;gt;, so &amp;lt;code&amp;gt;program address = file vaddr + 0x100000&amp;lt;/code&amp;gt;; the &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; wrappers translate automatically, raw Ghidra scripts do not. An earlier analysis passed file vaddrs straight to Ghidra and decompiled functions 0x100000 too low, so its decompiled-code conclusions were about the wrong functions (its live traces stayed valid). The same applies when transferring a name map to a new driver version.&lt;br /&gt;
&amp;lt;span id=&amp;quot;7-where-the-detail-lives&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Where the detail lives ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Document&lt;br /&gt;
! What it gives you&lt;br /&gt;
|-&lt;br /&gt;
| the reading order, fast recipes, and the two findings that change how you debug&lt;br /&gt;
|-&lt;br /&gt;
| the full layer/object/sync/memory model&lt;br /&gt;
|-&lt;br /&gt;
| build model, embedded device code, init/threading, what it touches&lt;br /&gt;
|-&lt;br /&gt;
| the emulation contract: nodes, ioctls, classes, controls, channels, UVM&lt;br /&gt;
|-&lt;br /&gt;
| NVIDIA vGPU vs Open-IOV, anti-fragility, performance, security&lt;br /&gt;
|-&lt;br /&gt;
| the binary map, the crash resolution, and the current engine-topology blocker&lt;br /&gt;
|-&lt;br /&gt;
| every tool, its usage and its cost&lt;br /&gt;
|-&lt;br /&gt;
| re-running the analysis on a new driver version&lt;br /&gt;
|-&lt;br /&gt;
| forwarding options and the honest current stage&lt;br /&gt;
|-&lt;br /&gt;
| the project documentation front door&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>