/* BLURB gpl

                           Coda File System
                              Release 5

          Copyright (c) 2005 Carnegie Mellon University
                  Additional copyrights listed below

This  code  is  distributed "AS IS" without warranty of any kind under
the terms of the GNU General Public Licence Version 2, as shown in the
file  LICENSE.  The  technical and financial  contributors to Coda are
listed in the file CREDITS.

                        Additional copyrights

#*/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <sys/types.h>
#include "lwp_stacktrace.h"

#ifndef HAVE_REGISTER_T
typedef int register_t;
#endif

void lwp_stacktrace(FILE *fp, void *top, stack_t *stack)
{
    /* Add others here as needed */
#if defined(__i386__)
    register_t ip;
    register_t ebp;
    register_t *esp;
    int count;
    
    /* Set current stack pointer to top */
    /* top is the address of the first parameter on the stack and it is an
     * integer. Next to this _should_ be the return address and the previous
     * stack pointer */
    esp = (register_t *)top;
    esp -= 2;

    fprintf(fp, "Call Trace:\n [<unknown>]");
    while (esp) {
	ebp = *(esp++); /* LEAVE */
	ip  = *(esp++); /* RET */
	
	/* make sure we stay within the allocated stack frame */
	if ((register_t *)ebp <= esp ||
	   (stack && stack->ss_sp &&
	    (char *)ebp >= (char *)stack->ss_sp+stack->ss_size))
	    break;

	//for (count = 0; count < 6 && esp < (register_t *)ebp; count++)
	for (count = 0; esp < (register_t *)ebp; count++)
	    fprintf(fp, " <%08x>", *(esp++));

	fprintf(fp, "\n [<%08x>] ", ip);

	esp = (register_t *)ebp;
    }
    fprintf(fp, "\n");
#endif
}


syntax highlighted by Code2HTML, v. 0.9.1