xref: /openbsd/sys/arch/riscv64/include/profile.h (revision 73471bf0)
1 /*	$OpenBSD: profile.h,v 1.4 2021/05/21 16:49:57 deraadt Exp $	*/
2 
3 /*
4  * Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #define	_MCOUNT_DECL void _mcount
20 
21 #define MCOUNT_ASM_NAME "__mcount"
22 
23 #ifdef __PIC__
24 #define	PLTSYM		"" /* XXX -aarch64 defaults to PLT? */
25 #else
26 #define	PLTSYM		""
27 #endif
28 
29 #define MCOUNT							\
30 __asm__ (".text						\n;"	\
31 	 ".align 3					\n;"	\
32 	 ".globl " MCOUNT_ASM_NAME "			\n;"	\
33 	 ".type " MCOUNT_ASM_NAME ",@function		\n;"	\
34 	 MCOUNT_ASM_NAME ":				\n;"	\
35 	 "	addi	sp, sp, -176			\n"	\
36 	 "	sd	fp, 0(sp)			\n"	\
37 	 "	sd	ra, 8(sp)			\n"	\
38 	 "	sd	s1, 24(sp)			\n"	\
39 	 "	sd	a0, 32(sp)			\n"	\
40 	 "	sd	a1, 40(sp)			\n"	\
41 	 "	sd	a2, 48(sp)			\n"	\
42 	 "	sd	a3, 56(sp)			\n"	\
43 	 "	sd	a4, 64(sp)			\n"	\
44 	 "	sd	a5, 72(sp)			\n"	\
45 	 "	sd	a6, 80(sp)			\n"	\
46 	 "	sd	a7, 88(sp)			\n"	\
47 	 "	sd	s2, 96(sp)			\n"	\
48 	 "	sd	s3, 104(sp)			\n"	\
49 	 "	sd	s4, 112(sp)			\n"	\
50 	 "	sd	s5, 120(sp)			\n"	\
51 	 "	sd	s6, 128(sp)			\n"	\
52 	 "	sd	s7, 136(sp)			\n"	\
53 	 "	sd	s8, 144(sp)			\n"	\
54 	 "	sd	s9, 152(sp)			\n"	\
55 	 "	sd	s10, 160(sp)			\n"	\
56 	 "	sd	s11, 168(sp)			\n"	\
57 	 "	ld	a0, 8(fp)			\n"	\
58 	 "	mv	a1, x1				\n"	\
59 	 "	call	" __STRING(_mcount) PLTSYM "	\n"	\
60 	 /* restore argument registers */			\
61 	 "	ld	fp, 0(sp)			\n"	\
62 	 "	ld	ra, 8(sp)			\n"	\
63 	 "	ld	s1, 24(sp)			\n"	\
64 	 "	ld	a0, 32(sp)			\n"	\
65 	 "	ld	a1, 40(sp)			\n"	\
66 	 "	ld	a2, 48(sp)			\n"	\
67 	 "	ld	a3, 56(sp)			\n"	\
68 	 "	ld	a4, 64(sp)			\n"	\
69 	 "	ld	a5, 72(sp)			\n"	\
70 	 "	ld	a6, 80(sp)			\n"	\
71 	 "	ld	a7, 88(sp)			\n"	\
72 	 "	ld	s2, 96(sp)			\n"	\
73 	 "	ld	s3, 104(sp)			\n"	\
74 	 "	ld	s4, 112(sp)			\n"	\
75 	 "	ld	s5, 120(sp)			\n"	\
76 	 "	ld	s6, 128(sp)			\n"	\
77 	 "	ld	s7, 136(sp)			\n"	\
78 	 "	ld	s8, 144(sp)			\n"	\
79 	 "	ld	s9, 152(sp)			\n"	\
80 	 "	ld	s10, 160(sp)			\n"	\
81 	 "	ld	s11, 168(sp)			\n"	\
82 	 "	addi	sp, sp, 176			\n"	\
83 	 "	jr	ra				\n");
84 
85 #ifdef _KERNEL
86 // Change this to dair read/set, then restore.
87 #define MCOUNT_ENTER						\
88 __asm__ ("mrs %x0,daif; msr daifset, #0x2": "=r"(s));
89 #define	MCOUNT_EXIT						\
90 __asm__ ("msr daif, %x0":: "r"(s));
91 
92 #endif
93