4f16661cbdbb507a34390df99202e5a73431ea5e
[sfrench/cifs-2.6.git] / tools / perf / arch / x86 / util / unwind-libunwind.c
1
2 #ifndef REMOTE_UNWIND_LIBUNWIND
3 #include <errno.h>
4 #include <libunwind.h>
5 #include "perf_regs.h"
6 #include "../../util/unwind.h"
7 #include "../../util/debug.h"
8 #endif
9
10 #ifdef HAVE_ARCH_X86_64_SUPPORT
11 int LIBUNWIND__ARCH_REG_ID(int regnum)
12 {
13         int id;
14
15         switch (regnum) {
16         case UNW_X86_64_RAX:
17                 id = PERF_REG_X86_AX;
18                 break;
19         case UNW_X86_64_RDX:
20                 id = PERF_REG_X86_DX;
21                 break;
22         case UNW_X86_64_RCX:
23                 id = PERF_REG_X86_CX;
24                 break;
25         case UNW_X86_64_RBX:
26                 id = PERF_REG_X86_BX;
27                 break;
28         case UNW_X86_64_RSI:
29                 id = PERF_REG_X86_SI;
30                 break;
31         case UNW_X86_64_RDI:
32                 id = PERF_REG_X86_DI;
33                 break;
34         case UNW_X86_64_RBP:
35                 id = PERF_REG_X86_BP;
36                 break;
37         case UNW_X86_64_RSP:
38                 id = PERF_REG_X86_SP;
39                 break;
40         case UNW_X86_64_R8:
41                 id = PERF_REG_X86_R8;
42                 break;
43         case UNW_X86_64_R9:
44                 id = PERF_REG_X86_R9;
45                 break;
46         case UNW_X86_64_R10:
47                 id = PERF_REG_X86_R10;
48                 break;
49         case UNW_X86_64_R11:
50                 id = PERF_REG_X86_R11;
51                 break;
52         case UNW_X86_64_R12:
53                 id = PERF_REG_X86_R12;
54                 break;
55         case UNW_X86_64_R13:
56                 id = PERF_REG_X86_R13;
57                 break;
58         case UNW_X86_64_R14:
59                 id = PERF_REG_X86_R14;
60                 break;
61         case UNW_X86_64_R15:
62                 id = PERF_REG_X86_R15;
63                 break;
64         case UNW_X86_64_RIP:
65                 id = PERF_REG_X86_IP;
66                 break;
67         default:
68                 pr_err("unwind: invalid reg id %d\n", regnum);
69                 return -EINVAL;
70         }
71
72         return id;
73 }
74 #else
75 int LIBUNWIND__ARCH_REG_ID(int regnum)
76 {
77         int id;
78
79         switch (regnum) {
80         case UNW_X86_EAX:
81                 id = PERF_REG_X86_AX;
82                 break;
83         case UNW_X86_EDX:
84                 id = PERF_REG_X86_DX;
85                 break;
86         case UNW_X86_ECX:
87                 id = PERF_REG_X86_CX;
88                 break;
89         case UNW_X86_EBX:
90                 id = PERF_REG_X86_BX;
91                 break;
92         case UNW_X86_ESI:
93                 id = PERF_REG_X86_SI;
94                 break;
95         case UNW_X86_EDI:
96                 id = PERF_REG_X86_DI;
97                 break;
98         case UNW_X86_EBP:
99                 id = PERF_REG_X86_BP;
100                 break;
101         case UNW_X86_ESP:
102                 id = PERF_REG_X86_SP;
103                 break;
104         case UNW_X86_EIP:
105                 id = PERF_REG_X86_IP;
106                 break;
107         default:
108                 pr_err("unwind: invalid reg id %d\n", regnum);
109                 return -EINVAL;
110         }
111
112         return id;
113 }
114 #endif /* HAVE_ARCH_X86_64_SUPPORT */