sched: Slightly fix up tests/prov
[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 /* Backtraces the current user context, if there is one */
31 void backtrace_current_ctx(void);
32
33 /*** Programmatic Backtraces */
34 /* Backtraces a PC/FP, stores results in *pcs, with no protections */
35 size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
36                       size_t nr_slots);
37 /* Backtraces a user PC/FP, stores results in *pcs */
38 size_t backtrace_user_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
39                                                    size_t nr_slots);
40 /* Prints out a backtrace list, using pfunc(opaque, "line") for the printk.
41  * This does a symbol lookup on the kernel binary, so it is less useful for a
42  * user backtrace. */
43 void print_backtrace_list(uintptr_t *pcs, size_t nr_pcs,
44                                                   void (*pfunc)(void *, const char *), void *opaque);
45 /* Backtraces the calling kernel context, using pfunc for printing */
46 void gen_backtrace(void (*pfunc)(void *, const char *), void *opaque);
47
48 /* Arch dependent, listed here for ease-of-use */
49 static inline uintptr_t get_caller_pc(void);
50
51 /* Returns a null-terminated string with the function name for a given PC /
52  * instruction pointer.  kfree() the result. */
53 char *get_fn_name(uintptr_t pc);
54
55 /* Returns the address of sym, or 0 if it does not exist */
56 uintptr_t get_symbol_addr(char *sym);
57
58 /* For a poor-mans function tracer (can add these with spatch) */
59 void __print_func_entry(const char *func, const char *file);
60 void __print_func_exit(const char *func, const char *file);
61 #define print_func_entry() __print_func_entry(__FUNCTION__, __FILE__)
62 #define print_func_exit() __print_func_exit(__FUNCTION__, __FILE__)
63 void hexdump(void *v, int length);
64 void pahexdump(uintptr_t pa, int length);
65 int printdump(char *buf, int numprint, int buflen, uint8_t *data);
66
67 extern bool printx_on;
68 void set_printx(int mode);
69 #define printx(args...)                                                 \
70         do {                                                                                    \
71                 if (printx_on)                                                          \
72                         printk(args);                                                   \
73         } while (0)
74 #define trace_printx(args...)                                           \
75         do {                                                                                    \
76                 if (printx_on)                                                          \
77                         trace_printk(args);                             \
78         } while (0)
79
80 void debug_addr_proc(struct proc *p, unsigned long addr);
81 void debug_addr_pid(int pid, unsigned long addr);
82
83 void px_lock(void);
84 void px_unlock(void);