xref: /linux/tools/perf/util/annotate-arch/annotate-csky.c (revision 07b972ff09f45cfb7acd20cd9b3769c6975bc434)
1*07b972ffSIan Rogers // SPDX-License-Identifier: GPL-2.0
2*07b972ffSIan Rogers // Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
3*07b972ffSIan Rogers #include <string.h>
4*07b972ffSIan Rogers #include <linux/compiler.h>
5*07b972ffSIan Rogers #include "../disasm.h"
6*07b972ffSIan Rogers 
7*07b972ffSIan Rogers static const struct ins_ops *csky__associate_ins_ops(struct arch *arch,
8*07b972ffSIan Rogers 						     const char *name)
9*07b972ffSIan Rogers {
10*07b972ffSIan Rogers 	const struct ins_ops *ops = NULL;
11*07b972ffSIan Rogers 
12*07b972ffSIan Rogers 	/* catch all kind of jumps */
13*07b972ffSIan Rogers 	if (!strcmp(name, "bt") ||
14*07b972ffSIan Rogers 	    !strcmp(name, "bf") ||
15*07b972ffSIan Rogers 	    !strcmp(name, "bez") ||
16*07b972ffSIan Rogers 	    !strcmp(name, "bnez") ||
17*07b972ffSIan Rogers 	    !strcmp(name, "bnezad") ||
18*07b972ffSIan Rogers 	    !strcmp(name, "bhsz") ||
19*07b972ffSIan Rogers 	    !strcmp(name, "bhz") ||
20*07b972ffSIan Rogers 	    !strcmp(name, "blsz") ||
21*07b972ffSIan Rogers 	    !strcmp(name, "blz") ||
22*07b972ffSIan Rogers 	    !strcmp(name, "br") ||
23*07b972ffSIan Rogers 	    !strcmp(name, "jmpi") ||
24*07b972ffSIan Rogers 	    !strcmp(name, "jmp"))
25*07b972ffSIan Rogers 		ops = &jump_ops;
26*07b972ffSIan Rogers 
27*07b972ffSIan Rogers 	/* catch function call */
28*07b972ffSIan Rogers 	if (!strcmp(name, "bsr") ||
29*07b972ffSIan Rogers 	    !strcmp(name, "jsri") ||
30*07b972ffSIan Rogers 	    !strcmp(name, "jsr"))
31*07b972ffSIan Rogers 		ops = &call_ops;
32*07b972ffSIan Rogers 
33*07b972ffSIan Rogers 	/* catch function return */
34*07b972ffSIan Rogers 	if (!strcmp(name, "rts"))
35*07b972ffSIan Rogers 		ops = &ret_ops;
36*07b972ffSIan Rogers 
37*07b972ffSIan Rogers 	if (ops)
38*07b972ffSIan Rogers 		arch__associate_ins_ops(arch, name, ops);
39*07b972ffSIan Rogers 	return ops;
40*07b972ffSIan Rogers }
41*07b972ffSIan Rogers 
42*07b972ffSIan Rogers int csky__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
43*07b972ffSIan Rogers {
44*07b972ffSIan Rogers 	arch->initialized = true;
45*07b972ffSIan Rogers 	arch->objdump.comment_char = '/';
46*07b972ffSIan Rogers 	arch->associate_instruction_ops = csky__associate_ins_ops;
47*07b972ffSIan Rogers 	return 0;
48*07b972ffSIan Rogers }
49