root/tools/perf/arch/arm64/util/dwarf-regs.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. get_arch_regstr
  2. regs_query_register_offset

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   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 
  15 struct 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.pdf
  30  */
  31 static 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 number
  69  * @n:  the DWARF register number
  70  *
  71  * get_arch_regstr() returns the name of the register in struct
  72  * regdwarfnum_table from it's DWARF register number. If the register is not
  73  * found in the table, this returns NULL;
  74  */
  75 const 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 
  84 int 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 }

/* [<][>][^][v][top][bottom][index][help] */