889 lines
78 KiB
HTML
889 lines
78 KiB
HTML
<!-- HTML header for doxygen 1.9.1-->
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.15.0"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>L4Re Operating System Framework: L4::Thread Class Reference</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('classL4_1_1Thread.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">L4::Thread Class Reference</div></div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
|
|
<p>C++ <a class="el" href="namespaceL4.html" title="L4 low-level kernel interface.">L4</a> kernel thread interface, see <a class="el" href="group__l4__thread__api.html">Thread</a> for the C interface.
|
|
<a href="#details">More...</a></p>
|
|
|
|
<p><code>#include <<a class="el" href="sys_2thread_source.html">thread</a>></code></p>
|
|
<div id="dynsection-0" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Inheritance diagram for L4::Thread:</div>
|
|
<div id="dynsection-0-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-0-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread__inherit__graph.svg" width="298" height="686"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
<div id="dynsection-1" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Collaboration diagram for L4::Thread:</div>
|
|
<div id="dynsection-1-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-1-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread__coll__graph.svg" width="298" height="686"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
<table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 id="header-nested-classes" class="groupheader"><a id="nested-classes" name="nested-classes"></a>
|
|
Data Structures</h2></td></tr>
|
|
<tr class="memitem:Attr" id="r_Attr"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classL4_1_1Thread_1_1Attr.html">Attr</a></td></tr>
|
|
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">Thread</a> attributes used for <a class="el" href="#a4252cd0ad4bdfa00cdc61b5fd2317aef" title="Commit the given thread-attributes object.">control()</a>. <a href="classL4_1_1Thread_1_1Attr.html#details">More...</a><br /></td></tr>
|
|
<tr class="memitem:Modify_5Fsenders" id="r_Modify_5Fsenders"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classL4_1_1Thread_1_1Modify__senders.html">Modify_senders</a></td></tr>
|
|
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classL4_1_1Kobject__t.html#af7df35ba5bf68ef5993e605a6b62328a">Class</a> wrapping a list of rules which modify the sender label of IPC messages inbound to this thread. <a href="classL4_1_1Thread_1_1Modify__senders.html#details">More...</a><br /></td></tr>
|
|
</table><table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 id="header-pub-methods" class="groupheader"><a id="pub-methods" name="pub-methods"></a>
|
|
Public Member Functions</h2></td></tr>
|
|
<tr class="memitem:aacd56bbf983577cfc591f21fd511d3b6" id="r_aacd56bbf983577cfc591f21fd511d3b6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#aacd56bbf983577cfc591f21fd511d3b6">ex_regs</a> (<a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> ip, <a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> sp, <a class="el" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> flags, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:aacd56bbf983577cfc591f21fd511d3b6"><td class="mdescLeft"> </td><td class="mdescRight">Exchange basic thread registers. <br /></td></tr>
|
|
<tr class="memitem:af50335e91a9efefa66b440aefefd9c61" id="r_af50335e91a9efefa66b440aefefd9c61"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#af50335e91a9efefa66b440aefefd9c61">ex_regs</a> (<a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> *ip, <a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> *sp, <a class="el" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> *flags, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:af50335e91a9efefa66b440aefefd9c61"><td class="mdescLeft"> </td><td class="mdescRight">Exchange basic thread registers and return previous values. <br /></td></tr>
|
|
<tr class="memitem:a4252cd0ad4bdfa00cdc61b5fd2317aef" id="r_a4252cd0ad4bdfa00cdc61b5fd2317aef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a4252cd0ad4bdfa00cdc61b5fd2317aef">control</a> (<a class="el" href="classL4_1_1Thread_1_1Attr.html">Attr</a> const &attr) noexcept</td></tr>
|
|
<tr class="memdesc:a4252cd0ad4bdfa00cdc61b5fd2317aef"><td class="mdescLeft"> </td><td class="mdescRight">Commit the given thread-attributes object. <br /></td></tr>
|
|
<tr class="memitem:a7bb604d3fe94545ad9e44b46600aef46" id="r_a7bb604d3fe94545ad9e44b46600aef46"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a7bb604d3fe94545ad9e44b46600aef46">switch_to</a> (<a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:a7bb604d3fe94545ad9e44b46600aef46"><td class="mdescLeft"> </td><td class="mdescRight">Switch execution to this thread. <br /></td></tr>
|
|
<tr class="memitem:a7c75cd39ef9fbe963d357d9909da7c10" id="r_a7c75cd39ef9fbe963d357d9909da7c10"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a7c75cd39ef9fbe963d357d9909da7c10">stats_time</a> (<a class="el" href="group__l4__basic__types.html#gab71da24eb7cda2c035f18b862309b101">l4_kernel_clock_t</a> *us, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:a7c75cd39ef9fbe963d357d9909da7c10"><td class="mdescLeft"> </td><td class="mdescRight">Get consumed time of thread in us. <br /></td></tr>
|
|
<tr class="memitem:acced76970ec38a15b2ec5a8c756545b4" id="r_acced76970ec38a15b2ec5a8c756545b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#acced76970ec38a15b2ec5a8c756545b4">vcpu_resume_start</a> (<a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:acced76970ec38a15b2ec5a8c756545b4"><td class="mdescLeft"> </td><td class="mdescRight">Resume from vCPU asynchronous IPC handler, start. <br /></td></tr>
|
|
<tr class="memitem:a72ce9179f1b083a65f0d4caa5b6aee67" id="r_a72ce9179f1b083a65f0d4caa5b6aee67"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a72ce9179f1b083a65f0d4caa5b6aee67">vcpu_resume_commit</a> (<a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> tag, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:a72ce9179f1b083a65f0d4caa5b6aee67"><td class="mdescLeft"> </td><td class="mdescRight">Resume from vCPU asynchronous IPC handler, commit. <br /></td></tr>
|
|
<tr class="memitem:a94a6d8a5a7a78fa99ef3c6358e0a0459" id="r_a94a6d8a5a7a78fa99ef3c6358e0a0459"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a94a6d8a5a7a78fa99ef3c6358e0a0459">vcpu_control</a> (<a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> vcpu_state, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:a94a6d8a5a7a78fa99ef3c6358e0a0459"><td class="mdescLeft"> </td><td class="mdescRight">Enable the vCPU feature for the thread. <br /></td></tr>
|
|
<tr class="memitem:ac341b827b00c21bc3753c30163e0f173" id="r_ac341b827b00c21bc3753c30163e0f173"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#ac341b827b00c21bc3753c30163e0f173">vcpu_control_ext</a> (<a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> ext_vcpu_state, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *utcb=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:ac341b827b00c21bc3753c30163e0f173"><td class="mdescLeft"> </td><td class="mdescRight">Enable the extended vCPU feature for the thread. <br /></td></tr>
|
|
<tr class="memitem:a5506636d5612bbc65a07edebcb885b8c" id="r_a5506636d5612bbc65a07edebcb885b8c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a5506636d5612bbc65a07edebcb885b8c">register_del_irq</a> (<a class="el" href="classL4_1_1Cap.html">Cap</a>< <a class="el" href="classL4_1_1Irq.html">Irq</a> > irq, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *u=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:a5506636d5612bbc65a07edebcb885b8c"><td class="mdescLeft"> </td><td class="mdescRight">Register an IRQ that will trigger upon deletion events. <br /></td></tr>
|
|
<tr class="memitem:a9bcade7e8db8d775cc1f2a2a6225c845" id="r_a9bcade7e8db8d775cc1f2a2a6225c845"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a9bcade7e8db8d775cc1f2a2a6225c845">modify_senders</a> (<a class="el" href="classL4_1_1Thread_1_1Modify__senders.html">Modify_senders</a> const &todo) noexcept</td></tr>
|
|
<tr class="memdesc:a9bcade7e8db8d775cc1f2a2a6225c845"><td class="mdescLeft"> </td><td class="mdescRight">Apply sender modification rules. <br /></td></tr>
|
|
<tr class="memitem:a3c0a77905e677454dcbb4a05d2d2d86b" id="r_a3c0a77905e677454dcbb4a05d2d2d86b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="#a3c0a77905e677454dcbb4a05d2d2d86b">register_doorbell_irq</a> (<a class="el" href="classL4_1_1Cap.html">Cap</a>< <a class="el" href="classL4_1_1Irq.html">Irq</a> > irq, <a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *u=<a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()) noexcept</td></tr>
|
|
<tr class="memdesc:a3c0a77905e677454dcbb4a05d2d2d86b"><td class="mdescLeft"> </td><td class="mdescRight">Register an IRQ that will trigger when a forwarded virtual interrupt is pending. <br /></td></tr>
|
|
</table><table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 id="header-inherited" class="groupheader"><a id="inherited" name="inherited"></a>
|
|
Additional Inherited Members</h2></td></tr>
|
|
<tr class="inherit_header pro_types_classL4_1_1Kobject__t"><td colspan="2" onclick="javascript:dynsection.toggleInherit('pro_types_classL4_1_1Kobject__t')"><span class="dynarrow"><span class="arrowhead closed"></span></span>Protected Types inherited from <a class="el" href="classL4_1_1Kobject__t.html">L4::Kobject_t< Thread, Snd_destination, L4_PROTO_THREAD, Type_info::Demand_t< 1 > ></a></td></tr>
|
|
<tr class="memitem:af7df35ba5bf68ef5993e605a6b62328a inherit pro_types_classL4_1_1Kobject__t" id="r_af7df35ba5bf68ef5993e605a6b62328a"><td class="memItemLeft" align="right" valign="top">
|
|
typedef <a class="el" href="classL4_1_1Thread.html">Thread</a> </td><td class="memItemRight" valign="bottom"><b>Class</b></td></tr>
|
|
<tr class="memdesc:af7df35ba5bf68ef5993e605a6b62328a inherit pro_types_classL4_1_1Kobject__t"><td class="mdescLeft"> </td><td class="mdescRight">The target interface type (inheriting from <a class="el" href="classL4_1_1Kobject__t.html" title="Helper class to create an L4Re interface class that is derived from a single base class.">Kobject_t</a>). <br /></td></tr>
|
|
<tr class="memitem:a0d83157994565e9c01f10006bdda2efa inherit pro_types_classL4_1_1Kobject__t" id="r_a0d83157994565e9c01f10006bdda2efa"><td class="memItemLeft" align="right" valign="top">
|
|
typedef Typeid::Iface< PROTO, <a class="el" href="classL4_1_1Thread.html">Thread</a> > </td><td class="memItemRight" valign="bottom"><b>__Iface</b></td></tr>
|
|
<tr class="memdesc:a0d83157994565e9c01f10006bdda2efa inherit pro_types_classL4_1_1Kobject__t"><td class="mdescLeft"> </td><td class="mdescRight">The interface description for the derived class. <br /></td></tr>
|
|
<tr class="memitem:afc2feec2f4a15e85286aabfa15c53e06 inherit pro_types_classL4_1_1Kobject__t" id="r_afc2feec2f4a15e85286aabfa15c53e06"><td class="memItemLeft" align="right" valign="top">
|
|
typedef Typeid::Merge_list< Typeid::Iface_list< <a class="el" href="classL4_1_1Kobject__t.html#a0d83157994565e9c01f10006bdda2efa">__Iface</a> >, typename Snd_destination::__Iface_list > </td><td class="memItemRight" valign="bottom"><b>__Iface_list</b></td></tr>
|
|
<tr class="memdesc:afc2feec2f4a15e85286aabfa15c53e06 inherit pro_types_classL4_1_1Kobject__t"><td class="mdescLeft"> </td><td class="mdescRight">The list of all RPC interfaces provided directly or through inheritance. <br /></td></tr>
|
|
<tr class="inherit_header pro_methods_classL4_1_1Kobject__t"><td colspan="2" onclick="javascript:dynsection.toggleInherit('pro_methods_classL4_1_1Kobject__t')"><span class="dynarrow"><span class="arrowhead closed"></span></span>Protected Member Functions inherited from <a class="el" href="classL4_1_1Kobject__t.html">L4::Kobject_t< Thread, Snd_destination, L4_PROTO_THREAD, Type_info::Demand_t< 1 > ></a></td></tr>
|
|
<tr class="memitem:a3d80fec7e057d575ec4b393437f05f8a inherit pro_methods_classL4_1_1Kobject__t" id="r_a3d80fec7e057d575ec4b393437f05f8a"><td class="memItemLeft" align="right" valign="top">
|
|
<a class="el" href="classL4_1_1Cap.html">L4::Cap</a>< <a class="el" href="classL4_1_1Kobject__t.html#af7df35ba5bf68ef5993e605a6b62328a">Class</a> > </td><td class="memItemRight" valign="bottom"><b>c</b> () const noexcept</td></tr>
|
|
<tr class="memdesc:a3d80fec7e057d575ec4b393437f05f8a inherit pro_methods_classL4_1_1Kobject__t"><td class="mdescLeft"> </td><td class="mdescRight">Get the capability to ourselves. <br /></td></tr>
|
|
<tr class="inherit_header pro_static_methods_classL4_1_1Kobject__t"><td colspan="2" onclick="javascript:dynsection.toggleInherit('pro_static_methods_classL4_1_1Kobject__t')"><span class="dynarrow"><span class="arrowhead closed"></span></span>Static Protected Member Functions inherited from <a class="el" href="classL4_1_1Kobject__t.html">L4::Kobject_t< Thread, Snd_destination, L4_PROTO_THREAD, Type_info::Demand_t< 1 > ></a></td></tr>
|
|
<tr class="memitem:a7433b8eed587278821dd496864f75363 inherit pro_static_methods_classL4_1_1Kobject__t" id="r_a7433b8eed587278821dd496864f75363"><td class="memItemLeft" align="right" valign="top">
|
|
static void </td><td class="memItemRight" valign="bottom"><b>__check_protocols__</b> () noexcept</td></tr>
|
|
<tr class="memdesc:a7433b8eed587278821dd496864f75363 inherit pro_static_methods_classL4_1_1Kobject__t"><td class="mdescLeft"> </td><td class="mdescRight">Helper to check for protocol conflicts. <br /></td></tr>
|
|
</table>
|
|
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
|
|
<div class="textblock"><p>C++ <a class="el" href="namespaceL4.html" title="L4 low-level kernel interface.">L4</a> kernel thread interface, see <a class="el" href="group__l4__thread__api.html">Thread</a> for the C interface. </p>
|
|
<p>The <a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">Thread</a> class defines a thread of execution in the <a class="el" href="namespaceL4.html" title="L4 low-level kernel interface.">L4</a> context. Usually user-level and kernel threads are mapped 1:1 to each other. <a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">Thread</a> kernel objects are created using a factory, see the <a class="el" href="classL4_1_1Factory.html" title="C++ Factory interface, see Factory for the C interface.">L4::Factory</a> API (<a class="el" href="classL4_1_1Factory.html#ab52604d4abed4d6009ce51a59492edd7" title="Generic create call to the factory.">L4::Factory::create()</a>).</p>
|
|
<p>Amongst other things an <a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">L4::Thread</a> encapsulates:</p><ul>
|
|
<li>CPU state<ul>
|
|
<li>General-purpose registers</li>
|
|
<li>Program counter</li>
|
|
<li>Stack pointer</li>
|
|
</ul>
|
|
</li>
|
|
<li>FPU state</li>
|
|
<li>Scheduling parameters, see the <a class="el" href="classL4_1_1Scheduler.html" title="C++ interface of the Scheduler kernel object, see Scheduler for the C interface.">L4::Scheduler</a> API</li>
|
|
<li>Execution state<ul>
|
|
<li>Blocked, Runnable, Running</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p><a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">Thread</a> objects provide an API for</p><ul>
|
|
<li><a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">Thread</a> configuration and manipulation</li>
|
|
<li><a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">Thread</a> switching.</li>
|
|
</ul>
|
|
<p>On ARM newly created threads run in EL0 by default and the exception level can be changed there with <a class="el" href="#aacd56bbf983577cfc591f21fd511d3b6" title="Exchange basic thread registers.">ex_regs()</a>.</p>
|
|
<dl class="section user"><dt>Include File</dt><dd><div class="fragment"><div class="line"><span class="preprocessor">#include <<a class="code" href="sys_2thread.html">l4/sys/thread</a>></span> </div>
|
|
<div class="ttc" id="asys_2thread_html"><div class="ttname"><a href="sys_2thread.html">thread</a></div><div class="ttdoc">Common thread related definitions.</div></div>
|
|
</div><!-- fragment --></dd></dl>
|
|
<p>For the C interface see the <a class="el" href="group__l4__thread__api.html">Thread</a> API. For more elaborated documentation on the vCPU feature see <a class="el" href="group__l4__vcpu__api.html">vCPU API</a>. </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00052">52</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
</div><a name="doc-func-members" id="doc-func-members"></a><h2 id="header-doc-func-members" class="groupheader">Member Function Documentation</h2>
|
|
<a id="a4252cd0ad4bdfa00cdc61b5fd2317aef" name="a4252cd0ad4bdfa00cdc61b5fd2317aef"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a4252cd0ad4bdfa00cdc61b5fd2317aef">◆ </a></span>control()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::control </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="classL4_1_1Thread_1_1Attr.html">Attr</a> const &</td> <td class="paramname"><span class="paramname"><em>attr</em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Commit the given thread-attributes object. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">attr</td><td>the attribute object to commit to the thread.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Syscall return tag containing one of the following return codes.</dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">L4_EOK</td><td>Operation successful. </td></tr>
|
|
<tr><td class="paramname">-L4_EPERM</td><td>Insufficient permissions; see precondition. </td></tr>
|
|
<tr><td class="paramname">-L4_EINVAL</td><td>Malformed thread-attributes.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section pre"><dt>Precondition</dt><dd>The invoked <a class="el" href="classL4_1_1Thread.html" title="C++ L4 kernel thread interface, see Thread for the C interface.">Thread</a> capability must have the permission <a class="el" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39acb2b2e95f6be245f64937ac48a068066" title="Interface specific 'S' right for capability flexpages.">L4_CAP_FPAGE_S</a>. When using #Attr::bind(), also the respective <a class="el" href="classL4_1_1Task.html" title="C++ interface of the Task kernel object, see Task for the C interface.">Task</a> capability must have the permission <a class="el" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39acb2b2e95f6be245f64937ac48a068066" title="Interface specific 'S' right for capability flexpages.">L4_CAP_FPAGE_S</a>. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00243">243</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>.</p>
|
|
<div id="dynsection-2" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-2-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-2-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a4252cd0ad4bdfa00cdc61b5fd2317aef_cgraph.svg" width="326" height="36"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="af50335e91a9efefa66b440aefefd9c61" name="af50335e91a9efefa66b440aefefd9c61"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#af50335e91a9efefa66b440aefefd9c61">◆ </a></span>ex_regs() <span class="overload">[1/2]</span></h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::ex_regs </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> *</td> <td class="paramname"><span class="paramname"><em>ip</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a> *</td> <td class="paramname"><span class="paramname"><em>sp</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a> *</td> <td class="paramname"><span class="paramname"><em>flags</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Exchange basic thread registers and return previous values. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramdir">[in,out]</td><td class="paramname">ip</td><td>New instruction pointer, use ~0UL to leave the instruction pointer unchanged, return previous instruction pointer. </td></tr>
|
|
<tr><td class="paramdir">[in,out]</td><td class="paramname">sp</td><td>New stack pointer, use ~0UL to leave the stack pointer unchanged, returns previous stack pointer. </td></tr>
|
|
<tr><td class="paramdir">[in,out]</td><td class="paramname">flags</td><td>Ex-regs flags, see <a class="el" href="group__l4__thread__api.html#ga288a4500e4be2587d2f16d754d1a2e16" title="Flags for the thread ex-regs operation.">L4_thread_ex_regs_flags</a>, return previous CPU flags of the thread. </td></tr>
|
|
<tr><td class="paramdir"></td><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>System call return tag. [out] parameters are only valid if the function returns successfully. Use <a class="el" href="group__l4__ipc__err__api.html#ga05c11e3e10b6c2aa941396ac2018899f" title="Get IPC error code if any or message tag label otherwise for an IPC call.">l4_error()</a> to check.</dd></dl>
|
|
<p>This method allows to manipulate and start a thread. The basic functionality is to set the instruction pointer and the stack pointer of a thread. Additionally, this method allows also to cancel ongoing IPC operations and to force the thread to raise an artificial exception (see <span class="tt">flags</span>). If the thread is in an IPC operation or if <a class="el" href="group__l4__thread__api.html#gga288a4500e4be2587d2f16d754d1a2e16abed26b392ea6e1ee9f468246ae19bf35" title="Trigger artificial exception in thread.">L4_THREAD_EX_REGS_TRIGGER_EXCEPTION</a> forces an IPC then changes in IP and SP take effect directly after returning from this IPC. On ARM this method allows to change the execption level, see <a class="el" href="group__l4__thread__api.html#ga1733954711051b531a3d8db16b72bd1b" title="Arm specific L4::Thread::ex_regs() flags.">L4_thread_ex_regs_flags_arm</a> and <a class="el" href="group__l4__thread__api.html#ga3037921d1968785807972a315c9f0b2c" title="Arm64 specific L4::Thread::ex_regs() flags.">L4_thread_ex_regs_flags_arm64</a>.</p>
|
|
<p>The thread is started using <a class="el" href="classL4_1_1Scheduler.html#acc86cb4df9b2aad35730b209e0c98089" title="Run a thread on a Scheduler.">L4::Scheduler::run_thread()</a>. However, if at the time <a class="el" href="classL4_1_1Scheduler.html#acc86cb4df9b2aad35730b209e0c98089" title="Run a thread on a Scheduler.">L4::Scheduler::run_thread()</a> is called, the instruction pointer of the thread is invalid, a later call to <a class="el" href="#aacd56bbf983577cfc591f21fd511d3b6" title="Exchange basic thread registers.">ex_regs()</a> with a valid instruction pointer might start the thread. </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00119">119</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>, and <a class="el" href="l4_2sys_2thread_8h_source.html#l00823">l4_thread_ex_regs_ret_u()</a>.</p>
|
|
<div id="dynsection-3" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-3-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-3-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_af50335e91a9efefa66b440aefefd9c61_cgraph.svg" width="840" height="110"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="aacd56bbf983577cfc591f21fd511d3b6" name="aacd56bbf983577cfc591f21fd511d3b6"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#aacd56bbf983577cfc591f21fd511d3b6">◆ </a></span>ex_regs() <span class="overload">[2/2]</span></h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::ex_regs </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a></td> <td class="paramname"><span class="paramname"><em>ip</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a></td> <td class="paramname"><span class="paramname"><em>sp</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga1c2c4b333f75b1d05b59855910f2b9cb">l4_umword_t</a></td> <td class="paramname"><span class="paramname"><em>flags</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Exchange basic thread registers. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">ip</td><td>New instruction pointer, use ~0UL to leave the instruction pointer unchanged. </td></tr>
|
|
<tr><td class="paramname">sp</td><td>New stack pointer, use ~0UL to leave the stack pointer unchanged. </td></tr>
|
|
<tr><td class="paramname">flags</td><td>Ex-regs flags, see <a class="el" href="group__l4__thread__api.html#ga288a4500e4be2587d2f16d754d1a2e16" title="Flags for the thread ex-regs operation.">L4_thread_ex_regs_flags</a>. </td></tr>
|
|
<tr><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>System call return tag.</dd></dl>
|
|
<p>This method allows to manipulate and start a thread. The basic functionality is to set the instruction pointer and the stack pointer of a thread. Additionally, this method allows also to cancel ongoing IPC operations and to force the thread to raise an artificial exception (see <span class="tt">flags</span>). If the thread is in an IPC operation or if <a class="el" href="group__l4__thread__api.html#gga288a4500e4be2587d2f16d754d1a2e16abed26b392ea6e1ee9f468246ae19bf35" title="Trigger artificial exception in thread.">L4_THREAD_EX_REGS_TRIGGER_EXCEPTION</a> forces an IPC then changes in IP and SP take effect directly after returning from this IPC. On ARM this method allows to change the execption level, see <a class="el" href="group__l4__thread__api.html#ga1733954711051b531a3d8db16b72bd1b" title="Arm specific L4::Thread::ex_regs() flags.">L4_thread_ex_regs_flags_arm</a> and <a class="el" href="group__l4__thread__api.html#ga3037921d1968785807972a315c9f0b2c" title="Arm64 specific L4::Thread::ex_regs() flags.">L4_thread_ex_regs_flags_arm64</a>.</p>
|
|
<p>The thread is started using <a class="el" href="classL4_1_1Scheduler.html#acc86cb4df9b2aad35730b209e0c98089" title="Run a thread on a Scheduler.">L4::Scheduler::run_thread()</a>. However, if at the time <a class="el" href="classL4_1_1Scheduler.html#acc86cb4df9b2aad35730b209e0c98089" title="Run a thread on a Scheduler.">L4::Scheduler::run_thread()</a> is called, the instruction pointer of the thread is invalid, a later call to <a class="el" href="#aacd56bbf983577cfc591f21fd511d3b6" title="Exchange basic thread registers.">ex_regs()</a> with a valid instruction pointer might start the thread. </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00084">84</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>, and <a class="el" href="l4_2sys_2thread_8h_source.html#l00812">l4_thread_ex_regs_u()</a>.</p>
|
|
<div id="dynsection-4" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-4-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-4-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_aacd56bbf983577cfc591f21fd511d3b6_cgraph.svg" width="611" height="110"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a9bcade7e8db8d775cc1f2a2a6225c845" name="a9bcade7e8db8d775cc1f2a2a6225c845"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a9bcade7e8db8d775cc1f2a2a6225c845">◆ </a></span>modify_senders()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::modify_senders </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="classL4_1_1Thread_1_1Modify__senders.html">Modify_senders</a> const &</td> <td class="paramname"><span class="paramname"><em>todo</em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Apply sender modification rules. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">todo</td><td>Prepared sender modification rules.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>System call return tag.</dd></dl>
|
|
<p>The modification rules are applied to all IPCs to the thread (whether directly or by IPC gate) that are already in flight, that is that the sender is already blocking on.</p>
|
|
<p>See <a class="el" href="classL4_1_1Thread_1_1Modify__senders.html" title="Class wrapping a list of rules which modify the sender label of IPC messages inbound to this thread.">Modify_senders</a> for a detailed description when applying sender modification rules is required.</p>
|
|
<dl class="section note"><dt>Note</dt><dd>Modifying the senders of a thread running on a different CPU core is not supported.</dd>
|
|
<dd>
|
|
To ensure that no in-flight senders are missed, either the thread itself must execute modify_senders, or the thread executing the modify_senders must synchronize with the target thread. This synchronization must ensure the following:<ol type="1">
|
|
<li>Before modify_senders is executed the target thread must execute at least shortly (so that pending DRQs are handled).</li>
|
|
<li>The target thread must pause its IPC dispatch, until modify_senders is completed. In other words, the target thread must not be receive ready, because otherwise an IPC message with an unmodified label can be transferred to its UTCB or vCPU state.</li>
|
|
</ol>
|
|
</dd></dl>
|
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__l4__thread__api.html#gab4f2106933cf35dc0d4fb2e97e093aef" title="Apply (commit) a sender modification sequence.">l4_thread_modify_sender_commit()</a> </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00525">525</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>, <a class="el" href="l4_2sys_2ipc_8h_source.html#l00565">l4_ipc_call()</a>, <a class="el" href="____timeout_8h_source.html#l00076">L4_IPC_NEVER</a>, <a class="el" href="l4_2sys_2types_8h_source.html#l00405">l4_msgtag()</a>, and <a class="el" href="l4_2sys_2types_8h_source.html#l00054">L4_PROTO_THREAD</a>.</p>
|
|
<div id="dynsection-5" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-5-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-5-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a9bcade7e8db8d775cc1f2a2a6225c845_cgraph.svg" width="434" height="135"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a5506636d5612bbc65a07edebcb885b8c" name="a5506636d5612bbc65a07edebcb885b8c"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a5506636d5612bbc65a07edebcb885b8c">◆ </a></span>register_del_irq()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::register_del_irq </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="classL4_1_1Cap.html">Cap</a>< <a class="el" href="classL4_1_1Irq.html">Irq</a> ></td> <td class="paramname"><span class="paramname"><em>irq</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>u</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Register an IRQ that will trigger upon deletion events. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">irq</td><td>Capability selector for the IRQ object to be triggered. </td></tr>
|
|
<tr><td class="paramname">u</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>System call return tag containing the return code.</dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">-L4_BUSY</td><td>A deletion IRQ is already bound to this thread. </td></tr>
|
|
<tr><td class="paramname">-L4_EPERM</td><td>Insufficient permissions; see precondition.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section pre"><dt>Precondition</dt><dd>The capability <span class="tt">irq</span> must have the permission <a class="el" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a561054fb4021ff4a22ab1881c7a7de5a" title="Interface specific 'W' right for capability flexpages.">L4_CAP_FPAGE_W</a>.</dd></dl>
|
|
<p>In case the <span class="tt">irq</span> is already bound to an interrupt source, it is unbound first. When <span class="tt">irq</span> is deleted, it will be deregistered first. A registered deletion <a class="el" href="classL4_1_1Irq.html" title="C++ Irq interface, see IRQs for the C interface.">Irq</a> can only be deregistered by deleting the <a class="el" href="classL4_1_1Irq.html" title="C++ Irq interface, see IRQs for the C interface.">Irq</a> or the thread.</p>
|
|
<p>List of deletion events:</p><ul>
|
|
<li>deletion of one or several IPC gates bound to this thread.</li>
|
|
</ul>
|
|
<p>When the deletion event is delivered, there is no indication about which IPC gate was deleted.</p>
|
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__l4__thread__api.html#ga9dded96485c96c7a3389ea00f5a305d1" title="Register an IRQ that will trigger upon deletion events.">l4_thread_register_del_irq</a> </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00427">427</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="capability_8h_source.html#l00049">L4::Cap_base::cap()</a>, and <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>.</p>
|
|
<div id="dynsection-6" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-6-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-6-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a5506636d5612bbc65a07edebcb885b8c_cgraph.svg" width="346" height="86"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a3c0a77905e677454dcbb4a05d2d2d86b" name="a3c0a77905e677454dcbb4a05d2d2d86b"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a3c0a77905e677454dcbb4a05d2d2d86b">◆ </a></span>register_doorbell_irq()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::register_doorbell_irq </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="classL4_1_1Cap.html">Cap</a>< <a class="el" href="classL4_1_1Irq.html">Irq</a> ></td> <td class="paramname"><span class="paramname"><em>irq</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>u</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Register an IRQ that will trigger when a forwarded virtual interrupt is pending. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">irq</td><td>Capability selector for the IRQ object to be triggered. </td></tr>
|
|
<tr><td class="paramname">u</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>System call return tag containing the return code.</dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">-L4_BUSY</td><td>A doorbell IRQ is already bound to this thread. </td></tr>
|
|
<tr><td class="paramname">-L4_EPERM</td><td>Insufficient permissions; see precondition.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section pre"><dt>Precondition</dt><dd>The capability <span class="tt">irq</span> must have the permission <a class="el" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39a561054fb4021ff4a22ab1881c7a7de5a" title="Interface specific 'W' right for capability flexpages.">L4_CAP_FPAGE_W</a>.</dd></dl>
|
|
<p>See <a class="el" href="classL4_1_1Irq.html#afd3e826c0a0c8ad8d0ee6506ae23016e" title="Bind a thread to this Irq for vCPU interrupt forwarding.">Irq::bind_vcpu()</a> for more details about how interrupts can be forwarded directly by the kernel to extended vCPU user mode.</p>
|
|
<p>In case the <span class="tt">irq</span> is already bound to an interrupt source, it is unbound first. When <span class="tt">irq</span> is deleted, it will be deregistered first. A registered doorbell <a class="el" href="classL4_1_1Irq.html" title="C++ Irq interface, see IRQs for the C interface.">Irq</a> can only be deregistered by deleting the <a class="el" href="classL4_1_1Irq.html" title="C++ Irq interface, see IRQs for the C interface.">Irq</a> or the thread.</p>
|
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__l4__thread__api.html#gaba7f8764bd91304b3407d94d90aa6578" title="Register an IRQ that will trigger when a forwarded virtual interrupt is pending.">l4_thread_register_doorbell_irq</a> </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00553">553</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="capability_8h_source.html#l00049">L4::Cap_base::cap()</a>, and <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>.</p>
|
|
<div id="dynsection-7" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-7-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-7-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a3c0a77905e677454dcbb4a05d2d2d86b_cgraph.svg" width="346" height="86"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a7c75cd39ef9fbe963d357d9909da7c10" name="a7c75cd39ef9fbe963d357d9909da7c10"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a7c75cd39ef9fbe963d357d9909da7c10">◆ </a></span>stats_time()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::stats_time </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#gab71da24eb7cda2c035f18b862309b101">l4_kernel_clock_t</a> *</td> <td class="paramname"><span class="paramname"><em>us</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Get consumed time of thread in us. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramdir">[out]</td><td class="paramname">us</td><td>Consumed time in µs. </td></tr>
|
|
<tr><td class="paramdir"></td><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Syscall return tag. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00264">264</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>.</p>
|
|
<div id="dynsection-8" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-8-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-8-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a7c75cd39ef9fbe963d357d9909da7c10_cgraph.svg" width="350" height="36"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a7bb604d3fe94545ad9e44b46600aef46" name="a7bb604d3fe94545ad9e44b46600aef46"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a7bb604d3fe94545ad9e44b46600aef46">◆ </a></span>switch_to()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::switch_to </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Switch execution to this thread. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section note"><dt>Note</dt><dd>The current time slice is inherited to this thread. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00253">253</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>.</p>
|
|
<div id="dynsection-9" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-9-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-9-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a7bb604d3fe94545ad9e44b46600aef46_cgraph.svg" width="343" height="36"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a94a6d8a5a7a78fa99ef3c6358e0a0459" name="a94a6d8a5a7a78fa99ef3c6358e0a0459"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a94a6d8a5a7a78fa99ef3c6358e0a0459">◆ </a></span>vcpu_control()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::vcpu_control </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a></td> <td class="paramname"><span class="paramname"><em>vcpu_state</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Enable the vCPU feature for the thread. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">vcpu_state</td><td>A virtual address pointing to a <a class="el" href="structl4__vcpu__state__t.html" title="State of a vCPU.">l4_vcpu_state_t</a>. It must be a valid kernel-user-memory address (see <a class="el" href="classL4_1_1Task.html#a9e741ff1d27ca776c65abaff1de2f139" title="Add kernel-user memory.">L4::Task::add_ku_mem()</a>). </td></tr>
|
|
<tr><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Syscall return tag.</dd></dl>
|
|
<p>This function enables the vCPU feature of <span class="tt">this</span> thread</p>
|
|
<p>The kernel-user memory starting at <span class="tt">vcpu_state</span> must be at least 128-byte aligned and must cover the size of <a class="el" href="structl4__vcpu__state__t.html" title="State of a vCPU.">l4_vcpu_state_t</a>.</p>
|
|
<p>The asynchronous IPC handling is described at <a class="el" href="group__l4__vcpu__api.html">vCPU API</a>.</p>
|
|
<dl class="section note"><dt>Note</dt><dd>Disabling of the vCPU feature is optional and currently not supported. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00358">358</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>, and <a class="el" href="l4_2sys_2thread_8h_source.html#l01044">l4_thread_vcpu_control_u()</a>.</p>
|
|
<div id="dynsection-10" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-10-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-10-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a94a6d8a5a7a78fa99ef3c6358e0a0459_cgraph.svg" width="675" height="110"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="ac341b827b00c21bc3753c30163e0f173" name="ac341b827b00c21bc3753c30163e0f173"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ac341b827b00c21bc3753c30163e0f173">◆ </a></span>vcpu_control_ext()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::vcpu_control_ext </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="group__l4__basic__types.html#ga4087b991c40c0d2fcde9ca331049a4d4">l4_addr_t</a></td> <td class="paramname"><span class="paramname"><em>ext_vcpu_state</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Enable the extended vCPU feature for the thread. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">ext_vcpu_state</td><td>The virtual address where the kernel shall store the vCPU state in case of vCPU exits. The address must be a valid kernel-user-memory address (see <a class="el" href="classL4_1_1Task.html#a9e741ff1d27ca776c65abaff1de2f139" title="Add kernel-user memory.">L4::Task::add_ku_mem()</a>). </td></tr>
|
|
<tr><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Syscall return tag.</dd></dl>
|
|
<p>The extended vCPU feature allows the use of hardware-virtualization features such as Intel's VT-x (VMX) or AMD's AMD-V (SVM).</p>
|
|
<p>This function enables the extended vCPU feature of <span class="tt">this</span> thread. Enabling the extended vCPU feature also enables the vCPU feature.</p>
|
|
<p>The kernel-user memory area starting at <span class="tt">ext_vcpu_state</span> must be at least 4 KiB aligned and must cover a size of L4_PAGESIZE. It includes the data of <a class="el" href="structl4__vcpu__state__t.html" title="State of a vCPU.">l4_vcpu_state_t</a> at offset 0, the extended vCPU state at offset L4_VCPU_OFFSET_EXT_STATE, and, on some platforms, the extended vCPU information at offset L4_VCPU_OFFSET_EXT_INFOS.</p>
|
|
<p>On Intel's VT-x (VMX), the extended vCPU state is <a class="el" href="structl4__vm__vmx__vcpu__vmcs__t.html" title="VMX software VMCS.">l4_vm_vmx_vcpu_vmcs_t</a> and the extended vCPU information is <a class="el" href="structl4__vm__vmx__vcpu__infos__t.html" title="VMX information members.">l4_vm_vmx_vcpu_infos_t</a>. Furthermore, the extended vCPU state needs to be associated with a vCPU context (see <a class="el" href="group__l4__vm__vmx__api.html#ga6f10feba83a036b0e88a56f4784862be" title="Associate the software VMCS with a vCPU context, i.e.">l4_vm_vmx_set_hw_vmcs()</a>).</p>
|
|
<p>On AMD's AMD-V (SVM), the extended vCPU state is <a class="el" href="structl4__vm__svm__vmcb__t.html" title="Control structure for SVM VMs.">l4_vm_svm_vmcb_t</a>.</p>
|
|
<dl class="section note"><dt>Note</dt><dd>Enabling the extended vCPU feature for a thread running on a different CPU core is currently not supported. </dd>
|
|
<dd>
|
|
Disabling of the extended vCPU feature is currently not supported. </dd>
|
|
<dd>
|
|
Upgrading from non-extended vCPU feature to extended vCPU feature is currently not supported. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00398">398</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>, and <a class="el" href="l4_2sys_2thread_8h_source.html#l01059">l4_thread_vcpu_control_ext_u()</a>.</p>
|
|
<div id="dynsection-11" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-11-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-11-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_ac341b827b00c21bc3753c30163e0f173_cgraph.svg" width="688" height="118"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a72ce9179f1b083a65f0d4caa5b6aee67" name="a72ce9179f1b083a65f0d4caa5b6aee67"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a72ce9179f1b083a65f0d4caa5b6aee67">◆ </a></span>vcpu_resume_commit()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::vcpu_resume_commit </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a></td> <td class="paramname"><span class="paramname"><em>tag</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Resume from vCPU asynchronous IPC handler, commit. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">tag</td><td>Tag to use, returned by <a class="el" href="group__l4__thread__api.html#ga6e0620f6b1119d84eac90adad52eabf8" title="vCPU return from event handler.">l4_thread_vcpu_resume_start()</a>. </td></tr>
|
|
<tr><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Syscall return tag containing one of the following return codes.</dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">0</td><td>Indicates a VM exit, provided that <span class="tt">thread</span> is in extended vCPU mode with virtual interrupts cleared. </td></tr>
|
|
<tr><td class="paramname">1</td><td>Indicates an incoming IPC message, provided that the <span class="tt">thread</span> is in extended vCPU mode with virtual interrupts cleared. </td></tr>
|
|
<tr><td class="paramname">-L4_EPERM</td><td>The user task capability set in the vCPU state is missing the <a class="el" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39acb2b2e95f6be245f64937ac48a068066" title="Interface specific 'S' right for capability flexpages.">L4_CAP_FPAGE_S</a> right. On Intel's VT-x (VMX): The vCPU context capability set in the extended vCPU state is missing the <a class="el" href="group__l4__fpage__api.html#ggaee60789a48cab2782f5a368237591b39acb2b2e95f6be245f64937ac48a068066" title="Interface specific 'S' right for capability flexpages.">L4_CAP_FPAGE_S</a> right. </td></tr>
|
|
<tr><td class="paramname">-L4_ENOENT</td><td>The user task capability set in the vCPU state is invalid. </td></tr>
|
|
<tr><td class="paramname">-L4_EINVAL</td><td><span class="tt">thread</span> is not the current running thread, or does not have the vCPU feature enabled. On Intel's VT-x (VMX): No vCPU context associated with the extended vCPU state. </td></tr>
|
|
<tr><td class="paramname">-L4_EBUSY</td><td>On Intel's VT-x (VMX): The vCPU context associated with the extended vCPU state is already active on a different CPU. </td></tr>
|
|
<tr><td class="paramname">-L4_ENODEV</td><td>On Intel's VT-x (VMX): The vCPU context associated with the extended vCPU state cannot be initialized or activated. </td></tr>
|
|
<tr><td class="paramname"><0</td><td>A supplied mapping failed.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<p>All flexpages in the UTCB (added with <a class="el" href="group__l4__ipc__api.html#gad2fef5fd3d173495d89c122883e909d6" title="Add a flexpage to be sent to the UTCB.">l4_sndfpage_add()</a> after <a class="el" href="group__l4__thread__api.html#ga6e0620f6b1119d84eac90adad52eabf8" title="vCPU return from event handler.">l4_thread_vcpu_resume_start()</a>) are unconditionally mapped into the user task configured in the vCPU state.</p>
|
|
<p>To resume into another address space, the capability to the target <a class="el" href="group__l4__task__api.html">Task</a> (or <a class="el" href="classL4_1_1Vm.html" title="Virtual machine host address space.">L4::Vm</a>) must be set in <a class="el" href="structl4__vcpu__state__t.html#ade963d62e21e225390c94f8e24a6bec1" title="User task to use.">l4_vcpu_state_t::user_task</a> together with <a class="el" href="group__l4__vcpu__api.html#gga648aa99b07fd60d941c5ebb25f746967a14d8e402739cff88ebf7e2810f306c4b" title="User task will be used.">L4_VCPU_F_USER_MODE</a>. The capability selector must have all lower bits clear (see <a class="el" href="group__l4__cap__api.html#ggafee0421c2fe0e5cfc59f17f16ea10879aba3e1dbcc462d842d56df9fc928e796b" title="Mask to get only the relevant bits of an l4_cap_idx_t.">L4_CAP_MASK</a>). The kernel adds the <a class="el" href="group__l4__ipc__api.html#ggaecfdf101783a02772b67b94793f3a915a5b352c0582c47836abceacaa0ecb8f2e" title="Send-phase flag.">L4_SYSF_SEND</a> flag there to indicate that the capability has been referenced in the kernel. Consecutive resumes will not reference the task capability again until all lower bits are cleared again. To release a task use a different task capability or use an invalid capability with the <a class="el" href="group__l4__ipc__api.html#ggaecfdf101783a02772b67b94793f3a915a21d07c1e159b0e4b2bd824ac052e4508" title="Reply flag.">L4_SYSF_REPLY</a> flag set.</p>
|
|
<p>The asynchronous IPC handling is described at <a class="el" href="group__l4__vcpu__api.html">vCPU API</a>.</p>
|
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__l4__thread__api.html#gaaf8bb1c28a014326dd381bc2d3478da8" title="Commit vCPU resume.">l4_thread_vcpu_resume_commit</a> </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00334">334</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
<p class="reference">References <a class="el" href="kobject_source.html#l00069">L4::Kobject::cap()</a>.</p>
|
|
<div id="dynsection-12" onclick="return dynsection.toggleVisibility(this)" class="dynheader closed" style="cursor:pointer;"><span class="dynarrow"><span class="arrowhead closed"></span></span>Here is the call graph for this function:</div>
|
|
<div id="dynsection-12-summary" class="dynsummary" style="display:block;">
|
|
</div>
|
|
<div id="dynsection-12-content" class="dyncontent" style="display:none;">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="classL4_1_1Thread_a72ce9179f1b083a65f0d4caa5b6aee67_cgraph.svg" width="368" height="51"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="acced76970ec38a15b2ec5a8c756545b4" name="acced76970ec38a15b2ec5a8c756545b4"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#acced76970ec38a15b2ec5a8c756545b4">◆ </a></span>vcpu_resume_start()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="structl4__msgtag__t.html">l4_msgtag_t</a> L4::Thread::vcpu_resume_start </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="group__l4__utcb__api.html#ga89be8a86d11c1d532b636cc2df1330fb">l4_utcb_t</a> *</td> <td class="paramname"><span class="paramname"><em>utcb</em></span><span class="paramdefsep"> = </span><span class="paramdefval"><a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644">l4_utcb</a>()</span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel noexcept">noexcept</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Resume from vCPU asynchronous IPC handler, start. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">utcb</td><td>UTCB to be used for this operation, shall be the UTCB of the calling thread. Defaults to <a class="el" href="group__l4__utcb__api.html#gadc099b4a59e1d99638c72c11a8c8b644" title="Get the UTCB address.">l4_utcb</a>.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Message tag to be used for <a class="el" href="group__l4__ipc__api.html#gad2fef5fd3d173495d89c122883e909d6" title="Add a flexpage to be sent to the UTCB.">l4_sndfpage_add()</a> and <a class="el" href="group__l4__thread__api.html#gaaf8bb1c28a014326dd381bc2d3478da8" title="Commit vCPU resume.">l4_thread_vcpu_resume_commit()</a></dd></dl>
|
|
<p>The vCPU resume functionality is split in multiple functions to allow the specification of additional send-flexpages using <a class="el" href="group__l4__ipc__api.html#gad2fef5fd3d173495d89c122883e909d6" title="Add a flexpage to be sent to the UTCB.">l4_sndfpage_add()</a>.</p>
|
|
<p>The asynchronous IPC handling is described at <a class="el" href="group__l4__vcpu__api.html">vCPU API</a>.</p>
|
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__l4__thread__api.html#ga6e0620f6b1119d84eac90adad52eabf8" title="vCPU return from event handler.">l4_thread_vcpu_resume_start</a> </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="sys_2thread_source.html#l00283">283</a> of file <a class="el" href="sys_2thread_source.html">thread</a>.</p>
|
|
|
|
</div>
|
|
</div>
|
|
<hr/>The documentation for this class was generated from the following file:<ul>
|
|
<li>l4/sys/<a class="el" href="sys_2thread_source.html">thread</a></li>
|
|
</ul>
|
|
</div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<div id="page-nav" class="page-nav-panel">
|
|
<div id="page-nav-resize-handle"></div>
|
|
<div id="page-nav-tree">
|
|
<div id="page-nav-contents">
|
|
</div><!-- page-nav-contents -->
|
|
</div><!-- page-nav-tree -->
|
|
</div><!-- page-nav -->
|
|
</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"><a href="namespaceL4.html">L4</a></li><li class="navelem"><a href="classL4_1_1Thread.html">Thread</a></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>
|