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