0001
0002
0003 #include <errno.h>
0004 #include "../../util/debug.h"
0005 #ifndef REMOTE_UNWIND_LIBUNWIND
0006 #include <libunwind.h>
0007 #include "perf_regs.h"
0008 #include "../../util/unwind.h"
0009 #endif
0010
0011 #ifdef HAVE_ARCH_X86_64_SUPPORT
0012 int LIBUNWIND__ARCH_REG_ID(int regnum)
0013 {
0014 int id;
0015
0016 switch (regnum) {
0017 case UNW_X86_64_RAX:
0018 id = PERF_REG_X86_AX;
0019 break;
0020 case UNW_X86_64_RDX:
0021 id = PERF_REG_X86_DX;
0022 break;
0023 case UNW_X86_64_RCX:
0024 id = PERF_REG_X86_CX;
0025 break;
0026 case UNW_X86_64_RBX:
0027 id = PERF_REG_X86_BX;
0028 break;
0029 case UNW_X86_64_RSI:
0030 id = PERF_REG_X86_SI;
0031 break;
0032 case UNW_X86_64_RDI:
0033 id = PERF_REG_X86_DI;
0034 break;
0035 case UNW_X86_64_RBP:
0036 id = PERF_REG_X86_BP;
0037 break;
0038 case UNW_X86_64_RSP:
0039 id = PERF_REG_X86_SP;
0040 break;
0041 case UNW_X86_64_R8:
0042 id = PERF_REG_X86_R8;
0043 break;
0044 case UNW_X86_64_R9:
0045 id = PERF_REG_X86_R9;
0046 break;
0047 case UNW_X86_64_R10:
0048 id = PERF_REG_X86_R10;
0049 break;
0050 case UNW_X86_64_R11:
0051 id = PERF_REG_X86_R11;
0052 break;
0053 case UNW_X86_64_R12:
0054 id = PERF_REG_X86_R12;
0055 break;
0056 case UNW_X86_64_R13:
0057 id = PERF_REG_X86_R13;
0058 break;
0059 case UNW_X86_64_R14:
0060 id = PERF_REG_X86_R14;
0061 break;
0062 case UNW_X86_64_R15:
0063 id = PERF_REG_X86_R15;
0064 break;
0065 case UNW_X86_64_RIP:
0066 id = PERF_REG_X86_IP;
0067 break;
0068 default:
0069 pr_err("unwind: invalid reg id %d\n", regnum);
0070 return -EINVAL;
0071 }
0072
0073 return id;
0074 }
0075 #else
0076 int LIBUNWIND__ARCH_REG_ID(int regnum)
0077 {
0078 int id;
0079
0080 switch (regnum) {
0081 case UNW_X86_EAX:
0082 id = PERF_REG_X86_AX;
0083 break;
0084 case UNW_X86_EDX:
0085 id = PERF_REG_X86_DX;
0086 break;
0087 case UNW_X86_ECX:
0088 id = PERF_REG_X86_CX;
0089 break;
0090 case UNW_X86_EBX:
0091 id = PERF_REG_X86_BX;
0092 break;
0093 case UNW_X86_ESI:
0094 id = PERF_REG_X86_SI;
0095 break;
0096 case UNW_X86_EDI:
0097 id = PERF_REG_X86_DI;
0098 break;
0099 case UNW_X86_EBP:
0100 id = PERF_REG_X86_BP;
0101 break;
0102 case UNW_X86_ESP:
0103 id = PERF_REG_X86_SP;
0104 break;
0105 case UNW_X86_EIP:
0106 id = PERF_REG_X86_IP;
0107 break;
0108 default:
0109 pr_err("unwind: invalid reg id %d\n", regnum);
0110 return -EINVAL;
0111 }
0112
0113 return id;
0114 }
0115 #endif