xref: /openbmc/linux/tools/perf/arch/powerpc/util/dwarf-regs.c (revision fead7960f0b645348fa4757100f4d57654bf9ffa)
1*fead7960SIan Munsie /*
2*fead7960SIan Munsie  * Mapping of DWARF debug register numbers into register names.
3*fead7960SIan Munsie  *
4*fead7960SIan Munsie  * Copyright (C) 2010 Ian Munsie, IBM Corporation.
5*fead7960SIan Munsie  *
6*fead7960SIan Munsie  * This program is free software; you can redistribute it and/or
7*fead7960SIan Munsie  * modify it under the terms of the GNU General Public License
8*fead7960SIan Munsie  * as published by the Free Software Foundation; either version
9*fead7960SIan Munsie  * 2 of the License, or (at your option) any later version.
10*fead7960SIan Munsie  */
11*fead7960SIan Munsie 
12*fead7960SIan Munsie #include <libio.h>
13*fead7960SIan Munsie #include <dwarf-regs.h>
14*fead7960SIan Munsie 
15*fead7960SIan Munsie 
16*fead7960SIan Munsie struct pt_regs_dwarfnum {
17*fead7960SIan Munsie 	const char *name;
18*fead7960SIan Munsie 	unsigned int dwarfnum;
19*fead7960SIan Munsie };
20*fead7960SIan Munsie 
21*fead7960SIan Munsie #define STR(s) #s
22*fead7960SIan Munsie #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
23*fead7960SIan Munsie #define GPR_DWARFNUM_NAME(num)	\
24*fead7960SIan Munsie 	{.name = STR(%gpr##num), .dwarfnum = num}
25*fead7960SIan Munsie #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
26*fead7960SIan Munsie 
27*fead7960SIan Munsie /*
28*fead7960SIan Munsie  * Reference:
29*fead7960SIan Munsie  * http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html
30*fead7960SIan Munsie  */
31*fead7960SIan Munsie static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
32*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(0),
33*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(1),
34*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(2),
35*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(3),
36*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(4),
37*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(5),
38*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(6),
39*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(7),
40*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(8),
41*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(9),
42*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(10),
43*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(11),
44*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(12),
45*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(13),
46*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(14),
47*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(15),
48*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(16),
49*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(17),
50*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(18),
51*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(19),
52*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(20),
53*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(21),
54*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(22),
55*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(23),
56*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(24),
57*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(25),
58*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(26),
59*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(27),
60*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(28),
61*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(29),
62*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(30),
63*fead7960SIan Munsie 	GPR_DWARFNUM_NAME(31),
64*fead7960SIan Munsie 	REG_DWARFNUM_NAME("%msr",   66),
65*fead7960SIan Munsie 	REG_DWARFNUM_NAME("%ctr",   109),
66*fead7960SIan Munsie 	REG_DWARFNUM_NAME("%link",  108),
67*fead7960SIan Munsie 	REG_DWARFNUM_NAME("%xer",   101),
68*fead7960SIan Munsie 	REG_DWARFNUM_NAME("%dar",   119),
69*fead7960SIan Munsie 	REG_DWARFNUM_NAME("%dsisr", 118),
70*fead7960SIan Munsie 	REG_DWARFNUM_END,
71*fead7960SIan Munsie };
72*fead7960SIan Munsie 
73*fead7960SIan Munsie /**
74*fead7960SIan Munsie  * get_arch_regstr() - lookup register name from it's DWARF register number
75*fead7960SIan Munsie  * @n:	the DWARF register number
76*fead7960SIan Munsie  *
77*fead7960SIan Munsie  * get_arch_regstr() returns the name of the register in struct
78*fead7960SIan Munsie  * regdwarfnum_table from it's DWARF register number. If the register is not
79*fead7960SIan Munsie  * found in the table, this returns NULL;
80*fead7960SIan Munsie  */
81*fead7960SIan Munsie const char *get_arch_regstr(unsigned int n)
82*fead7960SIan Munsie {
83*fead7960SIan Munsie 	const struct pt_regs_dwarfnum *roff;
84*fead7960SIan Munsie 	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
85*fead7960SIan Munsie 		if (roff->dwarfnum == n)
86*fead7960SIan Munsie 			return roff->name;
87*fead7960SIan Munsie 	return NULL;
88*fead7960SIan Munsie }
89