diff options
author | hunt <hunt> | 2005-04-07 15:17:29 +0000 |
---|---|---|
committer | hunt <hunt> | 2005-04-07 15:17:29 +0000 |
commit | 3d4bc8bea6b45893bd4b49f44df26bd602b4cba5 (patch) | |
tree | bae3fb1bc5fcbd7906574b6902c649b203274a3f /runtime/docs | |
parent | 6e01db401be4a19e6d81d9955d055e2f4e1b6aea (diff) | |
download | systemtap-steved-3d4bc8bea6b45893bd4b49f44df26bd602b4cba5.tar.gz systemtap-steved-3d4bc8bea6b45893bd4b49f44df26bd602b4cba5.tar.xz systemtap-steved-3d4bc8bea6b45893bd4b49f44df26bd602b4cba5.zip |
Update to use relayfs.
Diffstat (limited to 'runtime/docs')
-rw-r--r-- | runtime/docs/html/dir_000003.html | 2 | ||||
-rw-r--r-- | runtime/docs/html/dir_000004.html | 2 | ||||
-rw-r--r-- | runtime/docs/html/dtr_8mod_8c-source.html | 63 | ||||
-rw-r--r-- | runtime/docs/html/files.html | 2 | ||||
-rw-r--r-- | runtime/docs/html/globals.html | 3 | ||||
-rw-r--r-- | runtime/docs/html/globals_func.html | 3 | ||||
-rw-r--r-- | runtime/docs/html/group__scbuf.html | 70 | ||||
-rw-r--r-- | runtime/docs/html/group__stack.html | 51 | ||||
-rw-r--r-- | runtime/docs/html/group__sym.html | 2 | ||||
-rw-r--r-- | runtime/docs/html/kprobe__where__funct_8c-source.html | 4 | ||||
-rw-r--r-- | runtime/docs/html/scbuf_8c-source.html | 164 | ||||
-rw-r--r-- | runtime/docs/html/stack_8c-source.html | 43 | ||||
-rw-r--r-- | runtime/docs/html/stack_8c.html | 4 | ||||
-rw-r--r-- | runtime/docs/html/structmap__root.html | 2 | ||||
-rw-r--r-- | runtime/docs/html/test4_2dtr_8c-source.html | 371 | ||||
-rw-r--r-- | runtime/docs/html/todo.html | 7 |
16 files changed, 521 insertions, 272 deletions
diff --git a/runtime/docs/html/dir_000003.html b/runtime/docs/html/dir_000003.html index 173623b3..b9e20e19 100644 --- a/runtime/docs/html/dir_000003.html +++ b/runtime/docs/html/dir_000003.html @@ -13,6 +13,8 @@ <tr><td colspan="2"><br><h2>Files</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">file </td><td class="memItemRight" valign="bottom"><b>dtr.c</b> <a href="test4_2dtr_8c-source.html">[code]</a></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">file </td><td class="memItemRight" valign="bottom"><b>dtr.mod.c</b> <a href="dtr_8mod_8c-source.html">[code]</a></td></tr> + <tr><td class="memItemLeft" nowrap align="right" valign="top">file </td><td class="memItemRight" valign="bottom"><b>nrec.c</b> <a href="nrec_8c-source.html">[code]</a></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">file </td><td class="memItemRight" valign="bottom"><b>README</b> <a href="probes_2test4_2README-source.html">[code]</a></td></tr> diff --git a/runtime/docs/html/dir_000004.html b/runtime/docs/html/dir_000004.html index f2294de2..d3e72861 100644 --- a/runtime/docs/html/dir_000004.html +++ b/runtime/docs/html/dir_000004.html @@ -13,6 +13,8 @@ <tr><td colspan="2"><br><h2>Files</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">file </td><td class="memItemRight" valign="bottom"><b>kprobe_where_funct.c</b> <a href="kprobe__where__funct_8c-source.html">[code]</a></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">file </td><td class="memItemRight" valign="bottom"><b>kprobe_where_funct.mod.c</b> <a href="kprobe__where__funct_8mod_8c-source.html">[code]</a></td></tr> + <tr><td class="memItemLeft" nowrap align="right" valign="top">file </td><td class="memItemRight" valign="bottom"><b>README</b> <a href="probes_2where__func_2README-source.html">[code]</a></td></tr> </table> diff --git a/runtime/docs/html/dtr_8mod_8c-source.html b/runtime/docs/html/dtr_8mod_8c-source.html index 1deec9c6..e497c5c4 100644 --- a/runtime/docs/html/dtr_8mod_8c-source.html +++ b/runtime/docs/html/dtr_8mod_8c-source.html @@ -3,7 +3,7 @@ <title>SystemTap: probes/test4/dtr.mod.c Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> -<!-- Generated by Doxygen 1.3.9.1 --> +<!-- Generated by Doxygen 1.4.1 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related Pages</a></div> <div class="nav"> <a class="el" href="dir_000000.html">probes</a> / <a class="el" href="dir_000003.html">test4</a></div> @@ -27,30 +27,39 @@ 00018 __attribute_used__ 00019 __attribute__((section("__versions"))) = { 00020 { 0x506abef7, <span class="stringliteral">"struct_module"</span> }, -00021 { 0xb240ca65, <span class="stringliteral">"schedule_work"</span> }, -00022 { 0x1b9aca3f, <span class="stringliteral">"jprobe_return"</span> }, -00023 { 0xe3b0192b, <span class="stringliteral">"vscnprintf"</span> }, -00024 { 0x45e5f47f, <span class="stringliteral">"register_kprobe"</span> }, -00025 { 0x1e736243, <span class="stringliteral">"unregister_kprobe"</span> }, -00026 { 0xdd03a51e, <span class="stringliteral">"register_jprobe"</span> }, -00027 { 0x49a83d3a, <span class="stringliteral">"unregister_jprobe"</span> }, -00028 { 0x3fa03a97, <span class="stringliteral">"memset"</span> }, -00029 { 0xc16fe12d, <span class="stringliteral">"__memcpy"</span> }, -00030 { 0xe914e41e, <span class="stringliteral">"strcpy"</span> }, -00031 { 0xe2d5255a, <span class="stringliteral">"strcmp"</span> }, -00032 { 0x2fd1d81c, <span class="stringliteral">"vfree"</span> }, -00033 { 0x37a0cba, <span class="stringliteral">"kfree"</span> }, -00034 { 0xd6ee688f, <span class="stringliteral">"vmalloc"</span> }, -00035 { 0x8ce16b3f, <span class="stringliteral">"__kmalloc"</span> }, -00036 { 0x8e3c9cc3, <span class="stringliteral">"vprintk"</span> }, -00037 { 0xdd132261, <span class="stringliteral">"printk"</span> }, -00038 }; -00039 -00040 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> __module_depends[] -00041 __attribute_used__ -00042 __attribute__((section(<span class="stringliteral">".modinfo"</span>))) = -00043 <span class="stringliteral">"depends="</span>; -00044 -00045 -00046 MODULE_INFO(srcversion, <span class="stringliteral">"3CC4F9300C5C4E353BD2804"</span>); +00021 { 0xfcdec747, <span class="stringliteral">"sock_release"</span> }, +00022 { 0x8968634b, <span class="stringliteral">"netlink_kernel_create"</span> }, +00023 { 0xb240ca65, <span class="stringliteral">"schedule_work"</span> }, +00024 { 0x1b9aca3f, <span class="stringliteral">"jprobe_return"</span> }, +00025 { 0x757b6858, <span class="stringliteral">"skb_dequeue"</span> }, +00026 { 0xd4aed67a, <span class="stringliteral">"netlink_ack"</span> }, +00027 { 0x5fc0695e, <span class="stringliteral">"__kfree_skb"</span> }, +00028 { 0xaa1449d7, <span class="stringliteral">"netlink_unicast"</span> }, +00029 { 0x3958414f, <span class="stringliteral">"skb_over_panic"</span> }, +00030 { 0x559dbbb8, <span class="stringliteral">"alloc_skb"</span> }, +00031 { 0x7ec9bfbc, <span class="stringliteral">"strncpy"</span> }, +00032 { 0xe3b0192b, <span class="stringliteral">"vscnprintf"</span> }, +00033 { 0x45e5f47f, <span class="stringliteral">"register_kprobe"</span> }, +00034 { 0x1e736243, <span class="stringliteral">"unregister_kprobe"</span> }, +00035 { 0xdd03a51e, <span class="stringliteral">"register_jprobe"</span> }, +00036 { 0x49a83d3a, <span class="stringliteral">"unregister_jprobe"</span> }, +00037 { 0x3fa03a97, <span class="stringliteral">"memset"</span> }, +00038 { 0xc16fe12d, <span class="stringliteral">"__memcpy"</span> }, +00039 { 0xe914e41e, <span class="stringliteral">"strcpy"</span> }, +00040 { 0xe2d5255a, <span class="stringliteral">"strcmp"</span> }, +00041 { 0x2fd1d81c, <span class="stringliteral">"vfree"</span> }, +00042 { 0x37a0cba, <span class="stringliteral">"kfree"</span> }, +00043 { 0xd6ee688f, <span class="stringliteral">"vmalloc"</span> }, +00044 { 0x8ce16b3f, <span class="stringliteral">"__kmalloc"</span> }, +00045 { 0x8e3c9cc3, <span class="stringliteral">"vprintk"</span> }, +00046 { 0xdd132261, <span class="stringliteral">"printk"</span> }, +00047 }; +00048 +00049 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> __module_depends[] +00050 __attribute_used__ +00051 __attribute__((section(<span class="stringliteral">".modinfo"</span>))) = +00052 <span class="stringliteral">"depends="</span>; +00053 +00054 +00055 MODULE_INFO(srcversion, <span class="stringliteral">"01D3B50188E5E952DA9FD12"</span>); </pre></div></body></html> diff --git a/runtime/docs/html/files.html b/runtime/docs/html/files.html index ef853864..f61591f6 100644 --- a/runtime/docs/html/files.html +++ b/runtime/docs/html/files.html @@ -24,9 +24,11 @@ <tr><td class="indexkey">probes/tasklet/<b>README</b> <a href="probes_2tasklet_2README-source.html">[code]</a></td><td class="indexvalue"></td></tr> <tr><td class="indexkey">probes/tasklet/<b>stp_tasklet.c</b> <a href="stp__tasklet_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr> <tr><td class="indexkey">probes/test4/<b>dtr.c</b> <a href="test4_2dtr_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr> + <tr><td class="indexkey">probes/test4/<b>dtr.mod.c</b> <a href="dtr_8mod_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr> <tr><td class="indexkey">probes/test4/<b>nrec.c</b> <a href="nrec_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr> <tr><td class="indexkey">probes/test4/<b>README</b> <a href="probes_2test4_2README-source.html">[code]</a></td><td class="indexvalue"></td></tr> <tr><td class="indexkey">probes/where_func/<b>kprobe_where_funct.c</b> <a href="kprobe__where__funct_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr> + <tr><td class="indexkey">probes/where_func/<b>kprobe_where_funct.mod.c</b> <a href="kprobe__where__funct_8mod_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr> <tr><td class="indexkey">probes/where_func/<b>README</b> <a href="probes_2where__func_2README-source.html">[code]</a></td><td class="indexvalue"></td></tr> </table> </body></html> diff --git a/runtime/docs/html/globals.html b/runtime/docs/html/globals.html index 74f0f2e2..7ac847b4 100644 --- a/runtime/docs/html/globals.html +++ b/runtime/docs/html/globals.html @@ -50,7 +50,8 @@ Here is a list of all documented functions, variables, defines, enums, and typed : <a class="el" href="group__io.html#ga2">io.c</a><li>_stp_register_jprobes() : <a class="el" href="probes_8c.html#a2">probes.c</a><li>_stp_register_kprobes() : <a class="el" href="probes_8c.html#a4">probes.c</a><li>_stp_ret_addr() -: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_strncpy_from_user() +: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_stack_print() +: <a class="el" href="group__stack.html#ga6">stack.c</a><li>_stp_strncpy_from_user() : <a class="el" href="group__copy.html#ga0">copy.c</a><li>_stp_unregister_jprobes() : <a class="el" href="probes_8c.html#a1">probes.c</a><li>_stp_unregister_kprobes() : <a class="el" href="probes_8c.html#a3">probes.c</a><li>_stp_valloc() diff --git a/runtime/docs/html/globals_func.html b/runtime/docs/html/globals_func.html index 051cf88c..1562f9d2 100644 --- a/runtime/docs/html/globals_func.html +++ b/runtime/docs/html/globals_func.html @@ -46,7 +46,8 @@ : <a class="el" href="group__io.html#ga2">io.c</a><li>_stp_register_jprobes() : <a class="el" href="probes_8c.html#a2">probes.c</a><li>_stp_register_kprobes() : <a class="el" href="probes_8c.html#a4">probes.c</a><li>_stp_ret_addr() -: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_strncpy_from_user() +: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_stack_print() +: <a class="el" href="group__stack.html#ga6">stack.c</a><li>_stp_strncpy_from_user() : <a class="el" href="group__copy.html#ga0">copy.c</a><li>_stp_unregister_jprobes() : <a class="el" href="probes_8c.html#a1">probes.c</a><li>_stp_unregister_kprobes() : <a class="el" href="probes_8c.html#a3">probes.c</a><li>_stp_valloc() diff --git a/runtime/docs/html/group__scbuf.html b/runtime/docs/html/group__scbuf.html index c5e0d6e0..89033737 100644 --- a/runtime/docs/html/group__scbuf.html +++ b/runtime/docs/html/group__scbuf.html @@ -17,29 +17,26 @@ <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga2">_stp_sprint</a> (const char *fmt,...)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Sprint into the scratch buffer. <a href="#ga2"></a><br></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga3" doxytag="scbuf::_stp_sprint_str"></a> -void </td><td class="memItemRight" valign="bottom"><b>_stp_sprint_str</b> (const char *str)</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga3">_stp_sprint_str</a> (const char *str)</td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> (void)</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Write a string into the scratch buffer. <a href="#ga3"></a><br></td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> (void)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the scratch buffer. <a href="#ga4"></a><br></td></tr> -<tr><td colspan="2"><br><h2>Variables</h2></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga0" doxytag="scbuf::_stp_scbuf"></a> -char </td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga0">_stp_scbuf</a> [8191+1]</td></tr> - -<tr><td class="mdescLeft"> </td><td class="mdescRight">Scratch buffer for printing, building strings, etc. <br></td></tr> </table> <hr><a name="_details"></a><h2>Detailed Description</h2> Scratch Buffer Functions. <p> -The scratch buffer is for collecting output before storing in a map, printing, etc. This is a per-cpu static buffer. It is necessary because of the limited stack space available in the kernel. <hr><h2>Function Documentation</h2> +The scratch buffer is for collecting output before storing in a map, printing, etc. This is a per-cpu static buffer. It is necessary because of the limited stack space available in the kernel. <p> +<dl compact><dt><b><a class="el" href="todo.html#_todo000008">Todo:</a></b></dt><dd>Need careful review of these to insure safety.</dd></dl> +<hr><h2>Function Documentation</h2> <a class="anchor" name="ga4" doxytag="scbuf.c::_stp_scbuf_clear"></a><p> <table class="mdTable" cellpadding="2" cellspacing="0"> <tr> <td class="mdRow"> <table cellpadding="0" cellspacing="0" border="0"> <tr> - <td class="md" nowrap valign="top">void _stp_scbuf_clear </td> + <td class="md" nowrap valign="top">char* _stp_scbuf_clear </td> <td class="md" valign="top">( </td> <td class="md" nowrap valign="top">void </td> <td class="mdname1" valign="top" nowrap> </td> @@ -60,11 +57,12 @@ The scratch buffer is for collecting output before storing in a map, printing, e <p> Clear the scratch buffer. <p> -Output from <a class="el" href="group__scbuf.html#ga2">_stp_sprint()</a> will accumulate in the buffer until this is called. +This function should be called before anything is written to the scratch buffer. Output will accumulate in the buffer until this function is called again. <dl compact><dt><b>Returns:</b></dt><dd>A pointer to the buffer. </dd></dl> + <p> -Definition at line <a class="el" href="scbuf_8c-source.html#l00059">59</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>. +Definition at line <a class="el" href="scbuf_8c-source.html#l00074">74</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>. <p> -References <a class="el" href="scbuf_8c-source.html#l00018">_stp_scbuf</a>, and <a class="el" href="scbuf_8c-source.html#l00015">STP_BUF_LEN</a>. </td> +References <a class="el" href="scbuf_8c-source.html#l00017">STP_BUF_LEN</a>. </td> </tr> </table> <a class="anchor" name="ga2" doxytag="scbuf.c::_stp_sprint"></a><p> @@ -103,7 +101,7 @@ References <a class="el" href="scbuf_8c-source.html#l00018">_stp_scbuf</a>, and <p> Sprint into the scratch buffer. <p> -Like printf, except output goes into <a class="el" href="group__scbuf.html#ga0">_stp_scbuf</a>, which will contain the null-terminated output. Safe because overflowing <a class="el" href="group__scbuf.html#ga0">_stp_scbuf</a> is not allowed. Size is limited by length of scratch buffer, STP_BUF_LEN.<p> +Like printf, except output goes into a global scratch buffer which will contain the null-terminated output. Safe because overflowing the buffer is not allowed. Size is limited by length of scratch buffer, STP_BUF_LEN.<p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>fmt</em> </td><td>A printf-style format string followed by a variable number of args. </td></tr> @@ -112,11 +110,51 @@ Like printf, except output goes into <a class="el" href="group__scbuf.html#ga0"> <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> </dd></dl> <p> -Definition at line <a class="el" href="scbuf_8c-source.html#l00032">32</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>. +Definition at line <a class="el" href="scbuf_8c-source.html#l00034">34</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>. <p> -References <a class="el" href="scbuf_8c-source.html#l00018">_stp_scbuf</a>, and <a class="el" href="scbuf_8c-source.html#l00015">STP_BUF_LEN</a>. +References <a class="el" href="scbuf_8c-source.html#l00017">STP_BUF_LEN</a>. <p> Referenced by <a class="el" href="sym_8c-source.html#l00045">_stp_symbol_sprint()</a>. </td> </tr> </table> +<a class="anchor" name="ga3" doxytag="scbuf.c::_stp_sprint_str"></a><p> +<table class="mdTable" cellpadding="2" cellspacing="0"> + <tr> + <td class="mdRow"> + <table cellpadding="0" cellspacing="0" border="0"> + <tr> + <td class="md" nowrap valign="top">void _stp_sprint_str </td> + <td class="md" valign="top">( </td> + <td class="md" nowrap valign="top">const char * </td> + <td class="mdname1" valign="top" nowrap> <em>str</em> </td> + <td class="md" valign="top"> ) </td> + <td class="md" nowrap></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </td> + <td> + +<p> +Write a string into the scratch buffer. +<p> +Copies a string into a global scratch buffer. Safe because overflowing the buffer is not allowed. Size is limited by length of scratch buffer, STP_BUF_LEN. This is more efficient than using <a class="el" href="group__scbuf.html#ga2">_stp_sprint()</a>.<p> +<dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"></td><td valign="top"><em>str</em> </td><td>A string. </td></tr> + </table> +</dl> + +<p> +Definition at line <a class="el" href="scbuf_8c-source.html#l00056">56</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>. +<p> +References <a class="el" href="scbuf_8c-source.html#l00017">STP_BUF_LEN</a>. </td> + </tr> +</table> </body></html> diff --git a/runtime/docs/html/group__stack.html b/runtime/docs/html/group__stack.html index bf112d0a..159a529f 100644 --- a/runtime/docs/html/group__stack.html +++ b/runtime/docs/html/group__stack.html @@ -8,11 +8,58 @@ <h1>Stack Tracing Functions</h1><table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> <tr><td colspan="2"><br><h2>Functions</h2></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga6" doxytag="stack::_stp_stack_print"></a> -void </td><td class="memItemRight" valign="bottom"><b>_stp_stack_print</b> (int verbose, int levels)</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__stack.html#ga6">_stp_stack_print</a> (int verbose, int levels)</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Print stack dump. <a href="#ga6"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga7" doxytag="stack::_stp_stack_sprint"></a> char * </td><td class="memItemRight" valign="bottom"><b>_stp_stack_sprint</b> (int verbose, int levels)</td></tr> </table> +<hr><h2>Function Documentation</h2> +<a class="anchor" name="ga6" doxytag="stack.c::_stp_stack_print"></a><p> +<table class="mdTable" cellpadding="2" cellspacing="0"> + <tr> + <td class="mdRow"> + <table cellpadding="0" cellspacing="0" border="0"> + <tr> + <td class="md" nowrap valign="top">void _stp_stack_print </td> + <td class="md" valign="top">( </td> + <td class="md" nowrap valign="top">int </td> + <td class="mdname" nowrap> <em>verbose</em>, </td> + </tr> + <tr> + <td class="md" nowrap align="right"></td> + <td class="md"></td> + <td class="md" nowrap>int </td> + <td class="mdname" nowrap> <em>levels</em></td> + </tr> + <tr> + <td class="md"></td> + <td class="md">) </td> + <td class="md" colspan="2"></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </td> + <td> + +<p> +Print stack dump. +<p> +Prints a stack dump to the trace buffer. <dl compact><dt><b>Parameters:</b></dt><dd> + <table border="0" cellspacing="2" cellpadding="0"> + <tr><td valign="top"></td><td valign="top"><em>verbose</em> </td><td>Verbosity: </td></tr> + </table> +</dl> + +<p> +Definition at line <a class="el" href="stack_8c-source.html#l00151">151</a> of file <a class="el" href="stack_8c-source.html">stack.c</a>. </td> + </tr> +</table> </body></html> diff --git a/runtime/docs/html/group__sym.html b/runtime/docs/html/group__sym.html index c5301602..eafa03c2 100644 --- a/runtime/docs/html/group__sym.html +++ b/runtime/docs/html/group__sym.html @@ -98,7 +98,7 @@ Uses scbuf. </dd></dl> <p> Definition at line <a class="el" href="sym_8c-source.html#l00045">45</a> of file <a class="el" href="sym_8c-source.html">sym.c</a>. <p> -References <a class="el" href="scbuf_8c-source.html#l00032">_stp_sprint()</a>. </td> +References <a class="el" href="scbuf_8c-source.html#l00034">_stp_sprint()</a>. </td> </tr> </table> </body></html> diff --git a/runtime/docs/html/kprobe__where__funct_8c-source.html b/runtime/docs/html/kprobe__where__funct_8c-source.html index dbe9ac74..7da50eda 100644 --- a/runtime/docs/html/kprobe__where__funct_8c-source.html +++ b/runtime/docs/html/kprobe__where__funct_8c-source.html @@ -78,9 +78,9 @@ 00069 00070 <span class="comment">/* now walk the hash table and print out all the information */</span> 00071 <a class="code" href="group__maps.html#ga31">foreach</a>(funct_locations, ptr) { -00072 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>(); +00072 <span class="keywordtype">char</span> *str =<a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>(); 00073 <a class="code" href="group__sym.html#ga2">_stp_symbol_sprint</a> (<a class="code" href="group__maps.html#ga26">key1int</a>(ptr)); -00074 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"%lld\t0x%p\t(%s)\n"</span>, ptr-><a class="code" href="structmap__node__int64.html#o1">val</a>, <a class="code" href="group__maps.html#ga26">key1int</a>(ptr), _stp_scbuf); +00074 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"%lld\t0x%p\t(%s)\n"</span>, ptr-><a class="code" href="structmap__node__int64.html#o1">val</a>, <a class="code" href="group__maps.html#ga26">key1int</a>(ptr), str); 00075 } 00076 00077 <a class="code" href="group__maps.html#ga7">_stp_map_del</a>(funct_locations); diff --git a/runtime/docs/html/scbuf_8c-source.html b/runtime/docs/html/scbuf_8c-source.html index a9e9ddc8..ffdfaac7 100644 --- a/runtime/docs/html/scbuf_8c-source.html +++ b/runtime/docs/html/scbuf_8c-source.html @@ -5,75 +5,99 @@ </head><body> <!-- Generated by Doxygen 1.4.1 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related Pages</a></div> -<h1>scbuf.c</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef _SCBUF_C_</span> -00002 <span class="preprocessor"></span><span class="preprocessor">#define _SCBUF_C_</span> +<h1>scbuf.c</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef _SCBUF_C_ </span><span class="comment">/* -*- linux-c -*- */</span> +00002 <span class="preprocessor">#define _SCBUF_C_</span> 00003 <span class="preprocessor"></span> -00004 <span class="comment">/* -*- linux-c -*- */</span><span class="comment"></span> -00005 <span class="comment">/** @file scbuf.c</span> -00006 <span class="comment"> * @addtogroup scbuf Scratch Buffer</span> -00007 <span class="comment"> * Scratch Buffer Functions.</span> -00008 <span class="comment"> * The scratch buffer is for collecting output before storing in a map,</span> -00009 <span class="comment"> * printing, etc. This is a per-cpu static buffer. It is necessary because </span> -00010 <span class="comment"> * of the limited stack space available in the kernel.</span> -00011 <span class="comment"> * @{</span> -00012 <span class="comment"> */</span> -00013 <span class="comment"></span> -00014 <span class="comment">/** Maximum size of buffer, not including terminating NULL */</span> -<a name="l00015"></a><a class="code" href="group__scbuf.html#ga6">00015</a> <span class="preprocessor">#define STP_BUF_LEN 8191</span> -00016 <span class="preprocessor"></span><span class="comment"></span> -00017 <span class="comment">/** Scratch buffer for printing, building strings, etc */</span> -<a name="l00018"></a><a class="code" href="group__scbuf.html#ga0">00018</a> <span class="keywordtype">char</span> <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a>[<a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>+1]; -00019 <span class="keyword">static</span> <span class="keywordtype">int</span> _stp_scbuf_len = <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>; -00020 <span class="comment"></span> -00021 <span class="comment">/** Sprint into the scratch buffer.</span> -00022 <span class="comment"> * Like printf, except output goes into #_stp_scbuf,</span> -00023 <span class="comment"> * which will contain the null-terminated output.</span> -00024 <span class="comment"> * Safe because overflowing #_stp_scbuf is not allowed.</span> -00025 <span class="comment"> * Size is limited by length of scratch buffer, STP_BUF_LEN.</span> -00026 <span class="comment"> *</span> -00027 <span class="comment"> * @param fmt A printf-style format string followed by a </span> -00028 <span class="comment"> * variable number of args.</span> -00029 <span class="comment"> * @sa _stp_scbuf_clear</span> -00030 <span class="comment"> */</span> -00031 -<a name="l00032"></a><a class="code" href="group__scbuf.html#ga2">00032</a> <span class="keywordtype">void</span> <a class="code" href="group__scbuf.html#ga2">_stp_sprint</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, ...) -00033 { -00034 <span class="keywordtype">int</span> num; -00035 va_list args; -00036 <span class="keywordtype">char</span> *buf = <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a> + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len; -00037 va_start(args, fmt); -00038 num = vscnprintf(buf, _stp_scbuf_len, fmt, args); -00039 va_end(args); -00040 <span class="keywordflow">if</span> (num > 0) -00041 _stp_scbuf_len -= num; -00042 } -00043 -00044 <span class="keywordtype">void</span> _stp_sprint_str (<span class="keyword">const</span> <span class="keywordtype">char</span> *str) -00045 { -00046 <span class="keywordtype">char</span> *buf = <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a> + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len; -00047 <span class="keywordtype">int</span> num = strlen (str); -00048 <span class="keywordflow">if</span> (num > _stp_scbuf_len) -00049 num = _stp_scbuf_len; -00050 strncpy (buf, str, num); -00051 _stp_scbuf_len -= num; -00052 } -00053 <span class="comment"></span> -00054 <span class="comment">/** Clear the scratch buffer.</span> -00055 <span class="comment"> * Output from _stp_sprint() will accumulate in the buffer</span> -00056 <span class="comment"> * until this is called.</span> -00057 <span class="comment"> */</span> -00058 -<a name="l00059"></a><a class="code" href="group__scbuf.html#ga4">00059</a> <span class="keywordtype">void</span> _stp_scbuf_clear (<span class="keywordtype">void</span>) -00060 { -00061 _stp_scbuf_len = <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>; -00062 <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a>[0] = 0; -00063 } -00064 -00065 <span class="keyword">static</span> <span class="keywordtype">char</span> *_stp_scbuf_cur (<span class="keywordtype">void</span>) -00066 { -00067 <span class="keywordflow">return</span> <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a> + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len; -00068 } -00069 <span class="comment"></span> -00070 <span class="comment">/** @} */</span> -00071 <span class="preprocessor">#endif </span><span class="comment">/* _SCBUF_C_ */</span> +00004 <span class="preprocessor">#include <linux/config.h></span> +00005 <span class="comment"></span> +00006 <span class="comment">/** @file scbuf.c</span> +00007 <span class="comment"> * @addtogroup scbuf Scratch Buffer</span> +00008 <span class="comment"> * Scratch Buffer Functions.</span> +00009 <span class="comment"> * The scratch buffer is for collecting output before storing in a map,</span> +00010 <span class="comment"> * printing, etc. This is a per-cpu static buffer. It is necessary because </span> +00011 <span class="comment"> * of the limited stack space available in the kernel.</span> +00012 <span class="comment"> * @todo Need careful review of these to insure safety.</span> +00013 <span class="comment"> * @{</span> +00014 <span class="comment"> */</span> +00015 <span class="comment"></span> +00016 <span class="comment">/** Maximum size of buffer, not including terminating NULL */</span> +<a name="l00017"></a><a class="code" href="group__scbuf.html#ga6">00017</a> <span class="preprocessor">#define STP_BUF_LEN 8191</span> +00018 <span class="preprocessor"></span><span class="comment"></span> +00019 <span class="comment">/** Scratch buffer for printing, building strings, etc */</span> +00020 <span class="keyword">static</span> <span class="keywordtype">char</span> _stp_scbuf[NR_CPUS][<a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>+1]; +00021 <span class="keyword">static</span> <span class="keywordtype">int</span> _stp_scbuf_len[NR_CPUS]; +00022 <span class="comment"></span> +00023 <span class="comment">/** Sprint into the scratch buffer.</span> +00024 <span class="comment"> * Like printf, except output goes into a global scratch buffer</span> +00025 <span class="comment"> * which will contain the null-terminated output.</span> +00026 <span class="comment"> * Safe because overflowing the buffer is not allowed.</span> +00027 <span class="comment"> * Size is limited by length of scratch buffer, STP_BUF_LEN.</span> +00028 <span class="comment"> *</span> +00029 <span class="comment"> * @param fmt A printf-style format string followed by a </span> +00030 <span class="comment"> * variable number of args.</span> +00031 <span class="comment"> * @sa _stp_scbuf_clear</span> +00032 <span class="comment"> */</span> +00033 +<a name="l00034"></a><a class="code" href="group__scbuf.html#ga2">00034</a> <span class="keywordtype">void</span> <a class="code" href="group__scbuf.html#ga2">_stp_sprint</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, ...) +00035 { +00036 <span class="keywordtype">int</span> num; +00037 va_list args; +00038 <span class="keywordtype">int</span> cpu = smp_processor_id(); +00039 <span class="keywordtype">char</span> *buf = _stp_scbuf[cpu] + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len[cpu]; +00040 va_start(args, fmt); +00041 num = vscnprintf(buf, _stp_scbuf_len[cpu], fmt, args); +00042 va_end(args); +00043 <span class="keywordflow">if</span> (num > 0) +00044 _stp_scbuf_len[cpu] -= num; +00045 } +00046 <span class="comment"></span> +00047 <span class="comment">/** Write a string into the scratch buffer.</span> +00048 <span class="comment"> * Copies a string into a global scratch buffer.</span> +00049 <span class="comment"> * Safe because overflowing the buffer is not allowed.</span> +00050 <span class="comment"> * Size is limited by length of scratch buffer, STP_BUF_LEN.</span> +00051 <span class="comment"> * This is more efficient than using _stp_sprint().</span> +00052 <span class="comment"> *</span> +00053 <span class="comment"> * @param str A string.</span> +00054 <span class="comment"> */</span> +00055 +<a name="l00056"></a><a class="code" href="group__scbuf.html#ga3">00056</a> <span class="keywordtype">void</span> <a class="code" href="group__scbuf.html#ga3">_stp_sprint_str</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *str) +00057 { +00058 <span class="keywordtype">int</span> cpu = smp_processor_id(); +00059 <span class="keywordtype">char</span> *buf = _stp_scbuf[cpu] + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len[cpu]; +00060 <span class="keywordtype">int</span> num = strlen (str); +00061 <span class="keywordflow">if</span> (num > _stp_scbuf_len[cpu]) +00062 num = _stp_scbuf_len[cpu]; +00063 strncpy (buf, str, num); +00064 _stp_scbuf_len[cpu] -= num; +00065 } +00066 <span class="comment"></span> +00067 <span class="comment">/** Clear the scratch buffer.</span> +00068 <span class="comment"> * This function should be called before anything is written to </span> +00069 <span class="comment"> * the scratch buffer. Output will accumulate in the buffer</span> +00070 <span class="comment"> * until this function is called again. </span> +00071 <span class="comment"> * @returns A pointer to the buffer.</span> +00072 <span class="comment"> */</span> +00073 +<a name="l00074"></a><a class="code" href="group__scbuf.html#ga4">00074</a> <span class="keywordtype">char</span> *<a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> (<span class="keywordtype">void</span>) +00075 { +00076 <span class="keywordtype">int</span> cpu = smp_processor_id(); +00077 _stp_scbuf_len[cpu] = <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>; +00078 *_stp_scbuf[cpu] = 0; +00079 <span class="keywordflow">return</span> _stp_scbuf[cpu]; +00080 } +00081 <span class="comment"></span> +00082 <span class="comment">/** Get the current top of the scratch buffer.</span> +00083 <span class="comment"> * This returns the address of the location where</span> +00084 <span class="comment"> * data will be written next in the scratch buffer.</span> +00085 <span class="comment"> * @returns A pointer</span> +00086 <span class="comment"> */</span> +00087 +00088 <span class="keyword">static</span> <span class="keywordtype">char</span> *_stp_scbuf_cur (<span class="keywordtype">void</span>) +00089 { +00090 <span class="keywordtype">int</span> cpu = smp_processor_id(); +00091 <span class="keywordflow">return</span> _stp_scbuf[cpu] + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len[cpu]; +00092 } +00093 <span class="comment"></span> +00094 <span class="comment">/** @} */</span> +00095 <span class="preprocessor">#endif </span><span class="comment">/* _SCBUF_C_ */</span> </pre></div></body></html> diff --git a/runtime/docs/html/stack_8c-source.html b/runtime/docs/html/stack_8c-source.html index f4df8413..552f51cc 100644 --- a/runtime/docs/html/stack_8c-source.html +++ b/runtime/docs/html/stack_8c-source.html @@ -103,7 +103,7 @@ 00096 <span class="preprocessor"></span> <span class="keywordflow">while</span> (valid_stack_ptr(tinfo, (<span class="keywordtype">void</span> *)ebp)) { 00097 addr = *(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *)(ebp + 4); 00098 <a class="code" href="group__sym.html#ga2">_stp_symbol_sprint</a> (addr); -00099 _stp_sprint_str(<span class="stringliteral">"\n"</span>); +00099 <a class="code" href="group__scbuf.html#ga3">_stp_sprint_str</a>(<span class="stringliteral">"\n"</span>); 00100 ebp = *(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *)ebp; 00101 } 00102 <span class="preprocessor">#else</span> @@ -111,7 +111,7 @@ 00104 addr = *stack++; 00105 <span class="keywordflow">if</span> (_stp_kta (addr)) { 00106 <a class="code" href="group__sym.html#ga2">_stp_symbol_sprint</a> (addr); -00107 _stp_sprint_str (<span class="stringliteral">"\n"</span>); +00107 <a class="code" href="group__scbuf.html#ga3">_stp_sprint_str</a> (<span class="stringliteral">"\n"</span>); 00108 } 00109 } 00110 <span class="preprocessor">#endif</span> @@ -149,21 +149,26 @@ 00142 } 00143 00144 <span class="preprocessor">#endif </span><span class="comment">/* i386 */</span> -00145 -00146 <span class="keywordtype">void</span> _stp_stack_print (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels) -00147 { -00148 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack; -00149 <span class="keywordflow">return</span> __stp_stack_print (&stack, verbose, levels); -00150 } -00151 -00152 <span class="keywordtype">char</span> *_stp_stack_sprint (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels) -00153 { -00154 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack; -00155 <span class="keywordtype">char</span> *ptr = _stp_scbuf_cur(); -00156 __stp_stack_sprint (&stack, verbose, levels); -00157 <span class="keywordflow">return</span> ptr; -00158 } -00159 <span class="comment"></span> -00160 <span class="comment">/** @} */</span> -00161 <span class="preprocessor">#endif </span><span class="comment">/* _STACK_C_ */</span> +00145 <span class="comment"></span> +00146 <span class="comment">/** Print stack dump.</span> +00147 <span class="comment"> * Prints a stack dump to the trace buffer.</span> +00148 <span class="comment"> * @param verbose Verbosity:</span> +00149 <span class="comment"> */</span> +00150 +<a name="l00151"></a><a class="code" href="group__stack.html#ga6">00151</a> <span class="keywordtype">void</span> <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels) +00152 { +00153 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack; +00154 <span class="keywordflow">return</span> __stp_stack_print (&stack, verbose, levels); +00155 } +00156 +00157 <span class="keywordtype">char</span> *_stp_stack_sprint (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels) +00158 { +00159 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack; +00160 <span class="keywordtype">char</span> *ptr = _stp_scbuf_cur(); +00161 __stp_stack_sprint (&stack, verbose, levels); +00162 <span class="keywordflow">return</span> ptr; +00163 } +00164 <span class="comment"></span> +00165 <span class="comment">/** @} */</span> +00166 <span class="preprocessor">#endif </span><span class="comment">/* _STACK_C_ */</span> </pre></div></body></html> diff --git a/runtime/docs/html/stack_8c.html b/runtime/docs/html/stack_8c.html index 65cb258e..093cc186 100644 --- a/runtime/docs/html/stack_8c.html +++ b/runtime/docs/html/stack_8c.html @@ -13,9 +13,9 @@ <a href="stack_8c-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> <tr><td colspan="2"><br><h2>Functions</h2></td></tr> -<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga6" doxytag="stack.c::_stp_stack_print"></a> -void </td><td class="memItemRight" valign="bottom"><b>_stp_stack_print</b> (int verbose, int levels)</td></tr> +<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__stack.html#ga6">_stp_stack_print</a> (int verbose, int levels)</td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Print stack dump. <a href="group__stack.html#ga6"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga7" doxytag="stack.c::_stp_stack_sprint"></a> char * </td><td class="memItemRight" valign="bottom"><b>_stp_stack_sprint</b> (int verbose, int levels)</td></tr> diff --git a/runtime/docs/html/structmap__root.html b/runtime/docs/html/structmap__root.html index d6e95bd6..2a4eb819 100644 --- a/runtime/docs/html/structmap__root.html +++ b/runtime/docs/html/structmap__root.html @@ -99,7 +99,7 @@ Definition at line <a class="el" href="map_8h-source.html#l00067">67</a> of file <p> this is the creation data saved between the key functions and the set/get functions <p> -<dl compact><dt><b><a class="el" href="todo.html#_todo000008">Todo:</a></b></dt><dd>Needs to be per-cpu data for SMP support</dd></dl> +<dl compact><dt><b><a class="el" href="todo.html#_todo000009">Todo:</a></b></dt><dd>Needs to be per-cpu data for SMP support</dd></dl> <p> Definition at line <a class="el" href="map_8h-source.html#l00093">93</a> of file <a class="el" href="map_8h-source.html">map.h</a>. diff --git a/runtime/docs/html/test4_2dtr_8c-source.html b/runtime/docs/html/test4_2dtr_8c-source.html index 2847b88a..af19db1a 100644 --- a/runtime/docs/html/test4_2dtr_8c-source.html +++ b/runtime/docs/html/test4_2dtr_8c-source.html @@ -13,138 +13,251 @@ 00004 <span class="preprocessor">#include <linux/module.h></span> 00005 <span class="preprocessor">#include <linux/interrupt.h></span> 00006 <span class="preprocessor">#include <net/sock.h></span> -00007 -00008 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span> -00009 <span class="preprocessor">#include "<a class="code" href="io_8c.html">io.c</a>"</span> -00010 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span> -00011 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span> -00012 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span> -00013 -00014 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>); -00015 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt <hunt@redhat.com>"</span>); -00016 -00017 <span class="keyword">static</span> <span class="keywordtype">char</span> tbuffer[2][50000]; -00018 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper(<span class="keywordtype">void</span> *); -00019 <span class="keyword">static</span> DECLARE_WORK(stp_work, stp_helper, tbuffer); -00020 -00021 <a class="code" href="structmap__root.html">MAP</a> opens, reads, writes, traces; -00022 <span class="keyword">static</span> <span class="keywordtype">int</span> bufcount = 0; -00023 -00024 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper (<span class="keywordtype">void</span> *data) -00025 { -00026 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"HELPER\n"</span>); -00027 } +00007 <span class="preprocessor">#include <linux/netlink.h></span> +00008 +00009 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span> +00010 <span class="preprocessor">#include "<a class="code" href="io_8c.html">io.c</a>"</span> +00011 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span> +00012 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span> +00013 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span> +00014 +00015 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>); +00016 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt <hunt@redhat.com>"</span>); +00017 +00018 <span class="keyword">static</span> <span class="keywordtype">char</span> tbuffer[2][50000]; +00019 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper(<span class="keywordtype">void</span> *); +00020 <span class="keyword">static</span> DECLARE_WORK(stp_work, stp_helper, tbuffer); +00021 +00022 <a class="code" href="structmap__root.html">MAP</a> opens, reads, writes, traces; +00023 <span class="keyword">static</span> <span class="keywordtype">int</span> bufcount = 0; +00024 +00025 <span class="comment">/* netlink control channel */</span> +00026 <span class="keyword">static</span> <span class="keyword">struct </span>sock *control; +00027 <span class="keyword">static</span> <span class="keywordtype">int</span> seq = 0; 00028 -00029 asmlinkage <span class="keywordtype">long</span> inst_sys_open (<span class="keyword">const</span> <span class="keywordtype">char</span> __user * filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> mode) -00030 { -00031 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current->comm); -00032 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1); -00033 jprobe_return(); -00034 <span class="keywordflow">return</span> 0; -00035 } -00036 -00037 asmlinkage ssize_t inst_sys_read (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> __user * buf, size_t count) -00038 { -00039 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current->comm); -00040 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (reads, count); -00041 jprobe_return(); -00042 <span class="keywordflow">return</span> 0; -00043 } -00044 -00045 asmlinkage ssize_t inst_sys_write (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span> __user * buf, size_t count) -00046 { -00047 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current->comm); -00048 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (writes, count); -00049 jprobe_return(); -00050 <span class="keywordflow">return</span> 0; -00051 } +00029 <span class="keywordtype">int</span> pid; +00030 <span class="comment">/*</span> +00031 <span class="comment"> * send_reply - send reply to userspace over netlink control channel</span> +00032 <span class="comment"> */</span> +00033 <span class="keyword">static</span> <span class="keywordtype">int</span> send_reply(<span class="keywordtype">int</span> type, <span class="keywordtype">void</span> *reply, <span class="keywordtype">int</span> len, <span class="keywordtype">int</span> pid) +00034 { +00035 <span class="keyword">struct </span>sk_buff *skb; +00036 <span class="keyword">struct </span>nlmsghdr *nlh; +00037 <span class="keywordtype">void</span> *data; +00038 <span class="keywordtype">int</span> size; +00039 <span class="keywordtype">int</span> err; +00040 +00041 size = NLMSG_SPACE(len); +00042 skb = alloc_skb(size, GFP_KERNEL); +00043 <span class="keywordflow">if</span> (!skb) +00044 return -1; +00045 nlh = NLMSG_PUT(skb, pid, seq++, type, size - sizeof(*nlh)); +00046 nlh->nlmsg_flags = 0; +00047 data = NLMSG_DATA(nlh); +00048 memcpy(data, reply, len); +00049 err = netlink_unicast(control, skb, pid, MSG_DONTWAIT); +00050 +00051 return 0; 00052 -00053 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v) -00054 { -00055 _stp_stack_print (0,0); -00056 _stp_stack_print (1,0); -00057 -00058 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>(); -00059 <a class="code" href="group__lists.html#ga5">_stp_list_add</a> (traces, _stp_stack_sprint(0,0)); -00060 <span class="keywordflow">if</span> (bufcount++ == 0) -00061 schedule_work (&stp_work); -00062 -00063 jprobe_return(); -00064 return 0; -00065 } -00066 -00067 -00068 static struct jprobe dtr_probes[] = { -00069 { -00070 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>, -00071 .entry = (kprobe_opcode_t *) inst_sys_open -00072 }, -00073 { -00074 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>, -00075 .entry = (kprobe_opcode_t *) inst_sys_read -00076 }, -00077 { -00078 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>, -00079 .entry = (kprobe_opcode_t *) inst_sys_write -00080 }, -00081 { -00082 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>, -00083 .entry = (kprobe_opcode_t *) inst_show_cpuinfo, -00084 }, -00085 }; +00053 nlmsg_failure: +00054 if (skb) +00055 kfree_skb(skb); +00056 +00057 return -1; +00058 } +00059 +00060 static <span class="keywordtype">char</span> pbuff[1024]; +00061 +00062 <span class="keywordtype">void</span> nlog (const <span class="keywordtype">char</span> *fmt, ...) +00063 { +00064 <span class="keywordtype">int</span> len; +00065 va_list args; +00066 va_start(args, fmt); +00067 len = vscnprintf (pbuff, <span class="keyword">sizeof</span>(pbuff), fmt, args) + 1; +00068 va_end(args); +00069 send_reply (42, pbuff, len, pid); +00070 } +00071 +00072 <span class="comment">/*</span> +00073 <span class="comment"> * msg_rcv_skb - dispatch userspace requests from netlink control channel</span> +00074 <span class="comment"> */</span> +00075 <span class="keyword">static</span> <span class="keywordtype">void</span> msg_rcv_skb(<span class="keyword">struct</span> sk_buff *skb) +00076 { +00077 <span class="keyword">struct </span>nlmsghdr *nlh = NULL; +00078 <span class="keywordtype">int</span> flags; +00079 <span class="keywordtype">int</span> nlmsglen, skblen; +00080 <span class="keywordtype">void</span> *data; +00081 +00082 skblen = skb->len; +00083 <span class="comment">// dlog ("skblen = %d %d\n", skblen, sizeof(*nlh));</span> +00084 <span class="keywordflow">if</span> (skblen < <span class="keyword">sizeof</span> (*nlh)) +00085 return; 00086 -00087 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span> -00088 <span class="preprocessor"></span> -00089 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>) -00090 { -00091 <span class="keywordtype">int</span> ret; -00092 -00093 opens = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, INT64); -00094 reads = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT); -00095 writes = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT); -00096 traces = <a class="code" href="group__lists.html#ga0">_stp_list_new</a> (1000, STRING); -00097 -00098 ret = <a class="code" href="probes_8c.html#a2">_stp_register_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE); -00099 -00100 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"instrumentation is enabled...\n"</span>); -00101 <span class="keywordflow">return</span> ret; +00087 nlh = (struct nlmsghdr *)skb->data; +00088 nlmsglen = nlh->nlmsg_len; +00089 +00090 <span class="comment">// dlog ("nlmsghlen=%d\n", nlmsglen);</span> +00091 if (nlmsglen < sizeof(*nlh) || skblen < nlmsglen) +00092 return; +00093 +00094 pid = nlh->nlmsg_pid; +00095 flags = nlh->nlmsg_flags; +00096 +00097 <span class="comment">// dlog ("pid=%d flags=%x %x %x %x\n", pid, flags, NLM_F_REQUEST, MSG_TRUNC, NLM_F_ACK);</span> +00098 if (pid <= 0 || !(flags & NLM_F_REQUEST)) { +00099 netlink_ack(skb, nlh, -EINVAL); +00100 <span class="keywordflow">return</span>; +00101 } 00102 -00103 } -00104 -00105 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>) -00106 { -00107 <span class="keyword">struct </span><a class="code" href="structmap__node__stat.html">map_node_stat</a> *st; -00108 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *ptr; -00109 <span class="keyword">struct </span><a class="code" href="structmap__node__str.html">map_node_str</a> *sptr; -00110 -00111 <a class="code" href="probes_8c.html#a1">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE); -00112 -00113 <a class="code" href="group__maps.html#ga31">foreach</a> (traces, sptr) -00114 dlog ("trace: %s\n", sptr->str); -00115 -00116 foreach (opens, ptr) -00117 dlog ("opens[%s] = %lld\n", key1str(ptr), ptr->val); -00118 dlog ("\n"); -00119 -00120 foreach (reads, st) -00121 dlog ("reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st), -00122 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); -00123 dlog ("\n"); -00124 -00125 foreach (writes, st) -00126 dlog ("writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st), -00127 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); -00128 dlog ("\n"); -00129 -00130 _stp_map_del (opens); -00131 _stp_map_del (reads); -00132 _stp_map_del (writes); -00133 -00134 dlog("EXIT\n"); -00135 } -00136 -00137 module_init(init_dtr); -00138 module_exit(cleanup_dtr); -00139 MODULE_LICENSE("GPL"); +00103 <span class="keywordflow">if</span> (flags & MSG_TRUNC) { +00104 netlink_ack(skb, nlh, -ECOMM); +00105 <span class="keywordflow">return</span>; +00106 } +00107 +00108 data = NLMSG_DATA(nlh); +00109 +00110 <span class="comment">// dlog ("NETLINK: Got message \"%s\" of type %d from pid %d\n", data, nlh->nlmsg_type,pid);</span> +00111 +00112 <span class="keywordflow">if</span> (flags & NLM_F_ACK) +00113 netlink_ack(skb, nlh, 0); +00114 +00115 send_reply (42, "Howdy Partner", 14, pid); +00116 } +00117 +00118 static <span class="keywordtype">void</span> msg_rcv(struct sock *sk, <span class="keywordtype">int</span> len) +00119 { +00120 <span class="keyword">struct </span>sk_buff *skb; +00121 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"netlink message received\n"</span>); +00122 <span class="keywordflow">while</span> ((skb = skb_dequeue(&sk->sk_receive_queue))) { +00123 msg_rcv_skb(skb); +00124 kfree_skb(skb); +00125 } +00126 } +00127 +00128 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper (<span class="keywordtype">void</span> *data) +00129 { +00130 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"HELPER\n"</span>); +00131 } +00132 +00133 asmlinkage <span class="keywordtype">long</span> inst_sys_open (<span class="keyword">const</span> <span class="keywordtype">char</span> __user * filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> mode) +00134 { +00135 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current->comm); +00136 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1); +00137 jprobe_return(); +00138 <span class="keywordflow">return</span> 0; +00139 } 00140 +00141 asmlinkage ssize_t inst_sys_read (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> __user * buf, size_t count) +00142 { +00143 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current->comm); +00144 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (reads, count); +00145 jprobe_return(); +00146 <span class="keywordflow">return</span> 0; +00147 } +00148 +00149 asmlinkage ssize_t inst_sys_write (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span> __user * buf, size_t count) +00150 { +00151 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current->comm); +00152 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (writes, count); +00153 jprobe_return(); +00154 <span class="keywordflow">return</span> 0; +00155 } +00156 +00157 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v) +00158 { +00159 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (0,0); +00160 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (1,0); +00161 +00162 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>(); +00163 <a class="code" href="group__lists.html#ga5">_stp_list_add</a> (traces, _stp_stack_sprint(0,0)); +00164 <span class="keywordflow">if</span> (bufcount++ == 0) +00165 schedule_work (&stp_work); +00166 +00167 jprobe_return(); +00168 return 0; +00169 } +00170 +00171 +00172 static struct jprobe dtr_probes[] = { +00173 { +00174 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>, +00175 .entry = (kprobe_opcode_t *) inst_sys_open +00176 }, +00177 { +00178 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>, +00179 .entry = (kprobe_opcode_t *) inst_sys_read +00180 }, +00181 { +00182 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>, +00183 .entry = (kprobe_opcode_t *) inst_sys_write +00184 }, +00185 { +00186 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>, +00187 .entry = (kprobe_opcode_t *) inst_show_cpuinfo, +00188 }, +00189 }; +00190 +00191 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span> +00192 <span class="preprocessor"></span> +00193 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>) +00194 { +00195 <span class="keywordtype">int</span> ret; +00196 +00197 control = netlink_kernel_create(31, msg_rcv); +00198 <span class="keywordflow">if</span> (!control) { +00199 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"Couldn't create netlink channel\n"</span>); +00200 <span class="keywordflow">return</span> -1; +00201 } +00202 +00203 opens = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, INT64); +00204 reads = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT); +00205 writes = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT); +00206 traces = <a class="code" href="group__lists.html#ga0">_stp_list_new</a> (1000, STRING); +00207 +00208 ret = <a class="code" href="probes_8c.html#a2">_stp_register_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE); +00209 +00210 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"instrumentation is enabled...\n"</span>); +00211 <span class="keywordflow">return</span> ret; +00212 +00213 } +00214 +00215 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>) +00216 { +00217 <span class="keyword">struct </span><a class="code" href="structmap__node__stat.html">map_node_stat</a> *st; +00218 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *ptr; +00219 <span class="keyword">struct </span><a class="code" href="structmap__node__str.html">map_node_str</a> *sptr; +00220 +00221 <a class="code" href="probes_8c.html#a1">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE); +00222 +00223 <a class="code" href="group__maps.html#ga31">foreach</a> (traces, sptr) +00224 nlog ("trace: %s\n", sptr->str); +00225 +00226 foreach (opens, ptr) +00227 nlog ("opens[%s] = %lld\n", key1str(ptr), ptr->val); +00228 nlog ("\n"); +00229 +00230 foreach (reads, st) +00231 nlog ("reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st), +00232 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); +00233 nlog ("\n"); +00234 +00235 foreach (writes, st) +00236 nlog ("writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st), +00237 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); +00238 nlog ("\n"); +00239 +00240 _stp_map_del (opens); +00241 _stp_map_del (reads); +00242 _stp_map_del (writes); +00243 +00244 if (control) +00245 sock_release(control->sk_socket); +00246 +00247 dlog("EXIT\n"); +00248 } +00249 +00250 module_init(init_dtr); +00251 module_exit(cleanup_dtr); +00252 MODULE_LICENSE("GPL"); +00253 </pre></div></body></html> diff --git a/runtime/docs/html/todo.html b/runtime/docs/html/todo.html index 7435d106..22265a06 100644 --- a/runtime/docs/html/todo.html +++ b/runtime/docs/html/todo.html @@ -5,7 +5,7 @@ </head><body> <!-- Generated by Doxygen 1.4.1 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related Pages</a></div> -<h1><a class="anchor" name="todo">Todo List</a></h1><a class="anchor" name="_todo000008"></a> <dl> +<h1><a class="anchor" name="todo">Todo List</a></h1><a class="anchor" name="_todo000009"></a> <dl> <dt>Global <a class="el" href="structmap__root.html#o7">map_root::create</a> </dt> <dd>Needs to be per-cpu data for SMP support</dd> </dl> @@ -44,4 +44,9 @@ <dt>Global <a class="el" href="group__maps.html#ga23">_stp_map_stat_add</a> (MAP map, int64_t val) </dt> <dd>Histograms don't work yet. </dd> </dl> +<p> +<a class="anchor" name="_todo000008"></a> <dl> +<dt>Group <a class="el" href="group__scbuf.html">scbuf</a> </dt> +<dd>Need careful review of these to insure safety.</dd> +</dl> </body></html> |