162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. 462306a36Sopenharmony_ci * Mapping of DWARF debug register numbers into register names. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <stddef.h> 862306a36Sopenharmony_ci#include <errno.h> /* for EINVAL */ 962306a36Sopenharmony_ci#include <string.h> /* for strcmp */ 1062306a36Sopenharmony_ci#include <dwarf-regs.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct pt_regs_dwarfnum { 1362306a36Sopenharmony_ci const char *name; 1462306a36Sopenharmony_ci unsigned int dwarfnum; 1562306a36Sopenharmony_ci}; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} 1862306a36Sopenharmony_ci#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct pt_regs_dwarfnum riscv_dwarf_regs_table[] = { 2162306a36Sopenharmony_ci REG_DWARFNUM_NAME("%zero", 0), 2262306a36Sopenharmony_ci REG_DWARFNUM_NAME("%ra", 1), 2362306a36Sopenharmony_ci REG_DWARFNUM_NAME("%sp", 2), 2462306a36Sopenharmony_ci REG_DWARFNUM_NAME("%gp", 3), 2562306a36Sopenharmony_ci REG_DWARFNUM_NAME("%tp", 4), 2662306a36Sopenharmony_ci REG_DWARFNUM_NAME("%t0", 5), 2762306a36Sopenharmony_ci REG_DWARFNUM_NAME("%t1", 6), 2862306a36Sopenharmony_ci REG_DWARFNUM_NAME("%t2", 7), 2962306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s0", 8), 3062306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s1", 9), 3162306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a0", 10), 3262306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a1", 11), 3362306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a2", 12), 3462306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a3", 13), 3562306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a4", 14), 3662306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a5", 15), 3762306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a6", 16), 3862306a36Sopenharmony_ci REG_DWARFNUM_NAME("%a7", 17), 3962306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s2", 18), 4062306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s3", 19), 4162306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s4", 20), 4262306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s5", 21), 4362306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s6", 22), 4462306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s7", 23), 4562306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s8", 24), 4662306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s9", 25), 4762306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s10", 26), 4862306a36Sopenharmony_ci REG_DWARFNUM_NAME("%s11", 27), 4962306a36Sopenharmony_ci REG_DWARFNUM_NAME("%t3", 28), 5062306a36Sopenharmony_ci REG_DWARFNUM_NAME("%t4", 29), 5162306a36Sopenharmony_ci REG_DWARFNUM_NAME("%t5", 30), 5262306a36Sopenharmony_ci REG_DWARFNUM_NAME("%t6", 31), 5362306a36Sopenharmony_ci REG_DWARFNUM_END, 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define RISCV_MAX_REGS ((sizeof(riscv_dwarf_regs_table) / \ 5762306a36Sopenharmony_ci sizeof(riscv_dwarf_regs_table[0])) - 1) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciconst char *get_arch_regstr(unsigned int n) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci return (n < RISCV_MAX_REGS) ? riscv_dwarf_regs_table[n].name : NULL; 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciint regs_query_register_offset(const char *name) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci const struct pt_regs_dwarfnum *roff; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci for (roff = riscv_dwarf_regs_table; roff->name; roff++) 6962306a36Sopenharmony_ci if (!strcmp(roff->name, name)) 7062306a36Sopenharmony_ci return roff->dwarfnum; 7162306a36Sopenharmony_ci return -EINVAL; 7262306a36Sopenharmony_ci} 73