linux/tools/perf/arch/arm64/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(%x##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.ihi0057b/IHI0057B_aadwarf64.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        GPR_DWARFNUM_NAME(11),
  42        GPR_DWARFNUM_NAME(12),
  43        GPR_DWARFNUM_NAME(13),
  44        GPR_DWARFNUM_NAME(14),
  45        GPR_DWARFNUM_NAME(15),
  46        GPR_DWARFNUM_NAME(16),
  47        GPR_DWARFNUM_NAME(17),
  48        GPR_DWARFNUM_NAME(18),
  49        GPR_DWARFNUM_NAME(19),
  50        GPR_DWARFNUM_NAME(20),
  51        GPR_DWARFNUM_NAME(21),
  52        GPR_DWARFNUM_NAME(22),
  53        GPR_DWARFNUM_NAME(23),
  54        GPR_DWARFNUM_NAME(24),
  55        GPR_DWARFNUM_NAME(25),
  56        GPR_DWARFNUM_NAME(26),
  57        GPR_DWARFNUM_NAME(27),
  58        GPR_DWARFNUM_NAME(28),
  59        GPR_DWARFNUM_NAME(29),
  60        REG_DWARFNUM_NAME("%lr", 30),
  61        REG_DWARFNUM_NAME("%sp", 31),
  62        REG_DWARFNUM_END,
  63};
  64
  65/**
  66 * get_arch_regstr() - lookup register name from it's DWARF register number
  67 * @n:  the DWARF register number
  68 *
  69 * get_arch_regstr() returns the name of the register in struct
  70 * regdwarfnum_table from it's DWARF register number. If the register is not
  71 * found in the table, this returns NULL;
  72 */
  73const char *get_arch_regstr(unsigned int n)
  74{
  75        const struct pt_regs_dwarfnum *roff;
  76        for (roff = regdwarfnum_table; roff->name != NULL; roff++)
  77                if (roff->dwarfnum == n)
  78                        return roff->name;
  79        return NULL;
  80}
  81