mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-26 03:17:48 +00:00
52ffe0ff02
Support x86(32-bit) cross platform callchain unwind. Signed-off-by: He Kuang <hekuang@huawei.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Pekka Enberg <penberg@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1464924803-22214-14-git-send-email-hekuang@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
115 lines
1.9 KiB
C
115 lines
1.9 KiB
C
|
|
#ifndef REMOTE_UNWIND_LIBUNWIND
|
|
#include <errno.h>
|
|
#include <libunwind.h>
|
|
#include "perf_regs.h"
|
|
#include "../../util/unwind.h"
|
|
#include "../../util/debug.h"
|
|
#endif
|
|
|
|
#ifdef HAVE_ARCH_X86_64_SUPPORT
|
|
int LIBUNWIND__ARCH_REG_ID(int regnum)
|
|
{
|
|
int id;
|
|
|
|
switch (regnum) {
|
|
case UNW_X86_64_RAX:
|
|
id = PERF_REG_X86_AX;
|
|
break;
|
|
case UNW_X86_64_RDX:
|
|
id = PERF_REG_X86_DX;
|
|
break;
|
|
case UNW_X86_64_RCX:
|
|
id = PERF_REG_X86_CX;
|
|
break;
|
|
case UNW_X86_64_RBX:
|
|
id = PERF_REG_X86_BX;
|
|
break;
|
|
case UNW_X86_64_RSI:
|
|
id = PERF_REG_X86_SI;
|
|
break;
|
|
case UNW_X86_64_RDI:
|
|
id = PERF_REG_X86_DI;
|
|
break;
|
|
case UNW_X86_64_RBP:
|
|
id = PERF_REG_X86_BP;
|
|
break;
|
|
case UNW_X86_64_RSP:
|
|
id = PERF_REG_X86_SP;
|
|
break;
|
|
case UNW_X86_64_R8:
|
|
id = PERF_REG_X86_R8;
|
|
break;
|
|
case UNW_X86_64_R9:
|
|
id = PERF_REG_X86_R9;
|
|
break;
|
|
case UNW_X86_64_R10:
|
|
id = PERF_REG_X86_R10;
|
|
break;
|
|
case UNW_X86_64_R11:
|
|
id = PERF_REG_X86_R11;
|
|
break;
|
|
case UNW_X86_64_R12:
|
|
id = PERF_REG_X86_R12;
|
|
break;
|
|
case UNW_X86_64_R13:
|
|
id = PERF_REG_X86_R13;
|
|
break;
|
|
case UNW_X86_64_R14:
|
|
id = PERF_REG_X86_R14;
|
|
break;
|
|
case UNW_X86_64_R15:
|
|
id = PERF_REG_X86_R15;
|
|
break;
|
|
case UNW_X86_64_RIP:
|
|
id = PERF_REG_X86_IP;
|
|
break;
|
|
default:
|
|
pr_err("unwind: invalid reg id %d\n", regnum);
|
|
return -EINVAL;
|
|
}
|
|
|
|
return id;
|
|
}
|
|
#else
|
|
int LIBUNWIND__ARCH_REG_ID(int regnum)
|
|
{
|
|
int id;
|
|
|
|
switch (regnum) {
|
|
case UNW_X86_EAX:
|
|
id = PERF_REG_X86_AX;
|
|
break;
|
|
case UNW_X86_EDX:
|
|
id = PERF_REG_X86_DX;
|
|
break;
|
|
case UNW_X86_ECX:
|
|
id = PERF_REG_X86_CX;
|
|
break;
|
|
case UNW_X86_EBX:
|
|
id = PERF_REG_X86_BX;
|
|
break;
|
|
case UNW_X86_ESI:
|
|
id = PERF_REG_X86_SI;
|
|
break;
|
|
case UNW_X86_EDI:
|
|
id = PERF_REG_X86_DI;
|
|
break;
|
|
case UNW_X86_EBP:
|
|
id = PERF_REG_X86_BP;
|
|
break;
|
|
case UNW_X86_ESP:
|
|
id = PERF_REG_X86_SP;
|
|
break;
|
|
case UNW_X86_EIP:
|
|
id = PERF_REG_X86_IP;
|
|
break;
|
|
default:
|
|
pr_err("unwind: invalid reg id %d\n", regnum);
|
|
return -EINVAL;
|
|
}
|
|
|
|
return id;
|
|
}
|
|
#endif /* HAVE_ARCH_X86_64_SUPPORT */
|