summaryrefslogtreecommitdiffstats
path: root/runtime/docs/html/stack_8c-source.html
diff options
context:
space:
mode:
authorhunt <hunt>2005-03-29 18:07:58 +0000
committerhunt <hunt>2005-03-29 18:07:58 +0000
commite32551b18f4560056d2d482f5e1505b1b98fa82a (patch)
tree4e9e07a9b46a4fd5dea27732571cbb04c0ef5dee /runtime/docs/html/stack_8c-source.html
parent13b35bb112459702e7371ecc89d7deb789818a86 (diff)
downloadsystemtap-steved-e32551b18f4560056d2d482f5e1505b1b98fa82a.tar.gz
systemtap-steved-e32551b18f4560056d2d482f5e1505b1b98fa82a.tar.xz
systemtap-steved-e32551b18f4560056d2d482f5e1505b1b98fa82a.zip
*** empty log message ***
Diffstat (limited to 'runtime/docs/html/stack_8c-source.html')
-rw-r--r--runtime/docs/html/stack_8c-source.html341
1 files changed, 163 insertions, 178 deletions
diff --git a/runtime/docs/html/stack_8c-source.html b/runtime/docs/html/stack_8c-source.html
index dda3013a..f4df8413 100644
--- a/runtime/docs/html/stack_8c-source.html
+++ b/runtime/docs/html/stack_8c-source.html
@@ -4,181 +4,166 @@
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.1 -->
-<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
-<h1>stack.c</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/* -*- linux-c -*- */</span>
-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 = <a class="code" href="io_8c.html#a1">_stp_kallsyms_lookup</a>(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>
-00109 <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>
-00142 <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>
-00169 <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 Tue Mar 22 10:27:36 2005 for SystemTap.</small></body>
-</html>
+<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
+<h1>stack.c</h1><a href="stack_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef _STACK_C_</span>
+00002 <span class="preprocessor"></span><span class="preprocessor">#define _STACK_C_</span>
+00003 <span class="preprocessor"></span><span class="comment">/* -*- linux-c -*- */</span>
+00004 <span class="comment"></span>
+00005 <span class="comment">/** @file stack.c</span>
+00006 <span class="comment"> * @brief Stack Tracing Functions</span>
+00007 <span class="comment"> */</span>
+00008 <span class="comment"></span>
+00009 <span class="comment">/** @addtogroup stack Stack Tracing Functions</span>
+00010 <span class="comment"> * @{</span>
+00011 <span class="comment"> */</span>
+00012
+00013 <span class="preprocessor">#include "sym.c"</span>
+00014
+00015 <span class="keyword">static</span> int (*_stp_kta)(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> addr)=(<span class="keywordtype">void</span> *)KTA;
+00016
+00017 <span class="preprocessor">#ifdef __x86_64__</span>
+00018 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span> __stp_stack_print (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *stack, <span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
+00019 {
+00020 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> addr;
+00021
+00022 <span class="keywordflow">if</span> (verbose)
+00023 _stp_print ("trace for %d (%s)\n", current-&gt;pid, current-&gt;comm);
+00024
+00025 while (((<span class="keywordtype">long</span>) stack &amp; (THREAD_SIZE-1)) != 0) {
+00026 addr = *stack++;
+00027 <span class="keywordflow">if</span> (_stp_kta(addr)) {
+00028 <span class="keywordflow">if</span> (verbose)
+00029 _stp_symbol_print (addr);
+00030 else
+00031 _stp_print ("0x%lx ", addr);
+00032 }
+00033 }
+00034 _stp_print_str ("\n");
+00035 }
+00036
+00037
+00038 static <span class="keywordtype">char</span> *__stp_stack_sprint (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *stack, <span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
+00039 {
+00040 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> addr;
+00041 <span class="keywordtype">char</span> *ptr = _stp_scbuf_cur();
+00042 <span class="keywordflow">while</span> (((<span class="keywordtype">long</span>) stack &amp; (THREAD_SIZE-1)) != 0) {
+00043 addr = *stack++;
+00044 <span class="keywordflow">if</span> (_stp_kta(addr)) {
+00045 <span class="keywordflow">if</span> (verbose)
+00046 _stp_symbol_sprint (addr);
+00047 else
+00048 _stp_sprint ("0x%lx ", addr);
+00049 }
+00050 }
+00051 return ptr;
+00052 }
+00053
+00054 #else <span class="comment">/* i386 */</span>
+00055
+00056 static inline <span class="keywordtype">int</span> valid_stack_ptr (struct thread_info *tinfo, <span class="keywordtype">void</span> *p)
+00057 {
+00058 <span class="keywordflow">return</span> p &gt; (<span class="keywordtype">void</span> *)tinfo &amp;&amp;
+00059 p &lt; (<span class="keywordtype">void</span> *)tinfo + THREAD_SIZE - 3;
+00060 }
+00061
+00062 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> _stp_print_context_stack (
+00063 <span class="keyword">struct</span> thread_info *tinfo,
+00064 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *stack,
+00065 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ebp )
+00066 {
+00067 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> addr;
+00068
+00069 <span class="preprocessor">#ifdef CONFIG_FRAME_POINTER</span>
+00070 <span class="preprocessor"></span> <span class="keywordflow">while</span> (valid_stack_ptr(tinfo, (<span class="keywordtype">void</span> *)ebp)) {
+00071 addr = *(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *)(ebp + 4);
+00072 <a class="code" href="group__sym.html#ga3">_stp_symbol_print</a> (addr);
+00073 <a class="code" href="group__io.html#ga2">_stp_print_str</a>(<span class="stringliteral">"\n"</span>);
+00074 ebp = *(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *)ebp;
+00075 }
+00076 <span class="preprocessor">#else</span>
+00077 <span class="preprocessor"></span> <span class="keywordflow">while</span> (valid_stack_ptr(tinfo, stack)) {
+00078 addr = *stack++;
+00079 <span class="keywordflow">if</span> (_stp_kta (addr)) {
+00080 <a class="code" href="group__sym.html#ga3">_stp_symbol_print</a> (addr);
+00081 <a class="code" href="group__io.html#ga2">_stp_print_str</a> (<span class="stringliteral">"\n"</span>);
+00082 }
+00083 }
+00084 <span class="preprocessor">#endif</span>
+00085 <span class="preprocessor"></span> <span class="keywordflow">return</span> ebp;
+00086 }
+00087
+00088 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> _stp_sprint_context_stack (
+00089 <span class="keyword">struct</span> thread_info *tinfo,
+00090 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *stack,
+00091 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ebp )
+00092 {
+00093 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> addr;
+00094
+00095 <span class="preprocessor">#ifdef CONFIG_FRAME_POINTER</span>
+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>);
+00100 ebp = *(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *)ebp;
+00101 }
+00102 <span class="preprocessor">#else</span>
+00103 <span class="preprocessor"></span> <span class="keywordflow">while</span> (valid_stack_ptr(tinfo, stack)) {
+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>);
+00108 }
+00109 }
+00110 <span class="preprocessor">#endif</span>
+00111 <span class="preprocessor"></span> <span class="keywordflow">return</span> ebp;
+00112 }
+00113
+00114 <span class="keyword">static</span> <span class="keywordtype">void</span> __stp_stack_print (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *stack, <span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
+00115 {
+00116 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ebp;
+00117
+00118 <span class="comment">/* Grab ebp right from our regs */</span>
+00119 <span class="keyword">asm</span> (<span class="stringliteral">"movl %%ebp, %0"</span> : <span class="stringliteral">"=r"</span> (ebp) : );
+00120
+00121 <span class="keywordflow">while</span> (stack) {
+00122 <span class="keyword">struct </span>thread_info *context = (<span class="keyword">struct </span>thread_info *)
+00123 ((<span class="keywordtype">unsigned</span> long)stack &amp; (~(THREAD_SIZE - 1)));
+00124 ebp = _stp_print_context_stack (context, stack, ebp);
+00125 stack = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>*)context-&gt;previous_esp;
+00126 }
+00127 }
+00128
+00129 <span class="keyword">static</span> <span class="keywordtype">void</span> __stp_stack_sprint (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *stack, <span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
+00130 {
+00131 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ebp;
+00132
+00133 <span class="comment">/* Grab ebp right from our regs */</span>
+00134 <span class="keyword">asm</span> (<span class="stringliteral">"movl %%ebp, %0"</span> : <span class="stringliteral">"=r"</span> (ebp) : );
+00135
+00136 <span class="keywordflow">while</span> (stack) {
+00137 <span class="keyword">struct </span>thread_info *context = (<span class="keyword">struct </span>thread_info *)
+00138 ((<span class="keywordtype">unsigned</span> long)stack &amp; (~(THREAD_SIZE - 1)));
+00139 ebp = _stp_sprint_context_stack (context, stack, ebp);
+00140 stack = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>*)context-&gt;previous_esp;
+00141 }
+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 (&amp;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 (&amp;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>
+</pre></div></body></html>