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 libunwind__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 libunwind__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 */
112