linux/tools/perf/arch/arm/util/dwarf-regs.c
<<
>>
Prefs
   1/*
   2 * Mapping of DWARF debug register numbers into register names.
   3 *
   4 * Copyright (C) 2010 Will Deacon, ARM Ltd.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#include <stddef.h>
  12#include <dwarf-regs.h>
  13
  14struct pt_regs_dwarfnum {
  15        const char *name;
  16        unsigned int dwarfnum;
  17};
  18
  19#define STR(s) #s
  20#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
  21#define GPR_DWARFNUM_NAME(num) \
  22        {.name = STR(%r##num), .dwarfnum = num}
  23#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
  24
  25/*
  26 * Reference:
  27 * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf
  28 */
  29static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
  30        GPR_DWARFNUM_NAME(0),
  31        GPR_DWARFNUM_NAME(1),
  32        GPR_DWARFNUM_NAME(2),
  33        GPR_DWARFNUM_NAME(3),
  34        GPR_DWARFNUM_NAME(4),
  35        GPR_DWARFNUM_NAME(5),
  36        GPR_DWARFNUM_NAME(6),
  37        GPR_DWARFNUM_NAME(7),
  38        GPR_DWARFNUM_NAME(8),
  39        GPR_DWARFNUM_NAME(9),
  40        GPR_DWARFNUM_NAME(10),
  41        REG_DWARFNUM_NAME("%fp", 11),
  42        REG_DWARFNUM_NAME("%ip", 12),
  43        REG_DWARFNUM_NAME("%sp", 13),
  44        REG_DWARFNUM_NAME("%lr", 14),
  45        REG_DWARFNUM_NAME("%pc", 15),
  46        REG_DWARFNUM_END,
  47};
  48
  49/**
  50 * get_arch_regstr() - lookup register name from it's DWARF register number
  51 * @n:  the DWARF register number
  52 *
  53 * get_arch_regstr() returns the name of the register in struct
  54 * regdwarfnum_table from it's DWARF register number. If the register is not
  55 * found in the table, this returns NULL;
  56 */
  57const char *get_arch_regstr(unsigned int n)
  58{
  59        const struct pt_regs_dwarfnum *roff;
  60        for (roff = regdwarfnum_table; roff->name != NULL; roff++)
  61                if (roff->dwarfnum == n)
  62                        return roff->name;
  63        return NULL;
  64}
  65