mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
5ea8415407
Adding libdw DWARF post unwind support, which is part of elfutils-devel/libdw-dev package from version 0.158. The new code is contained in unwin-libdw.c object, and implements unwind__get_entries unwind interface function. New Makefile variable NO_LIBDW_DWARF_UNWIND was added to control its compilation, and is marked as disabled now. It's factored with the rest of the Makefile unwind build code in the next patch. Arch specific code was added for x86. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jean Pihet <jean.pihet@linaro.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1392825179-5228-5-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
52 lines
1.3 KiB
C
52 lines
1.3 KiB
C
#include <elfutils/libdwfl.h>
|
|
#include "../../util/unwind-libdw.h"
|
|
#include "../../util/perf_regs.h"
|
|
|
|
bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
|
|
{
|
|
struct unwind_info *ui = arg;
|
|
struct regs_dump *user_regs = &ui->sample->user_regs;
|
|
Dwarf_Word dwarf_regs[17];
|
|
unsigned nregs;
|
|
|
|
#define REG(r) ({ \
|
|
Dwarf_Word val = 0; \
|
|
perf_reg_value(&val, user_regs, PERF_REG_X86_##r); \
|
|
val; \
|
|
})
|
|
|
|
if (user_regs->abi == PERF_SAMPLE_REGS_ABI_32) {
|
|
dwarf_regs[0] = REG(AX);
|
|
dwarf_regs[1] = REG(CX);
|
|
dwarf_regs[2] = REG(DX);
|
|
dwarf_regs[3] = REG(BX);
|
|
dwarf_regs[4] = REG(SP);
|
|
dwarf_regs[5] = REG(BP);
|
|
dwarf_regs[6] = REG(SI);
|
|
dwarf_regs[7] = REG(DI);
|
|
dwarf_regs[8] = REG(IP);
|
|
nregs = 9;
|
|
} else {
|
|
dwarf_regs[0] = REG(AX);
|
|
dwarf_regs[1] = REG(DX);
|
|
dwarf_regs[2] = REG(CX);
|
|
dwarf_regs[3] = REG(BX);
|
|
dwarf_regs[4] = REG(SI);
|
|
dwarf_regs[5] = REG(DI);
|
|
dwarf_regs[6] = REG(BP);
|
|
dwarf_regs[7] = REG(SP);
|
|
dwarf_regs[8] = REG(R8);
|
|
dwarf_regs[9] = REG(R9);
|
|
dwarf_regs[10] = REG(R10);
|
|
dwarf_regs[11] = REG(R11);
|
|
dwarf_regs[12] = REG(R12);
|
|
dwarf_regs[13] = REG(R13);
|
|
dwarf_regs[14] = REG(R14);
|
|
dwarf_regs[15] = REG(R15);
|
|
dwarf_regs[16] = REG(IP);
|
|
nregs = 17;
|
|
}
|
|
|
|
return dwfl_thread_state_registers(thread, 0, nregs, dwarf_regs);
|
|
}
|