net: Add network_offset to blocks
[akaros.git] / kern / arch / x86 / kdebug.h
1 /* Copyright (c) 2011 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * x86-specific Kernel debugging headers and static inlines */
6
7 #pragma once
8
9 #include <ros/common.h>
10 #include <arch/x86.h>
11
12 #include <stdio.h>
13
14 // Debug information about a particular instruction pointer
15 typedef struct eipdebuginfo {
16         const char *eip_file;           // Source code filename for EIP
17         int eip_line;                           // Source code linenumber for EIP
18
19         const char *eip_fn_name;        // Name of function containing EIP
20                                                                 //  - Note: not null terminated!
21         int eip_fn_namelen;                     // Length of function name
22         uintptr_t eip_fn_addr;          // Address of start of function
23         int eip_fn_narg;                        // Number of function arguments
24 } eipdebuginfo_t;
25
26 int debuginfo_eip(uintptr_t eip, eipdebuginfo_t *info);
27 void *debug_get_fn_addr(char *fn_name);
28
29 /* Returns a PC/EIP in the function that called us, preferably near the call
30  * site.  Returns 0 when we can't jump back any farther. */
31 static inline uintptr_t get_caller_pc(void)
32 {
33         unsigned long *ebp = (unsigned long*)read_bp();
34         if (!ebp)
35                 return 0;
36         /* this is part of the way back into the call() instruction's bytes
37          * eagle-eyed readers should be able to explain why this is good enough, and
38          * retaddr (just *(ebp + 1) is not) */
39         return *(ebp + 1) - 1;
40 }