Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 
0003 #include <errno.h>
0004 #include "../../util/debug.h"
0005 #ifndef REMOTE_UNWIND_LIBUNWIND
0006 #include <libunwind.h>
0007 #include "perf_regs.h"
0008 #include "../../util/unwind.h"
0009 #endif
0010 
0011 #ifdef HAVE_ARCH_X86_64_SUPPORT
0012 int LIBUNWIND__ARCH_REG_ID(int regnum)
0013 {
0014     int id;
0015 
0016     switch (regnum) {
0017     case UNW_X86_64_RAX:
0018         id = PERF_REG_X86_AX;
0019         break;
0020     case UNW_X86_64_RDX:
0021         id = PERF_REG_X86_DX;
0022         break;
0023     case UNW_X86_64_RCX:
0024         id = PERF_REG_X86_CX;
0025         break;
0026     case UNW_X86_64_RBX:
0027         id = PERF_REG_X86_BX;
0028         break;
0029     case UNW_X86_64_RSI:
0030         id = PERF_REG_X86_SI;
0031         break;
0032     case UNW_X86_64_RDI:
0033         id = PERF_REG_X86_DI;
0034         break;
0035     case UNW_X86_64_RBP:
0036         id = PERF_REG_X86_BP;
0037         break;
0038     case UNW_X86_64_RSP:
0039         id = PERF_REG_X86_SP;
0040         break;
0041     case UNW_X86_64_R8:
0042         id = PERF_REG_X86_R8;
0043         break;
0044     case UNW_X86_64_R9:
0045         id = PERF_REG_X86_R9;
0046         break;
0047     case UNW_X86_64_R10:
0048         id = PERF_REG_X86_R10;
0049         break;
0050     case UNW_X86_64_R11:
0051         id = PERF_REG_X86_R11;
0052         break;
0053     case UNW_X86_64_R12:
0054         id = PERF_REG_X86_R12;
0055         break;
0056     case UNW_X86_64_R13:
0057         id = PERF_REG_X86_R13;
0058         break;
0059     case UNW_X86_64_R14:
0060         id = PERF_REG_X86_R14;
0061         break;
0062     case UNW_X86_64_R15:
0063         id = PERF_REG_X86_R15;
0064         break;
0065     case UNW_X86_64_RIP:
0066         id = PERF_REG_X86_IP;
0067         break;
0068     default:
0069         pr_err("unwind: invalid reg id %d\n", regnum);
0070         return -EINVAL;
0071     }
0072 
0073     return id;
0074 }
0075 #else
0076 int LIBUNWIND__ARCH_REG_ID(int regnum)
0077 {
0078     int id;
0079 
0080     switch (regnum) {
0081     case UNW_X86_EAX:
0082         id = PERF_REG_X86_AX;
0083         break;
0084     case UNW_X86_EDX:
0085         id = PERF_REG_X86_DX;
0086         break;
0087     case UNW_X86_ECX:
0088         id = PERF_REG_X86_CX;
0089         break;
0090     case UNW_X86_EBX:
0091         id = PERF_REG_X86_BX;
0092         break;
0093     case UNW_X86_ESI:
0094         id = PERF_REG_X86_SI;
0095         break;
0096     case UNW_X86_EDI:
0097         id = PERF_REG_X86_DI;
0098         break;
0099     case UNW_X86_EBP:
0100         id = PERF_REG_X86_BP;
0101         break;
0102     case UNW_X86_ESP:
0103         id = PERF_REG_X86_SP;
0104         break;
0105     case UNW_X86_EIP:
0106         id = PERF_REG_X86_IP;
0107         break;
0108     default:
0109         pr_err("unwind: invalid reg id %d\n", regnum);
0110         return -EINVAL;
0111     }
0112 
0113     return id;
0114 }
0115 #endif /* HAVE_ARCH_X86_64_SUPPORT */