forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.0 KiB
115 lines
2.0 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
|
|
#include <errno.h> |
|
#include "../../util/debug.h" |
|
#ifndef REMOTE_UNWIND_LIBUNWIND |
|
#include <libunwind.h> |
|
#include "perf_regs.h" |
|
#include "../../util/unwind.h" |
|
#endif |
|
|
|
#ifdef HAVE_ARCH_X86_64_SUPPORT |
|
int LIBUNWIND__ARCH_REG_ID(int regnum) |
|
{ |
|
int id; |
|
|
|
switch (regnum) { |
|
case UNW_X86_64_RAX: |
|
id = PERF_REG_X86_AX; |
|
break; |
|
case UNW_X86_64_RDX: |
|
id = PERF_REG_X86_DX; |
|
break; |
|
case UNW_X86_64_RCX: |
|
id = PERF_REG_X86_CX; |
|
break; |
|
case UNW_X86_64_RBX: |
|
id = PERF_REG_X86_BX; |
|
break; |
|
case UNW_X86_64_RSI: |
|
id = PERF_REG_X86_SI; |
|
break; |
|
case UNW_X86_64_RDI: |
|
id = PERF_REG_X86_DI; |
|
break; |
|
case UNW_X86_64_RBP: |
|
id = PERF_REG_X86_BP; |
|
break; |
|
case UNW_X86_64_RSP: |
|
id = PERF_REG_X86_SP; |
|
break; |
|
case UNW_X86_64_R8: |
|
id = PERF_REG_X86_R8; |
|
break; |
|
case UNW_X86_64_R9: |
|
id = PERF_REG_X86_R9; |
|
break; |
|
case UNW_X86_64_R10: |
|
id = PERF_REG_X86_R10; |
|
break; |
|
case UNW_X86_64_R11: |
|
id = PERF_REG_X86_R11; |
|
break; |
|
case UNW_X86_64_R12: |
|
id = PERF_REG_X86_R12; |
|
break; |
|
case UNW_X86_64_R13: |
|
id = PERF_REG_X86_R13; |
|
break; |
|
case UNW_X86_64_R14: |
|
id = PERF_REG_X86_R14; |
|
break; |
|
case UNW_X86_64_R15: |
|
id = PERF_REG_X86_R15; |
|
break; |
|
case UNW_X86_64_RIP: |
|
id = PERF_REG_X86_IP; |
|
break; |
|
default: |
|
pr_err("unwind: invalid reg id %d\n", regnum); |
|
return -EINVAL; |
|
} |
|
|
|
return id; |
|
} |
|
#else |
|
int LIBUNWIND__ARCH_REG_ID(int regnum) |
|
{ |
|
int id; |
|
|
|
switch (regnum) { |
|
case UNW_X86_EAX: |
|
id = PERF_REG_X86_AX; |
|
break; |
|
case UNW_X86_EDX: |
|
id = PERF_REG_X86_DX; |
|
break; |
|
case UNW_X86_ECX: |
|
id = PERF_REG_X86_CX; |
|
break; |
|
case UNW_X86_EBX: |
|
id = PERF_REG_X86_BX; |
|
break; |
|
case UNW_X86_ESI: |
|
id = PERF_REG_X86_SI; |
|
break; |
|
case UNW_X86_EDI: |
|
id = PERF_REG_X86_DI; |
|
break; |
|
case UNW_X86_EBP: |
|
id = PERF_REG_X86_BP; |
|
break; |
|
case UNW_X86_ESP: |
|
id = PERF_REG_X86_SP; |
|
break; |
|
case UNW_X86_EIP: |
|
id = PERF_REG_X86_IP; |
|
break; |
|
default: |
|
pr_err("unwind: invalid reg id %d\n", regnum); |
|
return -EINVAL; |
|
} |
|
|
|
return id; |
|
} |
|
#endif /* HAVE_ARCH_X86_64_SUPPORT */
|
|
|