MAJOR MILESTONE: Successfully imported complete PikeOS 5.0 ecosystem from Virtual Machine 100 (devvm-arch) on gigabyte Proxmox server. Import Summary: - Source Code: 4.3GB, 63,441 files, 14,829 C/C++/H files - Documentation: 78MB, 37+ PDF manuals covering all PikeOS aspects - XSD Schemas: 1.8MB, 158 schema files for configuration/code generation - Test Framework: Complete TFW infrastructure in src/tfw/ Key Components: ✅ Multi-architecture kernels (ARM v7/v8, PowerPC e500/e500mc/e5500, x86_64) ✅ Core source libraries (libstand, ssw, p4ext) ✅ Complete test framework with executables, includes, libraries ✅ 37+ comprehensive PDF documentation (installation, development, platform manuals) ✅ 158 XSD schemas for Eclipse-based code generation and configuration ✅ AUTOSAR/MISRA safety-critical compliance foundation ✅ Hardware virtualization support ✅ Eclipse IDE project configuration (.project, .cproject) Documentation Categories: - Installation & User Guides (pikeos-installation-guide.pdf, user manuals) - Development References (kernel, driver, test framework manuals) - API & Programming (C/C++ environments, native API extensions) - Platform Manuals (ARM, PowerPC, x86 specific guides) - CDK Documentation (gcc, binutils, ld, cpp internals) - Release Notes (all components for 5.0.3) - Specialized Topics (hardware virtualization, POSIX compliance) Technical Achievements: ✅ Complete PikeOS 5.0 codebase across multiple processor architectures ✅ Safety-critical foundation with AUTOSAR/MISRA compliance ✅ Eclipse IDE integration with XSD-driven code generation pipeline ✅ Comprehensive test framework for validation and verification ✅ Complete documentation covering development, deployment, and optimization Extraction Method: - Source: VM 100 (devvm-arch) on gigabyte server (192.168.0.104) - Method: Direct LVM disk mount via losetup, rsync transfer - Size: Total 4.4GB extracted and organized Next Phases: - Phase 3: XSD Workflow Analysis (Day 8-10) - Phase 4: Safety Standards Compliance Documentation (Day 11-12) - Phase 5: Component Categorization (Day 13-14) - Phase 6: Aurelio Brain Test (Day 15) Co-Authored-By: Claude <noreply@anthropic.com>
641 lines
38 KiB
HTML
641 lines
38 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://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.8.13"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>Instrumon_data</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="resize.js"></script>
|
|
<script type="text/javascript" src="navtreedata.js"></script>
|
|
<script type="text/javascript" src="navtree.js"></script>
|
|
<script type="text/javascript">
|
|
$(document).ready(initResizable);
|
|
</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" />
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.8.13 -->
|
|
<script type="text/javascript">
|
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
</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');
|
|
$(document).ready(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">
|
|
$(document).ready(function(){initNavTree('group__instrumon__data.html','');});
|
|
</script>
|
|
<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">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="summary">
|
|
<a href="#nested-classes">Data Structures</a> |
|
|
<a href="#typedef-members">Typedefs</a> |
|
|
<a href="#func-members">Functions</a> </div>
|
|
<div class="headertitle">
|
|
<div class="title">Instrumon_data</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
|
|
<p>End of group instrumon_tmr </p>
|
|
<table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
|
|
Data Structures</h2></td></tr>
|
|
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structinstr__iov__s.html">instr_iov_s</a></td></tr>
|
|
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">I/O vector descriptor for scatter/gather data access. <a href="structinstr__iov__s.html#details">More...</a><br /></td></tr>
|
|
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
|
</table><table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
|
|
Typedefs</h2></td></tr>
|
|
<tr class="memitem:gafbd969e2bd78de3c3e4d8768196c9e11"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structinstr__iov__s.html">instr_iov_s</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#gafbd969e2bd78de3c3e4d8768196c9e11">instr_iov_t</a></td></tr>
|
|
<tr class="memdesc:gafbd969e2bd78de3c3e4d8768196c9e11"><td class="mdescLeft"> </td><td class="mdescRight">I/O vector descriptor for scatter/gather data access. <a href="#gafbd969e2bd78de3c3e4d8768196c9e11">More...</a><br /></td></tr>
|
|
<tr class="separator:gafbd969e2bd78de3c3e4d8768196c9e11"><td class="memSeparator" colspan="2"> </td></tr>
|
|
</table><table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
|
|
Functions</h2></td></tr>
|
|
<tr class="memitem:ga01f0dc1745a2379144ee1e0eb2d65b18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#ga01f0dc1745a2379144ee1e0eb2d65b18">instr_data_attach</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, const char *rx, const char *tx)</td></tr>
|
|
<tr class="memdesc:ga01f0dc1745a2379144ee1e0eb2d65b18"><td class="mdescLeft"> </td><td class="mdescRight">Attach to an Instrumon data connection. <a href="#ga01f0dc1745a2379144ee1e0eb2d65b18">More...</a><br /></td></tr>
|
|
<tr class="separator:ga01f0dc1745a2379144ee1e0eb2d65b18"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:gac1742996e3c6c27d842e657480298ed7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#gac1742996e3c6c27d842e657480298ed7">instr_data_detach</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle)</td></tr>
|
|
<tr class="memdesc:gac1742996e3c6c27d842e657480298ed7"><td class="mdescLeft"> </td><td class="mdescRight">Detach from an Instrumon data connection. <a href="#gac1742996e3c6c27d842e657480298ed7">More...</a><br /></td></tr>
|
|
<tr class="separator:gac1742996e3c6c27d842e657480298ed7"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:gaf1231a9dcbcd1c0dd47a06fa96fcede1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#gaf1231a9dcbcd1c0dd47a06fa96fcede1">instr_data_size</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, unsigned int *size)</td></tr>
|
|
<tr class="memdesc:gaf1231a9dcbcd1c0dd47a06fa96fcede1"><td class="mdescLeft"> </td><td class="mdescRight">Retrieve Instrumon data connection block size. <a href="#gaf1231a9dcbcd1c0dd47a06fa96fcede1">More...</a><br /></td></tr>
|
|
<tr class="separator:gaf1231a9dcbcd1c0dd47a06fa96fcede1"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:ga90686c69fc66be6eb9abf51b62c55ee2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#ga90686c69fc66be6eb9abf51b62c55ee2">instr_data_setbuf</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, void *buf)</td></tr>
|
|
<tr class="memdesc:ga90686c69fc66be6eb9abf51b62c55ee2"><td class="mdescLeft"> </td><td class="mdescRight">Set Instrumon data connection buffer. <a href="#ga90686c69fc66be6eb9abf51b62c55ee2">More...</a><br /></td></tr>
|
|
<tr class="separator:ga90686c69fc66be6eb9abf51b62c55ee2"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:ga0efbb705e9c3f736dccb798e586eb406"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#ga0efbb705e9c3f736dccb798e586eb406">instr_data_settimeout</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, int read_to, int write_to)</td></tr>
|
|
<tr class="memdesc:ga0efbb705e9c3f736dccb798e586eb406"><td class="mdescLeft"> </td><td class="mdescRight">Set Instrumon data communication timeouts. <a href="#ga0efbb705e9c3f736dccb798e586eb406">More...</a><br /></td></tr>
|
|
<tr class="separator:ga0efbb705e9c3f736dccb798e586eb406"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:gac0868c0aa7b4f4f84d8c3afd36604804"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#gac0868c0aa7b4f4f84d8c3afd36604804">instr_data_read</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, <a class="el" href="instrumon__api_8h.html#a785a161461ee392fda2fe7887a32dbed">instr_ptr_t</a> addr, unsigned int size, void *data)</td></tr>
|
|
<tr class="memdesc:gac0868c0aa7b4f4f84d8c3afd36604804"><td class="mdescLeft"> </td><td class="mdescRight">Read data from monitored application. <a href="#gac0868c0aa7b4f4f84d8c3afd36604804">More...</a><br /></td></tr>
|
|
<tr class="separator:gac0868c0aa7b4f4f84d8c3afd36604804"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:ga4b077af9008912c9ad551d680d7401f5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#ga4b077af9008912c9ad551d680d7401f5">instr_data_write</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, <a class="el" href="instrumon__api_8h.html#a785a161461ee392fda2fe7887a32dbed">instr_ptr_t</a> addr, unsigned int size, const void *data)</td></tr>
|
|
<tr class="memdesc:ga4b077af9008912c9ad551d680d7401f5"><td class="mdescLeft"> </td><td class="mdescRight">Write data to monitored application. <a href="#ga4b077af9008912c9ad551d680d7401f5">More...</a><br /></td></tr>
|
|
<tr class="separator:ga4b077af9008912c9ad551d680d7401f5"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:ga5e58306e7608437942bd669e27c4eb3b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#ga5e58306e7608437942bd669e27c4eb3b">instr_sg_data_read</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, const <a class="el" href="group__instrumon__data.html#gafbd969e2bd78de3c3e4d8768196c9e11">instr_iov_t</a> *iov, unsigned int iovcnt)</td></tr>
|
|
<tr class="memdesc:ga5e58306e7608437942bd669e27c4eb3b"><td class="mdescLeft"> </td><td class="mdescRight">Perform a scatter/gather data read from monitored application. <a href="#ga5e58306e7608437942bd669e27c4eb3b">More...</a><br /></td></tr>
|
|
<tr class="separator:ga5e58306e7608437942bd669e27c4eb3b"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:ga433d634f25732142bd6abb41e3ddb325"><td class="memItemLeft" align="right" valign="top"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__instrumon__data.html#ga433d634f25732142bd6abb41e3ddb325">instr_sg_data_write</a> (<a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> handle, const <a class="el" href="group__instrumon__data.html#gafbd969e2bd78de3c3e4d8768196c9e11">instr_iov_t</a> *iov, unsigned int iovcnt)</td></tr>
|
|
<tr class="memdesc:ga433d634f25732142bd6abb41e3ddb325"><td class="mdescLeft"> </td><td class="mdescRight">Perform a scatter/gather data write to monitored application. <a href="#ga433d634f25732142bd6abb41e3ddb325">More...</a><br /></td></tr>
|
|
<tr class="separator:ga433d634f25732142bd6abb41e3ddb325"><td class="memSeparator" colspan="2"> </td></tr>
|
|
</table>
|
|
<h2 class="groupheader">Typedef Documentation</h2>
|
|
<a id="gafbd969e2bd78de3c3e4d8768196c9e11"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#gafbd969e2bd78de3c3e4d8768196c9e11">◆ </a></span>instr_iov_t</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">typedef struct <a class="el" href="structinstr__iov__s.html">instr_iov_s</a> <a class="el" href="group__instrumon__data.html#gafbd969e2bd78de3c3e4d8768196c9e11">instr_iov_t</a></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>I/O vector descriptor for scatter/gather data access. </p>
|
|
<p>Information on accessed data using scatter/gather functions <a class="el" href="group__instrumon__data.html#ga5e58306e7608437942bd669e27c4eb3b" title="Perform a scatter/gather data read from monitored application. ">instr_sg_data_read()</a> and <a class="el" href="group__instrumon__data.html#ga433d634f25732142bd6abb41e3ddb325" title="Perform a scatter/gather data write to monitored application. ">instr_sg_data_write()</a>. </p>
|
|
|
|
</div>
|
|
</div>
|
|
<h2 class="groupheader">Function Documentation</h2>
|
|
<a id="ga01f0dc1745a2379144ee1e0eb2d65b18"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ga01f0dc1745a2379144ee1e0eb2d65b18">◆ </a></span>instr_data_attach()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_data_attach </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const char * </td>
|
|
<td class="paramname"><em>rx</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const char * </td>
|
|
<td class="paramname"><em>tx</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Attach to an Instrumon data connection. </p>
|
|
<p><br />
|
|
This function initializes communication paths with the monitored application for Instrumon data access. The communication is implemented using two queueing ports passed as parameters <em>rx</em> and <em>tx</em>. <br />
|
|
Timeouts for queueing port operations are set to infinite timeout, they can be modified using <a class="el" href="group__instrumon__data.html#ga0efbb705e9c3f736dccb798e586eb406" title="Set Instrumon data communication timeouts. ">instr_data_settimeout()</a>. <br />
|
|
Note that this function requires a successfully initialized Instrumon handle. </p><dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid port names. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL_CONFIG</td><td>Ports could not be opened or have incompatible configuration. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">rx</td><td>Name of queueing port connected to the monitored applications' Instrumon output port. Note that this is not the path to the port but its name. </td></tr>
|
|
<tr><td class="paramname">tx</td><td>Name of queueing port connected to the monitored applications' Instrumon input port. Note that this is not the path to the port but its name. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="gac1742996e3c6c27d842e657480298ed7"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#gac1742996e3c6c27d842e657480298ed7">◆ </a></span>instr_data_detach()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_data_detach </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Detach from an Instrumon data connection. </p>
|
|
<p><br />
|
|
This function detaches from the communication paths used for Instrumon data access. Upon return of this function the Instrumon handle is still valid for Instrumon image access. </p><dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="gaf1231a9dcbcd1c0dd47a06fa96fcede1"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#gaf1231a9dcbcd1c0dd47a06fa96fcede1">◆ </a></span>instr_data_size()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_data_size </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">unsigned int * </td>
|
|
<td class="paramname"><em>size</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Retrieve Instrumon data connection block size. </p>
|
|
<p><br />
|
|
This function returns the configured message size for the communication path used for Instrumon data access in <em>size</em>. </p><dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle or handle has not been initialized for data access. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">size</td><td>Location to return queueing port data size in. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="ga90686c69fc66be6eb9abf51b62c55ee2"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ga90686c69fc66be6eb9abf51b62c55ee2">◆ </a></span>instr_data_setbuf()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_data_setbuf </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">void * </td>
|
|
<td class="paramname"><em>buf</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Set Instrumon data connection buffer. </p>
|
|
<p><br />
|
|
This function specifies the data buffer to be used for Instrumon data access. Note that there is only one buffer so the data access API is not reentrant and thus not thread safe. </p><dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle or handle has not been initialized for data access. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">buf</td><td>Data buffer for Instrumon data access. The buffer must be capable to hold at least the return value of <a class="el" href="group__instrumon__data.html#gaf1231a9dcbcd1c0dd47a06fa96fcede1" title="Retrieve Instrumon data connection block size. ">instr_data_size()</a> bytes. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="ga0efbb705e9c3f736dccb798e586eb406"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ga0efbb705e9c3f736dccb798e586eb406">◆ </a></span>instr_data_settimeout()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_data_settimeout </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int </td>
|
|
<td class="paramname"><em>read_to</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int </td>
|
|
<td class="paramname"><em>write_to</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Set Instrumon data communication timeouts. </p>
|
|
<p><br />
|
|
This function specifies timeouts to be used for queuing port operations in Instrumon data access operations. <br />
|
|
Note that on PikeOS/Linux only infinite and zero timeouts are supported. </p><dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle or handle has not been initialized for data access. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">read_to</td><td>Timeout for queueing port read operations in seconds. A negative value specifies and infinite timeout, a value of zero specifies no timeout (polling). </td></tr>
|
|
<tr><td class="paramname">write_to</td><td>Timeout for queueing port write operations in seconds. A negative value specifies and infinite timeout, a value of zero specifies no timeout (polling). </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="gac0868c0aa7b4f4f84d8c3afd36604804"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#gac0868c0aa7b4f4f84d8c3afd36604804">◆ </a></span>instr_data_read()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_data_read </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a785a161461ee392fda2fe7887a32dbed">instr_ptr_t</a> </td>
|
|
<td class="paramname"><em>addr</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">unsigned int </td>
|
|
<td class="paramname"><em>size</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">void * </td>
|
|
<td class="paramname"><em>data</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Read data from monitored application. </p>
|
|
<p><br />
|
|
Read <em>size</em> bytes starting at address <em>addr</em> from monitored application and store result in buffer pointed to by <em>data</em>. </p><dl class="section note"><dt>Note</dt><dd>The Instrumon data access API is not reentrant. </dd></dl>
|
|
<dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle or handle has not been initialized for data access. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Data amount exceeds message size configured for communication path. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_BADADDR</td><td>Instrumon data buffer not set with <a class="el" href="group__instrumon__data.html#ga90686c69fc66be6eb9abf51b62c55ee2" title="Set Instrumon data connection buffer. ">instr_data_setbuf()</a>. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_SEQUENCE</td><td>Bad sequence number received from monitored application. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_AGAIN</td><td>Timeout occurred during data transfer. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_FAIL</td><td>Received negative acknowledgement from monitored application, eg due to a bad address or page fault during memory access. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">addr</td><td>Address in the target application to read from. </td></tr>
|
|
<tr><td class="paramname">size</td><td>Amount of bytes to read. </td></tr>
|
|
<tr><td class="paramname">data</td><td>Buffer where to store the read data. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="ga4b077af9008912c9ad551d680d7401f5"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ga4b077af9008912c9ad551d680d7401f5">◆ </a></span>instr_data_write()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_data_write </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a785a161461ee392fda2fe7887a32dbed">instr_ptr_t</a> </td>
|
|
<td class="paramname"><em>addr</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">unsigned int </td>
|
|
<td class="paramname"><em>size</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const void * </td>
|
|
<td class="paramname"><em>data</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Write data to monitored application. </p>
|
|
<p><br />
|
|
Write <em>size</em> bytes starting at address <em>addr</em> in monitored application with data from buffer pointed to by <em>data</em>. </p><dl class="section note"><dt>Note</dt><dd>The Instrumon data access API is not reentrant. </dd></dl>
|
|
<dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle or handle has not been initialized for data access. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Data amount exceeds message size configured for communication path. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_BADADDR</td><td>Instrumon data buffer not set with <a class="el" href="group__instrumon__data.html#ga90686c69fc66be6eb9abf51b62c55ee2" title="Set Instrumon data connection buffer. ">instr_data_setbuf()</a>. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_SEQUENCE</td><td>Bad sequence number received from monitored application. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_AGAIN</td><td>Timeout occurred during data transfer. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_FAIL</td><td>Received negative acknowledgement from monitored application, eg due to a bad address or page fault during memory access or because the data access device driver was installed in read-only mode. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">addr</td><td>Address in the target application to write to. </td></tr>
|
|
<tr><td class="paramname">size</td><td>Amount of bytes to read. </td></tr>
|
|
<tr><td class="paramname">data</td><td>Data to be written. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="ga5e58306e7608437942bd669e27c4eb3b"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ga5e58306e7608437942bd669e27c4eb3b">◆ </a></span>instr_sg_data_read()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_sg_data_read </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const <a class="el" href="group__instrumon__data.html#gafbd969e2bd78de3c3e4d8768196c9e11">instr_iov_t</a> * </td>
|
|
<td class="paramname"><em>iov</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">unsigned int </td>
|
|
<td class="paramname"><em>iovcnt</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Perform a scatter/gather data read from monitored application. </p>
|
|
<p><br />
|
|
Parameter <em>iov</em> is an array with <em>iovcnt</em> elements. For each element in the array, the function will read <em>instr_iov_t:size</em> bytes from address <em>instr_iov_t:addr</em> in the monitored application and store the data to <em>instr_iov_t:data</em>. </p><dl class="section note"><dt>Note</dt><dd>The Instrumon data access API is not reentrant. </dd></dl>
|
|
<dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle or handle has not been initialized for data access. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>The value <em>iovcnt</em> exceeds INSTR_SG_IOV_MAX. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>The data amount of all elements in array <em>iov</em> exceeds message size configured for communication path. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_BADADDR</td><td>Instrumon data buffer not set with <a class="el" href="group__instrumon__data.html#ga90686c69fc66be6eb9abf51b62c55ee2" title="Set Instrumon data connection buffer. ">instr_data_setbuf()</a>. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_SEQUENCE</td><td>Bad sequence number received from monitored application. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_AGAIN</td><td>Timeout occurred during data transfer. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_FAIL</td><td>Received negative acknowledgement from monitored application, eg due to a bad address or page fault during memory access. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">iov</td><td>I/O vector. </td></tr>
|
|
<tr><td class="paramname">iovcnt</td><td>Number of elements in the I/O vector <em>iov</em>. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="ga433d634f25732142bd6abb41e3ddb325"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ga433d634f25732142bd6abb41e3ddb325">◆ </a></span>instr_sg_data_write()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="instrumon__api_8h.html#adc67de54a02c9e862daac18598cf54a8">instr_e_t</a> instr_sg_data_write </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="instrumon__api_8h.html#a0396bf2339512322562c92b6ca58350f">instr_t</a> </td>
|
|
<td class="paramname"><em>handle</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const <a class="el" href="group__instrumon__data.html#gafbd969e2bd78de3c3e4d8768196c9e11">instr_iov_t</a> * </td>
|
|
<td class="paramname"><em>iov</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">unsigned int </td>
|
|
<td class="paramname"><em>iovcnt</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Perform a scatter/gather data write to monitored application. </p>
|
|
<p><br />
|
|
Parameter <em>iov</em> is an array with <em>iovcnt</em> elements. For each element in the array, the function will write <em>instr_iov_t:size</em> bytes from <em>instr_iov_t:data</em> to the monitored application starting at address <em>instr_iov_t:addr</em>. </p><dl class="section note"><dt>Note</dt><dd>The Instrumon data access API is not reentrant. </dd></dl>
|
|
<dl class="section return"><dt>Returns</dt><dd></dd></dl>
|
|
<dl class="retval"><dt>Return values</dt><dd>
|
|
<table class="retval">
|
|
<tr><td class="paramname">INSTR_E_OK</td><td>Upon successful completion. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>Invalid Instrumon handle or handle has not been initialized for data access. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>The value <em>iovcnt</em> exceeds INSTR_SG_IOV_MAX. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_INVAL</td><td>The data amount of all elements in array <em>iov</em> exceeds message size configured for communication path. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_BADADDR</td><td>Instrumon data buffer not set with <a class="el" href="group__instrumon__data.html#ga90686c69fc66be6eb9abf51b62c55ee2" title="Set Instrumon data connection buffer. ">instr_data_setbuf()</a>. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_SEQUENCE</td><td>Bad sequence number received from monitored application. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_AGAIN</td><td>Timeout occurred during data transfer. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_FAIL</td><td>Received negative acknowledgement from monitored application, due to a forbidden write access in the data access device driver, unsupported request size or due to missing memory mapping with write access for all elements in the <em>iov</em>. The memory of monitored application is not changed when this error is returned. </td></tr>
|
|
<tr><td class="paramname">INSTR_E_WRITE</td><td>Received negative acknowledgement from monitored application that is send if memory mapping is changed during the writing data and the write operation fails. The memory of monitored application is in the inconsistent state when this error is returned. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">handle</td><td>Instrumon handle. </td></tr>
|
|
<tr><td class="paramname">iov</td><td>I/O vector. </td></tr>
|
|
<tr><td class="paramname">iovcnt</td><td>Number of elements in the I/O vector <em>iov</em>. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
|
|
</div>
|
|
</div>
|
|
</div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<!-- start footer part -->
|
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
|
<ul>
|
|
<li class="footer">(C) Copyright SYSGO AG</li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|