|  | /* Copyright (c) 2011 The Regents of the University of California | 
|  | * Barret Rhoden <brho@cs.berkeley.edu> | 
|  | * See LICENSE for details. | 
|  | * | 
|  | * x86-specific Kernel debugging headers and static inlines */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include <ros/common.h> | 
|  | #include <arch/x86.h> | 
|  |  | 
|  | #include <stdio.h> | 
|  |  | 
|  | // Debug information about a particular instruction pointer | 
|  | typedef struct eipdebuginfo { | 
|  | const char *eip_file;		// Source code filename for EIP | 
|  | int eip_line;				// Source code linenumber for EIP | 
|  |  | 
|  | const char *eip_fn_name;	// Name of function containing EIP | 
|  | //  - Note: not null terminated! | 
|  | int eip_fn_namelen;			// Length of function name | 
|  | uintptr_t eip_fn_addr;		// Address of start of function | 
|  | int eip_fn_narg;			// Number of function arguments | 
|  | } eipdebuginfo_t; | 
|  |  | 
|  | int debuginfo_eip(uintptr_t eip, eipdebuginfo_t *info); | 
|  | void *debug_get_fn_addr(char *fn_name); | 
|  |  | 
|  | /* Returns a PC/EIP in the function that called us, preferably near the call | 
|  | * site.  Returns 0 when we can't jump back any farther. */ | 
|  | static inline uintptr_t get_caller_pc(void) | 
|  | { | 
|  | unsigned long *ebp = (unsigned long*)read_bp(); | 
|  | if (!ebp) | 
|  | return 0; | 
|  | /* this is part of the way back into the call() instruction's bytes | 
|  | * eagle-eyed readers should be able to explain why this is good enough, and | 
|  | * retaddr (just *(ebp + 1) is not) */ | 
|  | return *(ebp + 1) - 1; | 
|  | } |