1*d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 28ab596afSJean Pihet /* 38ab596afSJean Pihet * Mapping of DWARF debug register numbers into register names. 48ab596afSJean Pihet * 58ab596afSJean Pihet * Copyright (C) 2010 Will Deacon, ARM Ltd. 68ab596afSJean Pihet */ 78ab596afSJean Pihet 8a43783aeSArnaldo Carvalho de Melo #include <errno.h> 98ab596afSJean Pihet #include <stddef.h> 107a8ef4c4SArnaldo Carvalho de Melo #include <string.h> 118ab596afSJean Pihet #include <dwarf-regs.h> 123bb53c9fSHe Kuang #include <linux/ptrace.h> /* for struct user_pt_regs */ 13aa8cc2f6SArnaldo Carvalho de Melo #include <linux/stringify.h> 143bb53c9fSHe Kuang #include "util.h" 158ab596afSJean Pihet 168ab596afSJean Pihet struct pt_regs_dwarfnum { 178ab596afSJean Pihet const char *name; 188ab596afSJean Pihet unsigned int dwarfnum; 198ab596afSJean Pihet }; 208ab596afSJean Pihet 218ab596afSJean Pihet #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} 228ab596afSJean Pihet #define GPR_DWARFNUM_NAME(num) \ 23aa8cc2f6SArnaldo Carvalho de Melo {.name = __stringify(%x##num), .dwarfnum = num} 248ab596afSJean Pihet #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} 253bb53c9fSHe Kuang #define DWARFNUM2OFFSET(index) \ 263bb53c9fSHe Kuang (index * sizeof((struct user_pt_regs *)0)->regs[0]) 278ab596afSJean Pihet 288ab596afSJean Pihet /* 298ab596afSJean Pihet * Reference: 308ab596afSJean Pihet * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf 318ab596afSJean Pihet */ 328ab596afSJean Pihet static const struct pt_regs_dwarfnum regdwarfnum_table[] = { 338ab596afSJean Pihet GPR_DWARFNUM_NAME(0), 348ab596afSJean Pihet GPR_DWARFNUM_NAME(1), 358ab596afSJean Pihet GPR_DWARFNUM_NAME(2), 368ab596afSJean Pihet GPR_DWARFNUM_NAME(3), 378ab596afSJean Pihet GPR_DWARFNUM_NAME(4), 388ab596afSJean Pihet GPR_DWARFNUM_NAME(5), 398ab596afSJean Pihet GPR_DWARFNUM_NAME(6), 408ab596afSJean Pihet GPR_DWARFNUM_NAME(7), 418ab596afSJean Pihet GPR_DWARFNUM_NAME(8), 428ab596afSJean Pihet GPR_DWARFNUM_NAME(9), 438ab596afSJean Pihet GPR_DWARFNUM_NAME(10), 448ab596afSJean Pihet GPR_DWARFNUM_NAME(11), 458ab596afSJean Pihet GPR_DWARFNUM_NAME(12), 468ab596afSJean Pihet GPR_DWARFNUM_NAME(13), 478ab596afSJean Pihet GPR_DWARFNUM_NAME(14), 488ab596afSJean Pihet GPR_DWARFNUM_NAME(15), 498ab596afSJean Pihet GPR_DWARFNUM_NAME(16), 508ab596afSJean Pihet GPR_DWARFNUM_NAME(17), 518ab596afSJean Pihet GPR_DWARFNUM_NAME(18), 528ab596afSJean Pihet GPR_DWARFNUM_NAME(19), 538ab596afSJean Pihet GPR_DWARFNUM_NAME(20), 548ab596afSJean Pihet GPR_DWARFNUM_NAME(21), 558ab596afSJean Pihet GPR_DWARFNUM_NAME(22), 568ab596afSJean Pihet GPR_DWARFNUM_NAME(23), 578ab596afSJean Pihet GPR_DWARFNUM_NAME(24), 588ab596afSJean Pihet GPR_DWARFNUM_NAME(25), 598ab596afSJean Pihet GPR_DWARFNUM_NAME(26), 608ab596afSJean Pihet GPR_DWARFNUM_NAME(27), 618ab596afSJean Pihet GPR_DWARFNUM_NAME(28), 628ab596afSJean Pihet GPR_DWARFNUM_NAME(29), 638ab596afSJean Pihet REG_DWARFNUM_NAME("%lr", 30), 648ab596afSJean Pihet REG_DWARFNUM_NAME("%sp", 31), 658ab596afSJean Pihet REG_DWARFNUM_END, 668ab596afSJean Pihet }; 678ab596afSJean Pihet 688ab596afSJean Pihet /** 698ab596afSJean Pihet * get_arch_regstr() - lookup register name from it's DWARF register number 708ab596afSJean Pihet * @n: the DWARF register number 718ab596afSJean Pihet * 728ab596afSJean Pihet * get_arch_regstr() returns the name of the register in struct 738ab596afSJean Pihet * regdwarfnum_table from it's DWARF register number. If the register is not 748ab596afSJean Pihet * found in the table, this returns NULL; 758ab596afSJean Pihet */ 768ab596afSJean Pihet const char *get_arch_regstr(unsigned int n) 778ab596afSJean Pihet { 788ab596afSJean Pihet const struct pt_regs_dwarfnum *roff; 798ab596afSJean Pihet for (roff = regdwarfnum_table; roff->name != NULL; roff++) 808ab596afSJean Pihet if (roff->dwarfnum == n) 818ab596afSJean Pihet return roff->name; 828ab596afSJean Pihet return NULL; 838ab596afSJean Pihet } 843bb53c9fSHe Kuang 853bb53c9fSHe Kuang int regs_query_register_offset(const char *name) 863bb53c9fSHe Kuang { 873bb53c9fSHe Kuang const struct pt_regs_dwarfnum *roff; 883bb53c9fSHe Kuang 893bb53c9fSHe Kuang for (roff = regdwarfnum_table; roff->name != NULL; roff++) 903bb53c9fSHe Kuang if (!strcmp(roff->name, name)) 913bb53c9fSHe Kuang return DWARFNUM2OFFSET(roff->dwarfnum); 923bb53c9fSHe Kuang return -EINVAL; 933bb53c9fSHe Kuang } 94