xref: /linux/tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c (revision c7decec2f2d2ab0366567f9e30c0e1418cece43f)
11672f370SIan Rogers // SPDX-License-Identifier: GPL-2.0
21672f370SIan Rogers // Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
31672f370SIan Rogers // Mapping of DWARF debug register numbers into register names.
41672f370SIan Rogers 
5cf7c7f12SIan Rogers #include <errno.h>
61672f370SIan Rogers #include <stddef.h>
71672f370SIan Rogers #include <dwarf-regs.h>
8*8cac4013SIan Rogers // Ensure the V2 perf reg definitions are included.
9*8cac4013SIan Rogers #undef __CSKYABIV2__
10*8cac4013SIan Rogers #define __CSKYABIV2__ 1
11*8cac4013SIan Rogers #include "../../../arch/csky/include/uapi/asm/perf_regs.h"
121672f370SIan Rogers 
131672f370SIan Rogers #define CSKY_ABIV2_MAX_REGS 73
14cf7c7f12SIan Rogers static const char * const csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_REGS] = {
151672f370SIan Rogers 	/* r0 ~ r8 */
161672f370SIan Rogers 	"%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1", "%regs2", "%regs3",
171672f370SIan Rogers 	/* r9 ~ r15 */
181672f370SIan Rogers 	"%regs4", "%regs5", "%regs6", "%regs7", "%regs8", "%regs9", "%sp",
191672f370SIan Rogers 	"%lr",
201672f370SIan Rogers 	/* r16 ~ r23 */
211672f370SIan Rogers 	"%exregs0", "%exregs1", "%exregs2", "%exregs3", "%exregs4",
221672f370SIan Rogers 	"%exregs5", "%exregs6", "%exregs7",
231672f370SIan Rogers 	/* r24 ~ r31 */
241672f370SIan Rogers 	"%exregs8", "%exregs9", "%exregs10", "%exregs11", "%exregs12",
251672f370SIan Rogers 	"%exregs13", "%exregs14", "%tls",
261672f370SIan Rogers 	"%pc", NULL, NULL, NULL, "%hi", "%lo", NULL, NULL,
271672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
281672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
291672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
301672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
311672f370SIan Rogers 	"%epc",
321672f370SIan Rogers };
331672f370SIan Rogers 
341672f370SIan Rogers #define CSKY_ABIV1_MAX_REGS 57
35cf7c7f12SIan Rogers static const char * const csky_dwarf_regs_table_abiv1[CSKY_ABIV1_MAX_REGS] = {
361672f370SIan Rogers 	/* r0 ~ r8 */
371672f370SIan Rogers 	"%sp", "%regs9", "%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1",
381672f370SIan Rogers 	/* r9 ~ r15 */
391672f370SIan Rogers 	"%regs2", "%regs3", "%regs4", "%regs5", "%regs6", "%regs7", "%regs8",
401672f370SIan Rogers 	"%lr",
411672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
421672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
431672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
441672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
451672f370SIan Rogers 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
461672f370SIan Rogers 	"%epc",
471672f370SIan Rogers };
481672f370SIan Rogers 
__get_csky_regstr(unsigned int n,unsigned int flags)49cf7c7f12SIan Rogers const char *__get_csky_regstr(unsigned int n, unsigned int flags)
501672f370SIan Rogers {
511672f370SIan Rogers 	if (flags & EF_CSKY_ABIV2)
521672f370SIan Rogers 		return (n < CSKY_ABIV2_MAX_REGS) ? csky_dwarf_regs_table_abiv2[n] : NULL;
531672f370SIan Rogers 
541672f370SIan Rogers 	return (n < CSKY_ABIV1_MAX_REGS) ? csky_dwarf_regs_table_abiv1[n] : NULL;
551672f370SIan Rogers }
56cf7c7f12SIan Rogers 
__get_dwarf_regnum(const char * const * regstr,size_t num_regstr,const char * name)57cf7c7f12SIan Rogers static int __get_dwarf_regnum(const char *const *regstr, size_t num_regstr, const char *name)
58cf7c7f12SIan Rogers {
59cf7c7f12SIan Rogers 	for (size_t i = 0; i < num_regstr; i++) {
60cf7c7f12SIan Rogers 		if (regstr[i] && !strcmp(regstr[i], name))
61cf7c7f12SIan Rogers 			return i;
62cf7c7f12SIan Rogers 	}
63cf7c7f12SIan Rogers 	return -ENOENT;
64cf7c7f12SIan Rogers }
65cf7c7f12SIan Rogers 
__get_csky_regnum(const char * name,unsigned int flags)66cf7c7f12SIan Rogers int __get_csky_regnum(const char *name, unsigned int flags)
67cf7c7f12SIan Rogers {
68cf7c7f12SIan Rogers 	if (flags & EF_CSKY_ABIV2)
69cf7c7f12SIan Rogers 		return __get_dwarf_regnum(csky_dwarf_regs_table_abiv2, CSKY_ABIV2_MAX_REGS, name);
70cf7c7f12SIan Rogers 
71cf7c7f12SIan Rogers 	return __get_dwarf_regnum(csky_dwarf_regs_table_abiv1, CSKY_ABIV1_MAX_REGS, name);
72cf7c7f12SIan Rogers }
73*8cac4013SIan Rogers 
__get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum,unsigned int flags)74*8cac4013SIan Rogers int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int flags)
75*8cac4013SIan Rogers {
76*8cac4013SIan Rogers 	static const int dwarf_csky_regnums[][2] = {
77*8cac4013SIan Rogers 		[PERF_REG_CSKY_TLS] = {-ENOENT, 31},
78*8cac4013SIan Rogers 		[PERF_REG_CSKY_LR] = {15, 15},
79*8cac4013SIan Rogers 		[PERF_REG_CSKY_PC] = {-ENOENT, 32},
80*8cac4013SIan Rogers 		/* TODO: PERF_REG_CSKY_SR */
81*8cac4013SIan Rogers 		[PERF_REG_CSKY_SP] = {0, 14},
82*8cac4013SIan Rogers 		/* TODO: PERF_REG_CSKY_ORIG_A0 */
83*8cac4013SIan Rogers 		[PERF_REG_CSKY_A0] = {2, 0},
84*8cac4013SIan Rogers 		[PERF_REG_CSKY_A1] = {3, 1},
85*8cac4013SIan Rogers 		[PERF_REG_CSKY_A2] = {4, 2},
86*8cac4013SIan Rogers 		[PERF_REG_CSKY_A3] = {5, 3},
87*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS0] = {6, 4},
88*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS1] = {7, 5},
89*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS2] = {8, 6},
90*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS3] = {9, 7},
91*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS4] = {10, 8},
92*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS5] = {11, 9},
93*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS6] = {12, 10},
94*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS7] = {13, 11},
95*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS8] = {14, 12},
96*8cac4013SIan Rogers 		[PERF_REG_CSKY_REGS9] = {1, 13},
97*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS0] = {-ENOENT, 16},
98*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS1] = {-ENOENT, 17},
99*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS2] = {-ENOENT, 18},
100*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS3] = {-ENOENT, 19},
101*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS4] = {-ENOENT, 20},
102*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS5] = {-ENOENT, 21},
103*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS6] = {-ENOENT, 22},
104*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS7] = {-ENOENT, 23},
105*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS8] = {-ENOENT, 24},
106*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS9] = {-ENOENT, 25},
107*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS10] = {-ENOENT, 26},
108*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS11] = {-ENOENT, 27},
109*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS12] = {-ENOENT, 28},
110*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS13] = {-ENOENT, 29},
111*8cac4013SIan Rogers 		[PERF_REG_CSKY_EXREGS14] = {-ENOENT, 30},
112*8cac4013SIan Rogers 		/* TODO: PERF_REG_CSKY_HI */
113*8cac4013SIan Rogers 		/* TODO: PERF_REG_CSKY_LO */
114*8cac4013SIan Rogers 		/* TODO: PERF_REG_CSKY_DCSR */
115*8cac4013SIan Rogers 	};
116*8cac4013SIan Rogers 	int idx = 0;
117*8cac4013SIan Rogers 
118*8cac4013SIan Rogers 	if (flags & EF_CSKY_ABIV2)
119*8cac4013SIan Rogers 		idx++;
120*8cac4013SIan Rogers 
121*8cac4013SIan Rogers 	if (perf_regnum <  0 || perf_regnum > (int)ARRAY_SIZE(dwarf_csky_regnums) ||
122*8cac4013SIan Rogers 	    dwarf_csky_regnums[perf_regnum][idx] == 0)
123*8cac4013SIan Rogers 		return -ENOENT;
124*8cac4013SIan Rogers 
125*8cac4013SIan Rogers 	return dwarf_csky_regnums[perf_regnum][idx];
126*8cac4013SIan Rogers }
127