brintos

brintos / linux-shallow public Read only

0
0
Text · 2.4 KiB · 917b97d Raw
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