summaryrefslogtreecommitdiffstats
path: root/runtime/docs/html/stack_8c-source.html
diff options
context:
space:
mode:
authorhunt <hunt>2005-03-21 21:47:54 +0000
committerhunt <hunt>2005-03-21 21:47:54 +0000
commit33776f4955fa52ae3e4dc87ab6ac484a3ebc9a71 (patch)
tree3d5346f8ba9553804b71806b94654ffe703f3b29 /runtime/docs/html/stack_8c-source.html
parentd14648baf61205e4259da53b383931f20c41c5bb (diff)
downloadsystemtap-steved-33776f4955fa52ae3e4dc87ab6ac484a3ebc9a71.tar.gz
systemtap-steved-33776f4955fa52ae3e4dc87ab6ac484a3ebc9a71.tar.xz
systemtap-steved-33776f4955fa52ae3e4dc87ab6ac484a3ebc9a71.zip
*** empty log message ***
Diffstat (limited to 'runtime/docs/html/stack_8c-source.html')
-rw-r--r--runtime/docs/html/stack_8c-source.html187
1 files changed, 187 insertions, 0 deletions
diff --git a/runtime/docs/html/stack_8c-source.html b/runtime/docs/html/stack_8c-source.html
new file mode 100644
index 00000000..34f7b76e
--- /dev/null
+++ b/runtime/docs/html/stack_8c-source.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>SystemTap: SystemTap Runtime Library</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head><body>
+<div class="qindex"><a class="qindex" href="index.html">Intro</a> | <a class="qindex" href="globals_func.html">Functions</a> | <a class="qindex" href="globals_defs.html">Defines</a> | <a class="qindex" href="globals_enum.html">Enumerations</a> | <a class="qindex" href="globals_eval.html">Enumeration Values</a></div>
+
+<!-- Generated by Doxygen 1.4.1 -->
+<h1>stack.c</h1><a href="stack_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001
+00002
+00003 <span class="preprocessor">#ifdef __x86_64__</span>
+00004 <span class="preprocessor"></span><span class="comment">/* ripped out of arch/x86_64/kernel/traps.c */</span>
+00005 <span class="preprocessor">#include &lt;linux/kallsyms.h&gt;</span>
+00006
+00007 <span class="keyword">static</span> <span class="keywordtype">int</span> _stp_printk_address(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> address)
+00008 {
+00009 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> offset = 0, symsize;
+00010 <span class="keyword">const</span> <span class="keywordtype">char</span> *symname;
+00011 <span class="keywordtype">char</span> *modname;
+00012 <span class="keywordtype">char</span> *delim = <span class="stringliteral">":"</span>;
+00013 <span class="keywordtype">char</span> namebuf[128];
+00014
+00015 symname = _stp_kallsyms_lookup(address, &amp;symsize, &amp;offset, &amp;modname, namebuf);
+00016 <span class="keywordflow">if</span> (!symname)
+00017 return printk("[&lt;%016lx&gt;]", address);
+00018 if (!modname)
+00019 modname = delim = "";
+00020 return printk("&lt;%016lx&gt;{%s%s%s%s%+ld}<span class="stringliteral">",</span>
+00021 <span class="stringliteral"> address,delim,modname,delim,symname,offset); </span>
+00022 <span class="stringliteral">}</span>
+00023 <span class="stringliteral"></span>
+00024 <span class="stringliteral">void _stp_show_trace(unsigned long *stack)</span>
+00025 <span class="stringliteral">{</span>
+00026 <span class="stringliteral"> unsigned long addr;</span>
+00027 <span class="stringliteral"> unsigned long *irqstack, *irqstack_end, *estack_end;</span>
+00028 <span class="stringliteral"> const int cpu = safe_smp_processor_id();</span>
+00029 <span class="stringliteral"> int i;</span>
+00030 <span class="stringliteral"></span>
+00031 <span class="stringliteral"> printk("</span>\nCall Trace:<span class="stringliteral">");</span>
+00032 <span class="stringliteral"> i = 0; </span>
+00033 <span class="stringliteral"> </span>
+00034 <span class="stringliteral"> estack_end = in_exception_stack(cpu, (unsigned long)stack); </span>
+00035 <span class="stringliteral"> if (estack_end) { </span>
+00036 <span class="stringliteral"> while (stack &lt; estack_end) { </span>
+00037 <span class="stringliteral"> addr = *stack++; </span>
+00038 <span class="stringliteral"> if (__kernel_text_address(addr)) {</span>
+00039 <span class="stringliteral"> i += printk_address(addr);</span>
+00040 <span class="stringliteral"> i += printk("</span> <span class="stringliteral">"); </span>
+00041 <span class="stringliteral"> if (i &gt; 50) {</span>
+00042 <span class="stringliteral"> printk("</span>\n<span class="stringliteral">"); </span>
+00043 <span class="stringliteral"> i = 0;</span>
+00044 <span class="stringliteral"> }</span>
+00045 <span class="stringliteral"> }</span>
+00046 <span class="stringliteral"> }</span>
+00047 <span class="stringliteral"> i += printk("</span> &lt;EOE&gt; <span class="stringliteral">"); </span>
+00048 <span class="stringliteral"> i += 7;</span>
+00049 <span class="stringliteral"> stack = (unsigned long *) estack_end[-2]; </span>
+00050 <span class="stringliteral"> } </span>
+00051 <span class="stringliteral"></span>
+00052 <span class="stringliteral"> irqstack_end = (unsigned long *) (cpu_pda[cpu].irqstackptr);</span>
+00053 <span class="stringliteral"> irqstack = (unsigned long *) (cpu_pda[cpu].irqstackptr - IRQSTACKSIZE + 64);</span>
+00054 <span class="stringliteral"></span>
+00055 <span class="stringliteral"> if (stack &gt;= irqstack &amp;&amp; stack &lt; irqstack_end) {</span>
+00056 <span class="stringliteral"> printk("</span>&lt;IRQ&gt; <span class="stringliteral">"); </span>
+00057 <span class="stringliteral"> while (stack &lt; irqstack_end) {</span>
+00058 <span class="stringliteral"> addr = *stack++;</span>
+00059 <span class="stringliteral"> /*</span>
+00060 <span class="stringliteral"> * If the address is either in the text segment of the</span>
+00061 <span class="stringliteral"> * kernel, or in the region which contains vmalloc'ed</span>
+00062 <span class="stringliteral"> * memory, it *may* be the address of a calling</span>
+00063 <span class="stringliteral"> * routine; if so, print it so that someone tracing</span>
+00064 <span class="stringliteral"> * down the cause of the crash will be able to figure</span>
+00065 <span class="stringliteral"> * out the call path that was taken.</span>
+00066 <span class="stringliteral"> */</span>
+00067 <span class="stringliteral"> if (__kernel_text_address(addr)) {</span>
+00068 <span class="stringliteral"> i += printk_address(addr);</span>
+00069 <span class="stringliteral"> i += printk("</span> <span class="stringliteral">"); </span>
+00070 <span class="stringliteral"> if (i &gt; 50) { </span>
+00071 <span class="stringliteral"> printk("</span>\n <span class="stringliteral">");</span>
+00072 <span class="stringliteral"> i = 0;</span>
+00073 <span class="stringliteral"> } </span>
+00074 <span class="stringliteral"> }</span>
+00075 <span class="stringliteral"> } </span>
+00076 <span class="stringliteral"> stack = (unsigned long *) (irqstack_end[-1]);</span>
+00077 <span class="stringliteral"> printk("</span> &lt;EOI&gt; <span class="stringliteral">");</span>
+00078 <span class="stringliteral"> i += 7;</span>
+00079 <span class="stringliteral"> } </span>
+00080 <span class="stringliteral"></span>
+00081 <span class="stringliteral"> while (((long) stack &amp; (THREAD_SIZE-1)) != 0) {</span>
+00082 <span class="stringliteral"> addr = *stack++;</span>
+00083 <span class="stringliteral"> if (__kernel_text_address(addr)) {</span>
+00084 <span class="stringliteral"> i += printk_address(addr);</span>
+00085 <span class="stringliteral"> i += printk("</span> <span class="stringliteral">"); </span>
+00086 <span class="stringliteral"> if (i &gt; 50) { </span>
+00087 <span class="stringliteral"> printk("</span>\n <span class="stringliteral">");</span>
+00088 <span class="stringliteral"> i = 0;</span>
+00089 <span class="stringliteral"> } </span>
+00090 <span class="stringliteral"> }</span>
+00091 <span class="stringliteral"> }</span>
+00092 <span class="stringliteral"> printk("</span>\n<span class="stringliteral">");</span>
+00093 <span class="stringliteral">}</span>
+00094 <span class="stringliteral"></span>
+00095 <span class="stringliteral">void _stp_dump_stack(void)</span>
+00096 <span class="stringliteral">{</span>
+00097 <span class="stringliteral"> unsigned long dummy;</span>
+00098 <span class="stringliteral"> show_trace(&amp;dummy);</span>
+00099 <span class="stringliteral">}</span>
+00100 <span class="stringliteral"></span>
+00101 <span class="stringliteral">#else /* i386 */</span>
+00102 <span class="stringliteral"></span>
+00103 <span class="stringliteral">static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)</span>
+00104 <span class="stringliteral">{</span>
+00105 <span class="stringliteral"> return p &gt; (void *)tinfo &amp;&amp;</span>
+00106 <span class="stringliteral"> p &lt; (void *)tinfo + THREAD_SIZE - 3;</span>
+00107 <span class="stringliteral">}</span>
+00108 <span class="stringliteral"></span>
+<a name="l00109"></a><a class="code" href="stack_8c.html#a1">00109</a> <span class="stringliteral">int __kernel_text_address(unsigned long addr)</span>
+00110 <span class="stringliteral">{</span>
+00111 <span class="stringliteral"> if (core_kernel_text(addr))</span>
+00112 <span class="stringliteral"> return 1;</span>
+00113 <span class="stringliteral"> return __module_text_address(addr) != NULL;</span>
+00114 <span class="stringliteral">}</span>
+00115 <span class="stringliteral"></span>
+00116 <span class="stringliteral">static inline unsigned long _stp_print_context_stack(struct thread_info *tinfo,</span>
+00117 <span class="stringliteral"> unsigned long *stack, unsigned long ebp)</span>
+00118 <span class="stringliteral">{</span>
+00119 <span class="stringliteral"> unsigned long addr;</span>
+00120 <span class="stringliteral"></span>
+00121 <span class="stringliteral">#ifdef CONFIG_FRAME_POINTER</span>
+00122 <span class="stringliteral"> while (valid_stack_ptr(tinfo, (void *)ebp)) {</span>
+00123 <span class="stringliteral"> addr = *(unsigned long *)(ebp + 4);</span>
+00124 <span class="stringliteral"> _stp_print_buf("</span> [&lt;%08lx&gt;] <span class="stringliteral">", addr);</span>
+00125 <span class="stringliteral"> _stp_print_symbol("</span>%s<span class="stringliteral">", addr);</span>
+00126 <span class="stringliteral"> _stp_print_buf("</span>\n<span class="stringliteral">");</span>
+00127 <span class="stringliteral"> ebp = *(unsigned long *)ebp;</span>
+00128 <span class="stringliteral"> }</span>
+00129 <span class="stringliteral">#else</span>
+00130 <span class="stringliteral"> while (valid_stack_ptr(tinfo, stack)) {</span>
+00131 <span class="stringliteral"> addr = *stack++;</span>
+00132 <span class="stringliteral"> if (__kernel_text_address(addr)) {</span>
+00133 <span class="stringliteral"> _stp_print_buf("</span> [&lt;%08lx&gt;]<span class="stringliteral">", addr);</span>
+00134 <span class="stringliteral"> _stp_print_symbol("</span> %s<span class="stringliteral">", addr);</span>
+00135 <span class="stringliteral"> _stp_print_buf("</span>\n<span class="stringliteral">");</span>
+00136 <span class="stringliteral"> }</span>
+00137 <span class="stringliteral"> }</span>
+00138 <span class="stringliteral">#endif</span>
+00139 <span class="stringliteral"> return ebp;</span>
+00140 <span class="stringliteral">}</span>
+00141 <span class="stringliteral"></span>
+<a name="l00142"></a><a class="code" href="stack_8c.html#a3">00142</a> <span class="stringliteral">void show_trace(struct task_struct *task, unsigned long * stack)</span>
+00143 <span class="stringliteral">{</span>
+00144 <span class="stringliteral"> unsigned long ebp;</span>
+00145 <span class="stringliteral"></span>
+00146 <span class="stringliteral"> if (!task)</span>
+00147 <span class="stringliteral"> task = current;</span>
+00148 <span class="stringliteral"></span>
+00149 <span class="stringliteral"> if (task == current) {</span>
+00150 <span class="stringliteral"> /* Grab ebp right from our regs */</span>
+00151 <span class="stringliteral"> asm ("</span>movl %%ebp, %0<span class="stringliteral">" : "</span>=r<span class="stringliteral">" (ebp) : );</span>
+00152 <span class="stringliteral"> } else {</span>
+00153 <span class="stringliteral"> /* ebp is the last reg pushed by switch_to */</span>
+00154 <span class="stringliteral"> ebp = *(unsigned long *) task-&gt;thread.esp;</span>
+00155 <span class="stringliteral"> }</span>
+00156 <span class="stringliteral"></span>
+00157 <span class="stringliteral"> while (1) {</span>
+00158 <span class="stringliteral"> struct thread_info *context;</span>
+00159 <span class="stringliteral"> context = (struct thread_info *)</span>
+00160 <span class="stringliteral"> ((unsigned long)stack &amp; (~(THREAD_SIZE - 1)));</span>
+00161 <span class="stringliteral"> ebp = _stp_print_context_stack(context, stack, ebp);</span>
+00162 <span class="stringliteral"> stack = (unsigned long*)context-&gt;previous_esp;</span>
+00163 <span class="stringliteral"> if (!stack)</span>
+00164 <span class="stringliteral"> break;</span>
+00165 <span class="stringliteral"> _stp_print_buf("</span> =======================\n<span class="stringliteral">");</span>
+00166 <span class="stringliteral"> }</span>
+00167 <span class="stringliteral">}</span>
+00168 <span class="stringliteral"></span>
+<a name="l00169"></a><a class="code" href="stack_8c.html#a4">00169</a> <span class="stringliteral">void dump_stack(void)</span>
+00170 <span class="stringliteral">{</span>
+00171 <span class="stringliteral"> unsigned long stack;</span>
+00172 <span class="stringliteral"> show_trace(current, &amp;stack);</span>
+00173 <span class="stringliteral">}</span>
+00174 <span class="stringliteral">#endif</span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Mar 21 13:29:45 2005 for SystemTap by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.1 </small></address>
+</body>
+</html>