Splits x86 into 32 and 64 bit (XCC)
[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 #ifndef ROS_KERN_ARCH_KDEBUG_H
8 #define ROS_KERN_ARCH_KDEBUG_H
9
10 #include <ros/common.h>
11 #include <arch/x86.h>
12
13 #include <stdio.h>
14
15 /* Returns a PC/EIP in the function that called us, preferably near the call
16  * site.  Returns 0 when we can't jump back any farther. */
17 static inline uintptr_t get_caller_pc(void)
18 {
19         unsigned long *ebp = (unsigned long*)read_bp();
20         if (!ebp)
21                 return 0;
22         /* this is part of the way back into the call() instruction's bytes
23          * eagle-eyed readers should be able to explain why this is good enough, and
24          * retaddr (just *(ebp + 1) is not) */
25         return *(ebp + 1) - 1;
26 }
27
28 #endif /* ROS_KERN_ARCH_KDEBUG_H */