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