git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
feat: nearly complete POSIX.1-2008 compliant terminal interface implementation
[lunaix-os.git]
/
lunaix-os
/
kernel
/
debug
/
trace.c
diff --git
a/lunaix-os/kernel/debug/trace.c
b/lunaix-os/kernel/debug/trace.c
index 1cf9ae34d37295a7251058d80813c978c7e84e12..8c5c1800fd6676ab9ec65d959eea2dc17cbf7706 100644
(file)
--- 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);
}
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,
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;
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);
ptr_t pc = *(frame + 1);
current = trace_sym_lookup(pc);