Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
unwind.c
Go to the documentation of this file.
1 
2 #include <errno.h>
3 #include <libunwind.h>
4 #include "perf_regs.h"
5 #include "../../util/unwind.h"
6 
7 #ifdef ARCH_X86_64
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 /* ARCH_X86_64 */