vmrunkernel: load the file using the ELF library
[akaros.git] / kern / include / kdebug.h
1 #pragma once
2
3 #include <ros/common.h>
4 #include <ros/trapframe.h>
5 #include <arch/kdebug.h>
6 #include <profiler.h>
7 /* for includes */ struct proc;
8
9 struct symtab_entry {
10         char *name;
11         uintptr_t addr;
12 };
13
14 /* An alternative here is to have backtrace_list kmalloc an array.  The downside
15  * is that we're calling into the allocator in potentially-delicate situations,
16  * such as the NMI handler. */
17 #define MAX_BT_DEPTH 20
18
19 /*** Printk Backtraces, usually used for debugging or from the monitor */
20 /* Backtraces the calling kernel context */
21 void backtrace(void);
22 /* Backtraces a PC/FP, with no protections */
23 void backtrace_frame(uintptr_t pc, uintptr_t fp);
24 /* Backtraces a user PC/FP */
25 void backtrace_user_frame(uintptr_t pc, uintptr_t fp);
26 /* Backtraces a hardware TF.  Can handle user or kernel TFs */
27 void backtrace_hwtf(struct hw_trapframe *hw_tf);
28 /* Backtraces a user context */
29 void backtrace_user_ctx(struct proc *p, struct user_context *ctx);
30
31 /*** Programmatic Backtraces */
32 /* Backtraces a PC/FP, stores results in *pcs, with no protections */
33 size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
34                       size_t nr_slots);
35 /* Backtraces a user PC/FP, stores results in *pcs */
36 size_t backtrace_user_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
37                                                    size_t nr_slots);
38 /* Prints out a backtrace list, using pfunc(opaque, "line") for the printk.
39  * This does a symbol lookup on the kernel binary, so it is less useful for a
40  * user backtrace. */
41 void print_backtrace_list(uintptr_t *pcs, size_t nr_pcs,
42                                                   void (*pfunc)(void *, const char *), void *opaque);
43 /* Backtraces the calling kernel context, using pfunc for printing */
44 void gen_backtrace(void (*pfunc)(void *, const char *), void *opaque);
45
46 /* Arch dependent, listed here for ease-of-use */
47 static inline uintptr_t get_caller_pc(void);
48
49 /* Returns a null-terminated string with the function name for a given PC /
50  * instruction pointer.  kfree() the result. */
51 char *get_fn_name(uintptr_t pc);
52
53 /* Returns the address of sym, or 0 if it does not exist */
54 uintptr_t get_symbol_addr(char *sym);
55
56 /* For a poor-mans function tracer (can add these with spatch) */
57 void __print_func_entry(const char *func, const char *file);
58 void __print_func_exit(const char *func, const char *file);
59 #define print_func_entry() __print_func_entry(__FUNCTION__, __FILE__)
60 #define print_func_exit() __print_func_exit(__FUNCTION__, __FILE__)
61 void hexdump(void *v, int length);
62 void pahexdump(uintptr_t pa, int length);
63 int printdump(char *buf, int numprint, int buflen, uint8_t *data);
64
65 extern bool printx_on;
66 void set_printx(int mode);
67 #define printx(args...)                                                 \
68         do {                                                                                    \
69                 if (printx_on)                                                          \
70                         printk(args);                                                   \
71         } while (0)
72 #define trace_printx(args...)                                           \
73         do {                                                                                    \
74                 if (printx_on)                                                          \
75                         trace_printk(args);                             \
76         } while (0)
77
78 void debug_addr_proc(struct proc *p, unsigned long addr);
79 void debug_addr_pid(int pid, unsigned long addr);
80
81 void px_lock(void);
82 void px_unlock(void);