1*2874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2fead7960SIan Munsie /* 3fead7960SIan Munsie * Mapping of DWARF debug register numbers into register names. 4fead7960SIan Munsie * 5fead7960SIan Munsie * Copyright (C) 2010 Ian Munsie, IBM Corporation. 6fead7960SIan Munsie */ 7fead7960SIan Munsie 8861e10beSCody P Schafer #include <stddef.h> 94679bccaSNaveen N. Rao #include <errno.h> 104679bccaSNaveen N. Rao #include <string.h> 11fead7960SIan Munsie #include <dwarf-regs.h> 124679bccaSNaveen N. Rao #include <linux/ptrace.h> 134679bccaSNaveen N. Rao #include <linux/kernel.h> 14aa8cc2f6SArnaldo Carvalho de Melo #include <linux/stringify.h> 154679bccaSNaveen N. Rao #include "util.h" 16fead7960SIan Munsie 17fead7960SIan Munsie struct pt_regs_dwarfnum { 18fead7960SIan Munsie const char *name; 19fead7960SIan Munsie unsigned int dwarfnum; 204679bccaSNaveen N. Rao unsigned int ptregs_offset; 21fead7960SIan Munsie }; 22fead7960SIan Munsie 234679bccaSNaveen N. Rao #define REG_DWARFNUM_NAME(r, num) \ 24aa8cc2f6SArnaldo Carvalho de Melo {.name = __stringify(%)__stringify(r), .dwarfnum = num, \ 254679bccaSNaveen N. Rao .ptregs_offset = offsetof(struct pt_regs, r)} 26fead7960SIan Munsie #define GPR_DWARFNUM_NAME(num) \ 27aa8cc2f6SArnaldo Carvalho de Melo {.name = __stringify(%gpr##num), .dwarfnum = num, \ 284679bccaSNaveen N. Rao .ptregs_offset = offsetof(struct pt_regs, gpr[num])} 294679bccaSNaveen N. Rao #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0, .ptregs_offset = 0} 30fead7960SIan Munsie 31fead7960SIan Munsie /* 32fead7960SIan Munsie * Reference: 33fead7960SIan Munsie * http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html 34fead7960SIan Munsie */ 35fead7960SIan Munsie static const struct pt_regs_dwarfnum regdwarfnum_table[] = { 36fead7960SIan Munsie GPR_DWARFNUM_NAME(0), 37fead7960SIan Munsie GPR_DWARFNUM_NAME(1), 38fead7960SIan Munsie GPR_DWARFNUM_NAME(2), 39fead7960SIan Munsie GPR_DWARFNUM_NAME(3), 40fead7960SIan Munsie GPR_DWARFNUM_NAME(4), 41fead7960SIan Munsie GPR_DWARFNUM_NAME(5), 42fead7960SIan Munsie GPR_DWARFNUM_NAME(6), 43fead7960SIan Munsie GPR_DWARFNUM_NAME(7), 44fead7960SIan Munsie GPR_DWARFNUM_NAME(8), 45fead7960SIan Munsie GPR_DWARFNUM_NAME(9), 46fead7960SIan Munsie GPR_DWARFNUM_NAME(10), 47fead7960SIan Munsie GPR_DWARFNUM_NAME(11), 48fead7960SIan Munsie GPR_DWARFNUM_NAME(12), 49fead7960SIan Munsie GPR_DWARFNUM_NAME(13), 50fead7960SIan Munsie GPR_DWARFNUM_NAME(14), 51fead7960SIan Munsie GPR_DWARFNUM_NAME(15), 52fead7960SIan Munsie GPR_DWARFNUM_NAME(16), 53fead7960SIan Munsie GPR_DWARFNUM_NAME(17), 54fead7960SIan Munsie GPR_DWARFNUM_NAME(18), 55fead7960SIan Munsie GPR_DWARFNUM_NAME(19), 56fead7960SIan Munsie GPR_DWARFNUM_NAME(20), 57fead7960SIan Munsie GPR_DWARFNUM_NAME(21), 58fead7960SIan Munsie GPR_DWARFNUM_NAME(22), 59fead7960SIan Munsie GPR_DWARFNUM_NAME(23), 60fead7960SIan Munsie GPR_DWARFNUM_NAME(24), 61fead7960SIan Munsie GPR_DWARFNUM_NAME(25), 62fead7960SIan Munsie GPR_DWARFNUM_NAME(26), 63fead7960SIan Munsie GPR_DWARFNUM_NAME(27), 64fead7960SIan Munsie GPR_DWARFNUM_NAME(28), 65fead7960SIan Munsie GPR_DWARFNUM_NAME(29), 66fead7960SIan Munsie GPR_DWARFNUM_NAME(30), 67fead7960SIan Munsie GPR_DWARFNUM_NAME(31), 684679bccaSNaveen N. Rao REG_DWARFNUM_NAME(msr, 66), 694679bccaSNaveen N. Rao REG_DWARFNUM_NAME(ctr, 109), 704679bccaSNaveen N. Rao REG_DWARFNUM_NAME(link, 108), 714679bccaSNaveen N. Rao REG_DWARFNUM_NAME(xer, 101), 724679bccaSNaveen N. Rao REG_DWARFNUM_NAME(dar, 119), 734679bccaSNaveen N. Rao REG_DWARFNUM_NAME(dsisr, 118), 74fead7960SIan Munsie REG_DWARFNUM_END, 75fead7960SIan Munsie }; 76fead7960SIan Munsie 77fead7960SIan Munsie /** 78fead7960SIan Munsie * get_arch_regstr() - lookup register name from it's DWARF register number 79fead7960SIan Munsie * @n: the DWARF register number 80fead7960SIan Munsie * 81fead7960SIan Munsie * get_arch_regstr() returns the name of the register in struct 82fead7960SIan Munsie * regdwarfnum_table from it's DWARF register number. If the register is not 83fead7960SIan Munsie * found in the table, this returns NULL; 84fead7960SIan Munsie */ 85fead7960SIan Munsie const char *get_arch_regstr(unsigned int n) 86fead7960SIan Munsie { 87fead7960SIan Munsie const struct pt_regs_dwarfnum *roff; 88fead7960SIan Munsie for (roff = regdwarfnum_table; roff->name != NULL; roff++) 89fead7960SIan Munsie if (roff->dwarfnum == n) 90fead7960SIan Munsie return roff->name; 91fead7960SIan Munsie return NULL; 92fead7960SIan Munsie } 934679bccaSNaveen N. Rao 944679bccaSNaveen N. Rao int regs_query_register_offset(const char *name) 954679bccaSNaveen N. Rao { 964679bccaSNaveen N. Rao const struct pt_regs_dwarfnum *roff; 974679bccaSNaveen N. Rao for (roff = regdwarfnum_table; roff->name != NULL; roff++) 984679bccaSNaveen N. Rao if (!strcmp(roff->name, name)) 994679bccaSNaveen N. Rao return roff->ptregs_offset; 1004679bccaSNaveen N. Rao return -EINVAL; 1014679bccaSNaveen N. Rao } 102