Added an arch_get_caller() function that returns the caller of the calling function :-)
Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12810 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,11 +1,29 @@
|
|||||||
/*
|
/*
|
||||||
** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
* Copyright 2005, Axel Dörfler, [email protected].
|
||||||
** Distributed under the terms of the NewOS License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*
|
||||||
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||||
|
* Distributed under the terms of the NewOS License.
|
||||||
|
*/
|
||||||
#ifndef _KERNEL_ARCH_DEBUG_H
|
#ifndef _KERNEL_ARCH_DEBUG_H
|
||||||
#define _KERNEL_ARCH_DEBUG_H
|
#define _KERNEL_ARCH_DEBUG_H
|
||||||
|
|
||||||
int arch_dbg_init(kernel_args *ka);
|
|
||||||
|
#include <SupportDefs.h>
|
||||||
|
|
||||||
|
struct kernel_args;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
status_t arch_dbg_init(kernel_args *args);
|
||||||
|
void *arch_get_caller(void);
|
||||||
void arch_dbg_save_registers(int *);
|
void arch_dbg_save_registers(int *);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _KERNEL_ARCH_DEBUG_H */
|
#endif /* _KERNEL_ARCH_DEBUG_H */
|
||||||
|
|||||||
@@ -16,7 +16,12 @@
|
|||||||
#include <arch_cpu.h>
|
#include <arch_cpu.h>
|
||||||
|
|
||||||
|
|
||||||
#define NUM_PREVIOUS_LOCATIONS 16
|
struct stack_frame {
|
||||||
|
struct stack_frame *previous;
|
||||||
|
addr_t return_address;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NUM_PREVIOUS_LOCATIONS 32
|
||||||
|
|
||||||
extern struct iframe_stack gBootFrameStack;
|
extern struct iframe_stack gBootFrameStack;
|
||||||
|
|
||||||
@@ -110,12 +115,12 @@ dbg_stack_trace(int argc, char **argv)
|
|||||||
dprintf(" vector: 0x%x, error code: 0x%x\n", frame->vector, frame->error_code);
|
dprintf(" vector: 0x%x, error code: 0x%x\n", frame->vector, frame->error_code);
|
||||||
ebp = frame->ebp;
|
ebp = frame->ebp;
|
||||||
} else {
|
} else {
|
||||||
uint32 eip = *((uint32 *)ebp + 1);
|
addr_t eip = ((struct stack_frame *)ebp)->return_address;
|
||||||
const char *symbol, *image;
|
const char *symbol, *image;
|
||||||
uint32 nextEbp = *(uint32 *)ebp;
|
addr_t nextEbp = (addr_t)((struct stack_frame *)ebp)->previous;
|
||||||
addr_t baseAddress;
|
addr_t baseAddress;
|
||||||
bool exactMatch;
|
bool exactMatch;
|
||||||
uint32 diff = nextEbp - ebp;
|
addr_t diff = nextEbp - ebp;
|
||||||
|
|
||||||
if (eip == 0 || ebp == 0)
|
if (eip == 0 || ebp == 0)
|
||||||
break;
|
break;
|
||||||
@@ -147,7 +152,23 @@ dbg_stack_trace(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
void *
|
||||||
|
arch_get_caller(void)
|
||||||
|
{
|
||||||
|
// It looks like you would get the wrong stack frame here, but
|
||||||
|
// since read_ebp() is an assembler inline macro, GCC seems to
|
||||||
|
// be smart enough to save its original value.
|
||||||
|
struct stack_frame *frame;
|
||||||
|
read_ebp(frame);
|
||||||
|
|
||||||
|
return (void *)frame->return_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
arch_dbg_init(kernel_args *args)
|
arch_dbg_init(kernel_args *args)
|
||||||
{
|
{
|
||||||
// at this stage, the debugger command system is alive
|
// at this stage, the debugger command system is alive
|
||||||
|
|||||||
Reference in New Issue
Block a user