1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. 4 * Mapping of DWARF debug register numbers into register names. 5 */ 6 7 #include <stddef.h> 8 #include <errno.h> /* for EINVAL */ 9 #include <string.h> /* for strcmp */ 10 #include <dwarf-regs.h> 11 12 struct pt_regs_dwarfnum { 13 const char *name; 14 unsigned int dwarfnum; 15 }; 16 17 #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} 18 #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} 19 20 struct pt_regs_dwarfnum riscv_dwarf_regs_table[] = { 21 REG_DWARFNUM_NAME("%zero", 0), 22 REG_DWARFNUM_NAME("%ra", 1), 23 REG_DWARFNUM_NAME("%sp", 2), 24 REG_DWARFNUM_NAME("%gp", 3), 25 REG_DWARFNUM_NAME("%tp", 4), 26 REG_DWARFNUM_NAME("%t0", 5), 27 REG_DWARFNUM_NAME("%t1", 6), 28 REG_DWARFNUM_NAME("%t2", 7), 29 REG_DWARFNUM_NAME("%s0", 8), 30 REG_DWARFNUM_NAME("%s1", 9), 31 REG_DWARFNUM_NAME("%a0", 10), 32 REG_DWARFNUM_NAME("%a1", 11), 33 REG_DWARFNUM_NAME("%a2", 12), 34 REG_DWARFNUM_NAME("%a3", 13), 35 REG_DWARFNUM_NAME("%a4", 14), 36 REG_DWARFNUM_NAME("%a5", 15), 37 REG_DWARFNUM_NAME("%a6", 16), 38 REG_DWARFNUM_NAME("%a7", 17), 39 REG_DWARFNUM_NAME("%s2", 18), 40 REG_DWARFNUM_NAME("%s3", 19), 41 REG_DWARFNUM_NAME("%s4", 20), 42 REG_DWARFNUM_NAME("%s5", 21), 43 REG_DWARFNUM_NAME("%s6", 22), 44 REG_DWARFNUM_NAME("%s7", 23), 45 REG_DWARFNUM_NAME("%s8", 24), 46 REG_DWARFNUM_NAME("%s9", 25), 47 REG_DWARFNUM_NAME("%s10", 26), 48 REG_DWARFNUM_NAME("%s11", 27), 49 REG_DWARFNUM_NAME("%t3", 28), 50 REG_DWARFNUM_NAME("%t4", 29), 51 REG_DWARFNUM_NAME("%t5", 30), 52 REG_DWARFNUM_NAME("%t6", 31), 53 REG_DWARFNUM_END, 54 }; 55 56 #define RISCV_MAX_REGS ((sizeof(riscv_dwarf_regs_table) / \ 57 sizeof(riscv_dwarf_regs_table[0])) - 1) 58 59 const char *get_arch_regstr(unsigned int n) 60 { 61 return (n < RISCV_MAX_REGS) ? riscv_dwarf_regs_table[n].name : NULL; 62 } 63 64 int regs_query_register_offset(const char *name) 65 { 66 const struct pt_regs_dwarfnum *roff; 67 68 for (roff = riscv_dwarf_regs_table; roff->name; roff++) 69 if (!strcmp(roff->name, name)) 70 return roff->dwarfnum; 71 return -EINVAL; 72 } 73