perf unwind-libunwind: Fix base address for .eh_frame
[platform/kernel/linux-starfive.git] / tools / perf / util / unwind-libunwind-local.c
index ebfde53..5e5c339 100644 (file)
@@ -327,7 +327,7 @@ static int read_unwind_spec_eh_frame(struct dso *dso, struct unwind_info *ui,
 
        maps__for_each_entry(thread__maps(ui->thread), map_node) {
                struct map *map = map_node->map;
-               u64 start = map__start(map);
+               u64 start = map__start(map) - map__pgoff(map);
 
                if (map__dso(map) == dso && start < base_addr)
                        base_addr = start;
@@ -553,6 +553,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as,
                      int __write, void *arg)
 {
        struct unwind_info *ui = arg;
+       const char *arch = perf_env__arch(ui->machine->env);
        struct stack_dump *stack = &ui->sample->user_stack;
        u64 start, end;
        int offset;
@@ -565,7 +566,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as,
        }
 
        ret = perf_reg_value(&start, &ui->sample->user_regs,
-                            LIBUNWIND__ARCH_REG_SP);
+                            perf_arch_reg_sp(arch));
        if (ret)
                return ret;
 
@@ -714,6 +715,7 @@ static void _unwind__finish_access(struct maps *maps)
 static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
                       void *arg, int max_stack)
 {
+       const char *arch = perf_env__arch(ui->machine->env);
        u64 val;
        unw_word_t ips[max_stack];
        unw_addr_space_t addr_space;
@@ -721,7 +723,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
        int ret, i = 0;
 
        ret = perf_reg_value(&val, &ui->sample->user_regs,
-                            LIBUNWIND__ARCH_REG_IP);
+                            perf_arch_reg_ip(arch));
        if (ret)
                return ret;