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