162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <errno.h>
462306a36Sopenharmony_ci#include "../../util/debug.h"
562306a36Sopenharmony_ci#ifndef REMOTE_UNWIND_LIBUNWIND
662306a36Sopenharmony_ci#include <libunwind.h>
762306a36Sopenharmony_ci#include "perf_regs.h"
862306a36Sopenharmony_ci#include "../../util/unwind.h"
962306a36Sopenharmony_ci#endif
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifdef HAVE_ARCH_X86_64_SUPPORT
1262306a36Sopenharmony_ciint LIBUNWIND__ARCH_REG_ID(int regnum)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	int id;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	switch (regnum) {
1762306a36Sopenharmony_ci	case UNW_X86_64_RAX:
1862306a36Sopenharmony_ci		id = PERF_REG_X86_AX;
1962306a36Sopenharmony_ci		break;
2062306a36Sopenharmony_ci	case UNW_X86_64_RDX:
2162306a36Sopenharmony_ci		id = PERF_REG_X86_DX;
2262306a36Sopenharmony_ci		break;
2362306a36Sopenharmony_ci	case UNW_X86_64_RCX:
2462306a36Sopenharmony_ci		id = PERF_REG_X86_CX;
2562306a36Sopenharmony_ci		break;
2662306a36Sopenharmony_ci	case UNW_X86_64_RBX:
2762306a36Sopenharmony_ci		id = PERF_REG_X86_BX;
2862306a36Sopenharmony_ci		break;
2962306a36Sopenharmony_ci	case UNW_X86_64_RSI:
3062306a36Sopenharmony_ci		id = PERF_REG_X86_SI;
3162306a36Sopenharmony_ci		break;
3262306a36Sopenharmony_ci	case UNW_X86_64_RDI:
3362306a36Sopenharmony_ci		id = PERF_REG_X86_DI;
3462306a36Sopenharmony_ci		break;
3562306a36Sopenharmony_ci	case UNW_X86_64_RBP:
3662306a36Sopenharmony_ci		id = PERF_REG_X86_BP;
3762306a36Sopenharmony_ci		break;
3862306a36Sopenharmony_ci	case UNW_X86_64_RSP:
3962306a36Sopenharmony_ci		id = PERF_REG_X86_SP;
4062306a36Sopenharmony_ci		break;
4162306a36Sopenharmony_ci	case UNW_X86_64_R8:
4262306a36Sopenharmony_ci		id = PERF_REG_X86_R8;
4362306a36Sopenharmony_ci		break;
4462306a36Sopenharmony_ci	case UNW_X86_64_R9:
4562306a36Sopenharmony_ci		id = PERF_REG_X86_R9;
4662306a36Sopenharmony_ci		break;
4762306a36Sopenharmony_ci	case UNW_X86_64_R10:
4862306a36Sopenharmony_ci		id = PERF_REG_X86_R10;
4962306a36Sopenharmony_ci		break;
5062306a36Sopenharmony_ci	case UNW_X86_64_R11:
5162306a36Sopenharmony_ci		id = PERF_REG_X86_R11;
5262306a36Sopenharmony_ci		break;
5362306a36Sopenharmony_ci	case UNW_X86_64_R12:
5462306a36Sopenharmony_ci		id = PERF_REG_X86_R12;
5562306a36Sopenharmony_ci		break;
5662306a36Sopenharmony_ci	case UNW_X86_64_R13:
5762306a36Sopenharmony_ci		id = PERF_REG_X86_R13;
5862306a36Sopenharmony_ci		break;
5962306a36Sopenharmony_ci	case UNW_X86_64_R14:
6062306a36Sopenharmony_ci		id = PERF_REG_X86_R14;
6162306a36Sopenharmony_ci		break;
6262306a36Sopenharmony_ci	case UNW_X86_64_R15:
6362306a36Sopenharmony_ci		id = PERF_REG_X86_R15;
6462306a36Sopenharmony_ci		break;
6562306a36Sopenharmony_ci	case UNW_X86_64_RIP:
6662306a36Sopenharmony_ci		id = PERF_REG_X86_IP;
6762306a36Sopenharmony_ci		break;
6862306a36Sopenharmony_ci	default:
6962306a36Sopenharmony_ci		pr_err("unwind: invalid reg id %d\n", regnum);
7062306a36Sopenharmony_ci		return -EINVAL;
7162306a36Sopenharmony_ci	}
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	return id;
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci#else
7662306a36Sopenharmony_ciint LIBUNWIND__ARCH_REG_ID(int regnum)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	int id;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	switch (regnum) {
8162306a36Sopenharmony_ci	case UNW_X86_EAX:
8262306a36Sopenharmony_ci		id = PERF_REG_X86_AX;
8362306a36Sopenharmony_ci		break;
8462306a36Sopenharmony_ci	case UNW_X86_EDX:
8562306a36Sopenharmony_ci		id = PERF_REG_X86_DX;
8662306a36Sopenharmony_ci		break;
8762306a36Sopenharmony_ci	case UNW_X86_ECX:
8862306a36Sopenharmony_ci		id = PERF_REG_X86_CX;
8962306a36Sopenharmony_ci		break;
9062306a36Sopenharmony_ci	case UNW_X86_EBX:
9162306a36Sopenharmony_ci		id = PERF_REG_X86_BX;
9262306a36Sopenharmony_ci		break;
9362306a36Sopenharmony_ci	case UNW_X86_ESI:
9462306a36Sopenharmony_ci		id = PERF_REG_X86_SI;
9562306a36Sopenharmony_ci		break;
9662306a36Sopenharmony_ci	case UNW_X86_EDI:
9762306a36Sopenharmony_ci		id = PERF_REG_X86_DI;
9862306a36Sopenharmony_ci		break;
9962306a36Sopenharmony_ci	case UNW_X86_EBP:
10062306a36Sopenharmony_ci		id = PERF_REG_X86_BP;
10162306a36Sopenharmony_ci		break;
10262306a36Sopenharmony_ci	case UNW_X86_ESP:
10362306a36Sopenharmony_ci		id = PERF_REG_X86_SP;
10462306a36Sopenharmony_ci		break;
10562306a36Sopenharmony_ci	case UNW_X86_EIP:
10662306a36Sopenharmony_ci		id = PERF_REG_X86_IP;
10762306a36Sopenharmony_ci		break;
10862306a36Sopenharmony_ci	default:
10962306a36Sopenharmony_ci		pr_err("unwind: invalid reg id %d\n", regnum);
11062306a36Sopenharmony_ci		return -EINVAL;
11162306a36Sopenharmony_ci	}
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	return id;
11462306a36Sopenharmony_ci}
11562306a36Sopenharmony_ci#endif /* HAVE_ARCH_X86_64_SUPPORT */
116