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 <stddef.h>
0009 #include <linux/stringify.h>
0010 #include <dwarf-regs.h>
0011 
0012 struct pt_regs_dwarfnum {
0013     const char *name;
0014     unsigned int dwarfnum;
0015 };
0016 
0017 #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
0018 #define GPR_DWARFNUM_NAME(num) \
0019     {.name = __stringify(%r##num), .dwarfnum = num}
0020 #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
0021 
0022 /*
0023  * Reference:
0024  * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf
0025  */
0026 static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
0027     GPR_DWARFNUM_NAME(0),
0028     GPR_DWARFNUM_NAME(1),
0029     GPR_DWARFNUM_NAME(2),
0030     GPR_DWARFNUM_NAME(3),
0031     GPR_DWARFNUM_NAME(4),
0032     GPR_DWARFNUM_NAME(5),
0033     GPR_DWARFNUM_NAME(6),
0034     GPR_DWARFNUM_NAME(7),
0035     GPR_DWARFNUM_NAME(8),
0036     GPR_DWARFNUM_NAME(9),
0037     GPR_DWARFNUM_NAME(10),
0038     REG_DWARFNUM_NAME("%fp", 11),
0039     REG_DWARFNUM_NAME("%ip", 12),
0040     REG_DWARFNUM_NAME("%sp", 13),
0041     REG_DWARFNUM_NAME("%lr", 14),
0042     REG_DWARFNUM_NAME("%pc", 15),
0043     REG_DWARFNUM_END,
0044 };
0045 
0046 /**
0047  * get_arch_regstr() - lookup register name from it's DWARF register number
0048  * @n:  the DWARF register number
0049  *
0050  * get_arch_regstr() returns the name of the register in struct
0051  * regdwarfnum_table from it's DWARF register number. If the register is not
0052  * found in the table, this returns NULL;
0053  */
0054 const char *get_arch_regstr(unsigned int n)
0055 {
0056     const struct pt_regs_dwarfnum *roff;
0057     for (roff = regdwarfnum_table; roff->name != NULL; roff++)
0058         if (roff->dwarfnum == n)
0059             return roff->name;
0060     return NULL;
0061 }