Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Mapping of DWARF debug register numbers into register names.
0004  *
0005  * Copyright (C) 2010 Will Deacon, ARM Ltd.
0006  */
0007 
0008 #include <errno.h>
0009 #include <stddef.h>
0010 #include <string.h>
0011 #include <dwarf-regs.h>
0012 #include <linux/ptrace.h> /* for struct user_pt_regs */
0013 #include <linux/stringify.h>
0014 
0015 struct pt_regs_dwarfnum {
0016     const char *name;
0017     unsigned int dwarfnum;
0018 };
0019 
0020 #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
0021 #define GPR_DWARFNUM_NAME(num) \
0022     {.name = __stringify(%x##num), .dwarfnum = num}
0023 #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
0024 #define DWARFNUM2OFFSET(index) \
0025     (index * sizeof((struct user_pt_regs *)0)->regs[0])
0026 
0027 /*
0028  * Reference:
0029  * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
0030  */
0031 static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
0032     GPR_DWARFNUM_NAME(0),
0033     GPR_DWARFNUM_NAME(1),
0034     GPR_DWARFNUM_NAME(2),
0035     GPR_DWARFNUM_NAME(3),
0036     GPR_DWARFNUM_NAME(4),
0037     GPR_DWARFNUM_NAME(5),
0038     GPR_DWARFNUM_NAME(6),
0039     GPR_DWARFNUM_NAME(7),
0040     GPR_DWARFNUM_NAME(8),
0041     GPR_DWARFNUM_NAME(9),
0042     GPR_DWARFNUM_NAME(10),
0043     GPR_DWARFNUM_NAME(11),
0044     GPR_DWARFNUM_NAME(12),
0045     GPR_DWARFNUM_NAME(13),
0046     GPR_DWARFNUM_NAME(14),
0047     GPR_DWARFNUM_NAME(15),
0048     GPR_DWARFNUM_NAME(16),
0049     GPR_DWARFNUM_NAME(17),
0050     GPR_DWARFNUM_NAME(18),
0051     GPR_DWARFNUM_NAME(19),
0052     GPR_DWARFNUM_NAME(20),
0053     GPR_DWARFNUM_NAME(21),
0054     GPR_DWARFNUM_NAME(22),
0055     GPR_DWARFNUM_NAME(23),
0056     GPR_DWARFNUM_NAME(24),
0057     GPR_DWARFNUM_NAME(25),
0058     GPR_DWARFNUM_NAME(26),
0059     GPR_DWARFNUM_NAME(27),
0060     GPR_DWARFNUM_NAME(28),
0061     GPR_DWARFNUM_NAME(29),
0062     REG_DWARFNUM_NAME("%lr", 30),
0063     REG_DWARFNUM_NAME("%sp", 31),
0064     REG_DWARFNUM_END,
0065 };
0066 
0067 /**
0068  * get_arch_regstr() - lookup register name from it's DWARF register number
0069  * @n:  the DWARF register number
0070  *
0071  * get_arch_regstr() returns the name of the register in struct
0072  * regdwarfnum_table from it's DWARF register number. If the register is not
0073  * found in the table, this returns NULL;
0074  */
0075 const char *get_arch_regstr(unsigned int n)
0076 {
0077     const struct pt_regs_dwarfnum *roff;
0078     for (roff = regdwarfnum_table; roff->name != NULL; roff++)
0079         if (roff->dwarfnum == n)
0080             return roff->name;
0081     return NULL;
0082 }
0083 
0084 int regs_query_register_offset(const char *name)
0085 {
0086     const struct pt_regs_dwarfnum *roff;
0087 
0088     for (roff = regdwarfnum_table; roff->name != NULL; roff++)
0089         if (!strcmp(roff->name, name))
0090             return DWARFNUM2OFFSET(roff->dwarfnum);
0091     return -EINVAL;
0092 }