Files
moslab-code/doc/source/html/server_2l4virtio_source.html
2025-09-12 15:55:45 +02:00

1344 lines
255 KiB
HTML

<!-- HTML header for doxygen 1.9.1-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.15.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>L4Re Operating System Framework: l4/l4virtio/server/l4virtio Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="l4re-awesome.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="L4Re_rgb_logo_quer_hg_h55.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">L4Re Operating System Framework
</div>
<div id="projectbrief">Interface and Usage Documentation</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.15.0 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('server_2l4virtio_source.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">l4virtio</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// vi:ft=cpp</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">/* SPDX-License-Identifier: MIT */</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">/*</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"> * Copyright (C) 2014-2024 Kernkonzept GmbH.</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment"> * Author(s): Alexander Warg &lt;alexander.warg@kernkonzept.com&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"> * Manuel von Oltersdorff-Kalettka &lt;manuel.kalettka@kernkonzept.com&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment"> *</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"> */</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> </div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &lt;limits.h&gt;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;<a class="code" href="dataspace.html">l4/re/dataspace</a>&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;l4/re/util/debug&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;<a class="code" href="env.html">l4/re/env</a>&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;<a class="code" href="error__helper.html">l4/re/error_helper</a>&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;<a class="code" href="rm.html">l4/re/rm</a>&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;<a class="code" href="util_2cap__alloc.html">l4/re/util/cap_alloc</a>&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &lt;<a class="code" href="util_2shared__cap.html">l4/re/util/shared_cap</a>&gt;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;<a class="code" href="util_2unique__cap.html">l4/re/util/unique_cap</a>&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &lt;<a class="code" href="l4_2sys_2types_8h.html">l4/sys/types.h</a>&gt;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include &lt;l4/re/util/meta&gt;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &lt;l4/cxx/bitfield&gt;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include &lt;l4/cxx/utils&gt;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include &lt;l4/cxx/unique_ptr&gt;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &lt;l4/sys/cxx/ipc_legacy&gt;</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> </div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include &quot;../l4virtio&quot;</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#include &quot;virtio&quot;</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceL4virtio.html">L4virtio</a> {</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="keyword">namespace </span>Svr {</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span></div>
<div class="foldopen" id="foldopen00052" data-start="{" data-end="};">
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html"> 52</a></span><span class="keyword">class </span><a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a663b81f49e6ce03f9b7e136d6646bf89">Dev_config</a></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span>{</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">typedef</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Dev__status.html">Dev_status</a> Status;</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keyword">typedef</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Dev__features.html">Dev_features</a> Features;</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">typedef</span> <a class="code hl_class" href="classL4Re_1_1Rm_1_1Unique__region.html">L4Re::Rm::Unique_region&lt; l4virtio_config_hdr_t*&gt;</a> Cfg_region;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">typedef</span> <a class="code hl_typedef" href="namespaceL4Re_1_1Util.html#a2eafa529c9c1144d7840f4e101ecf7aa">L4Re::Util::Shared_cap&lt;L4Re::Dataspace&gt;</a> Cfg_cap;</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> _vendor, _device, _qoffset, _nqueues;</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> _host_features[<span class="keyword">sizeof</span>(l4virtio_config_hdr_t::dev_features_map)</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> / <span class="keyword">sizeof</span>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a>)];</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> Cfg_cap _ds;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> Cfg_region _config;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> _ds_offset = 0;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> Status _status{0}; <span class="comment">// status shadow, can be trusted by the device model</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keyword">static</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> align(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> x)</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> { <span class="keywordflow">return</span> (x + 0xfU) &amp; ~0xfU; }</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keywordtype">void</span> attach_n_init_cfg(Cfg_cap <span class="keyword">const</span> &amp;cfg, <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> offset)</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> {</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(<a class="code hl_function" href="classL4Re_1_1Env.html#a2706ca11e70845b0a29a5646c9fd54bc">L4Re::Env::env</a>()-&gt;rm()-&gt;attach(&amp;_config, <a class="code hl_define" href="group__l4__memory__api.html#gabecf862d8b8f39ad28af45d7fc949dd5">L4_PAGESIZE</a>,</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <a class="code hl_enumvalue" href="structL4Re_1_1Rm_1_1F.html#adec4d26077e34d9586891ac0489e0041a067b0bc28378717b6962241c621caa0a">L4Re::Rm::F::Search_addr</a> | <a class="code hl_enumvalue" href="structL4Re_1_1Rm_1_1F.html#a9707a14d822d3f60aa6a97cb16b2a989a579e389b46e438a64f3f44d9cf19f26a">L4Re::Rm::F::RW</a>,</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <a class="code hl_function" href="namespaceL4_1_1Ipc.html#aa6b9422f850eb175240c9d18c5cc708c">L4::Ipc::make_cap_rw</a>(cfg.get()),</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> offset),</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="stringliteral">&quot;Attach config space to local address space.&quot;</span>);</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> </div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> _config-&gt;generation = 0;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> memset(_config-&gt;driver_features_map, 0, <span class="keyword">sizeof</span>(_config-&gt;driver_features_map));</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> memset(_host_features, 0, <span class="keyword">sizeof</span>(_host_features));</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> set_host_feature(<a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga01d1e713668a8ee48f1e34f428cea8d0ab8ea6c40b0611434c90ffee0bb729342">L4VIRTIO_FEATURE_VERSION_1</a>);</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#abfda82e19ccfbd5d40a0d8336c0d1815">reset_hdr</a>();</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> _ds = cfg;</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> _ds_offset = offset;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> }</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="keyword">protected</span>:</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordtype">void</span> <span class="keyword">volatile</span> *get_priv_config()<span class="keyword"> const</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordflow">return</span> <a class="code hl_function" href="group__l4virtio__transport.html#gaa54e6e4ef7d8a9ae2ebf288e75aca8df">l4virtio_device_config</a>(_config.get());</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> }</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> </div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span></div>
<div class="foldopen" id="foldopen00112" data-start="{" data-end="}">
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a663b81f49e6ce03f9b7e136d6646bf89"> 112</a></span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a663b81f49e6ce03f9b7e136d6646bf89">Dev_config</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> vendor, <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> device,</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordtype">unsigned</span> cfg_size, <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a> = 0)</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> : _vendor(vendor), _device(device),</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> _qoffset(0x100 + align(cfg_size)),</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> _nqueues(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>)</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> {</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keyword">using </span><a class="code hl_class" href="classL4Re_1_1Dataspace.html">L4Re::Dataspace</a>;</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keyword">using </span><a class="code hl_function" href="namespaceL4Re.html#a64b057254a760643ba67a9ed452fede8">L4Re::chkcap</a>;</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keyword">using </span><a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> </div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a>) * _nqueues + _qoffset &gt; <a class="code hl_define" href="group__l4__memory__api.html#gabecf862d8b8f39ad28af45d7fc949dd5">L4_PAGESIZE</a>)</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> {</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="comment">// too many queues does not fit into our page</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> _qoffset = 0;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> _nqueues = 0;</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> }</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> </div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keyword">auto</span> cfg = chkcap(<a class="code hl_function" href="namespaceL4Re_1_1Util.html#a08b3c68edc484947355ca2b60a97e30d">L4Re::Util::make_shared_cap&lt;Dataspace&gt;</a>());</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> chksys(<a class="code hl_function" href="classL4Re_1_1Env.html#a2706ca11e70845b0a29a5646c9fd54bc">L4Re::Env::env</a>()-&gt;mem_alloc()-&gt;alloc(<a class="code hl_define" href="group__l4__memory__api.html#gabecf862d8b8f39ad28af45d7fc949dd5">L4_PAGESIZE</a>, cfg.get()));</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> </div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> attach_n_init_cfg(cfg, 0);</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> }</div>
</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span></div>
<div class="foldopen" id="foldopen00146" data-start="{" data-end="}">
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#ac0a15fe6ca82defa26c36e37447275eb"> 146</a></span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#ac0a15fe6ca82defa26c36e37447275eb">Dev_config</a>(Cfg_cap <span class="keyword">const</span> &amp;cfg, <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> cfg_offset,</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> vendor, <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> device,</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keywordtype">unsigned</span> cfg_size, <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a> = 0)</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> : _vendor(vendor), _device(device),</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> _qoffset(0x100 + align(cfg_size)),</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> _nqueues(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>)</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> {</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a>) * _nqueues + _qoffset &gt; <a class="code hl_define" href="group__l4__memory__api.html#gabecf862d8b8f39ad28af45d7fc949dd5">L4_PAGESIZE</a>)</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> {</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="comment">// too many queues does not fit into our page</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> _qoffset = 0;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> _nqueues = 0;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> }</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> </div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> attach_n_init_cfg(cfg, cfg_offset);</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> }</div>
</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> </div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="keywordtype">void</span> set_host_feature(<span class="keywordtype">unsigned</span> feature)</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> { <a class="code hl_function" href="group__l4virtio__transport.html#gabbe70d7b16bf836b95729f581c047cad">l4virtio_set_feature</a>(_host_features, feature); }</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> </div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keywordtype">void</span> clear_host_feature(<span class="keywordtype">unsigned</span> feature)</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> { <a class="code hl_function" href="group__l4virtio__transport.html#gaa9e2b594dd8763023221b2a4d2455dab">l4virtio_clear_feature</a>(_host_features, feature); }</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> </div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keywordtype">bool</span> get_host_feature(<span class="keywordtype">unsigned</span> feature)</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> { <span class="keywordflow">return</span> <a class="code hl_function" href="group__l4virtio__transport.html#gae37bcd45875b27b302320e6b9580191d">l4virtio_get_feature</a>(_host_features, feature); }</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> </div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keywordtype">bool</span> get_guest_feature(<span class="keywordtype">unsigned</span> feature)</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> { <span class="keywordflow">return</span> <a class="code hl_function" href="group__l4virtio__transport.html#gae37bcd45875b27b302320e6b9580191d">l4virtio_get_feature</a>(_config-&gt;driver_features_map, feature); }</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> </div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> &amp;host_features(<span class="keywordtype">unsigned</span> idx)</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> { <span class="keywordflow">return</span> _host_features[idx]; }</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> host_features(<span class="keywordtype">unsigned</span> idx)<span class="keyword"> const</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _host_features[idx]; }</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span></div>
<div class="foldopen" id="foldopen00184" data-start="{" data-end="}">
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd"> 184</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _nqueues; }</div>
</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span></div>
<div class="foldopen" id="foldopen00198" data-start="{" data-end="}">
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#ae141610d4be24a07911dff2ba21dbe0a"> 198</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#ae141610d4be24a07911dff2ba21dbe0a">guest_features</a>(<span class="keywordtype">unsigned</span> idx)<span class="keyword"> const</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _config-&gt;driver_features_map[idx]; }</div>
</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span></div>
<div class="foldopen" id="foldopen00212" data-start="{" data-end="}">
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#af526040ad9d9edd555d29506ab46453c"> 212</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#af526040ad9d9edd555d29506ab46453c">negotiated_features</a>(<span class="keywordtype">unsigned</span> idx)<span class="keyword"> const</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _config-&gt;driver_features_map[idx] &amp; _host_features[idx]; }</div>
</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416"> 222</a></span> Status <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">status</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _status; }</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span></div>
<div class="foldopen" id="foldopen00230" data-start="{" data-end="}">
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a64313e8e41c209f12bd104442751753d"> 230</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a64313e8e41c209f12bd104442751753d">get_cmd</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea">hdr</a>()-&gt;cmd;</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> }</div>
</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span></div>
<div class="foldopen" id="foldopen00241" data-start="{" data-end="}">
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a988f5859320f66b6479d338c5b15660f"> 241</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a988f5859320f66b6479d338c5b15660f">reset_cmd</a>()</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> {</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="keyword">const_cast&lt;</span><a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <span class="keyword">volatile </span>&amp;<span class="keyword">&gt;</span>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea">hdr</a>()-&gt;cmd) = 0;</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> }</div>
</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span></div>
<div class="foldopen" id="foldopen00253" data-start="{" data-end="}">
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a01556f856334cea1ab98ef40559a5ead"> 253</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a01556f856334cea1ab98ef40559a5ead">set_status</a>(Status <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">status</a>)</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> {</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> _status = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">status</a>;</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keyword">const_cast&lt;</span><a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <span class="keyword">volatile </span>&amp;<span class="keyword">&gt;</span>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea">hdr</a>()-&gt;status) = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">status</a>.raw;</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> }</div>
</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span></div>
<div class="foldopen" id="foldopen00265" data-start="{" data-end="}">
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a7fb7334fc078f7c26c036ea1f5fbdbf3"> 265</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a7fb7334fc078f7c26c036ea1f5fbdbf3">add_irq_status</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">status</a>)</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> {</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keyword">const_cast&lt;</span><a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <span class="keyword">volatile </span>&amp;<span class="keyword">&gt;</span>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea">hdr</a>()-&gt;irq_status) |= <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">status</a>;</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> }</div>
</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span></div>
<div class="foldopen" id="foldopen00276" data-start="{" data-end="}">
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#afc2b3a6d213dc5fbaf7e500f784b5076"> 276</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#afc2b3a6d213dc5fbaf7e500f784b5076">set_device_needs_reset</a>()</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> {</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> _status.device_needs_reset() = 1;</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keyword">const_cast&lt;</span><a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <span class="keyword">volatile </span>&amp;<span class="keyword">&gt;</span>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea">hdr</a>()-&gt;status) = _status.raw;</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> }</div>
</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span></div>
<div class="foldopen" id="foldopen00286" data-start="{" data-end="}">
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a6e2930c86af691b5379cf45f253bad1d"> 286</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a6e2930c86af691b5379cf45f253bad1d">change_queue_config</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>)</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> {</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a>) * <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a> + _qoffset &gt; <a class="code hl_define" href="group__l4__memory__api.html#gabecf862d8b8f39ad28af45d7fc949dd5">L4_PAGESIZE</a>)</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="comment">// too many queues does not fit into our page</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> </div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> _nqueues = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>;</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#abfda82e19ccfbd5d40a0d8336c0d1815">reset_hdr</a>(<span class="keyword">true</span>);</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> }</div>
</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span></div>
<div class="foldopen" id="foldopen00303" data-start="{" data-end="}">
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#aa47cc92da20edf7757449a0917f30997"> 303</a></span> <a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a> <span class="keyword">volatile</span> <span class="keyword">const</span> *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#aa47cc92da20edf7757449a0917f30997">qconfig</a>(<span class="keywordtype">unsigned</span> index)<span class="keyword"> const</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(_qoffset &lt; <span class="keyword">sizeof</span> (<a class="code hl_struct" href="structl4virtio__config__hdr__t.html">l4virtio_config_hdr_t</a>)))</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> </div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(index &gt;= _nqueues))</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> </div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a> <span class="keyword">const </span>*<span class="keyword">&gt;</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> (<span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span> *<span class="keyword">&gt;</span>(_config.get()) + _qoffset) + index;</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> }</div>
</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span></div>
<div class="foldopen" id="foldopen00318" data-start="{" data-end="}">
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#abfda82e19ccfbd5d40a0d8336c0d1815"> 318</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#abfda82e19ccfbd5d40a0d8336c0d1815">reset_hdr</a>(<span class="keywordtype">bool</span> inc_generation = <span class="keyword">false</span>)<span class="keyword"> const</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> _config-&gt;magic = L4VIRTIO_MAGIC;</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> _config-&gt;version = 2;</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> _config-&gt;device = _device;</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> _config-&gt;vendor = _vendor;</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> _config-&gt;status = 0;</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> _config-&gt;irq_status = 0;</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> _config-&gt;num_queues = _nqueues;</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> _config-&gt;queues_offset = _qoffset;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> </div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> memcpy(_config-&gt;dev_features_map, _host_features,</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <span class="keyword">sizeof</span>(_config-&gt;dev_features_map));</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> wmb();</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="keywordflow">if</span> (inc_generation)</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> ++_config-&gt;generation;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> </div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> }</div>
</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span></div>
<div class="foldopen" id="foldopen00345" data-start="{" data-end="}">
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a23076c47a39c091db853262e9db32f1c"> 345</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a23076c47a39c091db853262e9db32f1c">reset_queue</a>(<span class="keywordtype">unsigned</span> index, <span class="keywordtype">unsigned</span> num_max,</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="keywordtype">bool</span> inc_generation = <span class="keyword">false</span>)<span class="keyword"> const</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> <a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a> <span class="keyword">volatile</span> *qc;</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> <span class="comment">// this function is allowed to write to the device config</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> qc = <span class="keyword">const_cast&lt;</span><a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a> <span class="keyword">volatile </span>*<span class="keyword">&gt;</span>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#aa47cc92da20edf7757449a0917f30997">qconfig</a>(index));</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(qc == 0))</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> </div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#adbd8746b07061f27508628fe442a594f">num_max</a> = num_max;</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#af07ce7772cafbaab1d694e1e9d74f9be">num</a> = 0;</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#ad533c96172ff34e3737aad54fba0282d">ready</a> = 0;</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> wmb();</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> <span class="keywordflow">if</span> (inc_generation)</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> ++_config-&gt;generation;</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> </div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> }</div>
</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span></div>
<div class="foldopen" id="foldopen00368" data-start="{" data-end="}">
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea"> 368</a></span> <a class="code hl_struct" href="structl4virtio__config__hdr__t.html">l4virtio_config_hdr_t</a> <span class="keyword">const</span> <span class="keyword">volatile</span> *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea">hdr</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _config.get(); }</div>
</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#a8e6813664c811ab615500c8db8d6eb3e"> 375</a></span> <a class="code hl_class" href="classL4_1_1Cap.html">L4::Cap&lt;L4Re::Dataspace&gt;</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a8e6813664c811ab615500c8db8d6eb3e">ds</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _ds.get(); }</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span></div>
<div class="foldopen" id="foldopen00381" data-start="{" data-end="}">
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Dev__config.html#af87ff434ac162e5843c92ff76f21d24b"> 381</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#af87ff434ac162e5843c92ff76f21d24b">ds_offset</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _ds_offset; }</div>
</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span>};</div>
</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> </div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> </div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> PRIV_CONFIG&gt;</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span><span class="keyword">class </span>Dev_config_t : <span class="keyword">public</span> Dev_config</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span>{</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> <span class="keyword">typedef</span> PRIV_CONFIG Priv_config;</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> Dev_config_t(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> vendor, <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> device,</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a> = 0)</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> : <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a663b81f49e6ce03f9b7e136d6646bf89">Dev_config</a>(vendor, device, sizeof(PRIV_CONFIG), <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>)</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> {}</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> Dev_config_t(<a class="code hl_typedef" href="namespaceL4Re_1_1Util.html#a2eafa529c9c1144d7840f4e101ecf7aa">L4Re::Util::Shared_cap&lt;L4Re::Dataspace&gt;</a> <span class="keyword">const</span> &amp;cfg,</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> cfg_offset, <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> vendor, <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> device,</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a> = 0)</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> : <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a663b81f49e6ce03f9b7e136d6646bf89">Dev_config</a>(cfg, cfg_offset, vendor, device, sizeof(PRIV_CONFIG),</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>)</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> {}</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> Priv_config <span class="keyword">volatile</span> *priv_config()<span class="keyword"> const</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>Priv_config <span class="keyword">volatile </span>*<span class="keyword">&gt;</span>(get_priv_config());</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> }</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> </div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span>};</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span><span class="keyword">struct </span>No_custom_data {};</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span></div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> DATA&gt;</div>
<div class="foldopen" id="foldopen00450" data-start="{" data-end="};">
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html"> 450</a></span><span class="keyword">class </span><a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a5a6d502d913c9998ae3bdf30f455336f">Driver_mem_region_t</a> : <span class="keyword">public</span> DATA</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span>{</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> <span class="keyword">struct </span>Flags</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> {</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> Flags() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> <span class="keyword">explicit</span> Flags(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> raw) : raw(raw) {}</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> </div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> raw; </div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> CXX_BITFIELD_MEMBER(0, 0, rw, raw); </div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> };</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> </div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keyword">typedef</span> <a class="code hl_typedef" href="namespaceL4Re_1_1Util.html#a0efccd325a19246334922e58dd973914">L4Re::Util::Unique_cap&lt;L4Re::Dataspace&gt;</a> Ds_cap;</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> </div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> _drv_base; </div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> _trans_offset; </div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> _size; </div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> Flags _flags; </div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> </div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> Ds_cap _ds; </div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> _ds_offset;</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <a class="code hl_class" href="classL4Re_1_1Rm_1_1Unique__region.html">L4Re::Rm::Unique_region&lt;l4_addr_t&gt;</a> _local_base;</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> </div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> T _local(<a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> addr)<span class="keyword"> const</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T<span class="keyword">&gt;</span>(addr - _trans_offset);</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> }</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> </div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a5a6d502d913c9998ae3bdf30f455336f"> 485</a></span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a5a6d502d913c9998ae3bdf30f455336f">Driver_mem_region_t</a>() : _size(0) {}</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span></div>
<div class="foldopen" id="foldopen00498" data-start="{" data-end="}">
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#abdad88a18e5428fb2276148ceccf0434"> 498</a></span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#abdad88a18e5428fb2276148ceccf0434">Driver_mem_region_t</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#adb51465f554f2bbfa04d632d6864683f">drv_base</a>, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>,</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> offset, Ds_cap &amp;&amp;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#ada86015cfd3d2001b0a40e132558de24">ds</a>)</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> : _drv_base(<a class="code hl_function" href="group__l4__memory__api.html#ga70b72ae96c18cb49a3445198711bba0d">l4_trunc_page</a>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#adb51465f554f2bbfa04d632d6864683f">drv_base</a>)), _size(0), _flags(0),</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> _ds_offset(<a class="code hl_function" href="group__l4__memory__api.html#ga70b72ae96c18cb49a3445198711bba0d">l4_trunc_page</a>(offset))</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> {</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keyword">using </span><a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>;</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keyword">using </span><a class="code hl_class" href="classL4Re_1_1Env.html">L4Re::Env</a>;</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> </div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <a class="code hl_struct" href="structL4Re_1_1Dataspace_1_1Stats.html">L4Re::Dataspace::Stats</a> ds_info = <a class="code hl_struct" href="structL4Re_1_1Dataspace_1_1Stats.html">L4Re::Dataspace::Stats</a>();</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <span class="comment">// Sometimes we work with dataspaces that do not implement all dataspace</span></div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <span class="comment">// methods and return an error instead. An example of such a dataspace is</span></div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> <span class="comment">// io&#39;s Vi::System_bus. We detect this case when the info method returns</span></div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="comment">// -L4_ENOSYS and simply assume the dataspace is good for us.</span></div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordtype">long</span> err = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#ada86015cfd3d2001b0a40e132558de24">ds</a>-&gt;info(&amp;ds_info);</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> <span class="keywordflow">if</span> (err &gt;= 0)</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> {</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> ds_size = <a class="code hl_function" href="group__l4__memory__api.html#ga96e3b2d8e69308aecbb11d1d24f61662">l4_round_page</a>(ds_info.<a class="code hl_variable" href="structL4Re_1_1Dataspace_1_1Stats.html#aa1d9562f0be26272f1e8a41c29d5e69f">size</a>);</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> </div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> <span class="keywordflow">if</span> (ds_size &lt; <a class="code hl_define" href="group__l4__memory__api.html#gabecf862d8b8f39ad28af45d7fc949dd5">L4_PAGESIZE</a>)</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> chksys(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>, <span class="stringliteral">&quot;DS too small&quot;</span>);</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> </div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="keywordflow">if</span> (_ds_offset &gt;= ds_size)</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> chksys(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a226d93ada42b58951cfe40102ae169c8">L4_ERANGE</a>, <span class="stringliteral">&quot;offset larger than DS size&quot;</span>);</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> </div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a> = <a class="code hl_function" href="group__l4__memory__api.html#ga96e3b2d8e69308aecbb11d1d24f61662">l4_round_page</a>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>);</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a> &gt; ds_size)</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> chksys(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>, <span class="stringliteral">&quot;size larger than DS size&quot;</span>);</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> </div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> <span class="keywordflow">if</span> (_ds_offset &gt; ds_size - <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>)</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> chksys(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>, <span class="stringliteral">&quot;invalid offset or size&quot;</span>);</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> </div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="comment">// overflow check</span></div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> <span class="keywordflow">if</span> ((ULLONG_MAX - <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>) &lt; _drv_base)</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> chksys(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>, <span class="stringliteral">&quot;invalid size&quot;</span>);</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> </div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> _flags.rw() = (ds_info.<a class="code hl_variable" href="structL4Re_1_1Dataspace_1_1Stats.html#aeb2961c7febeff7a7c674c91ad34961c">flags</a> &amp; <a class="code hl_enumvalue" href="structL4Re_1_1Dataspace_1_1F.html#a62af1272cb958fe0f6cb5e2ab07c2df2ab5141e1c94df9319247eb5ecc54e8b27">L4Re::Dataspace::F::W</a>).raw != 0;</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> }</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>)</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> {</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> _flags.rw() = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> }</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> {</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> chksys(err, <span class="stringliteral">&quot;getting data-space infos&quot;</span>);</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> }</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> </div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keyword">auto</span> f = <a class="code hl_enumvalue" href="structL4Re_1_1Rm_1_1F.html#adec4d26077e34d9586891ac0489e0041a067b0bc28378717b6962241c621caa0a">L4Re::Rm::F::Search_addr</a> | <a class="code hl_enumvalue" href="structL4Re_1_1Rm_1_1F.html#a9707a14d822d3f60aa6a97cb16b2a989a6c0c069e0eca980069382cf52276815b">L4Re::Rm::F::R</a>;</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <span class="keywordflow">if</span> (_flags.rw())</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> f |= <a class="code hl_enumvalue" href="structL4Re_1_1Rm_1_1F.html#a9707a14d822d3f60aa6a97cb16b2a989a7a5548a6185bfa97c1b41ef92ab40bc5">L4Re::Rm::F::W</a>;</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> </div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> <span class="comment">// use a big alignment to save PT/TLB entries and kernel memory resources!</span></div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> chksys(Env::env()-&gt;rm()-&gt;attach(&amp;_local_base, <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>, f,</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> <a class="code hl_function" href="namespaceL4_1_1Ipc.html#a2bad64d85342191b358597cd08e55574">L4::Ipc::make_cap</a>(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#ada86015cfd3d2001b0a40e132558de24">ds</a>.get(), _flags.rw()</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> ? <a class="code hl_enumvalue" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a3cca0a716e3eb64c770567932460203f">L4_CAP_FPAGE_RW</a></div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> : <a class="code hl_enumvalue" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a11c1416f531fdb44d1d02c3de2fcb3e8">L4_CAP_FPAGE_RO</a>),</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> _ds_offset, <a class="code hl_define" href="group__l4__memory__api.html#ga6ff8d213542e2b602ce10b8d9c4a7e0f">L4_SUPERPAGESHIFT</a>));</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> </div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> _size = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>;</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> _ds = cxx::move(<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#ada86015cfd3d2001b0a40e132558de24">ds</a>);</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> _trans_offset = _drv_base - _local_base.get();</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> }</div>
</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span></div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a9464fa4646271afd0d21feec59d563ba"> 561</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a9464fa4646271afd0d21feec59d563ba">is_writable</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _flags.rw(); }</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span></div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a0d0c98a19bb3156a39ec6fe4d5368c30"> 564</a></span> Flags <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a0d0c98a19bb3156a39ec6fe4d5368c30">flags</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _flags; }</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span></div>
<div class="foldopen" id="foldopen00567" data-start="{" data-end="}">
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a0aed4c9de2082eae409e01352a1a9b7d"> 567</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a0aed4c9de2082eae409e01352a1a9b7d">empty</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _size == 0; }</div>
</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span></div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#adb51465f554f2bbfa04d632d6864683f"> 571</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#adb51465f554f2bbfa04d632d6864683f">drv_base</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _drv_base; }</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span></div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6e35c07336f8b1f1972a6bc1349beeeb"> 574</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6e35c07336f8b1f1972a6bc1349beeeb">local_base</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _local_base.get(); }</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span></div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0"> 577</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _size; }</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a2335a953065452a39db72dadbc04c4cd"> 580</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a2335a953065452a39db72dadbc04c4cd">ds_offset</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _ds_offset; }</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span></div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#ada86015cfd3d2001b0a40e132558de24"> 583</a></span> <a class="code hl_class" href="classL4_1_1Cap.html">L4::Cap&lt;L4Re::Dataspace&gt;</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#ada86015cfd3d2001b0a40e132558de24">ds</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _ds.get(); }</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span></div>
<div class="foldopen" id="foldopen00592" data-start="{" data-end="}">
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a11384549e18dc249846201ac410400ac"> 592</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a11384549e18dc249846201ac410400ac">contains</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> base, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>)<span class="keyword"> const</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> <span class="keywordflow">if</span> (base &lt; _drv_base)</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> </div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> <span class="keywordflow">if</span> (base &gt; _drv_base + _size - 1)</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> </div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a> &gt; _size)</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> </div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> <span class="keywordflow">if</span> (base - _drv_base &gt; _size - <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">size</a>)</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> </div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> }</div>
</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
<div class="foldopen" id="foldopen00616" data-start="{" data-end="}">
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#af08e01da1fdcbc0f0f4c4d90da5d0469"> 616</a></span> T *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#af08e01da1fdcbc0f0f4c4d90da5d0469">local</a>(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;T&gt;</a> p)<span class="keyword"> const</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _local&lt;T*&gt;(p.<a class="code hl_function" href="classL4virtio_1_1Ptr.html#a8e39f7c9cd370812ebb4610b096c44b6">get</a>()); }</div>
</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span>};</div>
</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> </div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span><span class="keyword">typedef</span> Driver_mem_region_t&lt;No_custom_data&gt; Driver_mem_region;</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> DATA&gt;</div>
<div class="foldopen" id="foldopen00629" data-start="{" data-end="};">
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html"> 629</a></span><span class="keyword">class </span><a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ae99075243f58cce77372bb568dc2029a">Driver_mem_list_t</a></div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span>{</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> <span class="keyword">typedef</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html">Driver_mem_region_t&lt;DATA&gt;</a> Mem_region;</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> </div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> cxx::unique_ptr&lt;Mem_region[]&gt; _l;</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> <span class="keywordtype">unsigned</span> _max;</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> <span class="keywordtype">unsigned</span> _free;</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> </div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a596a1564e958b30bae24e1a315bac12c"> 641</a></span> <span class="keyword">typedef</span> <a class="code hl_typedef" href="namespaceL4Re_1_1Util.html#a0efccd325a19246334922e58dd973914">L4Re::Util::Unique_cap&lt;L4Re::Dataspace&gt;</a> <a class="code hl_typedef" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a596a1564e958b30bae24e1a315bac12c">Ds_cap</a>;</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span></div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ae99075243f58cce77372bb568dc2029a"> 644</a></span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ae99075243f58cce77372bb568dc2029a">Driver_mem_list_t</a>() : _max(0), _free(0) {}</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span></div>
<div class="foldopen" id="foldopen00650" data-start="{" data-end="}">
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a8b6a1e1abadf68d73ceb813ac4cbc703"> 650</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a8b6a1e1abadf68d73ceb813ac4cbc703">init</a>(<span class="keywordtype">unsigned</span> max)</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> {</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> _l = cxx::make_unique&lt;Driver_mem_region_t&lt;DATA&gt;[]&gt;(max);</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> _max = max;</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> _free = 0;</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> }</div>
</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span></div>
<div class="foldopen" id="foldopen00658" data-start="{" data-end="}">
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab20b5da9afe9f89643a4ee31b68792aa"> 658</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab20b5da9afe9f89643a4ee31b68792aa">full</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _free == _max; }</div>
</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span></div>
<div class="foldopen" id="foldopen00669" data-start="{" data-end="}">
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a4325ef36d8d9d159d8d6a774b11378f4"> 669</a></span> Mem_region <span class="keyword">const</span> *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a4325ef36d8d9d159d8d6a774b11378f4">add</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> drv_base, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> size,</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> offset, <a class="code hl_typedef" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a596a1564e958b30bae24e1a315bac12c">Ds_cap</a> &amp;&amp;ds)</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> {</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab20b5da9afe9f89643a4ee31b68792aa">full</a>())</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9af7f5d38973fbf298613b03a088541e27">L4_ENOMEM</a>);</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> </div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> _l[_free++] = Mem_region(drv_base, size, offset, cxx::move(ds));</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> <span class="keywordflow">return</span> &amp;_l[_free - 1];</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> }</div>
</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span></div>
<div class="foldopen" id="foldopen00683" data-start="{" data-end="}">
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a36efa2f3d99ee6e3e7d07e1dec0343d8"> 683</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a36efa2f3d99ee6e3e7d07e1dec0343d8">remove</a>(Mem_region <span class="keyword">const</span> *r)</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> {</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> <span class="keywordflow">if</span> (r &lt; &amp;_l[0] || r &gt;= &amp;_l[_free])</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a226d93ada42b58951cfe40102ae169c8">L4_ERANGE</a>);</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> </div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keywordtype">unsigned</span> idx = r - &amp;_l[0];</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> </div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = idx + 1; i &lt; _free - 1; ++i)</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> _l[i] = cxx::move(_l[i + 1]);</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> </div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> _l[--_free] = Mem_region();</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> }</div>
</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span></div>
<div class="foldopen" id="foldopen00703" data-start="{" data-end="}">
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a15115f44d2eaf629888fb34afbdbf9f8"> 703</a></span> Mem_region *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a15115f44d2eaf629888fb34afbdbf9f8">find</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> base, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> size)<span class="keyword"> const</span></div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> <span class="keywordflow">return</span> _find(base, size);</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> }</div>
</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span></div>
<div class="foldopen" id="foldopen00717" data-start="{" data-end="}">
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a270520dc38853577d41834c95148eb43"> 717</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a270520dc38853577d41834c95148eb43">load_desc</a>(<a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">Virtqueue::Desc</a> <span class="keyword">const</span> &amp;desc, <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Request__processor.html">Request_processor</a> <span class="keyword">const</span> *p,</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> <a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">Virtqueue::Desc</a> <span class="keyword">const</span> **table)<span class="keyword"> const</span></div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> Mem_region <span class="keyword">const</span> *r = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a15115f44d2eaf629888fb34afbdbf9f8">find</a>(desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a8aad49eded68125ad5e94d0688d09828">addr</a>.<a class="code hl_function" href="classL4virtio_1_1Ptr.html#a8e39f7c9cd370812ebb4610b096c44b6">get</a>(), desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a55a515e923e62893696c1e6c09ffb62b">len</a>);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(!r))</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> <span class="keywordflow">throw</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Bad__descriptor.html">Bad_descriptor</a>(p, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Bad__descriptor.html#a6d0361d240b52210a4a6bcb5570a6a25a0eec6f7ec63c549bd35c05e205d33ecd">Bad_descriptor::Bad_address</a>);</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> </div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> *table = <span class="keyword">static_cast&lt;</span><a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">Virtqueue::Desc</a> <span class="keyword">const </span>*<span class="keyword">&gt;</span>(r-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#af08e01da1fdcbc0f0f4c4d90da5d0469">local</a>(desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a8aad49eded68125ad5e94d0688d09828">addr</a>));</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> }</div>
</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span></div>
<div class="foldopen" id="foldopen00737" data-start="{" data-end="}">
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab848fc9ce2b3e6aff935d4ed8baeaf41"> 737</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab848fc9ce2b3e6aff935d4ed8baeaf41">load_desc</a>(<a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">Virtqueue::Desc</a> <span class="keyword">const</span> &amp;desc, <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Request__processor.html">Request_processor</a> <span class="keyword">const</span> *p,</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> Mem_region <span class="keyword">const</span> **data)<span class="keyword"> const</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> Mem_region <span class="keyword">const</span> *r = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a15115f44d2eaf629888fb34afbdbf9f8">find</a>(desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a8aad49eded68125ad5e94d0688d09828">addr</a>.<a class="code hl_function" href="classL4virtio_1_1Ptr.html#a8e39f7c9cd370812ebb4610b096c44b6">get</a>(), desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a55a515e923e62893696c1e6c09ffb62b">len</a>);</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(!r))</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> <span class="keywordflow">throw</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Bad__descriptor.html">Bad_descriptor</a>(p, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Bad__descriptor.html#a6d0361d240b52210a4a6bcb5570a6a25a0eec6f7ec63c549bd35c05e205d33ecd">Bad_descriptor::Bad_address</a>);</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> </div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> *data = r;</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> }</div>
</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span></div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> ARG&gt;</div>
<div class="foldopen" id="foldopen00764" data-start="{" data-end="}">
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ac02a4a037cb5ca10ac68eb28f5da8a37"> 764</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ac02a4a037cb5ca10ac68eb28f5da8a37">load_desc</a>(<a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">Virtqueue::Desc</a> <span class="keyword">const</span> &amp;desc, <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Request__processor.html">Request_processor</a> <span class="keyword">const</span> *p,</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> ARG *data)<span class="keyword"> const</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> Mem_region *r = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a15115f44d2eaf629888fb34afbdbf9f8">find</a>(desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a8aad49eded68125ad5e94d0688d09828">addr</a>.<a class="code hl_function" href="classL4virtio_1_1Ptr.html#a8e39f7c9cd370812ebb4610b096c44b6">get</a>(), desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a55a515e923e62893696c1e6c09ffb62b">len</a>);</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(!r))</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="keywordflow">throw</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Bad__descriptor.html">Bad_descriptor</a>(p, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Bad__descriptor.html#a6d0361d240b52210a4a6bcb5570a6a25a0eec6f7ec63c549bd35c05e205d33ecd">Bad_descriptor::Bad_address</a>);</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> </div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> *data = ARG(r, desc, p);</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> }</div>
</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> </div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> Mem_region *begin() { <span class="keywordflow">return</span> &amp;_l[0]; }</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> Mem_region <span class="keyword">const</span> *begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &amp;_l[0]; }</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> </div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> Mem_region *end() { <span class="keywordflow">return</span> &amp;_l[_free]; }</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> Mem_region <span class="keyword">const</span> *end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &amp;_l[_free]; }</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> </div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> Mem_region *_find(<a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> base, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> size)<span class="keyword"> const</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; _free; ++i)</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <span class="keywordflow">if</span> (_l[i].contains(base, size))</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> <span class="keywordflow">return</span> &amp;_l[i];</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> }</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> </div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> </div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span>};</div>
</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> </div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span><span class="keyword">typedef</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html">Driver_mem_list_t&lt;No_custom_data&gt;</a> Driver_mem_list;</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span></div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> DATA&gt;</div>
<div class="foldopen" id="foldopen00801" data-start="{" data-end="};">
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html"> 801</a></span><span class="keyword">class </span><a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a7ce755ee0579fb70926d762ba67bb66f">Device_t</a></div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span>{</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="keyword">typedef</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html">Driver_mem_list_t&lt;DATA&gt;</a> Mem_list;</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> </div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span><span class="keyword">protected</span>:</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d"> 807</a></span> Mem_list <a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>; </div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> </div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Dev__config.html">Dev_config</a> *_device_config; </div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> </div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> <span class="keyword">using </span>Ds_vector = std::vector&lt;L4::Cap&lt;L4Re::Dataspace&gt;&gt;;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> std::shared_ptr&lt;Ds_vector const&gt; _trusted_ds_caps;</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span></div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> <span class="keywordtype">bool</span> _trusted_ds_validation_enabled = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> </div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> L4_RPC_LEGACY_DISPATCH(<a class="code hl_class" href="classL4virtio_1_1Device.html">L4virtio::Device</a>);</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> IOS&gt; <span class="keywordtype">int</span> virtio_dispatch(<span class="keywordtype">unsigned</span> r, IOS &amp;ios)</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> { <span class="keywordflow">return</span> dispatch(r, ios); }</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span></div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a4350f6e35f43df84584ec30740f5a7aa"> 825</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a4350f6e35f43df84584ec30740f5a7aa">reset</a>() = 0;</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span></div>
<div class="foldopen" id="foldopen00828" data-start="{" data-end="}">
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a858188800d304a06069db6c04020fc47"> 828</a></span> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a858188800d304a06069db6c04020fc47">check_features</a>()</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> { <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div>
</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span></div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#afd67e955eac6db54cbe5a479102b1a95"> 832</a></span> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#afd67e955eac6db54cbe5a479102b1a95">check_queues</a>() = 0;</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span></div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#acd473f71ee4f34883a6da43b5eb27106"> 835</a></span> <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#acd473f71ee4f34883a6da43b5eb27106">reconfig_queue</a>(<span class="keywordtype">unsigned</span> idx) = 0;</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a2c191fe0524b519a6262f557ebf9f2be"> 838</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a2c191fe0524b519a6262f557ebf9f2be">cfg_changed</a>(<span class="keywordtype">unsigned</span> <span class="comment">/* reg */</span>) {};</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span></div>
<div class="foldopen" id="foldopen00841" data-start="{" data-end="}">
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a8047b37ac63d6b5f84bcb1886a06f1b2"> 841</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a8047b37ac63d6b5f84bcb1886a06f1b2">register_single_driver_irq</a>()</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> { <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>, <span class="stringliteral">&quot;Legacy single IRQ interface not implemented.&quot;</span>); }</div>
</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span></div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a4555e9697f41bc44c313496af829d215"> 845</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a4555e9697f41bc44c313496af829d215">trigger_driver_config_irq</a>() = 0;</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span></div>
<div class="foldopen" id="foldopen00848" data-start="{" data-end="}">
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#ae96ab79bacd9bb862b0cf2aa4d3d18ac"> 848</a></span> <span class="keyword">virtual</span> <a class="code hl_class" href="classL4_1_1Cap.html">L4::Cap&lt;L4::Irq&gt;</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ae96ab79bacd9bb862b0cf2aa4d3d18ac">device_notify_irq</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>, <span class="stringliteral">&quot;Legacy single IRQ interface not implemented.&quot;</span>);</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="keywordflow">return</span> <a class="code hl_class" href="classL4_1_1Cap.html">L4::Cap&lt;L4::Irq&gt;</a>();</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> }</div>
</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span></div>
<div class="foldopen" id="foldopen00860" data-start="{" data-end="}">
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a66d09e200e34ccad61e5843d2b5bb0a0"> 860</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a66d09e200e34ccad61e5843d2b5bb0a0">register_driver_irq</a>(<span class="keywordtype">unsigned</span> idx)</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> {</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> <span class="keywordflow">if</span> (idx != 0)</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>, <span class="stringliteral">&quot;Multi IRQ interface not implemented.&quot;</span>);</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> </div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a8047b37ac63d6b5f84bcb1886a06f1b2">register_single_driver_irq</a>();</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> }</div>
</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span></div>
<div class="foldopen" id="foldopen00874" data-start="{" data-end="}">
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#ae684a9e7816579ca93e4f3bf6c765999"> 874</a></span> <span class="keyword">virtual</span> <a class="code hl_class" href="classL4_1_1Cap.html">L4::Cap&lt;L4::Irq&gt;</a> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ae684a9e7816579ca93e4f3bf6c765999">device_notify_irq</a>(<span class="keywordtype">unsigned</span> idx)</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> {</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> <span class="keywordflow">if</span> (idx != 0)</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>, <span class="stringliteral">&quot;Multi IRQ interface not implemented.&quot;</span>);</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> </div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ae96ab79bacd9bb862b0cf2aa4d3d18ac">device_notify_irq</a>();</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> }</div>
</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span></div>
<div class="foldopen" id="foldopen00883" data-start="{" data-end="}">
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a9536bf0c6e00b566c78c6abe80a68780"> 883</a></span> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a9536bf0c6e00b566c78c6abe80a68780">num_events_supported</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> 1; }</div>
</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> </div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classL4_1_1Ipc__svr_1_1Server__iface.html">L4::Ipc_svr::Server_iface</a> *server_iface() <span class="keyword">const</span> = 0;</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span></div>
<div class="foldopen" id="foldopen00891" data-start="{" data-end="}">
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a7ce755ee0579fb70926d762ba67bb66f"> 891</a></span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a7ce755ee0579fb70926d762ba67bb66f">Device_t</a>(<a class="code hl_class" href="classL4virtio_1_1Svr_1_1Dev__config.html">Dev_config</a> *dev_config)</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> : _device_config(dev_config)</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> {}</div>
</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span></div>
<div class="foldopen" id="foldopen00898" data-start="{" data-end="}">
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#ac35c61db0aec9e96ee18170bf5bb17b4"> 898</a></span> Mem_list <span class="keyword">const</span> *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ac35c61db0aec9e96ee18170bf5bb17b4">mem_info</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> &amp;<a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>; };</div>
</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> </div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> <span class="keywordtype">long</span> op_set_status(L4virtio::Device::Rights, <span class="keywordtype">unsigned</span> status)</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> { <span class="keywordflow">return</span> _set_status(status); }</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> </div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> <span class="keywordtype">long</span> op_config_queue(L4virtio::Device::Rights, <span class="keywordtype">unsigned</span> queue)</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> {</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> Dev_config::Status status = _device_config-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">status</a>();</div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> <span class="keywordflow">if</span> (status.fail_state() || !status.acked() || !status.driver())</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9abf18baaba897b65a370e903268cbac91">L4_EIO</a>;</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span> </div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#acd473f71ee4f34883a6da43b5eb27106">reconfig_queue</a>(queue);</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> }</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> </div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span> <span class="keywordtype">long</span> op_register_ds(L4virtio::Device::Rights,</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> <a class="code hl_class" href="classL4_1_1Ipc_1_1Snd__fpage.html">L4::Ipc::Snd_fpage</a> ds_cap_fp, <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> ds_base,</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"> 915</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> offset, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> sz)</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> {</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> L4Re::Util::Dbg()</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"> 918</span> .printf(<span class="stringliteral">&quot;Registering dataspace from 0x%llx with %lu KiB, offset 0x%lx\n&quot;</span>,</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> ds_base, sz &gt;&gt; 10, offset);</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> </div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> _check_n_init_shm(ds_cap_fp, ds_base, sz, offset);</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> </div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> }</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> </div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> <span class="keywordtype">long</span> op_device_config(L4virtio::Device::Rights,</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> L4::Ipc::Cap&lt;L4Re::Dataspace&gt; &amp;config_ds,</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> &amp;ds_offset)</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> {</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span> L4Re::Util::Dbg()</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> .printf(<span class="stringliteral">&quot;register client: host IRQ: %lx config DS: %lx\n&quot;</span>,</div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ae96ab79bacd9bb862b0cf2aa4d3d18ac">device_notify_irq</a>().cap(), _device_config-&gt;ds().cap());</div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> </div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> config_ds = <a class="code hl_function" href="namespaceL4_1_1Ipc.html#a2bad64d85342191b358597cd08e55574">L4::Ipc::make_cap</a>(_device_config-&gt;ds(), <a class="code hl_enumvalue" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a3cca0a716e3eb64c770567932460203f">L4_CAP_FPAGE_RW</a>);</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span> ds_offset = _device_config-&gt;ds_offset();</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span> }</div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> </div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span> <span class="keywordtype">long</span> op_device_notification_irq(L4virtio::Device::Rights,</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> <span class="keywordtype">unsigned</span> idx,</div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> L4::Ipc::Cap&lt;L4::Triggerable&gt; &amp;irq)</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> {</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> <span class="keyword">auto</span> cap = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ae96ab79bacd9bb862b0cf2aa4d3d18ac">device_notify_irq</a>(idx);</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> </div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> <span class="keywordflow">if</span> (!cap.is_valid())</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>;</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> </div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> irq = <a class="code hl_function" href="namespaceL4_1_1Ipc.html#a2bad64d85342191b358597cd08e55574">L4::Ipc::make_cap</a>(cap, <a class="code hl_enumvalue" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a11c1416f531fdb44d1d02c3de2fcb3e8">L4_CAP_FPAGE_RO</a>);</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e">L4_EOK</a>;</div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> }</div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> </div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> <span class="keywordtype">int</span> op_bind(L4::Icu::Rights, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> idx, L4::Ipc::Snd_fpage irq_cap_fp)</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> {</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> <span class="keywordflow">if</span> (idx &gt;= <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a9536bf0c6e00b566c78c6abe80a68780">num_events_supported</a>())</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a226d93ada42b58951cfe40102ae169c8">L4_ERANGE</a>;</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span> </div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> <span class="keywordflow">if</span> (!irq_cap_fp.<a class="code hl_function" href="classL4_1_1Ipc_1_1Snd__fpage.html#af9b4655a879646d2e79818e71ef28d81">cap_received</a>())</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>;</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> </div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a66d09e200e34ccad61e5843d2b5bb0a0">register_driver_irq</a>(idx);</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> </div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e">L4_EOK</a>;</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> }</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> </div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> <span class="keywordtype">int</span> op_unbind(L4::Icu::Rights, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a>, L4::Ipc::Snd_fpage)</div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno"> 966</span> {</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>;</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> }</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> </div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> <span class="keywordtype">int</span> op_info(L4::Icu::Rights, L4::Icu::_Info &amp;info)</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> {</div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> info.features = 0;</div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span> info.nr_irqs = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a9536bf0c6e00b566c78c6abe80a68780">num_events_supported</a>();</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> info.nr_msis = 0;</div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span> </div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e">L4_EOK</a>;</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> }</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> </div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> <span class="keywordtype">int</span> op_msi_info(L4::Icu::Rights, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a>, <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a>, <a class="code hl_typedef" href="icu_8h.html#aa7b6f98d2cd8ec2ac3bff18335cdfeba">l4_icu_msi_info_t</a> &amp;)</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> { <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>; }</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> </div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> <span class="keywordtype">int</span> op_mask(L4::Icu::Rights, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a>)</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> { <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>; }</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> </div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> <span class="keywordtype">int</span> op_unmask(L4::Icu::Rights, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a>)</div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> { <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a680679fbebc1e0ac1f9ec607c43319e0">L4_ENOREPLY</a>; }</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> </div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> <span class="keywordtype">int</span> op_set_mode(L4::Icu::Rights, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a>, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a>)</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> { <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a>; }</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span></div>
<div class="foldopen" id="foldopen01002" data-start="{" data-end="}">
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#aedbe988112e98750e5409a8c92358dcf"> 1002</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#aedbe988112e98750e5409a8c92358dcf">reset_queue_config</a>(<span class="keywordtype">unsigned</span> idx, <span class="keywordtype">unsigned</span> num_max,</div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> <span class="keywordtype">bool</span> inc_generation = <span class="keyword">false</span>)</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> {</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> _device_config-&gt;reset_queue(idx, num_max, inc_generation);</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> }</div>
</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span></div>
<div class="foldopen" id="foldopen01012" data-start="{" data-end="}">
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#ac13ae09cfc41fad98bd25c2d76bfac63"> 1012</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ac13ae09cfc41fad98bd25c2d76bfac63">init_mem_info</a>(<span class="keywordtype">unsigned</span> num)</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> {</div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> <a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>.init(num);</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> }</div>
</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span></div>
<div class="foldopen" id="foldopen01024" data-start="{" data-end="}">
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a29f780ecb04509d8b72f4a155b073c74"> 1024</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a29f780ecb04509d8b72f4a155b073c74">device_error</a>()</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> {</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a4350f6e35f43df84584ec30740f5a7aa">reset</a>();</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span> _device_config-&gt;set_device_needs_reset();</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> </div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span> <span class="comment">// the device MUST NOT notify the driver before DRIVER_OK.</span></div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> <span class="keywordflow">if</span> (_device_config-&gt;status().driver_ok())</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a4555e9697f41bc44c313496af829d215">trigger_driver_config_irq</a>();</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> }</div>
</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span></div>
<div class="foldopen" id="foldopen01047" data-start="{" data-end="}">
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#ab906b4cc61026fd815a8056f07bef10e"> 1047</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ab906b4cc61026fd815a8056f07bef10e">setup_queue</a>(<a class="code hl_class" href="classL4virtio_1_1Svr_1_1Virtqueue.html">Virtqueue</a> *q, <span class="keywordtype">unsigned</span> qn, <span class="keywordtype">unsigned</span> num_max)</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> {</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span> <a class="code hl_struct" href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a> <span class="keyword">volatile</span> <span class="keyword">const</span> *qc;</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> qc = _device_config-&gt;qconfig(qn);</div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(qc == 0))</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> </div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span> <span class="keywordflow">if</span> (!qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#ad533c96172ff34e3737aad54fba0282d">ready</a>)</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span> {</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> q-&gt;<a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a031d371276beec1cb5cf550be6fac491">disable</a>();</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span> }</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> </div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> <span class="comment">// read to local variables before check</span></div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> num = qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#af07ce7772cafbaab1d694e1e9d74f9be">num</a>;</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> desc = qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#a7c8175ec8a55273afc88e55e320fcbb1">desc_addr</a>;</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> avail = qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#a6bb39fd7b5c6c5141a6e1c394dbfc17d">avail_addr</a>;</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> used = qc-&gt;<a class="code hl_variable" href="structl4virtio__config__queue__t.html#aaaa723731a983ca4bece81a7ef5703e9">used_addr</a>;</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> </div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> <span class="keywordflow">if</span> (0)</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> printf(<span class="stringliteral">&quot;%p: setup queue: num=0x%x max_num=0x%x desc=0x%llx avail=0x%llx used=0x%llx\n&quot;</span>,</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> <span class="keyword">this</span>, num, num_max, desc, avail, used);</div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> </div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> <span class="keywordflow">if</span> (!num || num &gt; num_max)</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> </div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> <span class="comment">// num must be power of two</span></div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="keywordflow">if</span> (num &amp; (num - 1))</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> </div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> <span class="keywordflow">if</span> (desc &amp; 0xf)</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> </div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> <span class="keywordflow">if</span> (avail &amp; 0x1)</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> </div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> <span class="keywordflow">if</span> (used &amp; 0x3)</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> </div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="keyword">auto</span> <span class="keyword">const</span> *desc_info = <a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>.find(desc, <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a19410c09db5499023cb4b9f11742cd26">Virtqueue::desc_size</a>(num));</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(!desc_info))</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> </div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> <span class="keyword">auto</span> <span class="keyword">const</span> *avail_info = <a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>.find(avail, <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a962767a117dad07184f59191d399f9ce">Virtqueue::avail_size</a>(num));</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(!avail_info))</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> </div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> <span class="keyword">auto</span> <span class="keyword">const</span> *used_info = <a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>.find(used, <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a7747ac81d7fd21e1e55e43c2e7ead2ea">Virtqueue::used_size</a>(num));</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(!used_info || !used_info-&gt;is_writable()))</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> </div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> L4Re::Util::Dbg()</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> .printf(<span class="stringliteral">&quot;shm=[%llx-%llx] local=[%lx-%lx] desc=[%llx-%llx] (%p-%p)\n&quot;</span>,</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> desc_info-&gt;drv_base(), desc_info-&gt;drv_base() + desc_info-&gt;size() - 1,</div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> desc_info-&gt;local_base(),</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> desc_info-&gt;local_base() + desc_info-&gt;size() - 1,</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> desc, desc + <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a19410c09db5499023cb4b9f11742cd26">Virtqueue::desc_size</a>(num),</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> desc_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;char&gt;</a>(desc)),</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> desc_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;char&gt;</a>(desc)) + <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a19410c09db5499023cb4b9f11742cd26">Virtqueue::desc_size</a>(num));</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> </div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> L4Re::Util::Dbg()</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> .printf(<span class="stringliteral">&quot;shm=[%llx-%llx] local=[%lx-%lx] avail=[%llx-%llx] (%p-%p)\n&quot;</span>,</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> avail_info-&gt;drv_base(), avail_info-&gt;drv_base() + avail_info-&gt;size() - 1,</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> avail_info-&gt;local_base(),</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> avail_info-&gt;local_base() + avail_info-&gt;size() - 1,</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> avail, avail + <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a962767a117dad07184f59191d399f9ce">Virtqueue::avail_size</a>(num),</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> avail_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;char&gt;</a>(avail)),</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> avail_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;char&gt;</a>(avail)) + <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a962767a117dad07184f59191d399f9ce">Virtqueue::avail_size</a>(num));</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> </div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> L4Re::Util::Dbg()</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> .printf(<span class="stringliteral">&quot;shm=[%llx-%llx] local=[%lx-%lx] used=[%llx-%llx] (%p-%p)\n&quot;</span>,</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> used_info-&gt;drv_base(), used_info-&gt;drv_base() + used_info-&gt;size() - 1,</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> used_info-&gt;local_base(),</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> used_info-&gt;local_base() + used_info-&gt;size() - 1,</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> used, used + <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a7747ac81d7fd21e1e55e43c2e7ead2ea">Virtqueue::used_size</a>(num),</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> used_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;char&gt;</a>(used)),</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> used_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;char&gt;</a>(used)) + <a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a7747ac81d7fd21e1e55e43c2e7ead2ea">Virtqueue::used_size</a>(num));</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> </div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> q-&gt;<a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#a109ea5677dd074df1d2c6a06056c7d82">setup</a>(num, desc_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;void&gt;</a>(desc)),</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> avail_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;void&gt;</a>(avail)),</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> used_info-&gt;local(<a class="code hl_class" href="classL4virtio_1_1Ptr.html">Ptr&lt;void&gt;</a>(used)));</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> }</div>
</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> </div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> <span class="keywordtype">void</span> check_n_init_shm(<a class="code hl_typedef" href="namespaceL4Re_1_1Util.html#a0efccd325a19246334922e58dd973914">L4Re::Util::Unique_cap&lt;L4Re::Dataspace&gt;</a> &amp;&amp;shm,</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> base, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> size, <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> offset)</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> {</div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>.<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab20b5da9afe9f89643a4ee31b68792aa">full</a>())</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9af7f5d38973fbf298613b03a088541e27">L4_ENOMEM</a>);</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> </div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> <span class="keyword">auto</span> <span class="keyword">const</span> *i = <a class="code hl_variable" href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">_mem_info</a>.<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a4325ef36d8d9d159d8d6a774b11378f4">add</a>(base, size, offset, cxx::move(shm));</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> L4Re::Util::Dbg()</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> .printf(<span class="stringliteral">&quot;PORT[%p]: DMA guest [%llx-%llx] local [%lx-%lx] offset %lx\n&quot;</span>,</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> <span class="keyword">this</span>, i-&gt;drv_base(), i-&gt;drv_base() + i-&gt;size() - 1,</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> i-&gt;local_base(),</div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> i-&gt;local_base() + i-&gt;size() - 1,</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> i-&gt;ds_offset());</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> }</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span></div>
<div class="foldopen" id="foldopen01154" data-start="{" data-end="}">
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a460f5dc2b32e33a616eb822ffd2f88f0"> 1154</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a460f5dc2b32e33a616eb822ffd2f88f0">handle_mem_cmd_write</a>()</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> {</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> cmd = _device_config-&gt;get_cmd();</div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#gac76599eba5afa89a12c44176cbfa90cb">L4_LIKELY</a>(!(cmd &amp; <a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07abcd4953e2ca2d46a2d3789e8edac4d6b">L4VIRTIO_CMD_MASK</a>)))</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> </div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> <span class="keywordflow">switch</span> (cmd &amp; <a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07abcd4953e2ca2d46a2d3789e8edac4d6b">L4VIRTIO_CMD_MASK</a>)</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> {</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07a8927996ae9cb218bf390cb0fb058902f">L4VIRTIO_CMD_SET_STATUS</a>:</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> _set_status(cmd &amp; ~<a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07abcd4953e2ca2d46a2d3789e8edac4d6b">L4VIRTIO_CMD_MASK</a>);</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> </div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07aa9e85fa86a4d204f1da9616c6c8198a7">L4VIRTIO_CMD_CFG_QUEUE</a>:</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#acd473f71ee4f34883a6da43b5eb27106">reconfig_queue</a>(cmd &amp; ~<a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07abcd4953e2ca2d46a2d3789e8edac4d6b">L4VIRTIO_CMD_MASK</a>);</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> </div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07af09ad9e572febac6e79eb2faa157bc2a">L4VIRTIO_CMD_CFG_CHANGED</a>:</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a2c191fe0524b519a6262f557ebf9f2be">cfg_changed</a>(cmd &amp; ~<a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07abcd4953e2ca2d46a2d3789e8edac4d6b">L4VIRTIO_CMD_MASK</a>);</div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> </div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span> <span class="comment">// unknown command</span></div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> }</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> </div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> _device_config-&gt;reset_cmd();</div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span> </div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span> }</div>
</div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span></div>
<div class="foldopen" id="foldopen01187" data-start="{" data-end="}">
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#ade1572aa45b90682de1e05f08590d7e3"> 1187</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ade1572aa45b90682de1e05f08590d7e3">enable_trusted_ds_validation</a>()</div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> {</div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> _trusted_ds_validation_enabled = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> }</div>
</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span></div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> <span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen01198" data-start="{" data-end="}">
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Device__t.html#a38406c5353e2f96de8c667a6d5c5f5f1"> 1198</a></span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a38406c5353e2f96de8c667a6d5c5f5f1">add_trusted_dataspaces</a>(std::shared_ptr&lt;Ds_vector const&gt; ds)</div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> {</div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> _trusted_ds_caps = ds;</div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> }</div>
</div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> </div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> </div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> <span class="keywordtype">long</span> validate_ds(<a class="code hl_class" href="classL4_1_1Cap.html">L4::Cap&lt;L4Re::Dataspace&gt;</a> ds)</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> {</div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> <span class="keywordflow">if</span> (!_trusted_ds_caps)</div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>;</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> <span class="keywordflow">if</span> (std::any_of(_trusted_ds_caps-&gt;cbegin(), _trusted_ds_caps-&gt;cend(),</div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> [&amp;ds](<a class="code hl_class" href="classL4_1_1Cap.html">L4::Cap&lt;L4Re::Dataspace&gt;</a> cap)</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span> {</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> return L4Re::Env::env()-&gt;task()</div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> -&gt;cap_equal(ds, cap).label() == 1;</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> }</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> ))</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> {</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e">L4_EOK</a>;</div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> }</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>;</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> }</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span> </div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> <span class="keywordtype">void</span> _check_n_init_shm(<a class="code hl_class" href="classL4_1_1Ipc_1_1Snd__fpage.html">L4::Ipc::Snd_fpage</a> shm_cap_fp,</div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a> base, <a class="code hl_typedef" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> size, <a class="code hl_typedef" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> offset)</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> {</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> <span class="keywordflow">if</span> (!shm_cap_fp.<a class="code hl_function" href="classL4_1_1Ipc_1_1Snd__fpage.html#af9b4655a879646d2e79818e71ef28d81">cap_received</a>())</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(-<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>);</div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> </div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> <a class="code hl_typedef" href="namespaceL4Re_1_1Util.html#a0efccd325a19246334922e58dd973914">L4Re::Util::Unique_cap&lt;L4Re::Dataspace&gt;</a> ds(</div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> <a class="code hl_function" href="namespaceL4Re.html#a64b057254a760643ba67a9ed452fede8">L4Re::chkcap</a>(server_iface()-&gt;<span class="keyword">template</span> rcv_cap&lt;L4Re::Dataspace&gt;(0)));</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(server_iface()-&gt;realloc_rcv_cap(0));</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> </div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> <span class="keywordflow">if</span> (_trusted_ds_validation_enabled)</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span> <a class="code hl_function" href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a>(validate_ds(ds.get()), <span class="stringliteral">&quot;Validating the dataspace.&quot;</span>);</div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> </div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span> check_n_init_shm(cxx::move(ds), base, size, offset);</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span> }</div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span> </div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span> <span class="keywordtype">bool</span> check_features_internal()</div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span> {</div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> <span class="keyword">static_assert</span>(<span class="keyword">sizeof</span>(l4virtio_config_hdr_t::driver_features_map)</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> == <span class="keyword">sizeof</span>(l4virtio_config_hdr_t::dev_features_map),</div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span> <span class="stringliteral">&quot;Driver and device feature maps must be of the same size&quot;</span>);</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span> </div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> <span class="comment">// From the Virtio 1.0 specification 6.1 Driver Requirements and 6.2 Device</span></div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span> <span class="comment">// Requirements: A driver MUST accept VIRTIO_F_VERSION_1 if it is offered.</span></div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span> <span class="comment">// A device MUST offer VIRTIO_F_VERSION_1. A device MAY fail to operate</span></div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> <span class="comment">// further if VIRTIO_F_VERSION_1 is not accepted.</span></div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span> <span class="comment">//</span></div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> <span class="comment">// The L4virtio implementation does not support legacy interfaces so we</span></div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> <span class="comment">// fail here if the Virtio 1.0 feature was not accepted.</span></div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> <span class="keywordflow">if</span> (!_device_config-&gt;get_guest_feature(<a class="code hl_enumvalue" href="group__l4virtio__transport.html#gga01d1e713668a8ee48f1e34f428cea8d0ab8ea6c40b0611434c90ffee0bb729342">L4VIRTIO_FEATURE_VERSION_1</a>))</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> </div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = 0u;</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> i &lt; <span class="keyword">sizeof</span>(l4virtio_config_hdr_t::driver_features_map)</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> / <span class="keyword">sizeof</span>(l4virtio_config_hdr_t::driver_features_map[0]);</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> i++)</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> {</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> <span class="comment">// Driver must not accept features that were not offered by device</span></div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> <span class="keywordflow">if</span> (_device_config-&gt;guest_features(i)</div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> &amp; ~_device_config-&gt;host_features(i))</div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> }</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a858188800d304a06069db6c04020fc47">check_features</a>();</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> }</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span></div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> <span class="keywordtype">void</span> check_and_update_status(Dev_config::Status status)</div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span> {</div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span> <span class="comment">// snapshot of current status</span></div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> Dev_config::Status current_status = _device_config-&gt;status();</div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span> </div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> <span class="comment">// handle reset</span></div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> <span class="keywordflow">if</span> (!status.raw)</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> {</div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> _device_config-&gt;set_status(status);</div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> }</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> </div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> <span class="comment">// Do no further processing in case of driver or device failure. If FAILED</span></div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> <span class="comment">// or DEVICE_NEEDS_RESET are set only these fail_state bits will be set in</span></div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> <span class="comment">// addition to the current status bits already set.</span></div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> <span class="keywordflow">if</span> (current_status.fail_state() || status.fail_state())</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> {</div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> <span class="keywordflow">if</span> (current_status.fail_state() != status.fail_state())</div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> {</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> current_status.fail_state() =</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> current_status.fail_state() | status.fail_state();</div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> _device_config-&gt;set_status(current_status);</div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> }</div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> }</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> </div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> <span class="comment">// Enforce init sequence ACKNOWLEDGE, DRIVER, FEATURES_OK, DRIVER_OK.</span></div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span> <span class="comment">// We do not enforce that only one additional new bit is set per call.</span></div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> <span class="keywordflow">if</span> ((!status.acked() &amp;&amp; status.driver())</div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> || (!status.driver() &amp;&amp; status.features_ok())</div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> || (!status.features_ok() &amp;&amp; status.driver_ok()))</div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> {</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> current_status.device_needs_reset() = 1;</div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> _device_config-&gt;set_status(current_status);</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> }</div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> </div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span> <span class="comment">// only check feature compatibility before DRIVER_OK is set</span></div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> <span class="keywordflow">if</span> (status.features_ok() &amp;&amp; !status.driver_ok()</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> &amp;&amp; !check_features_internal())</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> status.features_ok() = 0;</div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> </div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span> <span class="comment">// Note that if FEATURES_OK and DRIVER_OK are both updated to being set</span></div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> <span class="comment">// at the same time the above check_features_internal() is skipped; this is</span></div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span> <span class="comment">// considered undefined behaviour but it is not prevented.</span></div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> <span class="keywordflow">if</span> (status.running() &amp;&amp; !<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#afd67e955eac6db54cbe5a479102b1a95">check_queues</a>())</div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span> {</div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span> current_status.device_needs_reset() = 1;</div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span> _device_config-&gt;set_status(current_status);</div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> }</div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span> </div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span> _device_config-&gt;set_status(status);</div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span> }</div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span></div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span> <span class="keywordtype">int</span> _set_status(<span class="keywordtype">unsigned</span> new_status)</div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span> {</div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span> <span class="keywordflow">if</span> (new_status == 0)</div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span> {</div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span> L4Re::Util::Dbg().printf(<span class="stringliteral">&quot;Resetting device\n&quot;</span>);</div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#a4350f6e35f43df84584ec30740f5a7aa">reset</a>();</div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span> _device_config-&gt;reset_hdr(<span class="keyword">true</span>);</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span> }</div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span> </div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span> Dev_config::Status status(new_status);</div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span> check_and_update_status(status);</div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span> </div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span> }</div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span> </div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span>};</div>
</div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span> </div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span><span class="keyword">typedef</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Device__t.html">Device_t&lt;No_custom_data&gt;</a> Device;</div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span> </div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span>} <span class="comment">// namespace Svr</span></div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span> </div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span>}</div>
<div class="ttc" id="aclassL4Re_1_1Dataspace_html"><div class="ttname"><a href="classL4Re_1_1Dataspace.html">L4Re::Dataspace</a></div><div class="ttdoc">Interface for memory-like objects.</div><div class="ttdef"><b>Definition</b> <a href="dataspace_source.html#l00050">dataspace:53</a></div></div>
<div class="ttc" id="aclassL4Re_1_1Env_html"><div class="ttname"><a href="classL4Re_1_1Env.html">L4Re::Env</a></div><div class="ttdoc">C++ interface of the initial environment that is provided to an L4 task.</div><div class="ttdef"><b>Definition</b> <a href="env_source.html#l00078">env:79</a></div></div>
<div class="ttc" id="aclassL4Re_1_1Env_html_a2706ca11e70845b0a29a5646c9fd54bc"><div class="ttname"><a href="classL4Re_1_1Env.html#a2706ca11e70845b0a29a5646c9fd54bc">L4Re::Env::env</a></div><div class="ttdeci">static Env const * env() noexcept</div><div class="ttdoc">Returns the initial environment for the current task.</div><div class="ttdef"><b>Definition</b> <a href="env_source.html#l00096">env:96</a></div></div>
<div class="ttc" id="aclassL4Re_1_1Rm_1_1Unique__region_html"><div class="ttname"><a href="classL4Re_1_1Rm_1_1Unique__region.html">L4Re::Rm::Unique_region</a></div><div class="ttdoc">Unique region.</div><div class="ttdef"><b>Definition</b> <a href="rm_source.html#l00435">rm:436</a></div></div>
<div class="ttc" id="aclassL4_1_1Cap_html"><div class="ttname"><a href="classL4_1_1Cap.html">L4::Cap</a></div><div class="ttdoc">C++ interface for capabilities.</div><div class="ttdef"><b>Definition</b> <a href="capability_8h_source.html#l00223">capability.h:224</a></div></div>
<div class="ttc" id="aclassL4_1_1Ipc_1_1Snd__fpage_html"><div class="ttname"><a href="classL4_1_1Ipc_1_1Snd__fpage.html">L4::Ipc::Snd_fpage</a></div><div class="ttdoc">Send item or return item.</div><div class="ttdef"><b>Definition</b> <a href="ipc__types_source.html#l00323">ipc_types:324</a></div></div>
<div class="ttc" id="aclassL4_1_1Ipc_1_1Snd__fpage_html_af9b4655a879646d2e79818e71ef28d81"><div class="ttname"><a href="classL4_1_1Ipc_1_1Snd__fpage.html#af9b4655a879646d2e79818e71ef28d81">L4::Ipc::Snd_fpage::cap_received</a></div><div class="ttdeci">bool cap_received() const noexcept</div><div class="ttdoc">(Defined for return items only.) Check if at least one object capability has been mapped for this ite...</div><div class="ttdef"><b>Definition</b> <a href="ipc__types_source.html#l00496">ipc_types:496</a></div></div>
<div class="ttc" id="aclassL4_1_1Ipc__svr_1_1Server__iface_html"><div class="ttname"><a href="classL4_1_1Ipc__svr_1_1Server__iface.html">L4::Ipc_svr::Server_iface</a></div><div class="ttdoc">Interface for server-loop related functions.</div><div class="ttdef"><b>Definition</b> <a href="ipc__epiface_source.html#l00036">ipc_epiface:37</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Device_html"><div class="ttname"><a href="classL4virtio_1_1Device.html">L4virtio::Device</a></div><div class="ttdoc">IPC interface for virtio over L4 IPC.</div><div class="ttdef"><b>Definition</b> <a href="l4virtio_source.html#l00039">l4virtio:42</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Ptr_html"><div class="ttname"><a href="classL4virtio_1_1Ptr.html">L4virtio::Ptr</a></div><div class="ttdoc">Pointer used in virtio descriptors.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00047">virtqueue:48</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Ptr_html_a8e39f7c9cd370812ebb4610b096c44b6"><div class="ttname"><a href="classL4virtio_1_1Ptr.html#a8e39f7c9cd370812ebb4610b096c44b6">L4virtio::Ptr::get</a></div><div class="ttdeci">l4_uint64_t get() const</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00062">virtqueue:62</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html">L4virtio::Svr::Dev_config</a></div><div class="ttdoc">Abstraction for L4-Virtio device config memory.</div><div class="ttdef"><b>Definition</b> <a href="#l00052">l4virtio:53</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a01556f856334cea1ab98ef40559a5ead"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a01556f856334cea1ab98ef40559a5ead">L4virtio::Svr::Dev_config::set_status</a></div><div class="ttdeci">void set_status(Status status)</div><div class="ttdoc">Set device status register.</div><div class="ttdef"><b>Definition</b> <a href="#l00253">l4virtio:253</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a23076c47a39c091db853262e9db32f1c"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a23076c47a39c091db853262e9db32f1c">L4virtio::Svr::Dev_config::reset_queue</a></div><div class="ttdeci">bool reset_queue(unsigned index, unsigned num_max, bool inc_generation=false) const</div><div class="ttdoc">Reset queue config for the given queue.</div><div class="ttdef"><b>Definition</b> <a href="#l00345">l4virtio:345</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a3acc9e5e59e097b5eb997644478d54ea"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a3acc9e5e59e097b5eb997644478d54ea">L4virtio::Svr::Dev_config::hdr</a></div><div class="ttdeci">l4virtio_config_hdr_t const volatile * hdr() const</div><div class="ttdoc">Get a read-only pointer to the config header.</div><div class="ttdef"><b>Definition</b> <a href="#l00368">l4virtio:368</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a64313e8e41c209f12bd104442751753d"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a64313e8e41c209f12bd104442751753d">L4virtio::Svr::Dev_config::get_cmd</a></div><div class="ttdeci">l4_uint32_t get_cmd() const</div><div class="ttdoc">Get the value from the cmd register.</div><div class="ttdef"><b>Definition</b> <a href="#l00230">l4virtio:230</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a663b81f49e6ce03f9b7e136d6646bf89"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a663b81f49e6ce03f9b7e136d6646bf89">L4virtio::Svr::Dev_config::Dev_config</a></div><div class="ttdeci">Dev_config(l4_uint32_t vendor, l4_uint32_t device, unsigned cfg_size, l4_uint32_t num_queues=0)</div><div class="ttdoc">Create a L4-Virtio config data space.</div><div class="ttdef"><b>Definition</b> <a href="#l00112">l4virtio:112</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a6e2930c86af691b5379cf45f253bad1d"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a6e2930c86af691b5379cf45f253bad1d">L4virtio::Svr::Dev_config::change_queue_config</a></div><div class="ttdeci">bool change_queue_config(l4_uint32_t num_queues)</div><div class="ttdoc">Setup new queue configuration.</div><div class="ttdef"><b>Definition</b> <a href="#l00286">l4virtio:286</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a7fb7334fc078f7c26c036ea1f5fbdbf3"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a7fb7334fc078f7c26c036ea1f5fbdbf3">L4virtio::Svr::Dev_config::add_irq_status</a></div><div class="ttdeci">void add_irq_status(l4_uint32_t status)</div><div class="ttdoc">Adds irq status bit.</div><div class="ttdef"><b>Definition</b> <a href="#l00265">l4virtio:265</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a8e6813664c811ab615500c8db8d6eb3e"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a8e6813664c811ab615500c8db8d6eb3e">L4virtio::Svr::Dev_config::ds</a></div><div class="ttdeci">L4::Cap&lt; L4Re::Dataspace &gt; ds() const</div><div class="ttdoc">Get data-space capability for the shared config data space.</div><div class="ttdef"><b>Definition</b> <a href="#l00375">l4virtio:375</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a96ad6d40f04894e7a0ef8ce33a4f8416"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a96ad6d40f04894e7a0ef8ce33a4f8416">L4virtio::Svr::Dev_config::status</a></div><div class="ttdeci">Status status() const</div><div class="ttdoc">Get current device status (trusted).</div><div class="ttdef"><b>Definition</b> <a href="#l00222">l4virtio:222</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a988f5859320f66b6479d338c5b15660f"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a988f5859320f66b6479d338c5b15660f">L4virtio::Svr::Dev_config::reset_cmd</a></div><div class="ttdeci">void reset_cmd()</div><div class="ttdoc">Reset the cmd register after execution of a command.</div><div class="ttdef"><b>Definition</b> <a href="#l00241">l4virtio:241</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_a9c4009f53b93a29f3e19d676085d99dd"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">L4virtio::Svr::Dev_config::num_queues</a></div><div class="ttdeci">l4_uint32_t num_queues() const</div><div class="ttdoc">Return the number of queues currently usable.</div><div class="ttdef"><b>Definition</b> <a href="#l00184">l4virtio:184</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_aa47cc92da20edf7757449a0917f30997"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#aa47cc92da20edf7757449a0917f30997">L4virtio::Svr::Dev_config::qconfig</a></div><div class="ttdeci">l4virtio_config_queue_t volatile const * qconfig(unsigned index) const</div><div class="ttdoc">Get queue read-only config data for queue with the given index.</div><div class="ttdef"><b>Definition</b> <a href="#l00303">l4virtio:303</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_abfda82e19ccfbd5d40a0d8336c0d1815"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#abfda82e19ccfbd5d40a0d8336c0d1815">L4virtio::Svr::Dev_config::reset_hdr</a></div><div class="ttdeci">void reset_hdr(bool inc_generation=false) const</div><div class="ttdoc">Reset the config header to the initial contents.</div><div class="ttdef"><b>Definition</b> <a href="#l00318">l4virtio:318</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_ac0a15fe6ca82defa26c36e37447275eb"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#ac0a15fe6ca82defa26c36e37447275eb">L4virtio::Svr::Dev_config::Dev_config</a></div><div class="ttdeci">Dev_config(Cfg_cap const &amp;cfg, l4_addr_t cfg_offset, l4_uint32_t vendor, l4_uint32_t device, unsigned cfg_size, l4_uint32_t num_queues=0)</div><div class="ttdoc">Setup an L4-Virtio config space in an existing data space.</div><div class="ttdef"><b>Definition</b> <a href="#l00146">l4virtio:146</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_ae141610d4be24a07911dff2ba21dbe0a"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#ae141610d4be24a07911dff2ba21dbe0a">L4virtio::Svr::Dev_config::guest_features</a></div><div class="ttdeci">l4_uint32_t guest_features(unsigned idx) const</div><div class="ttdoc">Return a specific set of guest features.</div><div class="ttdef"><b>Definition</b> <a href="#l00198">l4virtio:198</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_af526040ad9d9edd555d29506ab46453c"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#af526040ad9d9edd555d29506ab46453c">L4virtio::Svr::Dev_config::negotiated_features</a></div><div class="ttdeci">l4_uint32_t negotiated_features(unsigned idx) const</div><div class="ttdoc">Compute a specific set of negotiated features.</div><div class="ttdef"><b>Definition</b> <a href="#l00212">l4virtio:212</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_af87ff434ac162e5843c92ff76f21d24b"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#af87ff434ac162e5843c92ff76f21d24b">L4virtio::Svr::Dev_config::ds_offset</a></div><div class="ttdeci">l4_addr_t ds_offset() const</div><div class="ttdoc">Return the offset into the config dataspace where the device configuration starts.</div><div class="ttdef"><b>Definition</b> <a href="#l00381">l4virtio:381</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Dev__config_html_afc2b3a6d213dc5fbaf7e500f784b5076"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Dev__config.html#afc2b3a6d213dc5fbaf7e500f784b5076">L4virtio::Svr::Dev_config::set_device_needs_reset</a></div><div class="ttdeci">void set_device_needs_reset()</div><div class="ttdoc">Set DEVICE_NEEDS_RESET bit in device status register.</div><div class="ttdef"><b>Definition</b> <a href="#l00276">l4virtio:276</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html">L4virtio::Svr::Device_t</a></div><div class="ttdoc">Server-side L4-VIRTIO device stub.</div><div class="ttdef"><b>Definition</b> <a href="#l00801">l4virtio:802</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a29f780ecb04509d8b72f4a155b073c74"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a29f780ecb04509d8b72f4a155b073c74">L4virtio::Svr::Device_t::device_error</a></div><div class="ttdeci">void device_error()</div><div class="ttdoc">Transition device into DEVICE_NEEDS_RESET state.</div><div class="ttdef"><b>Definition</b> <a href="#l01024">l4virtio:1024</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a2c191fe0524b519a6262f557ebf9f2be"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a2c191fe0524b519a6262f557ebf9f2be">L4virtio::Svr::Device_t::cfg_changed</a></div><div class="ttdeci">virtual void cfg_changed(unsigned)</div><div class="ttdoc">callback for client device configuration changes</div><div class="ttdef"><b>Definition</b> <a href="#l00838">l4virtio:838</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a38406c5353e2f96de8c667a6d5c5f5f1"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a38406c5353e2f96de8c667a6d5c5f5f1">L4virtio::Svr::Device_t::add_trusted_dataspaces</a></div><div class="ttdeci">void add_trusted_dataspaces(std::shared_ptr&lt; Ds_vector const &gt; ds)</div><div class="ttdoc">Provide a list of trusted dataspaces that can be used for validation.</div><div class="ttdef"><b>Definition</b> <a href="#l01198">l4virtio:1198</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a4350f6e35f43df84584ec30740f5a7aa"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a4350f6e35f43df84584ec30740f5a7aa">L4virtio::Svr::Device_t::reset</a></div><div class="ttdeci">virtual void reset()=0</div><div class="ttdoc">reset callback, called for doing a device reset</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a4555e9697f41bc44c313496af829d215"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a4555e9697f41bc44c313496af829d215">L4virtio::Svr::Device_t::trigger_driver_config_irq</a></div><div class="ttdeci">virtual void trigger_driver_config_irq()=0</div><div class="ttdoc">callback for triggering configuration change notification IRQ</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a460f5dc2b32e33a616eb822ffd2f88f0"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a460f5dc2b32e33a616eb822ffd2f88f0">L4virtio::Svr::Device_t::handle_mem_cmd_write</a></div><div class="ttdeci">bool handle_mem_cmd_write()</div><div class="ttdoc">Check for a value in the cmd register and handle a write.</div><div class="ttdef"><b>Definition</b> <a href="#l01154">l4virtio:1154</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a4ff8b5e4425d1b720b9751fbe501f68d"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a4ff8b5e4425d1b720b9751fbe501f68d">L4virtio::Svr::Device_t&lt; No_custom_data &gt;::_mem_info</a></div><div class="ttdeci">Mem_list _mem_info</div><div class="ttdef"><b>Definition</b> <a href="#l00807">l4virtio:807</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a66d09e200e34ccad61e5843d2b5bb0a0"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a66d09e200e34ccad61e5843d2b5bb0a0">L4virtio::Svr::Device_t::register_driver_irq</a></div><div class="ttdeci">virtual void register_driver_irq(unsigned idx)</div><div class="ttdoc">Callback for registering an notification IRQ (multi IRQ).</div><div class="ttdef"><b>Definition</b> <a href="#l00860">l4virtio:860</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a7ce755ee0579fb70926d762ba67bb66f"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a7ce755ee0579fb70926d762ba67bb66f">L4virtio::Svr::Device_t::Device_t</a></div><div class="ttdeci">Device_t(Dev_config *dev_config)</div><div class="ttdoc">Make a device for the given config.</div><div class="ttdef"><b>Definition</b> <a href="#l00891">l4virtio:891</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a8047b37ac63d6b5f84bcb1886a06f1b2"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a8047b37ac63d6b5f84bcb1886a06f1b2">L4virtio::Svr::Device_t::register_single_driver_irq</a></div><div class="ttdeci">virtual void register_single_driver_irq()</div><div class="ttdoc">callback for registering a single guest IRQ for all queues (old-style)</div><div class="ttdef"><b>Definition</b> <a href="#l00841">l4virtio:841</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a858188800d304a06069db6c04020fc47"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a858188800d304a06069db6c04020fc47">L4virtio::Svr::Device_t::check_features</a></div><div class="ttdeci">virtual bool check_features()</div><div class="ttdoc">callback for checking the subset of accepted features</div><div class="ttdef"><b>Definition</b> <a href="#l00828">l4virtio:828</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_a9536bf0c6e00b566c78c6abe80a68780"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#a9536bf0c6e00b566c78c6abe80a68780">L4virtio::Svr::Device_t::num_events_supported</a></div><div class="ttdeci">virtual unsigned num_events_supported() const</div><div class="ttdoc">Return the highest notification index supported.</div><div class="ttdef"><b>Definition</b> <a href="#l00883">l4virtio:883</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_ab906b4cc61026fd815a8056f07bef10e"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#ab906b4cc61026fd815a8056f07bef10e">L4virtio::Svr::Device_t::setup_queue</a></div><div class="ttdeci">bool setup_queue(Virtqueue *q, unsigned qn, unsigned num_max)</div><div class="ttdoc">Enable/disable the specified queue.</div><div class="ttdef"><b>Definition</b> <a href="#l01047">l4virtio:1047</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_ac13ae09cfc41fad98bd25c2d76bfac63"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#ac13ae09cfc41fad98bd25c2d76bfac63">L4virtio::Svr::Device_t::init_mem_info</a></div><div class="ttdeci">void init_mem_info(unsigned num)</div><div class="ttdoc">Initialize the memory region list to the given maximum.</div><div class="ttdef"><b>Definition</b> <a href="#l01012">l4virtio:1012</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_ac35c61db0aec9e96ee18170bf5bb17b4"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#ac35c61db0aec9e96ee18170bf5bb17b4">L4virtio::Svr::Device_t::mem_info</a></div><div class="ttdeci">Mem_list const * mem_info() const</div><div class="ttdoc">Get the memory region list used for this device.</div><div class="ttdef"><b>Definition</b> <a href="#l00898">l4virtio:898</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_acd473f71ee4f34883a6da43b5eb27106"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#acd473f71ee4f34883a6da43b5eb27106">L4virtio::Svr::Device_t::reconfig_queue</a></div><div class="ttdeci">virtual int reconfig_queue(unsigned idx)=0</div><div class="ttdoc">callback for client queue-config request</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_ade1572aa45b90682de1e05f08590d7e3"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#ade1572aa45b90682de1e05f08590d7e3">L4virtio::Svr::Device_t::enable_trusted_ds_validation</a></div><div class="ttdeci">void enable_trusted_ds_validation()</div><div class="ttdoc">Enable trusted dataspace validation.</div><div class="ttdef"><b>Definition</b> <a href="#l01187">l4virtio:1187</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_ae684a9e7816579ca93e4f3bf6c765999"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#ae684a9e7816579ca93e4f3bf6c765999">L4virtio::Svr::Device_t::device_notify_irq</a></div><div class="ttdeci">virtual L4::Cap&lt; L4::Irq &gt; device_notify_irq(unsigned idx)</div><div class="ttdoc">Callback to gather the device notification IRQ (multi IRQ).</div><div class="ttdef"><b>Definition</b> <a href="#l00874">l4virtio:874</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_ae96ab79bacd9bb862b0cf2aa4d3d18ac"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#ae96ab79bacd9bb862b0cf2aa4d3d18ac">L4virtio::Svr::Device_t::device_notify_irq</a></div><div class="ttdeci">virtual L4::Cap&lt; L4::Irq &gt; device_notify_irq() const</div><div class="ttdoc">callback to gather the device notification IRQ (old-style)</div><div class="ttdef"><b>Definition</b> <a href="#l00848">l4virtio:848</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_aedbe988112e98750e5409a8c92358dcf"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#aedbe988112e98750e5409a8c92358dcf">L4virtio::Svr::Device_t::reset_queue_config</a></div><div class="ttdeci">void reset_queue_config(unsigned idx, unsigned num_max, bool inc_generation=false)</div><div class="ttdoc">Trigger reset for the configuration space for queue idx.</div><div class="ttdef"><b>Definition</b> <a href="#l01002">l4virtio:1002</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Device__t_html_afd67e955eac6db54cbe5a479102b1a95"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Device__t.html#afd67e955eac6db54cbe5a479102b1a95">L4virtio::Svr::Device_t::check_queues</a></div><div class="ttdeci">virtual bool check_queues()=0</div><div class="ttdoc">callback for checking if the queues at DRIVER_OK transition</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html">L4virtio::Svr::Driver_mem_list_t</a></div><div class="ttdoc">List of driver memory regions assigned to a single L4-VIRTIO transport instance.</div><div class="ttdef"><b>Definition</b> <a href="#l00629">l4virtio:630</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_a15115f44d2eaf629888fb34afbdbf9f8"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a15115f44d2eaf629888fb34afbdbf9f8">L4virtio::Svr::Driver_mem_list_t::find</a></div><div class="ttdeci">Mem_region * find(l4_uint64_t base, l4_umword_t size) const</div><div class="ttdoc">Find memory region containing the given driver address region.</div><div class="ttdef"><b>Definition</b> <a href="#l00703">l4virtio:703</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_a270520dc38853577d41834c95148eb43"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a270520dc38853577d41834c95148eb43">L4virtio::Svr::Driver_mem_list_t::load_desc</a></div><div class="ttdeci">void load_desc(Virtqueue::Desc const &amp;desc, Request_processor const *p, Virtqueue::Desc const **table) const</div><div class="ttdoc">Default implementation for loading an indirect descriptor.</div><div class="ttdef"><b>Definition</b> <a href="#l00717">l4virtio:717</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_a36efa2f3d99ee6e3e7d07e1dec0343d8"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a36efa2f3d99ee6e3e7d07e1dec0343d8">L4virtio::Svr::Driver_mem_list_t::remove</a></div><div class="ttdeci">void remove(Mem_region const *r)</div><div class="ttdoc">Remove the given region from the list.</div><div class="ttdef"><b>Definition</b> <a href="#l00683">l4virtio:683</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_a4325ef36d8d9d159d8d6a774b11378f4"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a4325ef36d8d9d159d8d6a774b11378f4">L4virtio::Svr::Driver_mem_list_t::add</a></div><div class="ttdeci">Mem_region const * add(l4_uint64_t drv_base, l4_umword_t size, l4_addr_t offset, Ds_cap &amp;&amp;ds)</div><div class="ttdoc">Add a new region to the list.</div><div class="ttdef"><b>Definition</b> <a href="#l00669">l4virtio:669</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_a596a1564e958b30bae24e1a315bac12c"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a596a1564e958b30bae24e1a315bac12c">L4virtio::Svr::Driver_mem_list_t::Ds_cap</a></div><div class="ttdeci">L4Re::Util::Unique_cap&lt; L4Re::Dataspace &gt; Ds_cap</div><div class="ttdoc">type for storing a data-space capability internally</div><div class="ttdef"><b>Definition</b> <a href="#l00641">l4virtio:641</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_a8b6a1e1abadf68d73ceb813ac4cbc703"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#a8b6a1e1abadf68d73ceb813ac4cbc703">L4virtio::Svr::Driver_mem_list_t::init</a></div><div class="ttdeci">void init(unsigned max)</div><div class="ttdoc">Make a fresh list with capacity max.</div><div class="ttdef"><b>Definition</b> <a href="#l00650">l4virtio:650</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_ab20b5da9afe9f89643a4ee31b68792aa"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab20b5da9afe9f89643a4ee31b68792aa">L4virtio::Svr::Driver_mem_list_t::full</a></div><div class="ttdeci">bool full() const</div><div class="ttdef"><b>Definition</b> <a href="#l00658">l4virtio:658</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_ab848fc9ce2b3e6aff935d4ed8baeaf41"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ab848fc9ce2b3e6aff935d4ed8baeaf41">L4virtio::Svr::Driver_mem_list_t::load_desc</a></div><div class="ttdeci">void load_desc(Virtqueue::Desc const &amp;desc, Request_processor const *p, Mem_region const **data) const</div><div class="ttdoc">Default implementation returning the Driver_mem_region.</div><div class="ttdef"><b>Definition</b> <a href="#l00737">l4virtio:737</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_ac02a4a037cb5ca10ac68eb28f5da8a37"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ac02a4a037cb5ca10ac68eb28f5da8a37">L4virtio::Svr::Driver_mem_list_t::load_desc</a></div><div class="ttdeci">void load_desc(Virtqueue::Desc const &amp;desc, Request_processor const *p, ARG *data) const</div><div class="ttdoc">Default implementation returning generic information.</div><div class="ttdef"><b>Definition</b> <a href="#l00764">l4virtio:764</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__list__t_html_ae99075243f58cce77372bb568dc2029a"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__list__t.html#ae99075243f58cce77372bb568dc2029a">L4virtio::Svr::Driver_mem_list_t::Driver_mem_list_t</a></div><div class="ttdeci">Driver_mem_list_t()</div><div class="ttdoc">Make an empty, zero capacity list.</div><div class="ttdef"><b>Definition</b> <a href="#l00644">l4virtio:644</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html">L4virtio::Svr::Driver_mem_region_t</a></div><div class="ttdoc">Region of driver memory, that shall be managed locally.</div><div class="ttdef"><b>Definition</b> <a href="#l00450">l4virtio:451</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a0aed4c9de2082eae409e01352a1a9b7d"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a0aed4c9de2082eae409e01352a1a9b7d">L4virtio::Svr::Driver_mem_region_t::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition</b> <a href="#l00567">l4virtio:567</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a0d0c98a19bb3156a39ec6fe4d5368c30"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a0d0c98a19bb3156a39ec6fe4d5368c30">L4virtio::Svr::Driver_mem_region_t::flags</a></div><div class="ttdeci">Flags flags() const</div><div class="ttdef"><b>Definition</b> <a href="#l00564">l4virtio:564</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a11384549e18dc249846201ac410400ac"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a11384549e18dc249846201ac410400ac">L4virtio::Svr::Driver_mem_region_t::contains</a></div><div class="ttdeci">bool contains(l4_uint64_t base, l4_umword_t size) const</div><div class="ttdoc">Test if the given driver address range is within this region.</div><div class="ttdef"><b>Definition</b> <a href="#l00592">l4virtio:592</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a2335a953065452a39db72dadbc04c4cd"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a2335a953065452a39db72dadbc04c4cd">L4virtio::Svr::Driver_mem_region_t::ds_offset</a></div><div class="ttdeci">l4_addr_t ds_offset() const</div><div class="ttdef"><b>Definition</b> <a href="#l00580">l4virtio:580</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a5a6d502d913c9998ae3bdf30f455336f"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a5a6d502d913c9998ae3bdf30f455336f">L4virtio::Svr::Driver_mem_region_t::Driver_mem_region_t</a></div><div class="ttdeci">Driver_mem_region_t()</div><div class="ttdoc">Make default empty memory region.</div><div class="ttdef"><b>Definition</b> <a href="#l00485">l4virtio:485</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a6d13ee0514d05868dfc96d64a5d6c8e0"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6d13ee0514d05868dfc96d64a5d6c8e0">L4virtio::Svr::Driver_mem_region_t&lt; No_custom_data &gt;::size</a></div><div class="ttdeci">l4_umword_t size() const</div><div class="ttdef"><b>Definition</b> <a href="#l00577">l4virtio:577</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a6e35c07336f8b1f1972a6bc1349beeeb"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a6e35c07336f8b1f1972a6bc1349beeeb">L4virtio::Svr::Driver_mem_region_t::local_base</a></div><div class="ttdeci">l4_addr_t local_base() const</div><div class="ttdef"><b>Definition</b> <a href="#l00574">l4virtio:574</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_a9464fa4646271afd0d21feec59d563ba"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#a9464fa4646271afd0d21feec59d563ba">L4virtio::Svr::Driver_mem_region_t::is_writable</a></div><div class="ttdeci">bool is_writable() const</div><div class="ttdef"><b>Definition</b> <a href="#l00561">l4virtio:561</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_abdad88a18e5428fb2276148ceccf0434"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#abdad88a18e5428fb2276148ceccf0434">L4virtio::Svr::Driver_mem_region_t::Driver_mem_region_t</a></div><div class="ttdeci">Driver_mem_region_t(l4_uint64_t drv_base, l4_umword_t size, l4_addr_t offset, Ds_cap &amp;&amp;ds)</div><div class="ttdoc">Make a local memory region for the given driver values.</div><div class="ttdef"><b>Definition</b> <a href="#l00498">l4virtio:498</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_ada86015cfd3d2001b0a40e132558de24"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#ada86015cfd3d2001b0a40e132558de24">L4virtio::Svr::Driver_mem_region_t&lt; No_custom_data &gt;::ds</a></div><div class="ttdeci">L4::Cap&lt; L4Re::Dataspace &gt; ds() const</div><div class="ttdef"><b>Definition</b> <a href="#l00583">l4virtio:583</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_adb51465f554f2bbfa04d632d6864683f"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#adb51465f554f2bbfa04d632d6864683f">L4virtio::Svr::Driver_mem_region_t&lt; No_custom_data &gt;::drv_base</a></div><div class="ttdeci">l4_uint64_t drv_base() const</div><div class="ttdef"><b>Definition</b> <a href="#l00571">l4virtio:571</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Driver__mem__region__t_html_af08e01da1fdcbc0f0f4c4d90da5d0469"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Driver__mem__region__t.html#af08e01da1fdcbc0f0f4c4d90da5d0469">L4virtio::Svr::Driver_mem_region_t::local</a></div><div class="ttdeci">T * local(Ptr&lt; T &gt; p) const</div><div class="ttdoc">Get the local address for driver address p.</div><div class="ttdef"><b>Definition</b> <a href="#l00616">l4virtio:616</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Request__processor_html"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Request__processor.html">L4virtio::Svr::Request_processor</a></div><div class="ttdoc">Encapsulate the state for processing a VIRTIO request.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00472">virtio:473</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Virtqueue_html"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Virtqueue.html">L4virtio::Svr::Virtqueue</a></div><div class="ttdoc">Virtqueue implementation for the device.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00087">virtio:88</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_1_1Desc_html"><div class="ttname"><a href="classL4virtio_1_1Virtqueue_1_1Desc.html">L4virtio::Virtqueue::Desc</a></div><div class="ttdoc">Descriptor in the descriptor table.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00086">virtqueue:87</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_1_1Desc_html_a55a515e923e62893696c1e6c09ffb62b"><div class="ttname"><a href="classL4virtio_1_1Virtqueue_1_1Desc.html#a55a515e923e62893696c1e6c09ffb62b">L4virtio::Virtqueue::Desc::len</a></div><div class="ttdeci">l4_uint32_t len</div><div class="ttdoc">Length of described buffer.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00109">virtqueue:109</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_1_1Desc_html_a8aad49eded68125ad5e94d0688d09828"><div class="ttname"><a href="classL4virtio_1_1Virtqueue_1_1Desc.html#a8aad49eded68125ad5e94d0688d09828">L4virtio::Virtqueue::Desc::addr</a></div><div class="ttdeci">Ptr&lt; void &gt; addr</div><div class="ttdoc">Address stored in descriptor.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00108">virtqueue:108</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_html_a031d371276beec1cb5cf550be6fac491"><div class="ttname"><a href="classL4virtio_1_1Virtqueue.html#a031d371276beec1cb5cf550be6fac491">L4virtio::Virtqueue::disable</a></div><div class="ttdeci">void disable()</div><div class="ttdoc">Completely disable the queue.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00224">virtqueue:224</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_html_a109ea5677dd074df1d2c6a06056c7d82"><div class="ttname"><a href="classL4virtio_1_1Virtqueue.html#a109ea5677dd074df1d2c6a06056c7d82">L4virtio::Virtqueue::setup</a></div><div class="ttdeci">void setup(unsigned num, void *desc, void *avail, void *used)</div><div class="ttdoc">Enable this queue.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00349">virtqueue:349</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_html_a19410c09db5499023cb4b9f11742cd26"><div class="ttname"><a href="classL4virtio_1_1Virtqueue.html#a19410c09db5499023cb4b9f11742cd26">L4virtio::Virtqueue::desc_size</a></div><div class="ttdeci">static unsigned long desc_size(unsigned num)</div><div class="ttdoc">Calculate the size of the descriptor table for num entries.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00261">virtqueue:261</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_html_a7747ac81d7fd21e1e55e43c2e7ead2ea"><div class="ttname"><a href="classL4virtio_1_1Virtqueue.html#a7747ac81d7fd21e1e55e43c2e7ead2ea">L4virtio::Virtqueue::used_size</a></div><div class="ttdeci">static unsigned long used_size(unsigned num)</div><div class="ttdoc">Calculate the size of the used ring for num entries.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00298">virtqueue:298</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Virtqueue_html_a962767a117dad07184f59191d399f9ce"><div class="ttname"><a href="classL4virtio_1_1Virtqueue.html#a962767a117dad07184f59191d399f9ce">L4virtio::Virtqueue::avail_size</a></div><div class="ttdeci">static unsigned long avail_size(unsigned num)</div><div class="ttdoc">Calculate the size of the available ring for num entries.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00279">virtqueue:279</a></div></div>
<div class="ttc" id="adataspace_html"><div class="ttname"><a href="dataspace.html">dataspace</a></div><div class="ttdoc">Dataspace interface.</div></div>
<div class="ttc" id="aenv_html"><div class="ttname"><a href="env.html">env</a></div><div class="ttdoc">Environment interface.</div></div>
<div class="ttc" id="aerror__helper_html"><div class="ttname"><a href="error__helper.html">error_helper</a></div><div class="ttdoc">Error helper.</div></div>
<div class="ttc" id="agroup__l4__basic__types_html_ga1c2c4b333f75b1d05b59855910f2b9cb"><div class="ttname"><a href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a></div><div class="ttdeci">unsigned long l4_umword_t</div><div class="ttdoc">Unsigned machine word.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2l4int_8h_source.html#l00040">l4int.h:40</a></div></div>
<div class="ttc" id="agroup__l4__basic__types_html_ga4087b991c40c0d2fcde9ca331049a4d4"><div class="ttname"><a href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a></div><div class="ttdeci">unsigned long l4_addr_t</div><div class="ttdoc">Address type.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2l4int_8h_source.html#l00034">l4int.h:34</a></div></div>
<div class="ttc" id="agroup__l4__basic__types_html_gac1d09f3e382e711b776931f10e6e1e5a"><div class="ttname"><a href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a></div><div class="ttdeci">unsigned int l4_uint32_t</div><div class="ttdoc">Unsigned 32bit value.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2l4int_8h_source.html#l00029">l4int.h:29</a></div></div>
<div class="ttc" id="agroup__l4__basic__types_html_gaf3331c485014bd12a9e4f9d27a55e689"><div class="ttname"><a href="group__l4__basic__types.html#gaf3331c485014bd12a9e4f9d27a55e689">l4_uint64_t</a></div><div class="ttdeci">unsigned long long l4_uint64_t</div><div class="ttdoc">Unsigned 64bit value.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2l4int_8h_source.html#l00031">l4int.h:31</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9a226d93ada42b58951cfe40102ae169c8"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a226d93ada42b58951cfe40102ae169c8">L4_ERANGE</a></div><div class="ttdeci">@ L4_ERANGE</div><div class="ttdoc">Range error.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00048">err.h:48</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a29002561c97b1d3664caf3b0fe120553">L4_ENOSYS</a></div><div class="ttdeci">@ L4_ENOSYS</div><div class="ttdoc">No sys.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00050">err.h:50</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a></div><div class="ttdeci">@ L4_EINVAL</div><div class="ttdoc">Invalid argument.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00046">err.h:46</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9a680679fbebc1e0ac1f9ec607c43319e0"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a680679fbebc1e0ac1f9ec607c43319e0">L4_ENOREPLY</a></div><div class="ttdeci">@ L4_ENOREPLY</div><div class="ttdoc">No reply.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00055">err.h:55</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9abf18baaba897b65a370e903268cbac91"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9abf18baaba897b65a370e903268cbac91">L4_EIO</a></div><div class="ttdeci">@ L4_EIO</div><div class="ttdoc">I/O error.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00035">err.h:35</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e">L4_EOK</a></div><div class="ttdeci">@ L4_EOK</div><div class="ttdoc">Ok.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00032">err.h:32</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9af7f5d38973fbf298613b03a088541e27"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9af7f5d38973fbf298613b03a088541e27">L4_ENOMEM</a></div><div class="ttdeci">@ L4_ENOMEM</div><div class="ttdoc">No memory.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00039">err.h:39</a></div></div>
<div class="ttc" id="agroup__l4__fpage__api_html_ggaee60789a48cab2782f5a368237591b39a11c1416f531fdb44d1d02c3de2fcb3e8"><div class="ttname"><a href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a11c1416f531fdb44d1d02c3de2fcb3e8">L4_CAP_FPAGE_RO</a></div><div class="ttdeci">@ L4_CAP_FPAGE_RO</div><div class="ttdoc">Read right for capability flexpages.</div><div class="ttdef"><b>Definition</b> <a href="____l4__fpage_8h_source.html#l00176">__l4_fpage.h:176</a></div></div>
<div class="ttc" id="agroup__l4__fpage__api_html_ggaee60789a48cab2782f5a368237591b39a3cca0a716e3eb64c770567932460203f"><div class="ttname"><a href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a3cca0a716e3eb64c770567932460203f">L4_CAP_FPAGE_RW</a></div><div class="ttdeci">@ L4_CAP_FPAGE_RW</div><div class="ttdoc">Read and interface specific &#39;W&#39; right for capability flexpages.</div><div class="ttdef"><b>Definition</b> <a href="____l4__fpage_8h_source.html#l00192">__l4_fpage.h:192</a></div></div>
<div class="ttc" id="agroup__l4__memory__api_html_ga6ff8d213542e2b602ce10b8d9c4a7e0f"><div class="ttname"><a href="group__l4__memory__api.html#ga6ff8d213542e2b602ce10b8d9c4a7e0f">L4_SUPERPAGESHIFT</a></div><div class="ttdeci">#define L4_SUPERPAGESHIFT</div><div class="ttdoc">Size of a large page, log2-based.</div><div class="ttdef"><b>Definition</b> <a href="arm_2l4_2sys_2consts_8h_source.html#l00031">consts.h:31</a></div></div>
<div class="ttc" id="agroup__l4__memory__api_html_ga70b72ae96c18cb49a3445198711bba0d"><div class="ttname"><a href="group__l4__memory__api.html#ga70b72ae96c18cb49a3445198711bba0d">l4_trunc_page</a></div><div class="ttdeci">l4_addr_t l4_trunc_page(l4_addr_t address) L4_NOTHROW</div><div class="ttdoc">Round an address down to the next lower page boundary.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2consts_8h_source.html#l00448">consts.h:448</a></div></div>
<div class="ttc" id="agroup__l4__memory__api_html_ga96e3b2d8e69308aecbb11d1d24f61662"><div class="ttname"><a href="group__l4__memory__api.html#ga96e3b2d8e69308aecbb11d1d24f61662">l4_round_page</a></div><div class="ttdeci">l4_addr_t l4_round_page(l4_addr_t address) L4_NOTHROW</div><div class="ttdoc">Round address up to the next page.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2consts_8h_source.html#l00473">consts.h:473</a></div></div>
<div class="ttc" id="agroup__l4__memory__api_html_gabecf862d8b8f39ad28af45d7fc949dd5"><div class="ttname"><a href="group__l4__memory__api.html#gabecf862d8b8f39ad28af45d7fc949dd5">L4_PAGESIZE</a></div><div class="ttdeci">#define L4_PAGESIZE</div><div class="ttdoc">Minimal page size (in bytes).</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2consts_8h_source.html#l00391">consts.h:391</a></div></div>
<div class="ttc" id="agroup__l4sys__defines_html_ga3df4200910f2664b97397c23693beeb0"><div class="ttname"><a href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a></div><div class="ttdeci">#define L4_UNLIKELY(x)</div><div class="ttdoc">Expression is unlikely to execute.</div><div class="ttdef"><b>Definition</b> <a href="compiler_8h_source.html#l00284">compiler.h:284</a></div></div>
<div class="ttc" id="agroup__l4sys__defines_html_gac76599eba5afa89a12c44176cbfa90cb"><div class="ttname"><a href="group__l4sys__defines.html#gac76599eba5afa89a12c44176cbfa90cb">L4_LIKELY</a></div><div class="ttdeci">#define L4_LIKELY(x)</div><div class="ttdoc">Expression is likely to execute.</div><div class="ttdef"><b>Definition</b> <a href="compiler_8h_source.html#l00283">compiler.h:283</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gaa54e6e4ef7d8a9ae2ebf288e75aca8df"><div class="ttname"><a href="group__l4virtio__transport.html#gaa54e6e4ef7d8a9ae2ebf288e75aca8df">l4virtio_device_config</a></div><div class="ttdeci">void * l4virtio_device_config(l4virtio_config_hdr_t const *cfg)</div><div class="ttdoc">Get the pointer to the device configuration.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00263">virtio.h:263</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gaa9e2b594dd8763023221b2a4d2455dab"><div class="ttname"><a href="group__l4virtio__transport.html#gaa9e2b594dd8763023221b2a4d2455dab">l4virtio_clear_feature</a></div><div class="ttdeci">void l4virtio_clear_feature(l4_uint32_t *feature_map, unsigned feat)</div><div class="ttdoc">Clear the given feature bit in a feature map.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00284">virtio.h:284</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gabbe70d7b16bf836b95729f581c047cad"><div class="ttname"><a href="group__l4virtio__transport.html#gabbe70d7b16bf836b95729f581c047cad">l4virtio_set_feature</a></div><div class="ttdeci">void l4virtio_set_feature(l4_uint32_t *feature_map, unsigned feat)</div><div class="ttdoc">Set the given feature bit in a feature map.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00272">virtio.h:272</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gae37bcd45875b27b302320e6b9580191d"><div class="ttname"><a href="group__l4virtio__transport.html#gae37bcd45875b27b302320e6b9580191d">l4virtio_get_feature</a></div><div class="ttdeci">unsigned l4virtio_get_feature(l4_uint32_t *feature_map, unsigned feat)</div><div class="ttdoc">Check if the given bit in a feature map is set.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00296">virtio.h:296</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gga01d1e713668a8ee48f1e34f428cea8d0ab8ea6c40b0611434c90ffee0bb729342"><div class="ttname"><a href="group__l4virtio__transport.html#gga01d1e713668a8ee48f1e34f428cea8d0ab8ea6c40b0611434c90ffee0bb729342">L4VIRTIO_FEATURE_VERSION_1</a></div><div class="ttdeci">@ L4VIRTIO_FEATURE_VERSION_1</div><div class="ttdoc">Virtio protocol version 1 supported. Must be 1 for L4virtio.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00101">virtio.h:101</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gga4783b17d00ec949f63c11c7bda0eed07a8927996ae9cb218bf390cb0fb058902f"><div class="ttname"><a href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07a8927996ae9cb218bf390cb0fb058902f">L4VIRTIO_CMD_SET_STATUS</a></div><div class="ttdeci">@ L4VIRTIO_CMD_SET_STATUS</div><div class="ttdoc">Set the status register.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00122">virtio.h:122</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gga4783b17d00ec949f63c11c7bda0eed07aa9e85fa86a4d204f1da9616c6c8198a7"><div class="ttname"><a href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07aa9e85fa86a4d204f1da9616c6c8198a7">L4VIRTIO_CMD_CFG_QUEUE</a></div><div class="ttdeci">@ L4VIRTIO_CMD_CFG_QUEUE</div><div class="ttdoc">Configure a queue.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00123">virtio.h:123</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gga4783b17d00ec949f63c11c7bda0eed07abcd4953e2ca2d46a2d3789e8edac4d6b"><div class="ttname"><a href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07abcd4953e2ca2d46a2d3789e8edac4d6b">L4VIRTIO_CMD_MASK</a></div><div class="ttdeci">@ L4VIRTIO_CMD_MASK</div><div class="ttdoc">Mask to get command bits.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00126">virtio.h:126</a></div></div>
<div class="ttc" id="agroup__l4virtio__transport_html_gga4783b17d00ec949f63c11c7bda0eed07af09ad9e572febac6e79eb2faa157bc2a"><div class="ttname"><a href="group__l4virtio__transport.html#gga4783b17d00ec949f63c11c7bda0eed07af09ad9e572febac6e79eb2faa157bc2a">L4VIRTIO_CMD_CFG_CHANGED</a></div><div class="ttdeci">@ L4VIRTIO_CMD_CFG_CHANGED</div><div class="ttdoc">Device config changed.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00124">virtio.h:124</a></div></div>
<div class="ttc" id="aicu_8h_html_aa7b6f98d2cd8ec2ac3bff18335cdfeba"><div class="ttname"><a href="icu_8h.html#aa7b6f98d2cd8ec2ac3bff18335cdfeba">l4_icu_msi_info_t</a></div><div class="ttdeci">struct l4_icu_msi_info_t l4_icu_msi_info_t</div><div class="ttdoc">Info to use for a specific MSI.</div></div>
<div class="ttc" id="al4_2sys_2types_8h_html"><div class="ttname"><a href="l4_2sys_2types_8h.html">types.h</a></div><div class="ttdoc">Common L4 ABI Data Types.</div></div>
<div class="ttc" id="anamespaceL4Re_1_1Util_html_a08b3c68edc484947355ca2b60a97e30d"><div class="ttname"><a href="namespaceL4Re_1_1Util.html#a08b3c68edc484947355ca2b60a97e30d">L4Re::Util::make_shared_cap</a></div><div class="ttdeci">Shared_cap&lt; T &gt; make_shared_cap()</div><div class="ttdoc">Allocate a capability slot and wrap it in a Shared_cap.</div><div class="ttdef"><b>Definition</b> <a href="util_2shared__cap_source.html#l00060">shared_cap:60</a></div></div>
<div class="ttc" id="anamespaceL4Re_1_1Util_html_a0efccd325a19246334922e58dd973914"><div class="ttname"><a href="namespaceL4Re_1_1Util.html#a0efccd325a19246334922e58dd973914">L4Re::Util::Unique_cap</a></div><div class="ttdeci">L4::Detail::Unique_cap_impl&lt; T, Smart_cap_auto&lt; L4_FP_ALL_SPACES &gt; &gt; Unique_cap</div><div class="ttdoc">Unique capability that implements automatic free and unmap of the capability selector.</div><div class="ttdef"><b>Definition</b> <a href="util_2unique__cap_source.html#l00043">unique_cap:43</a></div></div>
<div class="ttc" id="anamespaceL4Re_1_1Util_html_a2eafa529c9c1144d7840f4e101ecf7aa"><div class="ttname"><a href="namespaceL4Re_1_1Util.html#a2eafa529c9c1144d7840f4e101ecf7aa">L4Re::Util::Shared_cap</a></div><div class="ttdeci">L4::Detail::Shared_cap_impl&lt; T, Smart_count_cap&lt; L4_FP_ALL_SPACES &gt; &gt; Shared_cap</div><div class="ttdoc">Shared capability that implements automatic free and unmap of the capability selector.</div><div class="ttdef"><b>Definition</b> <a href="util_2shared__cap_source.html#l00048">shared_cap:48</a></div></div>
<div class="ttc" id="anamespaceL4Re_html_a3f17984019f06676a7e3eecb41bbb0bb"><div class="ttname"><a href="namespaceL4Re.html#a3f17984019f06676a7e3eecb41bbb0bb">L4Re::chksys</a></div><div class="ttdeci">long chksys(long err, char const *extra=&quot;&quot;, long ret=0)</div><div class="ttdoc">Generate C++ exception on error.</div><div class="ttdef"><b>Definition</b> <a href="error__helper_source.html#l00072">error_helper:72</a></div></div>
<div class="ttc" id="anamespaceL4Re_html_a64b057254a760643ba67a9ed452fede8"><div class="ttname"><a href="namespaceL4Re.html#a64b057254a760643ba67a9ed452fede8">L4Re::chkcap</a></div><div class="ttdeci">T chkcap(T &amp;&amp;cap, char const *extra=&quot;&quot;, long err=-L4_ENOMEM)</div><div class="ttdoc">Check for valid capability or raise C++ exception.</div><div class="ttdef"><b>Definition</b> <a href="error__helper_source.html#l00149">error_helper:149</a></div></div>
<div class="ttc" id="anamespaceL4_1_1Ipc_html_a2bad64d85342191b358597cd08e55574"><div class="ttname"><a href="namespaceL4_1_1Ipc.html#a2bad64d85342191b358597cd08e55574">L4::Ipc::make_cap</a></div><div class="ttdeci">Cap&lt; T &gt; make_cap(L4::Cap&lt; T &gt; cap, unsigned rights) noexcept</div><div class="ttdoc">Make an L4::Ipc::Cap&lt;T&gt; for the given capability and rights.</div><div class="ttdef"><b>Definition</b> <a href="ipc__types_source.html#l00785">ipc_types:785</a></div></div>
<div class="ttc" id="anamespaceL4_1_1Ipc_html_aa6b9422f850eb175240c9d18c5cc708c"><div class="ttname"><a href="namespaceL4_1_1Ipc.html#aa6b9422f850eb175240c9d18c5cc708c">L4::Ipc::make_cap_rw</a></div><div class="ttdeci">Cap&lt; T &gt; make_cap_rw(L4::Cap&lt; T &gt; cap) noexcept</div><div class="ttdoc">Make an L4::Ipc::Cap&lt;T&gt; for the given capability with L4_CAP_FPAGE_RW rights.</div><div class="ttdef"><b>Definition</b> <a href="ipc__types_source.html#l00795">ipc_types:795</a></div></div>
<div class="ttc" id="anamespaceL4virtio_html"><div class="ttname"><a href="namespaceL4virtio.html">L4virtio</a></div><div class="ttdoc">L4-VIRTIO Transport C++ API.</div><div class="ttdef"><b>Definition</b> <a href="client_2l4virtio_source.html#l00026">l4virtio:26</a></div></div>
<div class="ttc" id="arm_html"><div class="ttname"><a href="rm.html">rm</a></div><div class="ttdoc">Region mapper interface.</div></div>
<div class="ttc" id="astructL4Re_1_1Dataspace_1_1F_html_a62af1272cb958fe0f6cb5e2ab07c2df2ab5141e1c94df9319247eb5ecc54e8b27"><div class="ttname"><a href="structL4Re_1_1Dataspace_1_1F.html#a62af1272cb958fe0f6cb5e2ab07c2df2ab5141e1c94df9319247eb5ecc54e8b27">L4Re::Dataspace::F::W</a></div><div class="ttdeci">@ W</div><div class="ttdoc">Request write-only mapping.</div><div class="ttdef"><b>Definition</b> <a href="dataspace_source.html#l00079">dataspace:79</a></div></div>
<div class="ttc" id="astructL4Re_1_1Dataspace_1_1Stats_html"><div class="ttname"><a href="structL4Re_1_1Dataspace_1_1Stats.html">L4Re::Dataspace::Stats</a></div><div class="ttdoc">Information about the dataspace.</div><div class="ttdef"><b>Definition</b> <a href="dataspace_source.html#l00126">dataspace:127</a></div></div>
<div class="ttc" id="astructL4Re_1_1Dataspace_1_1Stats_html_aa1d9562f0be26272f1e8a41c29d5e69f"><div class="ttname"><a href="structL4Re_1_1Dataspace_1_1Stats.html#aa1d9562f0be26272f1e8a41c29d5e69f">L4Re::Dataspace::Stats::size</a></div><div class="ttdeci">Size size</div><div class="ttdoc">size</div><div class="ttdef"><b>Definition</b> <a href="dataspace_source.html#l00128">dataspace:128</a></div></div>
<div class="ttc" id="astructL4Re_1_1Dataspace_1_1Stats_html_aeb2961c7febeff7a7c674c91ad34961c"><div class="ttname"><a href="structL4Re_1_1Dataspace_1_1Stats.html#aeb2961c7febeff7a7c674c91ad34961c">L4Re::Dataspace::Stats::flags</a></div><div class="ttdeci">Flags flags</div><div class="ttdoc">flags</div><div class="ttdef"><b>Definition</b> <a href="dataspace_source.html#l00129">dataspace:129</a></div></div>
<div class="ttc" id="astructL4Re_1_1Rm_1_1F_html_a9707a14d822d3f60aa6a97cb16b2a989a579e389b46e438a64f3f44d9cf19f26a"><div class="ttname"><a href="structL4Re_1_1Rm_1_1F.html#a9707a14d822d3f60aa6a97cb16b2a989a579e389b46e438a64f3f44d9cf19f26a">L4Re::Rm::F::RW</a></div><div class="ttdeci">@ RW</div><div class="ttdoc">Readable and writable region.</div><div class="ttdef"><b>Definition</b> <a href="rm_source.html#l00139">rm:139</a></div></div>
<div class="ttc" id="astructL4Re_1_1Rm_1_1F_html_a9707a14d822d3f60aa6a97cb16b2a989a6c0c069e0eca980069382cf52276815b"><div class="ttname"><a href="structL4Re_1_1Rm_1_1F.html#a9707a14d822d3f60aa6a97cb16b2a989a6c0c069e0eca980069382cf52276815b">L4Re::Rm::F::R</a></div><div class="ttdeci">@ R</div><div class="ttdoc">Readable region.</div><div class="ttdef"><b>Definition</b> <a href="rm_source.html#l00133">rm:133</a></div></div>
<div class="ttc" id="astructL4Re_1_1Rm_1_1F_html_a9707a14d822d3f60aa6a97cb16b2a989a7a5548a6185bfa97c1b41ef92ab40bc5"><div class="ttname"><a href="structL4Re_1_1Rm_1_1F.html#a9707a14d822d3f60aa6a97cb16b2a989a7a5548a6185bfa97c1b41ef92ab40bc5">L4Re::Rm::F::W</a></div><div class="ttdeci">@ W</div><div class="ttdoc">Writable region.</div><div class="ttdef"><b>Definition</b> <a href="rm_source.html#l00135">rm:135</a></div></div>
<div class="ttc" id="astructL4Re_1_1Rm_1_1F_html_adec4d26077e34d9586891ac0489e0041a067b0bc28378717b6962241c621caa0a"><div class="ttname"><a href="structL4Re_1_1Rm_1_1F.html#adec4d26077e34d9586891ac0489e0041a067b0bc28378717b6962241c621caa0a">L4Re::Rm::F::Search_addr</a></div><div class="ttdeci">@ Search_addr</div><div class="ttdoc">Search for a suitable address range.</div><div class="ttdef"><b>Definition</b> <a href="rm_source.html#l00114">rm:114</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Bad__descriptor_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Bad__descriptor.html">L4virtio::Svr::Bad_descriptor</a></div><div class="ttdoc">Exception used by Queue to indicate descriptor errors.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00397">virtio:398</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Bad__descriptor_html_a6d0361d240b52210a4a6bcb5570a6a25a0eec6f7ec63c549bd35c05e205d33ecd"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Bad__descriptor.html#a6d0361d240b52210a4a6bcb5570a6a25a0eec6f7ec63c549bd35c05e205d33ecd">L4virtio::Svr::Bad_descriptor::Bad_address</a></div><div class="ttdeci">@ Bad_address</div><div class="ttdoc">Address cannot be translated.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00402">virtio:402</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Dev__features_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Dev__features.html">L4virtio::Svr::Dev_features</a></div><div class="ttdoc">Type for device feature bitmap.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00066">virtio:67</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Dev__status_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Dev__status.html">L4virtio::Svr::Dev_status</a></div><div class="ttdoc">Type of the device status register.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00032">virtio:33</a></div></div>
<div class="ttc" id="astructl4virtio__config__hdr__t_html"><div class="ttname"><a href="structl4virtio__config__hdr__t.html">l4virtio_config_hdr_t</a></div><div class="ttdoc">L4-VIRTIO config header, provided in shared data space.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00132">virtio.h:133</a></div></div>
<div class="ttc" id="astructl4virtio__config__queue__t_html"><div class="ttname"><a href="structl4virtio__config__queue__t.html">l4virtio_config_queue_t</a></div><div class="ttdoc">Queue configuration entry.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00223">virtio.h:224</a></div></div>
<div class="ttc" id="astructl4virtio__config__queue__t_html_a6bb39fd7b5c6c5141a6e1c394dbfc17d"><div class="ttname"><a href="structl4virtio__config__queue__t.html#a6bb39fd7b5c6c5141a6e1c394dbfc17d">l4virtio_config_queue_t::avail_addr</a></div><div class="ttdeci">l4_uint64_t avail_addr</div><div class="ttdoc">W: address of available ring.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00237">virtio.h:237</a></div></div>
<div class="ttc" id="astructl4virtio__config__queue__t_html_a7c8175ec8a55273afc88e55e320fcbb1"><div class="ttname"><a href="structl4virtio__config__queue__t.html#a7c8175ec8a55273afc88e55e320fcbb1">l4virtio_config_queue_t::desc_addr</a></div><div class="ttdeci">l4_uint64_t desc_addr</div><div class="ttdoc">W: address of descriptor table.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00236">virtio.h:236</a></div></div>
<div class="ttc" id="astructl4virtio__config__queue__t_html_aaaa723731a983ca4bece81a7ef5703e9"><div class="ttname"><a href="structl4virtio__config__queue__t.html#aaaa723731a983ca4bece81a7ef5703e9">l4virtio_config_queue_t::used_addr</a></div><div class="ttdeci">l4_uint64_t used_addr</div><div class="ttdoc">W: address of used ring.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00238">virtio.h:238</a></div></div>
<div class="ttc" id="astructl4virtio__config__queue__t_html_ad533c96172ff34e3737aad54fba0282d"><div class="ttname"><a href="structl4virtio__config__queue__t.html#ad533c96172ff34e3737aad54fba0282d">l4virtio_config_queue_t::ready</a></div><div class="ttdeci">l4_uint16_t ready</div><div class="ttdoc">RW: queue ready flag (read-write).</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00231">virtio.h:231</a></div></div>
<div class="ttc" id="astructl4virtio__config__queue__t_html_adbd8746b07061f27508628fe442a594f"><div class="ttname"><a href="structl4virtio__config__queue__t.html#adbd8746b07061f27508628fe442a594f">l4virtio_config_queue_t::num_max</a></div><div class="ttdeci">l4_uint16_t num_max</div><div class="ttdoc">R: maximum number of descriptors supported by this queue.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00226">virtio.h:226</a></div></div>
<div class="ttc" id="astructl4virtio__config__queue__t_html_af07ce7772cafbaab1d694e1e9d74f9be"><div class="ttname"><a href="structl4virtio__config__queue__t.html#af07ce7772cafbaab1d694e1e9d74f9be">l4virtio_config_queue_t::num</a></div><div class="ttdeci">l4_uint16_t num</div><div class="ttdoc">RW: number of descriptors configured for this queue.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00228">virtio.h:228</a></div></div>
<div class="ttc" id="autil_2cap__alloc_html"><div class="ttname"><a href="util_2cap__alloc.html">cap_alloc</a></div><div class="ttdoc">Capability allocator.</div></div>
<div class="ttc" id="autil_2shared__cap_html"><div class="ttname"><a href="util_2shared__cap.html">shared_cap</a></div><div class="ttdoc">Shared_cap / Shared_del_cap.</div></div>
<div class="ttc" id="autil_2unique__cap_html"><div class="ttname"><a href="util_2unique__cap.html">unique_cap</a></div><div class="ttdoc">Unique_cap / Unique_del_cap.</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
</div><!-- container -->
<!-- HTML footer for doxygen 1.9.1-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>l4</b></li><li class="navelem"><b>l4virtio</b></li><li class="navelem"><b>server</b></li><li class="navelem"><b>l4virtio</b></li>
<li class="footer">Generated on <span class="timestamp"></span> for L4Re Operating System Framework by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.15.0 </li>
</ul>
</div>
</body>
</html>