X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/d1b1c8d9119229dbeed06cd252917e54a1cb77f6..cbc8fdbfe473e23e19690204418e19999a9522d1:/lunaix-os/kernel/debug/trace.c diff --git a/lunaix-os/kernel/debug/trace.c b/lunaix-os/kernel/debug/trace.c index 66e5505..452b3cd 100644 --- a/lunaix-os/kernel/debug/trace.c +++ b/lunaix-os/kernel/debug/trace.c @@ -3,19 +3,19 @@ #include #include #include +#include -#include -#include +#include +#include #include #include #define NB_TRACEBACK 16 -LOG_MODULE("TRACE") +LOG_MODULE("lkdbg") -weak struct ksyms __lunaix_ksymtable[] = { }; -extern struct ksyms __lunaix_ksymtable[]; +extern_autogen(ksymtable); static struct trace_context trace_ctx; @@ -33,7 +33,10 @@ trace_log(const char* fmt, ...) void trace_modksyms_init(struct boot_handoff* bhctx) { - trace_ctx.ksym_table = __lunaix_ksymtable; + trace_ctx.ksym_table = autogen(struct ksyms, ksymtable); + + INFO("symbols loaded: %d @0x%lx", + trace_ctx.ksym_table->ksym_count, trace_ctx.ksym_table->syms); } struct ksym_entry* @@ -71,14 +74,14 @@ static char* ksym_getstr(struct ksym_entry* sym) { if (!sym) { - return "???"; + return NULL; } return sym->label; } static inline bool valid_fp(ptr_t ptr) { - ptr_t start = ROUNDUP(current_thread->kstack - KSTACK_SIZE, MEM_PAGE); + ptr_t start = ROUNDUP(current_thread->kstack - KSTACK_SIZE, PAGE_SIZE); return (start < ptr && ptr < current_thread->kstack) || arch_valid_fp(ptr); @@ -121,10 +124,10 @@ trace_walkback(struct trace_record* tb_buffer, static inline void trace_print_code_entry(ptr_t sym_pc, ptr_t inst_pc, char* sym) { - if (sym_pc) { + if (sym) { trace_log("%s+%p", sym, inst_pc - sym_pc); } else { - trace_log("%s [%p]", sym, sym_pc); + trace_log("??? [%p]", inst_pc); } } @@ -161,7 +164,7 @@ static void trace_printswctx(const struct hart_state* hstate, bool from_usr, bool to_usr) { - struct ksym_entry* sym = trace_sym_lookup(hstate->execp->eip); + struct ksym_entry* sym = trace_sym_lookup(hart_pc(hstate)); trace_log("^^^^^ --- %s", to_usr ? "user" : "kernel"); trace_print_transistion_short(hstate);