diff options
author | hunt <hunt> | 2005-03-21 21:47:54 +0000 |
---|---|---|
committer | hunt <hunt> | 2005-03-21 21:47:54 +0000 |
commit | 33776f4955fa52ae3e4dc87ab6ac484a3ebc9a71 (patch) | |
tree | 3d5346f8ba9553804b71806b94654ffe703f3b29 /runtime/docs/html/stack_8c-source.html | |
parent | d14648baf61205e4259da53b383931f20c41c5bb (diff) | |
download | systemtap-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.html | 187 |
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 <linux/kallsyms.h></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, &symsize, &offset, &modname, namebuf); +00016 <span class="keywordflow">if</span> (!symname) +00017 return printk("[<%016lx>]", address); +00018 if (!modname) +00019 modname = delim = ""; +00020 return printk("<%016lx>{%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 < 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 > 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> <EOE> <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 >= irqstack && stack < irqstack_end) {</span> +00056 <span class="stringliteral"> printk("</span><IRQ> <span class="stringliteral">"); </span> +00057 <span class="stringliteral"> while (stack < 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 > 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> <EOI> <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 & (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 > 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(&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 > (void *)tinfo &&</span> +00106 <span class="stringliteral"> p < (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> [<%08lx>] <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> [<%08lx>]<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->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 & (~(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->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, &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 +<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> |