X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/b60166b327a9108b07e3069fa6568a451529ffd9..6c506d8916fb114675e93d0e2cb20831d4022294:/lunaix-os/kernel/debug/trace.c?ds=sidebyside diff --git a/lunaix-os/kernel/debug/trace.c b/lunaix-os/kernel/debug/trace.c index 1e5c44a..0a70de3 100644 --- a/lunaix-os/kernel/debug/trace.c +++ b/lunaix-os/kernel/debug/trace.c @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -7,6 +6,7 @@ #include #include +#include #include @@ -14,36 +14,26 @@ LOG_MODULE("TRACE") +weak struct ksyms __lunaix_ksymtable[] = { }; +extern struct ksyms __lunaix_ksymtable[]; + static struct trace_context trace_ctx; void trace_modksyms_init(struct boot_handoff* bhctx) { - struct boot_modent* modents = bhctx->mods.entries; - for (size_t i = 0; i < bhctx->mods.mods_num; i++) { - struct boot_modent* mod = &bhctx->mods.entries[i]; - if (streq(mod->str, "modksyms")) { - assert(PG_ALIGNED(mod->start)); - - ptr_t end = ROUNDUP(mod->end, PG_SIZE); - ptr_t ksym_va = - (ptr_t)vmap(mod->start, (end - mod->start), PG_PREM_R, 0); - - assert(ksym_va); - trace_ctx.ksym_table = (struct ksyms*)ksym_va; - } - } + trace_ctx.ksym_table = __lunaix_ksymtable; } struct ksym_entry* trace_sym_lookup(ptr_t addr) { - int c = trace_ctx.ksym_table->ksym_count; + unsigned long c = trace_ctx.ksym_table->ksym_count; struct ksym_entry* ksent = trace_ctx.ksym_table->syms; int i = c - 1, j = 0, m = 0; - if (addr > ksent[i].pc || addr < ksent[j].pc || addr < KERNEL_EXEC) { + if (addr > ksent[i].pc || addr < ksent[j].pc || !kernel_addr(addr)) { return NULL; } @@ -73,13 +63,14 @@ ksym_getstr(struct ksym_entry* sym) return "???"; } - return (char*)((ptr_t)trace_ctx.ksym_table + - trace_ctx.ksym_table->ksym_label_off + sym->label_off); + return sym->label; } static inline bool valid_fp(ptr_t ptr) { ptr_t start = ROUNDUP(current_thread->kstack - KSTACK_SIZE, MEM_PAGE); - return start < ptr && ptr < current_thread->kstack; + + return (start < ptr && ptr < current_thread->kstack) + || arch_valid_fp(ptr); } int @@ -120,9 +111,9 @@ static inline void trace_print_code_entry(ptr_t sym_pc, ptr_t inst_pc, char* sym) { if (sym_pc) { - DEBUG("%p+%p: %s", sym_pc, inst_pc - sym_pc, sym); + DEBUG("%s+%p", sym, inst_pc - sym_pc); } else { - DEBUG("%p+%p: %s", inst_pc, sym_pc, sym); + DEBUG("%s [%p]", sym, sym_pc); } } @@ -147,7 +138,12 @@ trace_printstack_of(ptr_t fp) void trace_printstack() { - trace_printstack_of(abi_get_callframe()); + if (current_thread) { + trace_printstack_isr(current_thread->intr_ctx); + } + else { + trace_printstack_of(abi_get_callframe()); + } } static void @@ -200,4 +196,6 @@ trace_printstack_isr(const isr_param* isrm) p = p->execp->saved_prev_ctx; } + + DEBUG("----- [trace end] -----\n"); } \ No newline at end of file