| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. |
| * Mapping of DWARF debug register numbers into register names. |
| */ |
| |
| #include <stddef.h> |
| #include <errno.h> /* for EINVAL */ |
| #include <string.h> /* for strcmp */ |
| #include <dwarf-regs.h> |
| |
| struct pt_regs_dwarfnum { |
| const char *name; |
| unsigned int dwarfnum; |
| }; |
| |
| #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} |
| #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} |
| |
| struct pt_regs_dwarfnum riscv_dwarf_regs_table[] = { |
| REG_DWARFNUM_NAME("%zero", 0), |
| REG_DWARFNUM_NAME("%ra", 1), |
| REG_DWARFNUM_NAME("%sp", 2), |
| REG_DWARFNUM_NAME("%gp", 3), |
| REG_DWARFNUM_NAME("%tp", 4), |
| REG_DWARFNUM_NAME("%t0", 5), |
| REG_DWARFNUM_NAME("%t1", 6), |
| REG_DWARFNUM_NAME("%t2", 7), |
| REG_DWARFNUM_NAME("%s0", 8), |
| REG_DWARFNUM_NAME("%s1", 9), |
| REG_DWARFNUM_NAME("%a0", 10), |
| REG_DWARFNUM_NAME("%a1", 11), |
| REG_DWARFNUM_NAME("%a2", 12), |
| REG_DWARFNUM_NAME("%a3", 13), |
| REG_DWARFNUM_NAME("%a4", 14), |
| REG_DWARFNUM_NAME("%a5", 15), |
| REG_DWARFNUM_NAME("%a6", 16), |
| REG_DWARFNUM_NAME("%a7", 17), |
| REG_DWARFNUM_NAME("%s2", 18), |
| REG_DWARFNUM_NAME("%s3", 19), |
| REG_DWARFNUM_NAME("%s4", 20), |
| REG_DWARFNUM_NAME("%s5", 21), |
| REG_DWARFNUM_NAME("%s6", 22), |
| REG_DWARFNUM_NAME("%s7", 23), |
| REG_DWARFNUM_NAME("%s8", 24), |
| REG_DWARFNUM_NAME("%s9", 25), |
| REG_DWARFNUM_NAME("%s10", 26), |
| REG_DWARFNUM_NAME("%s11", 27), |
| REG_DWARFNUM_NAME("%t3", 28), |
| REG_DWARFNUM_NAME("%t4", 29), |
| REG_DWARFNUM_NAME("%t5", 30), |
| REG_DWARFNUM_NAME("%t6", 31), |
| REG_DWARFNUM_END, |
| }; |
| |
| #define RISCV_MAX_REGS ((sizeof(riscv_dwarf_regs_table) / \ |
| sizeof(riscv_dwarf_regs_table[0])) - 1) |
| |
| const char *get_arch_regstr(unsigned int n) |
| { |
| return (n < RISCV_MAX_REGS) ? riscv_dwarf_regs_table[n].name : NULL; |
| } |
| |
| int regs_query_register_offset(const char *name) |
| { |
| const struct pt_regs_dwarfnum *roff; |
| |
| for (roff = riscv_dwarf_regs_table; roff->name; roff++) |
| if (!strcmp(roff->name, name)) |
| return roff->dwarfnum; |
| return -EINVAL; |
| } |