feat: nearly complete POSIX.1-2008 compliant terminal interface implementation
[lunaix-os.git] / lunaix-os / kernel / debug / trace.c
index 1235884c68704417f821f36501fa8249133fd2de..8c5c1800fd6676ab9ec65d959eea2dc17cbf7706 100644 (file)
@@ -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