l4re-base-25.08.0

This commit is contained in:
2025-09-12 15:55:45 +02:00
commit d959eaab98
37938 changed files with 9382688 additions and 0 deletions

View File

@@ -0,0 +1,795 @@
<!-- 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/virtio-console 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('virtio-console_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">virtio-console</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) 2019-2024 Kernkonzept GmbH.</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment"> * Author(s): Sarah Hoffmann &lt;sarah.hoffmann@kernkonzept.com&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"> * Phillip Raffeck &lt;phillip.raffeck@kernkonzept.com&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment"> * Steffen Liebergeld &lt;steffen.liebergeld@kernkonzept.com&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"> * Jan Klötzke &lt;jan.kloetzke@kernkonzept.com&gt;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment"> */</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &lt;l4/l4virtio/server/l4virtio&gt;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</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="l00014" name="l00014"></a><span class="lineno"> 14</span> </div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceL4virtio.html">L4virtio</a> { <span class="keyword">namespace </span>Svr { <span class="keyword">namespace </span>Console {</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span></div>
<div class="foldopen" id="foldopen00018" data-start="{" data-end="};">
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html"> 18</a></span><span class="keyword">struct </span>Features : Dev_config::Features</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span>{</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> Features() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> <span class="keyword">explicit</span> Features(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Dev__features.html#a01bb482bee85fd60f8685ed5a55fde79">raw</a>) : Dev_config::Features(<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Dev__features.html#a01bb482bee85fd60f8685ed5a55fde79">raw</a>) {}</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#adbaf841fda10ff379ddaaf6d12725a69"> 23</a></span> CXX_BITFIELD_MEMBER(0, 0, <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#adbaf841fda10ff379ddaaf6d12725a69">console_size</a>, <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Dev__features.html#a01bb482bee85fd60f8685ed5a55fde79">raw</a>);</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#ab2a934d203c8f5e8ebe93463ed5aa094"> 25</a></span> CXX_BITFIELD_MEMBER(1, 1, <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#ab2a934d203c8f5e8ebe93463ed5aa094">console_multiport</a>, <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Dev__features.html#a01bb482bee85fd60f8685ed5a55fde79">raw</a>);</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#a1a7415b9e55e5cda43a338922f956074"> 27</a></span> CXX_BITFIELD_MEMBER(2, 2, <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#a1a7415b9e55e5cda43a338922f956074">emerg_write</a>, <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Dev__features.html#a01bb482bee85fd60f8685ed5a55fde79">raw</a>);</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span>};</div>
</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span></div>
<div class="foldopen" id="foldopen00031" data-start="{" data-end="};">
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html"> 31</a></span><span class="keyword">struct </span>Control_message</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span>{</div>
<div class="foldopen" id="foldopen00034" data-start="{" data-end="};">
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981"> 34</a></span> <span class="keyword">enum</span> <a class="code hl_enumeration" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981">Events</a></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> {</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a13bd62558c453a4792aa5cabb2a572ff"> 37</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a13bd62558c453a4792aa5cabb2a572ff">Device_ready</a> = 0,</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5"> 39</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5">Device_add</a> = 1,</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ad22dd3cdf6f6f8837be0181ddfb0c60c"> 41</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ad22dd3cdf6f6f8837be0181ddfb0c60c">Device_remove</a> = 2,</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981afc0c91bfcbb2828106cc53750272a38e"> 43</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981afc0c91bfcbb2828106cc53750272a38e">Port_ready</a> = 3,</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a5153819c01fcc63725eefb1f7ca5140c"> 45</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a5153819c01fcc63725eefb1f7ca5140c">Console_port</a> = 4,</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981afc1ca28f88d22a6fed8d08097d3c3a3d"> 47</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981afc1ca28f88d22a6fed8d08097d3c3a3d">Resize</a> = 5,</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52"> 49</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Port_open</a> = 6,</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ab478b87f60331bb9f3391938b36ced6f"> 51</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ab478b87f60331bb9f3391938b36ced6f">Port_name</a> = 7,</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> };</div>
</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"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#acf5a7ec9b146001a70223dfc9475d67b"> 54</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#acf5a7ec9b146001a70223dfc9475d67b">id</a>; </div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#ad91664d695fdec86bcbfb826a07be1d7"> 55</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#ad91664d695fdec86bcbfb826a07be1d7">event</a>; </div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0"> 56</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0">value</a>; </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> Control_message() {}</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html">Control_message</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> i, <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> e, <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> v)</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> : <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#acf5a7ec9b146001a70223dfc9475d67b">id</a>(i), <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#ad91664d695fdec86bcbfb826a07be1d7">event</a>(e), <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0">value</a>(v)</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>};</div>
</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span></div>
<div class="foldopen" id="foldopen00065" data-start="{" data-end="};">
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html"> 65</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html">Control_request</a></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>{</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a26a4c4682fc8bd928d0fcd667def715c"> 68</a></span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html">Control_message</a> *<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a26a4c4682fc8bd928d0fcd667def715c">msg</a>;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a81c73cf58c1125e5322f6502a89073f0"> 70</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a81c73cf58c1125e5322f6502a89073f0">len</a>;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#aef5b20e03e990c002c26604aa911963b"> 72</a></span> Driver_mem_region *<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#aef5b20e03e990c002c26604aa911963b">mem</a>;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span>};</div>
</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span></div>
<div class="foldopen" id="foldopen00109" data-start="{" data-end="};">
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html"> 109</a></span><span class="keyword">struct </span>Port</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span>{</div>
<div class="foldopen" id="foldopen00114" data-start="{" data-end="};">
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4"> 114</a></span> <span class="keyword">enum</span> <a class="code hl_enumeration" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4">Port_status</a></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> {</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081"> 117</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a> = 0,</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61"> 119</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port_added</a>,</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f"> 121</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a>,</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48"> 123</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port_open</a>,</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05"> 125</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">Port_failed</a>,</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a871c8abed5ed54a325a5914baf7e88fc"> 127</a></span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a871c8abed5ed54a325a5914baf7e88fc">Port_num_states</a>,</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> };</div>
</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keyword">enum</span> { Control_queue_size = 0x10 };</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a5163c0cac00845a5ddb1df7b99d69e15"> 133</a></span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Virtqueue.html">Virtqueue</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a5163c0cac00845a5ddb1df7b99d69e15">tx</a>; </div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a0fcc1dfa5ac5a7eb6eca90c409ccec3e"> 134</a></span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Virtqueue.html">Virtqueue</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a0fcc1dfa5ac5a7eb6eca90c409ccec3e">rx</a>; </div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de"> 135</a></span> <a class="code hl_enumeration" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4">Port_status</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a>; </div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ad4fadf5e23978c8699f5b96ec5662d2b"> 136</a></span> <a class="code hl_enumeration" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4">Port_status</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ad4fadf5e23978c8699f5b96ec5662d2b">reported_status</a>; </div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a2a94becc1d3bf66435deca9aa95bc7f1"> 137</a></span> <span class="keywordtype">unsigned</span> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a2a94becc1d3bf66435deca9aa95bc7f1">vq_max</a>; </div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> </div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> Port() : <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a>(<a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a>), <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a2a94becc1d3bf66435deca9aa95bc7f1">vq_max</a>(Control_queue_size) {}</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a>(<a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> <span class="keyword">const</span> &amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> &amp;operator = (<a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> <span class="keyword">const</span> &amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> </div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keyword">virtual</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">~Port</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</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="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a564883ca057696fe31faff4fe2d3dec2"> 146</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a564883ca057696fe31faff4fe2d3dec2">is_open</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> == <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port_open</a>; }</div>
</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span></div>
<div class="foldopen" id="foldopen00150" data-start="{" data-end="}">
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a3d4183cf67569e325ba243f7bd272d7d"> 150</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a3d4183cf67569e325ba243f7bd272d7d">reset</a>()</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> {</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> = <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a>;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ad4fadf5e23978c8699f5b96ec5662d2b">reported_status</a> = <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a>;</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> }</div>
</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span></div>
<div class="foldopen" id="foldopen00157" data-start="{" data-end="}">
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ab2dc3b90ca7f997234ac1db8f2a4d760"> 157</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ab2dc3b90ca7f997234ac1db8f2a4d760">queues_ready</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a5163c0cac00845a5ddb1df7b99d69e15">tx</a>.ready() &amp;&amp; <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a0fcc1dfa5ac5a7eb6eca90c409ccec3e">rx</a>.ready(); }</div>
</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span></div>
<div class="foldopen" id="foldopen00161" data-start="{" data-end="}">
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a6a7c23d4b6bd657a466d159c30666400"> 161</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a6a7c23d4b6bd657a466d159c30666400">rx_ready</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a564883ca057696fe31faff4fe2d3dec2">is_open</a>() &amp;&amp; <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a0fcc1dfa5ac5a7eb6eca90c409ccec3e">rx</a>.ready(); }</div>
</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span></div>
<div class="foldopen" id="foldopen00165" data-start="{" data-end="}">
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a6ac3b50167b7ea843741727f017e97c1"> 165</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a6ac3b50167b7ea843741727f017e97c1">tx_ready</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> <a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a564883ca057696fe31faff4fe2d3dec2">is_open</a>() &amp;&amp; <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a5163c0cac00845a5ddb1df7b99d69e15">tx</a>.ready(); }</div>
</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span></div>
<div class="foldopen" id="foldopen00169" data-start="{" data-end="};">
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html"> 169</a></span> <span class="keyword">struct </span><a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html">Transition</a> {</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#af49a0a58c1611cb5ef5708b96cbf0acf"> 170</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#ga60b19416a2c6ca22085f94b5954c1f05">l4_int16_t</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#af49a0a58c1611cb5ef5708b96cbf0acf">event</a>; </div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#a64327020c9e1ad4c79aea31062e581c0"> 171</a></span> <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#a64327020c9e1ad4c79aea31062e581c0">value</a>; </div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#a686458019b0612c7f04a42edf33f73ee"> 172</a></span> <a class="code hl_enumeration" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4">Port_status</a> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#a686458019b0612c7f04a42edf33f73ee">next</a>; </div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> };</div>
</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keyword">static</span> <span class="keyword">constexpr</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html">Transition</a></div>
<div class="foldopen" id="foldopen00195" data-start="{" data-end="};">
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"><a class="line" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a21e01f7f9a6b764f30ac15fc3aec8efa"> 195</a></span> <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a21e01f7f9a6b764f30ac15fc3aec8efa">state_transitions</a>[<a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a871c8abed5ed54a325a5914baf7e88fc">Port_num_states</a>][<a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a871c8abed5ed54a325a5914baf7e88fc">Port_num_states</a>] =</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> {</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="comment">/* reported current */</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> </div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="comment">/* Port_disabled */</span> <span class="comment">/* Port_disabled */</span> {{ -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a> },</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="comment">/* Port_added */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5">Control_message::Device_add</a>, 0,</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port_added</a> },</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="comment">/* Port_ready */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5">Control_message::Device_add</a>, 0,</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> },</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="comment">/* Port_open */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5">Control_message::Device_add</a>, 0,</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> },</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="comment">/* Port_failed */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5">Control_message::Device_add</a>, 0,</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">Port_failed</a> }},</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> </div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="comment">/* Port_added */</span> <span class="comment">/* Port_disabled */</span> {{ <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ad22dd3cdf6f6f8837be0181ddfb0c60c">Control_message::Device_remove</a>,</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a> },</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="comment">/* Port_added */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port_added</a> },</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="comment">/* Port_ready */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> },</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="comment">/* Port_open */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>, 1,</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port_open</a> },</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="comment">/* Port_failed */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">Port_failed</a> }},</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> </div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="comment">/* Port_ready */</span> <span class="comment">/* Port_disabled */</span> {{ <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ad22dd3cdf6f6f8837be0181ddfb0c60c">Control_message::Device_remove</a>,</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a> },</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="comment">/* Port_added */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port_added</a> },</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="comment">/* Port_ready */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> },</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="comment">/* Port_open */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>, 1,</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port_open</a> },</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="comment">/* Port_failed */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">Port_failed</a> }},</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> </div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="comment">/* Port_open */</span> <span class="comment">/* Port_disabled */</span> {{ <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>, 0,</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> },</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <span class="comment">/* Port_added */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>, 0,</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port_added</a> },</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="comment">/* Port_ready */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>, 0,</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> },</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="comment">/* Port_open */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port_open</a> },</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="comment">/* Port_failed */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>, 0,</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> }},</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> </div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="comment">/* Port_failed */</span> <span class="comment">/* Port_disabled */</span> {{ <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ad22dd3cdf6f6f8837be0181ddfb0c60c">Control_message::Device_remove</a>,</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port_disabled</a> },</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="comment">/* Port_added */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port_added</a> },</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="comment">/* Port_ready */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port_ready</a> },</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="comment">/* Port_open */</span> { <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>, 1,</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port_open</a> },</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="comment">/* Port_failed */</span> { -1, 0, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">Port_failed</a> }},</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> };</div>
</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span>};</div>
</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span></div>
<div class="foldopen" id="foldopen00267" data-start="{" data-end="};">
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html"> 267</a></span><span class="keyword">class </span><a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a91e490d2fb56abc72771fbef8edf1d70">Virtio_con</a> : <span class="keyword">public</span> L4virtio::Svr::Device</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span>{</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="keyword">enum</span> Virtqueue_names</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> {</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> Ctrl_rx = 2, </div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> Ctrl_tx = 3, </div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> };</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> </div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="keyword">struct </span>Serial_config_space</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> {</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> cols;</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> rows;</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> max_nr_ports;</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> emerg_wr;</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> } __attribute__((packed));</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> </div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span><span class="keyword">public</span>:</div>
<div class="foldopen" id="foldopen00293" data-start="{" data-end="}">
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a91e490d2fb56abc72771fbef8edf1d70"> 293</a></span> <span class="keyword">explicit</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a91e490d2fb56abc72771fbef8edf1d70">Virtio_con</a>(<span class="keywordtype">unsigned</span> max_ports, <span class="keywordtype">bool</span> enable_multiport)</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> : <a class="code hl_namespace" href="namespaceL4virtio.html">L4virtio</a>::Svr::<a class="code hl_class" href="classL4virtio_1_1Svr_1_1Console_1_1Device.html">Device</a>(&amp;_dev_config),</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> _num_ports(enable_multiport ? max_ports : 1),</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> _dev_config(L4VIRTIO_VENDOR_KK, <a class="code hl_enumvalue" href="group__l4virtio__transport.html#ggaa3812d621d81dd6a7101d739153b6c3ba3209479ecc025e24194aa8bae2b75d6c">L4VIRTIO_ID_CONSOLE</a>,</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> enable_multiport ? max_ports * 2 + 2 : 2)</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> {</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <span class="keywordflow">if</span> (_num_ports &lt; 1)</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</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>, <span class="stringliteral">&quot;At least one port is required.&quot;</span>);</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> </div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html">Features</a> hf(0);</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> </div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> hf.<a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#ab2a934d203c8f5e8ebe93463ed5aa094">console_multiport</a>() = enable_multiport;</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> </div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> _dev_config.host_features(0) = hf.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Dev__features.html#a01bb482bee85fd60f8685ed5a55fde79">raw</a>;</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> (enable_multiport)</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> _dev_config.priv_config()-&gt;max_nr_ports = _num_ports;</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> _dev_config.reset_hdr();</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> }</div>
</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> </div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keywordtype">void</span> reset_queue_configs()</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> {</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> q = 0; q &lt; _dev_config.<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Dev__config.html#a9c4009f53b93a29f3e19d676085d99dd">num_queues</a>(); ++q)</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#aedbe988112e98750e5409a8c92358dcf">reset_queue_config</a>(q, max_queue_size(q));</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> }</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> </div>
<div class="foldopen" id="foldopen00319" data-start="{" data-end="}">
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a907c7c33a513325d49c3214f94b2f600"> 319</a></span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a907c7c33a513325d49c3214f94b2f600">reconfig_queue</a>(<span class="keywordtype">unsigned</span> index)<span class="keyword"> override</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="keywordflow">if</span> (index &gt;= _dev_config.num_queues())</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</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="l00323" name="l00323"></a><span class="lineno"> 323</span> </div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Device__t.html#ab906b4cc61026fd815a8056f07bef10e">setup_queue</a>(get_queue(index), index, max_queue_size(index)))</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</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="l00328" name="l00328"></a><span class="lineno"> 328</span> }</div>
</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span></div>
<div class="foldopen" id="foldopen00334" data-start="{" data-end="}">
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a44a02eb2274372cb6df5cfe7cf966537"> 334</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a44a02eb2274372cb6df5cfe7cf966537">multiport_enabled</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> <span class="keywordflow">return</span> _negotiated_features.console_multiport()</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> &amp;&amp; _dev_config.num_queues() &gt; Ctrl_rx;</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> }</div>
</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> </div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <span class="keywordtype">bool</span> ctrl_queue_ready()<span class="keyword"> const</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _ctrl_port.<a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a564883ca057696fe31faff4fe2d3dec2">is_open</a>(); }</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> </div>
<div class="foldopen" id="foldopen00343" data-start="{" data-end="}">
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a68d5e6ef1b7a3d192396805724ee4bdc"> 343</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a68d5e6ef1b7a3d192396805724ee4bdc">check_features</a>(<span class="keywordtype">void</span>)<span class="keyword"> override</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> _negotiated_features = <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html">Features</a>(_dev_config.negotiated_features(0));</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> }</div>
</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> </div>
<div class="foldopen" id="foldopen00349" data-start="{" data-end="}">
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a05dafd1c2afd4c83381de815d42fda9b"> 349</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a05dafd1c2afd4c83381de815d42fda9b">check_queues</a>()<span class="keyword"> override</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="comment">// NOTE</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="comment">// The VIRTIO specification states:</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="comment">// &quot;The port 0 receive and transmit queues always exist&quot;</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="comment">// The linux driver however does not setup port 0 if the multiport feature</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="comment">// is negotiated.</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <span class="comment">// We just go along with the linux driver and do not expect port 0 to be up,</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="comment">// if the multiport feature is negotiated.</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> </div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a44a02eb2274372cb6df5cfe7cf966537">multiport_enabled</a>())</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> <span class="comment">// If MULTIPORT was negotiated, ctrl queues should be set up.</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="keywordflow">return</span> _ctrl_port.queues_ready();</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> </div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <span class="comment">// If MULTIPORT was not negotiated, port 0 should be set up.</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(0)-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> = <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port::Port_open</a>;</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(0)-&gt;<a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ab2dc3b90ca7f997234ac1db8f2a4d760">queues_ready</a>();</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> }</div>
</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span></div>
<div class="foldopen" id="foldopen00379" data-start="{" data-end="}">
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a88e370a9d1c9e029a8de04f68e380457"> 379</a></span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a88e370a9d1c9e029a8de04f68e380457">port_add</a>(<span class="keywordtype">unsigned</span> idx)</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> {</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> *p = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(idx);</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> </div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> <span class="keywordflow">if</span> (p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> != <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port::Port_disabled</a>)</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9ae679aa95cfccf769e6d8e7ddb746fdc8">L4_EPERM</a>;</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> p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> = <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port::Port_added</a>;</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> port_report_status(idx);</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="keywordflow">return</span> <a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e">L4_EOK</a>;</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> }</div>
</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span></div>
<div class="foldopen" id="foldopen00403" data-start="{" data-end="}">
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a8335db1f605263cb6ccf2109b8993944"> 403</a></span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a8335db1f605263cb6ccf2109b8993944">port_remove</a>(<span class="keywordtype">unsigned</span> idx)</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> {</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> *p = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(idx);</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> </div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> <span class="keywordflow">if</span> (p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> == <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port::Port_disabled</a>)</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9ae679aa95cfccf769e6d8e7ddb746fdc8">L4_EPERM</a>;</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> </div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> = <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port::Port_disabled</a>;</div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> port_report_status(idx);</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> </div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</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="l00414" name="l00414"></a><span class="lineno"> 414</span> }</div>
</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span></div>
<div class="foldopen" id="foldopen00428" data-start="{" data-end="}">
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a71decef04824571dd001527b9cff8ccb"> 428</a></span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a71decef04824571dd001527b9cff8ccb">port_open</a>(<span class="keywordtype">unsigned</span> idx, <span class="keywordtype">bool</span> open)</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> {</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> *p = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(idx);</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> </div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordflow">if</span> ((open &amp;&amp; p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> != <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port::Port_ready</a>)</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> || (!open &amp;&amp; p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> != <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port::Port_open</a>))</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9ae679aa95cfccf769e6d8e7ddb746fdc8">L4_EPERM</a>;</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> </div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> = open ? <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port::Port_open</a> : <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port::Port_ready</a>;</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> port_report_status(idx);</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> <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="l00440" name="l00440"></a><span class="lineno"> 440</span> }</div>
</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span></div>
<div class="foldopen" id="foldopen00455" data-start="{" data-end="}">
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a72a318f5bf7cf781cde60a2f6a5d16f4"> 455</a></span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a72a318f5bf7cf781cde60a2f6a5d16f4">port_name</a>(<span class="keywordtype">unsigned</span> idx, <span class="keywordtype">char</span> <span class="keyword">const</span> *name)</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> {</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> *p = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(idx);</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> </div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="keywordflow">if</span> (p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> == <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port::Port_disabled</a>)</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9ae679aa95cfccf769e6d8e7ddb746fdc8">L4_EPERM</a>;</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="keywordflow">return</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ade546fa843dcfb4a0412757fee9834d7">send_control_message</a>(idx, <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ab478b87f60331bb9f3391938b36ced6f">Control_message::Port_name</a>, 0, name);</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> }</div>
</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span></div>
<div class="foldopen" id="foldopen00487" data-start="{" data-end="}">
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ade546fa843dcfb4a0412757fee9834d7"> 487</a></span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ade546fa843dcfb4a0412757fee9834d7">send_control_message</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> idx, <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> event,</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> value = 0, <span class="keyword">const</span> <span class="keywordtype">char</span> *name = 0)</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> {</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keywordflow">if</span> (!ctrl_queue_ready())</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a96c4464d149a63301a5314ecd1ff53d9">L4_ENODEV</a>;</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> </div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Virtqueue.html">Virtqueue</a> *q = &amp;_ctrl_port.rx;</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">if</span> (!q-&gt;<a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#aa242e930433e8705c4ee00afaf58f686">ready</a>())</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a96c4464d149a63301a5314ecd1ff53d9">L4_ENODEV</a>;</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> </div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> Virtqueue::Request r = q-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Virtqueue.html#aa7e9493f7fe5bfa9ebaa5d80be8179cf">next_avail</a>();</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <span class="keywordflow">if</span> (!r)</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a6e966af53c8cc82f6bcd1464d957d47f">L4_EBUSY</a>;</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> </div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Request__processor.html">Request_processor</a> rp;</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html">Control_request</a> req;</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> rp.<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Request__processor.html#abcf6a6b8bf80e0d73d45b5eb9e817abd">start</a>(<span class="keyword">this</span>, r, &amp;req);</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> </div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keywordflow">if</span> (req.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a81c73cf58c1125e5322f6502a89073f0">len</a> &lt; <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html">Control_message</a>))</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9af7f5d38973fbf298613b03a088541e27">L4_ENOMEM</a>;</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> </div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html">Control_message</a> msg(idx, event, value);</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> </div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> memcpy(req.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a26a4c4682fc8bd928d0fcd667def715c">msg</a>, &amp;msg, <span class="keyword">sizeof</span>(msg));</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> </div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> <span class="keywordflow">if</span> (event == <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ab478b87f60331bb9f3391938b36ced6f">Control_message::Port_name</a> &amp;&amp; name)</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> <span class="keywordtype">size_t</span> name_len = cxx::min(req.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a81c73cf58c1125e5322f6502a89073f0">len</a> - <span class="keyword">sizeof</span>(msg), strlen(name));</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> memcpy(<span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(req.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a26a4c4682fc8bd928d0fcd667def715c">msg</a>) + <span class="keyword">sizeof</span>(msg), name, name_len);</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> q-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Virtqueue.html#aeba93ed1ee8f9abfe42542187e54cca0">finish</a>(r, <span class="keyword">this</span>, <span class="keyword">sizeof</span>(msg) + name_len);</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> }</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> q-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Virtqueue.html#aeba93ed1ee8f9abfe42542187e54cca0">finish</a>(r, <span class="keyword">this</span>, <span class="keyword">sizeof</span>(msg));</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> </div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</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="l00522" name="l00522"></a><span class="lineno"> 522</span> }</div>
</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span></div>
<div class="foldopen" id="foldopen00536" data-start="{" data-end="}">
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ab3766f6b0a63966a6063ae540bb844a1"> 536</a></span> <span class="keywordtype">int</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ab3766f6b0a63966a6063ae540bb844a1">handle_control_message</a>()</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> {</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> <span class="comment">// Report port state transitions if that failed in the past...</span></div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <span class="keywordflow">if</span> (_report_port_state)</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> _report_port_state = <span class="keyword">false</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> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; _num_ports; ++i)</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keywordflow">if</span> (!port_report_status(i))</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> _report_port_state = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> }</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> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Virtqueue.html">Virtqueue</a> *q = &amp;_ctrl_port.tx;</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> <span class="keywordflow">if</span> (!q-&gt;<a class="code hl_function" href="classL4virtio_1_1Virtqueue.html#aa242e930433e8705c4ee00afaf58f686">ready</a>())</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> <span class="keywordflow">return</span> -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a96c4464d149a63301a5314ecd1ff53d9">L4_ENODEV</a>;</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> </div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> <span class="keywordtype">int</span> ret = <a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9aca91ea3bdb5bd82f63784ee66b489d5e">L4_EOK</a>;</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> Virtqueue::Request r;</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> <span class="keywordflow">while</span> ((r = q-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Virtqueue.html#aa7e9493f7fe5bfa9ebaa5d80be8179cf">next_avail</a>()))</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> {</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Request__processor.html">Request_processor</a> rp;</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html">Control_request</a> req;</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> </div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> rp.<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Request__processor.html#abcf6a6b8bf80e0d73d45b5eb9e817abd">start</a>(<span class="keyword">this</span>, r, &amp;req);</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> </div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html">Control_message</a> msg;</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> <span class="keywordflow">if</span> (req.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a81c73cf58c1125e5322f6502a89073f0">len</a> &lt; <span class="keyword">sizeof</span>(msg))</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> {</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> <span class="comment">// Just ignore malformed input.</span></div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> q-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Virtqueue.html#aeba93ed1ee8f9abfe42542187e54cca0">finish</a>(r, <span class="keyword">this</span>);</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> ret = -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>;</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> }</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> </div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> memcpy(&amp;msg, req.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a26a4c4682fc8bd928d0fcd667def715c">msg</a>, <span class="keyword">sizeof</span>(msg));</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> q-&gt;<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Virtqueue.html#aeba93ed1ee8f9abfe42542187e54cca0">finish</a>(r, <span class="keyword">this</span>);</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> </div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="keywordflow">if</span> (_ctrl_port.status == <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">Port::Port_disabled</a>)</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> {</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> <span class="comment">// When the control queue is disabled, only device ready is accepted.</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> <span class="keywordflow">if</span> (msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#ad91664d695fdec86bcbfb826a07be1d7">event</a> == <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a13bd62558c453a4792aa5cabb2a572ff">Control_message::Device_ready</a>)</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> {</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="keywordflow">if</span> (msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0">value</a>)</div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> _ctrl_port.status = <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port::Port_open</a>;</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> }</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> </div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a881b5ba4878d2d4393bc87112a88aa68">process_device_ready</a>(msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0">value</a>);</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> }</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> </div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> <span class="keywordflow">if</span> (!ctrl_queue_ready())</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> </div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> <span class="comment">// Ignore invalid port ids</span></div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> <span class="keywordflow">if</span> (msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#acf5a7ec9b146001a70223dfc9475d67b">id</a> &gt;= max_ports())</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> </div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> <span class="keywordflow">switch</span> (msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#ad91664d695fdec86bcbfb826a07be1d7">event</a>)</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> {</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981afc0c91bfcbb2828106cc53750272a38e">Control_message::Port_ready</a>:</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a756ca0c5c7dfb856c3a53c7d8e8bcbbf">process_port_ready</a>(msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#acf5a7ec9b146001a70223dfc9475d67b">id</a>, msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0">value</a>);</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">Control_message::Port_open</a>:</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0484023e58f9540275d31a9aac94dd22">process_port_open</a>(msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#acf5a7ec9b146001a70223dfc9475d67b">id</a>, msg.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0">value</a>);</div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> ret = -<a class="code hl_enumvalue" href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a54ddbebc30b661c87177b968a77588b8">L4_EINVAL</a>;</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</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> </div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> }</div>
</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> <span class="keywordtype">void</span> load_desc(<a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">L4virtio::Virtqueue::Desc</a> <span class="keyword">const</span> &amp;desc,</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Request__processor.html">Request_processor</a> <span class="keyword">const</span> *proc,</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> <a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">L4virtio::Virtqueue::Desc</a> <span class="keyword">const</span> **table)</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> {</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> this-&gt;<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#a270520dc38853577d41834c95148eb43">load_desc</a>(desc, proc, table);</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> }</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span></div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> <span class="keywordtype">void</span> load_desc(<a class="code hl_class" href="classL4virtio_1_1Virtqueue_1_1Desc.html">L4virtio::Virtqueue::Desc</a> <span class="keyword">const</span> &amp;desc,</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> <a class="code hl_class" href="classL4virtio_1_1Svr_1_1Request__processor.html">Request_processor</a> <span class="keyword">const</span> *proc,</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> Control_request *data)</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> {</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="keyword">auto</span> *region = this-&gt;<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#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="l00624" name="l00624"></a><span class="lineno"> 624</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="group__l4sys__defines.html#ga3df4200910f2664b97397c23693beeb0">L4_UNLIKELY</a>(!region))</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> <span class="keywordflow">throw</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Bad__descriptor.html">Bad_descriptor</a>(proc, <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="l00626" name="l00626"></a><span class="lineno"> 626</span> </div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> data-&gt;msg = <span class="keyword">reinterpret_cast&lt;</span>Control_message *<span class="keyword">&gt;</span>(region-&gt;local(desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a8aad49eded68125ad5e94d0688d09828">addr</a>));</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> data-&gt;len = desc.<a class="code hl_variable" href="classL4virtio_1_1Virtqueue_1_1Desc.html#a55a515e923e62893696c1e6c09ffb62b">len</a>;</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> data-&gt;mem = region;</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> </div>
<div class="foldopen" id="foldopen00632" data-start="{" data-end="}">
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a6af9e7a53e9707319c9b46425e583594"> 632</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a6af9e7a53e9707319c9b46425e583594">reset</a>()<span class="keyword"> override</span></div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> p = 0; p &lt; _num_ports; ++p)</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(p)-&gt;<a class="code hl_function" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a3d4183cf67569e325ba243f7bd272d7d">reset</a>();</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> </div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> _ctrl_port.reset();</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> reset_queue_configs();</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> _dev_config.reset_hdr();</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> _negotiated_features = <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Features.html">Features</a>(0);</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> _report_port_state = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> </div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0acfd3f46918e6d382201745a4ffb2d1">reset_device</a>();</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> }</div>
</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span></div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0acfd3f46918e6d382201745a4ffb2d1"> 652</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0acfd3f46918e6d382201745a4ffb2d1">reset_device</a>() {}</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a6947ed06c4dc7dc219e41824f21f9a19"> 663</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a6947ed06c4dc7dc219e41824f21f9a19">notify_queue</a>(<a class="code hl_class" href="classL4virtio_1_1Svr_1_1Virtqueue.html">Virtqueue</a> *queue) = 0;</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span></div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd"> 672</a></span> <span class="keyword">virtual</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(<span class="keywordtype">unsigned</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>) = 0;</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <span class="keyword">virtual</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> <span class="keyword">const</span> *<a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(<span class="keywordtype">unsigned</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>) <span class="keyword">const</span> = 0;</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span></div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a881b5ba4878d2d4393bc87112a88aa68"> 685</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a881b5ba4878d2d4393bc87112a88aa68">process_device_ready</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> value) = 0;</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span></div>
<div class="foldopen" id="foldopen00698" data-start="{" data-end="}">
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a756ca0c5c7dfb856c3a53c7d8e8bcbbf"> 698</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a756ca0c5c7dfb856c3a53c7d8e8bcbbf">process_port_ready</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <span class="keywordtype">id</span>, <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> value)</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> {</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> <a class="code hl_struct" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">Port</a> *p = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(<span class="keywordtype">id</span>);</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> </div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> <span class="keywordflow">switch</span> (p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a>)</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> {</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">Port::Port_added</a>:</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port::Port_ready</a>:</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> = value ? <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">Port::Port_ready</a> : <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">Port::Port_failed</a>;</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">Port::Port_open</a>:</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> <span class="keywordflow">if</span> (!value)</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> p-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">status</a> = <a class="code hl_enumvalue" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">Port::Port_failed</a>;</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> <span class="comment">// invalid state for PORT_READY message</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> }</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> }</div>
</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"><a class="line" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0484023e58f9540275d31a9aac94dd22"> 728</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0484023e58f9540275d31a9aac94dd22">process_port_open</a>(<a class="code hl_typedef" href="group__l4__basic__types.html#gac1d09f3e382e711b776931f10e6e1e5a">l4_uint32_t</a> <span class="keywordtype">id</span>, <a class="code hl_typedef" href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a> value) = 0;</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> </div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <span class="keywordtype">unsigned</span> max_ports()<span class="keyword"> const</span></div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> _num_ports; }</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> </div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> <span class="keywordtype">bool</span> is_control_queue(<span class="keywordtype">unsigned</span> q)<span class="keyword"> const</span></div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> q == Ctrl_rx || q == Ctrl_tx; }</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> </div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="keywordtype">unsigned</span> queue_to_port(<span class="keywordtype">unsigned</span> q)<span class="keyword"> const</span></div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span><span class="keyword"> </span>{ <span class="keywordflow">return</span> (q == 0 || q == 1) ? 0 : (q / 2) - 1; }</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <span class="keywordtype">unsigned</span> max_queue_size(<span class="keywordtype">unsigned</span> q)<span class="keyword"> const</span></div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <span class="keywordflow">if</span> (is_control_queue(q))</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> <span class="keywordflow">return</span> _ctrl_port.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a2a94becc1d3bf66435deca9aa95bc7f1">vq_max</a>;</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> </div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(queue_to_port(q))-&gt;<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a2a94becc1d3bf66435deca9aa95bc7f1">vq_max</a>;</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> }</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span></div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> Virtqueue *get_queue(<span class="keywordtype">unsigned</span> q)</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> {</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> Port *p;</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> <span class="keywordflow">if</span> (is_control_queue(q))</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> p = &amp;_ctrl_port;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> p = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(queue_to_port(q));</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> </div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <span class="keywordflow">if</span> (q &amp; 1)</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="keywordflow">return</span> &amp;p-&gt;tx;</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> <span class="keywordflow">return</span> &amp;p-&gt;rx;</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></div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="keywordtype">bool</span> port_report_status(<span class="keywordtype">unsigned</span> idx)</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> Port *p = <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">port</a>(idx);</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> <span class="keywordflow">while</span> (p-&gt;status != p-&gt;reported_status)</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> {</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> <span class="keyword">auto</span> <span class="keyword">const</span> &amp;trans</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> = <a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a21e01f7f9a6b764f30ac15fc3aec8efa">Port::state_transitions</a>[p-&gt;reported_status][p-&gt;status];</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> </div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <span class="keywordflow">if</span> (trans.event &gt;= 0</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> &amp;&amp; <a class="code hl_function" href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ade546fa843dcfb4a0412757fee9834d7">send_control_message</a>(idx, trans.event, trans.value) &lt; 0)</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> {</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> _report_port_state = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> }</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> p-&gt;reported_status = trans.<a class="code hl_variable" href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#a686458019b0612c7f04a42edf33f73ee">next</a>;</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> }</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="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> }</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="keywordtype">unsigned</span> _num_ports;</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> <span class="keywordtype">bool</span> _report_port_state = <span class="keyword">false</span>;</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">protected</span>:</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> Dev_config_t&lt;Serial_config_space&gt; _dev_config;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> Port _ctrl_port;</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> Features _negotiated_features{0};</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span>};</div>
</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> </div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span>}}} <span class="comment">// name space</span></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_1Console_1_1Device_html"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Device.html">L4virtio::Svr::Console::Device</a></div><div class="ttdoc">Base class implementing a virtio console device with L4Re-based notification handling.</div><div class="ttdef"><b>Definition</b> <a href="virtio-console-device_source.html#l00118">virtio-console-device:120</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a0484023e58f9540275d31a9aac94dd22"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0484023e58f9540275d31a9aac94dd22">L4virtio::Svr::Console::Virtio_con::process_port_open</a></div><div class="ttdeci">virtual void process_port_open(l4_uint32_t id, l4_uint16_t value)=0</div><div class="ttdoc">Callback called on PORT_OPEN event.</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a05dafd1c2afd4c83381de815d42fda9b"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a05dafd1c2afd4c83381de815d42fda9b">L4virtio::Svr::Console::Virtio_con::check_queues</a></div><div class="ttdeci">bool check_queues() override</div><div class="ttdoc">callback for checking if the queues at DRIVER_OK transition</div><div class="ttdef"><b>Definition</b> <a href="#l00349">virtio-console:349</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a0acfd3f46918e6d382201745a4ffb2d1"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a0acfd3f46918e6d382201745a4ffb2d1">L4virtio::Svr::Console::Virtio_con::reset_device</a></div><div class="ttdeci">virtual void reset_device()</div><div class="ttdoc">Reset the state of the actual console device.</div><div class="ttdef"><b>Definition</b> <a href="#l00652">virtio-console:652</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a44a02eb2274372cb6df5cfe7cf966537"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a44a02eb2274372cb6df5cfe7cf966537">L4virtio::Svr::Console::Virtio_con::multiport_enabled</a></div><div class="ttdeci">bool multiport_enabled() const</div><div class="ttdoc">Return true if the multiport feature is enabled and control queues are available.</div><div class="ttdef"><b>Definition</b> <a href="#l00334">virtio-console:334</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a68d5e6ef1b7a3d192396805724ee4bdc"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a68d5e6ef1b7a3d192396805724ee4bdc">L4virtio::Svr::Console::Virtio_con::check_features</a></div><div class="ttdeci">bool check_features(void) override</div><div class="ttdoc">callback for checking the subset of accepted features</div><div class="ttdef"><b>Definition</b> <a href="#l00343">virtio-console:343</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a6947ed06c4dc7dc219e41824f21f9a19"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a6947ed06c4dc7dc219e41824f21f9a19">L4virtio::Svr::Console::Virtio_con::notify_queue</a></div><div class="ttdeci">virtual void notify_queue(Virtqueue *queue)=0</div><div class="ttdoc">Notify queue of available data.</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a6af9e7a53e9707319c9b46425e583594"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a6af9e7a53e9707319c9b46425e583594">L4virtio::Svr::Console::Virtio_con::reset</a></div><div class="ttdeci">void reset() override</div><div class="ttdoc">reset callback, called for doing a device reset</div><div class="ttdef"><b>Definition</b> <a href="#l00632">virtio-console:632</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a71decef04824571dd001527b9cff8ccb"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a71decef04824571dd001527b9cff8ccb">L4virtio::Svr::Console::Virtio_con::port_open</a></div><div class="ttdeci">int port_open(unsigned idx, bool open)</div><div class="ttdoc">Send a PORT_OPEN message and update the internal state.</div><div class="ttdef"><b>Definition</b> <a href="#l00428">virtio-console:428</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a72a318f5bf7cf781cde60a2f6a5d16f4"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a72a318f5bf7cf781cde60a2f6a5d16f4">L4virtio::Svr::Console::Virtio_con::port_name</a></div><div class="ttdeci">int port_name(unsigned idx, char const *name)</div><div class="ttdoc">Send a PORT_NAME message to announce the port name.</div><div class="ttdef"><b>Definition</b> <a href="#l00455">virtio-console:455</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a756ca0c5c7dfb856c3a53c7d8e8bcbbf"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a756ca0c5c7dfb856c3a53c7d8e8bcbbf">L4virtio::Svr::Console::Virtio_con::process_port_ready</a></div><div class="ttdeci">virtual void process_port_ready(l4_uint32_t id, l4_uint16_t value)</div><div class="ttdoc">Callback called on PORT_READY event.</div><div class="ttdef"><b>Definition</b> <a href="#l00698">virtio-console:698</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a8335db1f605263cb6ccf2109b8993944"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a8335db1f605263cb6ccf2109b8993944">L4virtio::Svr::Console::Virtio_con::port_remove</a></div><div class="ttdeci">int port_remove(unsigned idx)</div><div class="ttdoc">Send a DEVICE_REMOVE message and update the internal state.</div><div class="ttdef"><b>Definition</b> <a href="#l00403">virtio-console:403</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a881b5ba4878d2d4393bc87112a88aa68"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a881b5ba4878d2d4393bc87112a88aa68">L4virtio::Svr::Console::Virtio_con::process_device_ready</a></div><div class="ttdeci">virtual void process_device_ready(l4_uint16_t value)=0</div><div class="ttdoc">Callback called on DEVICE_READY event.</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a88e370a9d1c9e029a8de04f68e380457"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a88e370a9d1c9e029a8de04f68e380457">L4virtio::Svr::Console::Virtio_con::port_add</a></div><div class="ttdeci">int port_add(unsigned idx)</div><div class="ttdoc">Send a DEVICE_ADD message and update the internal state.</div><div class="ttdef"><b>Definition</b> <a href="#l00379">virtio-console:379</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a907c7c33a513325d49c3214f94b2f600"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a907c7c33a513325d49c3214f94b2f600">L4virtio::Svr::Console::Virtio_con::reconfig_queue</a></div><div class="ttdeci">int reconfig_queue(unsigned index) override</div><div class="ttdoc">callback for client queue-config request</div><div class="ttdef"><b>Definition</b> <a href="#l00319">virtio-console:319</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_a91e490d2fb56abc72771fbef8edf1d70"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#a91e490d2fb56abc72771fbef8edf1d70">L4virtio::Svr::Console::Virtio_con::Virtio_con</a></div><div class="ttdeci">Virtio_con(unsigned max_ports, bool enable_multiport)</div><div class="ttdoc">Create a new multiport console device.</div><div class="ttdef"><b>Definition</b> <a href="#l00293">virtio-console:293</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_aabb98e78ce5301c2a15e116871046cfd"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#aabb98e78ce5301c2a15e116871046cfd">L4virtio::Svr::Console::Virtio_con::port</a></div><div class="ttdeci">virtual Port * port(unsigned port)=0</div><div class="ttdoc">Return the specified port.</div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_ab3766f6b0a63966a6063ae540bb844a1"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ab3766f6b0a63966a6063ae540bb844a1">L4virtio::Svr::Console::Virtio_con::handle_control_message</a></div><div class="ttdeci">int handle_control_message()</div><div class="ttdoc">Handle control message received from the driver.</div><div class="ttdef"><b>Definition</b> <a href="#l00536">virtio-console:536</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Console_1_1Virtio__con_html_ade546fa843dcfb4a0412757fee9834d7"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Console_1_1Virtio__con.html#ade546fa843dcfb4a0412757fee9834d7">L4virtio::Svr::Console::Virtio_con::send_control_message</a></div><div class="ttdeci">int send_control_message(l4_uint32_t idx, l4_uint16_t event, l4_uint16_t value=0, const char *name=0)</div><div class="ttdoc">Send control message to driver.</div><div class="ttdef"><b>Definition</b> <a href="#l00487">virtio-console:487</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="server_2l4virtio_source.html#l00184">l4virtio:184</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="server_2l4virtio_source.html#l00807">l4virtio:807</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&lt; No_custom_data &gt;::setup_queue</a></div><div class="ttdeci">bool setup_queue(Virtqueue *q, unsigned qn, unsigned num_max)</div><div class="ttdef"><b>Definition</b> <a href="server_2l4virtio_source.html#l01047">l4virtio:1047</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&lt; No_custom_data &gt;::reset_queue_config</a></div><div class="ttdeci">void reset_queue_config(unsigned idx, unsigned num_max, bool inc_generation=false)</div><div class="ttdef"><b>Definition</b> <a href="server_2l4virtio_source.html#l01002">l4virtio:1002</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="server_2l4virtio_source.html#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="server_2l4virtio_source.html#l00717">l4virtio:717</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_1Request__processor_html_abcf6a6b8bf80e0d73d45b5eb9e817abd"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Request__processor.html#abcf6a6b8bf80e0d73d45b5eb9e817abd">L4virtio::Svr::Request_processor::start</a></div><div class="ttdeci">void start(DESC_MAN *dm, Virtqueue *ring, Virtqueue::Head_desc const &amp;request, ARGS... args)</div><div class="ttdoc">Start processing a new request.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00501">virtio:501</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_1Svr_1_1Virtqueue_html_aa7e9493f7fe5bfa9ebaa5d80be8179cf"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Virtqueue.html#aa7e9493f7fe5bfa9ebaa5d80be8179cf">L4virtio::Svr::Virtqueue::next_avail</a></div><div class="ttdeci">Request next_avail()</div><div class="ttdoc">Get the next available descriptor from the available ring.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00136">virtio:136</a></div></div>
<div class="ttc" id="aclassL4virtio_1_1Svr_1_1Virtqueue_html_aeba93ed1ee8f9abfe42542187e54cca0"><div class="ttname"><a href="classL4virtio_1_1Svr_1_1Virtqueue.html#aeba93ed1ee8f9abfe42542187e54cca0">L4virtio::Svr::Virtqueue::finish</a></div><div class="ttdeci">void finish(Head_desc &amp;d, QUEUE_OBSERVER *o, l4_uint32_t len=0)</div><div class="ttdoc">Add a descriptor to the used ring, and notify an observer.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00240">virtio:240</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_aa242e930433e8705c4ee00afaf58f686"><div class="ttname"><a href="classL4virtio_1_1Virtqueue.html#aa242e930433e8705c4ee00afaf58f686">L4virtio::Virtqueue::ready</a></div><div class="ttdeci">bool ready() const</div><div class="ttdoc">Test if this queue is in working state.</div><div class="ttdef"><b>Definition</b> <a href="virtqueue_source.html#l00400">virtqueue:400</a></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_ga60b19416a2c6ca22085f94b5954c1f05"><div class="ttname"><a href="group__l4__basic__types.html#ga60b19416a2c6ca22085f94b5954c1f05">l4_int16_t</a></div><div class="ttdeci">signed short int l4_int16_t</div><div class="ttdoc">Signed 16bit value.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2l4int_8h_source.html#l00026">l4int.h:26</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_gae8d67914f723bf843df6f311ad2619a2"><div class="ttname"><a href="group__l4__basic__types.html#gae8d67914f723bf843df6f311ad2619a2">l4_uint16_t</a></div><div class="ttdeci">unsigned short int l4_uint16_t</div><div class="ttdoc">Unsigned 16bit value.</div><div class="ttdef"><b>Definition</b> <a href="l4_2sys_2l4int_8h_source.html#l00027">l4int.h:27</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_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_ggab4c8abc71ffa221a25c1ca5840a354f9a6e966af53c8cc82f6bcd1464d957d47f"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a6e966af53c8cc82f6bcd1464d957d47f">L4_EBUSY</a></div><div class="ttdeci">@ L4_EBUSY</div><div class="ttdoc">Object currently busy, try later.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00042">err.h:42</a></div></div>
<div class="ttc" id="agroup__l4__error__api_html_ggab4c8abc71ffa221a25c1ca5840a354f9a96c4464d149a63301a5314ecd1ff53d9"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9a96c4464d149a63301a5314ecd1ff53d9">L4_ENODEV</a></div><div class="ttdeci">@ L4_ENODEV</div><div class="ttdoc">No such thing.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00044">err.h:44</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_ggab4c8abc71ffa221a25c1ca5840a354f9ae679aa95cfccf769e6d8e7ddb746fdc8"><div class="ttname"><a href="group__l4__error__api.html#ggab4c8abc71ffa221a25c1ca5840a354f9ae679aa95cfccf769e6d8e7ddb746fdc8">L4_EPERM</a></div><div class="ttdeci">@ L4_EPERM</div><div class="ttdoc">No permission.</div><div class="ttdef"><b>Definition</b> <a href="err_8h_source.html#l00033">err.h:33</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__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__l4virtio__transport_html_ggaa3812d621d81dd6a7101d739153b6c3ba3209479ecc025e24194aa8bae2b75d6c"><div class="ttname"><a href="group__l4virtio__transport.html#ggaa3812d621d81dd6a7101d739153b6c3ba3209479ecc025e24194aa8bae2b75d6c">L4VIRTIO_ID_CONSOLE</a></div><div class="ttdeci">@ L4VIRTIO_ID_CONSOLE</div><div class="ttdoc">Simple device for data IO via ports.</div><div class="ttdef"><b>Definition</b> <a href="virtio_8h_source.html#l00066">virtio.h:66</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="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="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_1Console_1_1Control__message_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html">L4virtio::Svr::Console::Control_message</a></div><div class="ttdoc">Virtio console control message.</div><div class="ttdef"><b>Definition</b> <a href="#l00031">virtio-console:32</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981">L4virtio::Svr::Console::Control_message::Events</a></div><div class="ttdeci">Events</div><div class="ttdoc">Possible control events.</div><div class="ttdef"><b>Definition</b> <a href="#l00034">virtio-console:35</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981a13bd62558c453a4792aa5cabb2a572ff"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a13bd62558c453a4792aa5cabb2a572ff">L4virtio::Svr::Console::Control_message::Device_ready</a></div><div class="ttdeci">@ Device_ready</div><div class="ttdoc">Sent by driver at initialization.</div><div class="ttdef"><b>Definition</b> <a href="#l00037">virtio-console:37</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981a5153819c01fcc63725eefb1f7ca5140c"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a5153819c01fcc63725eefb1f7ca5140c">L4virtio::Svr::Console::Control_message::Console_port</a></div><div class="ttdeci">@ Console_port</div><div class="ttdoc">Sent by device to nominate port as console port.</div><div class="ttdef"><b>Definition</b> <a href="#l00045">virtio-console:45</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981a7022580cd861fe314f272fe8937f3a52">L4virtio::Svr::Console::Control_message::Port_open</a></div><div class="ttdeci">@ Port_open</div><div class="ttdoc">Sent by device and driver to indicate whether a port is open.</div><div class="ttdef"><b>Definition</b> <a href="#l00049">virtio-console:49</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981ab478b87f60331bb9f3391938b36ced6f"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ab478b87f60331bb9f3391938b36ced6f">L4virtio::Svr::Console::Control_message::Port_name</a></div><div class="ttdeci">@ Port_name</div><div class="ttdoc">Sent by device to tag a port.</div><div class="ttdef"><b>Definition</b> <a href="#l00051">virtio-console:51</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981ad22dd3cdf6f6f8837be0181ddfb0c60c"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981ad22dd3cdf6f6f8837be0181ddfb0c60c">L4virtio::Svr::Console::Control_message::Device_remove</a></div><div class="ttdeci">@ Device_remove</div><div class="ttdoc">Sent by device to remove added ports.</div><div class="ttdef"><b>Definition</b> <a href="#l00041">virtio-console:41</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981add0b7bf6eccaea022d42d5dde2b8d5c5">L4virtio::Svr::Console::Control_message::Device_add</a></div><div class="ttdeci">@ Device_add</div><div class="ttdoc">Sent by device to create new ports.</div><div class="ttdef"><b>Definition</b> <a href="#l00039">virtio-console:39</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981afc0c91bfcbb2828106cc53750272a38e"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981afc0c91bfcbb2828106cc53750272a38e">L4virtio::Svr::Console::Control_message::Port_ready</a></div><div class="ttdeci">@ Port_ready</div><div class="ttdoc">Sent by driver as response to Device_add.</div><div class="ttdef"><b>Definition</b> <a href="#l00043">virtio-console:43</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a47d3b7eb9911ef9b693250331174e981afc1ca28f88d22a6fed8d08097d3c3a3d"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a47d3b7eb9911ef9b693250331174e981afc1ca28f88d22a6fed8d08097d3c3a3d">L4virtio::Svr::Console::Control_message::Resize</a></div><div class="ttdeci">@ Resize</div><div class="ttdoc">Sent by device to indicate a console size change.</div><div class="ttdef"><b>Definition</b> <a href="#l00047">virtio-console:47</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_a593598e3108d3c206bceb2d0523fe7f0"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#a593598e3108d3c206bceb2d0523fe7f0">L4virtio::Svr::Console::Control_message::value</a></div><div class="ttdeci">l4_uint16_t value</div><div class="ttdoc">Extra information.</div><div class="ttdef"><b>Definition</b> <a href="#l00056">virtio-console:56</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_acf5a7ec9b146001a70223dfc9475d67b"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#acf5a7ec9b146001a70223dfc9475d67b">L4virtio::Svr::Console::Control_message::id</a></div><div class="ttdeci">l4_uint32_t id</div><div class="ttdoc">Port number.</div><div class="ttdef"><b>Definition</b> <a href="#l00054">virtio-console:54</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__message_html_ad91664d695fdec86bcbfb826a07be1d7"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__message.html#ad91664d695fdec86bcbfb826a07be1d7">L4virtio::Svr::Console::Control_message::event</a></div><div class="ttdeci">l4_uint16_t event</div><div class="ttdoc">Control event, see Events.</div><div class="ttdef"><b>Definition</b> <a href="#l00055">virtio-console:55</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__request_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html">L4virtio::Svr::Console::Control_request</a></div><div class="ttdoc">Specialised Virtqueue::Request providing access to control message payload.</div><div class="ttdef"><b>Definition</b> <a href="#l00065">virtio-console:66</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__request_html_a26a4c4682fc8bd928d0fcd667def715c"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a26a4c4682fc8bd928d0fcd667def715c">L4virtio::Svr::Console::Control_request::msg</a></div><div class="ttdeci">Control_message * msg</div><div class="ttdoc">Virtual address of the data block (in device space).</div><div class="ttdef"><b>Definition</b> <a href="#l00068">virtio-console:68</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__request_html_a81c73cf58c1125e5322f6502a89073f0"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#a81c73cf58c1125e5322f6502a89073f0">L4virtio::Svr::Console::Control_request::len</a></div><div class="ttdeci">l4_uint32_t len</div><div class="ttdoc">Length of datablock in bytes.</div><div class="ttdef"><b>Definition</b> <a href="#l00070">virtio-console:70</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Control__request_html_aef5b20e03e990c002c26604aa911963b"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Control__request.html#aef5b20e03e990c002c26604aa911963b">L4virtio::Svr::Console::Control_request::mem</a></div><div class="ttdeci">Driver_mem_region * mem</div><div class="ttdoc">Pointer to driver memory region.</div><div class="ttdef"><b>Definition</b> <a href="#l00072">virtio-console:72</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Features_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Features.html">L4virtio::Svr::Console::Features</a></div><div class="ttdoc">Virtio console specific feature bits.</div><div class="ttdef"><b>Definition</b> <a href="#l00018">virtio-console:19</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Features_html_a1a7415b9e55e5cda43a338922f956074"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#a1a7415b9e55e5cda43a338922f956074">L4virtio::Svr::Console::Features::emerg_write</a></div><div class="ttdeci">constexpr emerg_write_bfm_t::Val emerg_write() const</div><div class="ttdoc">Get the emerg_write bits (2 to 2) of raw.</div><div class="ttdef"><b>Definition</b> <a href="#l00027">virtio-console:27</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Features_html_ab2a934d203c8f5e8ebe93463ed5aa094"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#ab2a934d203c8f5e8ebe93463ed5aa094">L4virtio::Svr::Console::Features::console_multiport</a></div><div class="ttdeci">constexpr console_multiport_bfm_t::Val console_multiport() const</div><div class="ttdoc">Get the console_multiport bits (1 to 1) of raw.</div><div class="ttdef"><b>Definition</b> <a href="#l00025">virtio-console:25</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Features_html_adbaf841fda10ff379ddaaf6d12725a69"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Features.html#adbaf841fda10ff379ddaaf6d12725a69">L4virtio::Svr::Console::Features::console_size</a></div><div class="ttdeci">constexpr console_size_bfm_t::Val console_size() const</div><div class="ttdoc">Get the console_size bits (0 to 0) of raw.</div><div class="ttdef"><b>Definition</b> <a href="#l00023">virtio-console:23</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html">L4virtio::Svr::Console::Port::Transition</a></div><div class="ttdoc">State transition from last report state to current state.</div><div class="ttdef"><b>Definition</b> <a href="#l00169">virtio-console:169</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition_html_a64327020c9e1ad4c79aea31062e581c0"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#a64327020c9e1ad4c79aea31062e581c0">L4virtio::Svr::Console::Port::Transition::value</a></div><div class="ttdeci">l4_uint16_t value</div><div class="ttdoc">Extra information.</div><div class="ttdef"><b>Definition</b> <a href="#l00171">virtio-console:171</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition_html_a686458019b0612c7f04a42edf33f73ee"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#a686458019b0612c7f04a42edf33f73ee">L4virtio::Svr::Console::Port::Transition::next</a></div><div class="ttdeci">Port_status next</div><div class="ttdoc">Next Port_status state.</div><div class="ttdef"><b>Definition</b> <a href="#l00172">virtio-console:172</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition_html_af49a0a58c1611cb5ef5708b96cbf0acf"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port_1_1Transition.html#af49a0a58c1611cb5ef5708b96cbf0acf">L4virtio::Svr::Console::Port::Transition::event</a></div><div class="ttdeci">l4_int16_t event</div><div class="ttdoc">Control_message::Events or &lt;0 if no event is sent.</div><div class="ttdef"><b>Definition</b> <a href="#l00170">virtio-console:170</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html">L4virtio::Svr::Console::Port</a></div><div class="ttdoc">Representation of a Virtio console port.</div><div class="ttdef"><b>Definition</b> <a href="#l00109">virtio-console:110</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a08e4e9c848a96fdb93c03ef9a3c0e1de"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a08e4e9c848a96fdb93c03ef9a3c0e1de">L4virtio::Svr::Console::Port::status</a></div><div class="ttdeci">Port_status status</div><div class="ttdoc">State the port is in.</div><div class="ttdef"><b>Definition</b> <a href="#l00135">virtio-console:135</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a0fcc1dfa5ac5a7eb6eca90c409ccec3e"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a0fcc1dfa5ac5a7eb6eca90c409ccec3e">L4virtio::Svr::Console::Port::rx</a></div><div class="ttdeci">Virtqueue rx</div><div class="ttdoc">Transmitq of the port.</div><div class="ttdef"><b>Definition</b> <a href="#l00134">virtio-console:134</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a21e01f7f9a6b764f30ac15fc3aec8efa"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a21e01f7f9a6b764f30ac15fc3aec8efa">L4virtio::Svr::Console::Port::state_transitions</a></div><div class="ttdeci">static constexpr Transition state_transitions[Port_num_states][Port_num_states]</div><div class="ttdoc">State transition table from last report state to current state.</div><div class="ttdef"><b>Definition</b> <a href="#l00195">virtio-console:195</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a2a94becc1d3bf66435deca9aa95bc7f1"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a2a94becc1d3bf66435deca9aa95bc7f1">L4virtio::Svr::Console::Port::vq_max</a></div><div class="ttdeci">unsigned vq_max</div><div class="ttdoc">Maximum queue sizes for this port.</div><div class="ttdef"><b>Definition</b> <a href="#l00137">virtio-console:137</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a3d4183cf67569e325ba243f7bd272d7d"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a3d4183cf67569e325ba243f7bd272d7d">L4virtio::Svr::Console::Port::reset</a></div><div class="ttdeci">virtual void reset()</div><div class="ttdoc">Reset the port to the initial state and disable its virtqueues.</div><div class="ttdef"><b>Definition</b> <a href="#l00150">virtio-console:150</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a5163c0cac00845a5ddb1df7b99d69e15"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a5163c0cac00845a5ddb1df7b99d69e15">L4virtio::Svr::Console::Port::tx</a></div><div class="ttdeci">Virtqueue tx</div><div class="ttdoc">Receiveq of the port.</div><div class="ttdef"><b>Definition</b> <a href="#l00133">virtio-console:133</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a564883ca057696fe31faff4fe2d3dec2"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a564883ca057696fe31faff4fe2d3dec2">L4virtio::Svr::Console::Port::is_open</a></div><div class="ttdeci">bool is_open() const</div><div class="ttdoc">Check that the port is open.</div><div class="ttdef"><b>Definition</b> <a href="#l00146">virtio-console:146</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a6a7c23d4b6bd657a466d159c30666400"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a6a7c23d4b6bd657a466d159c30666400">L4virtio::Svr::Console::Port::rx_ready</a></div><div class="ttdeci">bool rx_ready() const</div><div class="ttdoc">Check that device implementation may write to receive queues.</div><div class="ttdef"><b>Definition</b> <a href="#l00161">virtio-console:161</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a6ac3b50167b7ea843741727f017e97c1"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a6ac3b50167b7ea843741727f017e97c1">L4virtio::Svr::Console::Port::tx_ready</a></div><div class="ttdeci">bool tx_ready() const</div><div class="ttdoc">Check that device implementation may read from transmit queues.</div><div class="ttdef"><b>Definition</b> <a href="#l00165">virtio-console:165</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a910a21e0cc83f245e4048adc6ae2b9f4"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4">L4virtio::Svr::Console::Port::Port_status</a></div><div class="ttdeci">Port_status</div><div class="ttdoc">Possible states of a virtio console port.</div><div class="ttdef"><b>Definition</b> <a href="#l00114">virtio-console:115</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a06c5c154064240eeb71ecd4f315a1d61">L4virtio::Svr::Console::Port::Port_added</a></div><div class="ttdeci">@ Port_added</div><div class="ttdoc">Port has been added by device, waiting for ready message.</div><div class="ttdef"><b>Definition</b> <a href="#l00119">virtio-console:119</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a1346b4e43e5df28ff6a965acccd4900f">L4virtio::Svr::Console::Port::Port_ready</a></div><div class="ttdeci">@ Port_ready</div><div class="ttdoc">Port is ready but still closed.</div><div class="ttdef"><b>Definition</b> <a href="#l00121">virtio-console:121</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a910a21e0cc83f245e4048adc6ae2b9f4a871c8abed5ed54a325a5914baf7e88fc"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a871c8abed5ed54a325a5914baf7e88fc">L4virtio::Svr::Console::Port::Port_num_states</a></div><div class="ttdeci">@ Port_num_states</div><div class="ttdoc">Number of port states. Must be last.</div><div class="ttdef"><b>Definition</b> <a href="#l00127">virtio-console:127</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4a8ba425b948c24ad0d62040ac57649b48">L4virtio::Svr::Console::Port::Port_open</a></div><div class="ttdeci">@ Port_open</div><div class="ttdoc">Port is in a working state.</div><div class="ttdef"><b>Definition</b> <a href="#l00123">virtio-console:123</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4ab33c8d73cb67dce5eb046bba02653081">L4virtio::Svr::Console::Port::Port_disabled</a></div><div class="ttdeci">@ Port_disabled</div><div class="ttdoc">Reset state, waiting for port to be added.</div><div class="ttdef"><b>Definition</b> <a href="#l00117">virtio-console:117</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#a910a21e0cc83f245e4048adc6ae2b9f4aebb5740d3b372195b3de60e3c21a6f05">L4virtio::Svr::Console::Port::Port_failed</a></div><div class="ttdeci">@ Port_failed</div><div class="ttdoc">Device failure, port unusable.</div><div class="ttdef"><b>Definition</b> <a href="#l00125">virtio-console:125</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_ab2dc3b90ca7f997234ac1db8f2a4d760"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ab2dc3b90ca7f997234ac1db8f2a4d760">L4virtio::Svr::Console::Port::queues_ready</a></div><div class="ttdeci">bool queues_ready() const</div><div class="ttdoc">Check that both virtqueues are set up correctly.</div><div class="ttdef"><b>Definition</b> <a href="#l00157">virtio-console:157</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Console_1_1Port_html_ad4fadf5e23978c8699f5b96ec5662d2b"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Console_1_1Port.html#ad4fadf5e23978c8699f5b96ec5662d2b">L4virtio::Svr::Console::Port::reported_status</a></div><div class="ttdeci">Port_status reported_status</div><div class="ttdoc">State the port was last reported.</div><div class="ttdef"><b>Definition</b> <a href="#l00136">virtio-console:136</a></div></div>
<div class="ttc" id="astructL4virtio_1_1Svr_1_1Dev__features_html_a01bb482bee85fd60f8685ed5a55fde79"><div class="ttname"><a href="structL4virtio_1_1Svr_1_1Dev__features.html#a01bb482bee85fd60f8685ed5a55fde79">L4virtio::Svr::Dev_features::raw</a></div><div class="ttdeci">l4_uint32_t raw</div><div class="ttdoc">The raw value of the features bitmap.</div><div class="ttdef"><b>Definition</b> <a href="virtio_source.html#l00068">virtio:68</a></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>virtio-console</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>