93 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Mapping of DWARF debug register numbers into register names.4 *5 * Copyright (C) 2010 Will Deacon, ARM Ltd.6 */7 8#include <errno.h>9#include <stddef.h>10#include <string.h>11#include <dwarf-regs.h>12#include <linux/ptrace.h> /* for struct user_pt_regs */13#include <linux/stringify.h>14 15struct pt_regs_dwarfnum {16 const char *name;17 unsigned int dwarfnum;18};19 20#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}21#define GPR_DWARFNUM_NAME(num) \22 {.name = __stringify(%x##num), .dwarfnum = num}23#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}24#define DWARFNUM2OFFSET(index) \25 (index * sizeof((struct user_pt_regs *)0)->regs[0])26 27/*28 * Reference:29 * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf30 */31static const struct pt_regs_dwarfnum regdwarfnum_table[] = {32 GPR_DWARFNUM_NAME(0),33 GPR_DWARFNUM_NAME(1),34 GPR_DWARFNUM_NAME(2),35 GPR_DWARFNUM_NAME(3),36 GPR_DWARFNUM_NAME(4),37 GPR_DWARFNUM_NAME(5),38 GPR_DWARFNUM_NAME(6),39 GPR_DWARFNUM_NAME(7),40 GPR_DWARFNUM_NAME(8),41 GPR_DWARFNUM_NAME(9),42 GPR_DWARFNUM_NAME(10),43 GPR_DWARFNUM_NAME(11),44 GPR_DWARFNUM_NAME(12),45 GPR_DWARFNUM_NAME(13),46 GPR_DWARFNUM_NAME(14),47 GPR_DWARFNUM_NAME(15),48 GPR_DWARFNUM_NAME(16),49 GPR_DWARFNUM_NAME(17),50 GPR_DWARFNUM_NAME(18),51 GPR_DWARFNUM_NAME(19),52 GPR_DWARFNUM_NAME(20),53 GPR_DWARFNUM_NAME(21),54 GPR_DWARFNUM_NAME(22),55 GPR_DWARFNUM_NAME(23),56 GPR_DWARFNUM_NAME(24),57 GPR_DWARFNUM_NAME(25),58 GPR_DWARFNUM_NAME(26),59 GPR_DWARFNUM_NAME(27),60 GPR_DWARFNUM_NAME(28),61 GPR_DWARFNUM_NAME(29),62 REG_DWARFNUM_NAME("%lr", 30),63 REG_DWARFNUM_NAME("%sp", 31),64 REG_DWARFNUM_END,65};66 67/**68 * get_arch_regstr() - lookup register name from it's DWARF register number69 * @n: the DWARF register number70 *71 * get_arch_regstr() returns the name of the register in struct72 * regdwarfnum_table from it's DWARF register number. If the register is not73 * found in the table, this returns NULL;74 */75const char *get_arch_regstr(unsigned int n)76{77 const struct pt_regs_dwarfnum *roff;78 for (roff = regdwarfnum_table; roff->name != NULL; roff++)79 if (roff->dwarfnum == n)80 return roff->name;81 return NULL;82}83 84int regs_query_register_offset(const char *name)85{86 const struct pt_regs_dwarfnum *roff;87 88 for (roff = regdwarfnum_table; roff->name != NULL; roff++)89 if (!strcmp(roff->name, name))90 return DWARFNUM2OFFSET(roff->dwarfnum);91 return -EINVAL;92}93