From 728fa8052dff8d540c18dd5f3b41c24e2f2de46b Mon Sep 17 00:00:00 2001 From: tracer-ysyx Date: Wed, 20 Mar 2024 19:29:51 +0800 Subject: [PATCH] =?UTF-8?q?>=20compile=20NEMU=20ysyx=5F22040000=20?= =?UTF-8?q?=E6=9D=8E=E5=BF=83=E6=9D=A8=20Linux=20calcite=206.6.19=20#1-Nix?= =?UTF-8?q?OS=20SMP=20PREEMPT=5FDYNAMIC=20Fri=20Mar=20=201=2012:35:11=20UT?= =?UTF-8?q?C=202024=20x86=5F64=20GNU/Linux=20=2019:29:51=20=20up=20=20=206?= =?UTF-8?q?:35,=20=202=20users,=20=20load=20average:=200.51,=200.55,=200.4?= =?UTF-8?q?6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nemu/src/utils/ftrace.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/nemu/src/utils/ftrace.c b/nemu/src/utils/ftrace.c index a045fb9..a21cc71 100644 --- a/nemu/src/utils/ftrace.c +++ b/nemu/src/utils/ftrace.c @@ -17,15 +17,14 @@ static int cmp_func_t(const void *a, const void *b) { return ((func_t *)a)->start > ((func_t *)b)->start; } -static const char *get_func_name(vaddr_t addr) { +static func_t *get_func(vaddr_t addr) { int l = 0, r = func_table_len - 1; while(l <= r) { int mid = (l + r) / 2; if(func_table[mid].start <= addr) l = mid + 1; else r = mid - 1; } - // if(func_table[l].start + func_table[l].len < addr) return "???"; - return l == 0 ? "???" : func_table[l - 1].name; + return l == 0 ? NULL : &func_table[l - 1]; } void init_elf(const char *path) { @@ -101,11 +100,12 @@ failed_nosym: } void ftrace_call(vaddr_t pc, vaddr_t addr) { + func_t *f = get_func(addr); Assert(ftrace_stack_len < CONFIG_FTRACE_STACK_SIZE, "Ftrace stack exceed size limit, consider turn off ftrace or increase " "FTRACE_STACK_SIZE."); ftrace_stack[ftrace_stack_len] = pc + 4; - Trace("%*s0x%x call [%s@0x%x]", ftrace_stack_len, "", pc, get_func_name(addr), + Trace("%*s0x%x call <%s@0x%x>", ftrace_stack_len, "", pc, f == NULL ? "???" : f->name, addr); ftrace_stack_len++; } @@ -115,7 +115,9 @@ void ftrace_return(vaddr_t pc, vaddr_t addr) { for (; addr != ftrace_stack[ftrace_stack_len] && ftrace_stack_len >= 0; ftrace_stack_len--) { vaddr_t tco_addr = ftrace_stack[ftrace_stack_len]; - Trace("%*s0x%x [%s@0x%x] ", ftrace_stack_len, "", pc, get_func_name(tco_addr), tco_addr); + func_t *f = get_func(tco_addr); + Trace("%*s0x%x [%s@0x%x] ", ftrace_stack_len, "", pc, f == NULL ? "???" : f->name, tco_addr - f->start); } - Trace("%*s0x%x ret [%s@0x%x]", ftrace_stack_len, "", pc, get_func_name(addr), addr); + func_t *f = get_func(addr); + Trace("%*s0x%x ret <%s+0x%x>", ftrace_stack_len, "", pc, f == NULL ? "???" : f->name, addr - f->start); }