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