1// SPDX-License-Identifier: GPL-2.0
2
3#include <errno.h>
4#include "../../util/debug.h"
5#ifndef REMOTE_UNWIND_LIBUNWIND
6#include <libunwind.h>
7#include "perf_regs.h"
8#include "../../util/unwind.h"
9#endif
10
11#ifdef HAVE_ARCH_X86_64_SUPPORT
12int 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
76int 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