Home | History | Annotate | Download | only in util
      1 
      2 #include <errno.h>
      3 #include <libunwind.h>
      4 #include "perf_regs.h"
      5 #include "../../util/unwind.h"
      6 
      7 #ifdef ARCH_X86_64
      8 int unwind__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 unwind__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 /* ARCH_X86_64 */
    112