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 */
116