18ab596afSJean Pihet /* 28ab596afSJean Pihet * Mapping of DWARF debug register numbers into register names. 38ab596afSJean Pihet * 48ab596afSJean Pihet * Copyright (C) 2010 Will Deacon, ARM Ltd. 58ab596afSJean Pihet * 68ab596afSJean Pihet * This program is free software; you can redistribute it and/or modify 78ab596afSJean Pihet * it under the terms of the GNU General Public License version 2 as 88ab596afSJean Pihet * published by the Free Software Foundation. 98ab596afSJean Pihet */ 108ab596afSJean Pihet 11*a43783aeSArnaldo Carvalho de Melo #include <errno.h> 128ab596afSJean Pihet #include <stddef.h> 138ab596afSJean Pihet #include <dwarf-regs.h> 143bb53c9fSHe Kuang #include <linux/ptrace.h> /* for struct user_pt_regs */ 15aa8cc2f6SArnaldo Carvalho de Melo #include <linux/stringify.h> 163bb53c9fSHe Kuang #include "util.h" 178ab596afSJean Pihet 188ab596afSJean Pihet struct pt_regs_dwarfnum { 198ab596afSJean Pihet const char *name; 208ab596afSJean Pihet unsigned int dwarfnum; 218ab596afSJean Pihet }; 228ab596afSJean Pihet 238ab596afSJean Pihet #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} 248ab596afSJean Pihet #define GPR_DWARFNUM_NAME(num) \ 25aa8cc2f6SArnaldo Carvalho de Melo {.name = __stringify(%x##num), .dwarfnum = num} 268ab596afSJean Pihet #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} 273bb53c9fSHe Kuang #define DWARFNUM2OFFSET(index) \ 283bb53c9fSHe Kuang (index * sizeof((struct user_pt_regs *)0)->regs[0]) 298ab596afSJean Pihet 308ab596afSJean Pihet /* 318ab596afSJean Pihet * Reference: 328ab596afSJean Pihet * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf 338ab596afSJean Pihet */ 348ab596afSJean Pihet static const struct pt_regs_dwarfnum regdwarfnum_table[] = { 358ab596afSJean Pihet GPR_DWARFNUM_NAME(0), 368ab596afSJean Pihet GPR_DWARFNUM_NAME(1), 378ab596afSJean Pihet GPR_DWARFNUM_NAME(2), 388ab596afSJean Pihet GPR_DWARFNUM_NAME(3), 398ab596afSJean Pihet GPR_DWARFNUM_NAME(4), 408ab596afSJean Pihet GPR_DWARFNUM_NAME(5), 418ab596afSJean Pihet GPR_DWARFNUM_NAME(6), 428ab596afSJean Pihet GPR_DWARFNUM_NAME(7), 438ab596afSJean Pihet GPR_DWARFNUM_NAME(8), 448ab596afSJean Pihet GPR_DWARFNUM_NAME(9), 458ab596afSJean Pihet GPR_DWARFNUM_NAME(10), 468ab596afSJean Pihet GPR_DWARFNUM_NAME(11), 478ab596afSJean Pihet GPR_DWARFNUM_NAME(12), 488ab596afSJean Pihet GPR_DWARFNUM_NAME(13), 498ab596afSJean Pihet GPR_DWARFNUM_NAME(14), 508ab596afSJean Pihet GPR_DWARFNUM_NAME(15), 518ab596afSJean Pihet GPR_DWARFNUM_NAME(16), 528ab596afSJean Pihet GPR_DWARFNUM_NAME(17), 538ab596afSJean Pihet GPR_DWARFNUM_NAME(18), 548ab596afSJean Pihet GPR_DWARFNUM_NAME(19), 558ab596afSJean Pihet GPR_DWARFNUM_NAME(20), 568ab596afSJean Pihet GPR_DWARFNUM_NAME(21), 578ab596afSJean Pihet GPR_DWARFNUM_NAME(22), 588ab596afSJean Pihet GPR_DWARFNUM_NAME(23), 598ab596afSJean Pihet GPR_DWARFNUM_NAME(24), 608ab596afSJean Pihet GPR_DWARFNUM_NAME(25), 618ab596afSJean Pihet GPR_DWARFNUM_NAME(26), 628ab596afSJean Pihet GPR_DWARFNUM_NAME(27), 638ab596afSJean Pihet GPR_DWARFNUM_NAME(28), 648ab596afSJean Pihet GPR_DWARFNUM_NAME(29), 658ab596afSJean Pihet REG_DWARFNUM_NAME("%lr", 30), 668ab596afSJean Pihet REG_DWARFNUM_NAME("%sp", 31), 678ab596afSJean Pihet REG_DWARFNUM_END, 688ab596afSJean Pihet }; 698ab596afSJean Pihet 708ab596afSJean Pihet /** 718ab596afSJean Pihet * get_arch_regstr() - lookup register name from it's DWARF register number 728ab596afSJean Pihet * @n: the DWARF register number 738ab596afSJean Pihet * 748ab596afSJean Pihet * get_arch_regstr() returns the name of the register in struct 758ab596afSJean Pihet * regdwarfnum_table from it's DWARF register number. If the register is not 768ab596afSJean Pihet * found in the table, this returns NULL; 778ab596afSJean Pihet */ 788ab596afSJean Pihet const char *get_arch_regstr(unsigned int n) 798ab596afSJean Pihet { 808ab596afSJean Pihet const struct pt_regs_dwarfnum *roff; 818ab596afSJean Pihet for (roff = regdwarfnum_table; roff->name != NULL; roff++) 828ab596afSJean Pihet if (roff->dwarfnum == n) 838ab596afSJean Pihet return roff->name; 848ab596afSJean Pihet return NULL; 858ab596afSJean Pihet } 863bb53c9fSHe Kuang 873bb53c9fSHe Kuang int regs_query_register_offset(const char *name) 883bb53c9fSHe Kuang { 893bb53c9fSHe Kuang const struct pt_regs_dwarfnum *roff; 903bb53c9fSHe Kuang 913bb53c9fSHe Kuang for (roff = regdwarfnum_table; roff->name != NULL; roff++) 923bb53c9fSHe Kuang if (!strcmp(roff->name, name)) 933bb53c9fSHe Kuang return DWARFNUM2OFFSET(roff->dwarfnum); 943bb53c9fSHe Kuang return -EINVAL; 953bb53c9fSHe Kuang } 96