X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/2236410f4582ab45ae8c384dd6eeeef5d10aab15..59ecf21e36b2332f6adf2a568ef555283d8c119a:/lunaix-os/kernel/debug/trace.c diff --git a/lunaix-os/kernel/debug/trace.c b/lunaix-os/kernel/debug/trace.c index 1235884..8c5c180 100644 --- a/lunaix-os/kernel/debug/trace.c +++ b/lunaix-os/kernel/debug/trace.c @@ -77,6 +77,10 @@ ksym_getstr(struct ksym_entry* sym) trace_ctx.ksym_table->ksym_label_off + sym->label_off); } +static inline bool valid_fp(ptr_t ptr) { + return KERNEL_STACK < ptr && ptr < KERNEL_EXEC_END; +} + int trace_walkback(struct trace_record* tb_buffer, ptr_t fp, @@ -87,7 +91,7 @@ trace_walkback(struct trace_record* tb_buffer, struct ksym_entry* current = NULL; int i = 0; - while (frame && i < limit) { + while (valid_fp((ptr_t)frame) && i < limit) { ptr_t pc = *(frame + 1); current = trace_sym_lookup(pc); @@ -148,7 +152,8 @@ trace_printswctx(const isr_param* p, char* direction) p->execp->vector, p->execp->err_code); - trace_print_code_entry(sym->pc, p->execp->eip, ksym_getstr(sym)); + ptr_t sym_pc = sym ? sym->pc : p->execp->eip; + trace_print_code_entry(sym_pc, p->execp->eip, ksym_getstr(sym)); } void