X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/69777bdcab284335651a8002e2896f3862fa423d..9209afa5f69cffa48a04c4a9066357d5cba75926:/lunaix-os/kernel/debug/trace.c diff --git a/lunaix-os/kernel/debug/trace.c b/lunaix-os/kernel/debug/trace.c index 2e30b09..0a70de3 100644 --- a/lunaix-os/kernel/debug/trace.c +++ b/lunaix-os/kernel/debug/trace.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -6,6 +6,7 @@ #include #include +#include #include @@ -13,32 +14,21 @@ 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(!va_offset(mod->start)); - - pte_t pte = mkpte(mod->start, KERNEL_DATA); - size_t n = pfn(mod->end) - pfn(mod->start); - - ptr_t ksym_va = vmap_leaf_ptes(pte, n); - - 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; @@ -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); } } @@ -205,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