xref: /openbsd-src/sys/arch/arm64/include/profile.h (revision adc7c282072bd0a8067bf9fbcf42318cb4ad7921)
1*adc7c282Skettenis /* $OpenBSD: profile.h,v 1.2 2021/02/17 12:11:45 kettenis Exp $ */
2f24071e5Spatrick /*
3f24071e5Spatrick  * Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com>
4f24071e5Spatrick  *
5f24071e5Spatrick  * Permission to use, copy, modify, and distribute this software for any
6f24071e5Spatrick  * purpose with or without fee is hereby granted, provided that the above
7f24071e5Spatrick  * copyright notice and this permission notice appear in all copies.
8f24071e5Spatrick  *
9f24071e5Spatrick  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10f24071e5Spatrick  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11f24071e5Spatrick  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12f24071e5Spatrick  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13f24071e5Spatrick  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14f24071e5Spatrick  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15f24071e5Spatrick  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16f24071e5Spatrick  */
17f24071e5Spatrick 
18f24071e5Spatrick #define	_MCOUNT_DECL void _mcount
19f24071e5Spatrick 
20f24071e5Spatrick #define MCOUNT_ASM_NAME "__mcount"
21f24071e5Spatrick 
22f24071e5Spatrick #ifdef __PIC__
23f24071e5Spatrick #define	PLTSYM		"" /* XXX -aarch64 defaults to PLT? */
24f24071e5Spatrick #else
25f24071e5Spatrick #define	PLTSYM		""
26f24071e5Spatrick #endif
27f24071e5Spatrick 
28f24071e5Spatrick #define MCOUNT							\
29f24071e5Spatrick __asm__ (".text;"						\
30f24071e5Spatrick 	 ".align 3;"						\
31f24071e5Spatrick 	 ".globl " MCOUNT_ASM_NAME ";"				\
32f24071e5Spatrick 	 ".type " MCOUNT_ASM_NAME ",@function;"			\
33f24071e5Spatrick 	 MCOUNT_ASM_NAME ":;"					\
34f24071e5Spatrick 	 "	stp	x0, x1, [sp, #-160]!;"			\
35f24071e5Spatrick 	 "	stp	x2, x3, [sp, #16];"			\
36f24071e5Spatrick 	 "	stp	x4, x5, [sp, #32];"			\
37f24071e5Spatrick 	 "	stp	x6, x7, [sp, #48];"			\
38f24071e5Spatrick 	 "	stp	x8, x9, [sp, #64];"			\
39f24071e5Spatrick 	 "	stp	x10,x11,[sp, #80];"			\
40f24071e5Spatrick 	 "	stp	x12,x13,[sp, #96];"			\
41f24071e5Spatrick 	 "	stp	x14,x15,[sp, #112];"			\
42f24071e5Spatrick 	 "	stp	x16,x17,[sp, #128];"			\
43f24071e5Spatrick 	 "	stp	x29,lr, [sp, #144];"			\
44f24071e5Spatrick 	 /* load from pc at 8 off frame pointer */		\
45f24071e5Spatrick 	 "	ldr	x0, [x29, #8];"				\
46f24071e5Spatrick 	 "	mov	x1, lr;"				\
47f24071e5Spatrick 	 "	bl	" __STRING(_mcount) PLTSYM ";"		\
48f24071e5Spatrick 	 /* restore argument registers */			\
49f24071e5Spatrick 	 "	ldp	x2, x3, [sp, #16];"			\
50f24071e5Spatrick 	 "	ldp	x4, x5, [sp, #32];"			\
51f24071e5Spatrick 	 "	ldp	x6, x7, [sp, #48];"			\
52f24071e5Spatrick 	 "	ldp	x8, x9, [sp, #64];"			\
53f24071e5Spatrick 	 "	ldp	x10,x11,[sp, #80];"			\
54f24071e5Spatrick 	 "	ldp	x12,x13,[sp, #96];"			\
55f24071e5Spatrick 	 "	ldp	x14,x15,[sp, #112];"			\
56f24071e5Spatrick 	 "	ldp	x16,x17,[sp, #128];"			\
57f24071e5Spatrick 	 "	ldp	x29,lr, [sp, #144];"			\
58f24071e5Spatrick 	 "	ldp	x0, x1, [sp], #160;"			\
59f24071e5Spatrick 	 "	ret;");
60f24071e5Spatrick 
61f24071e5Spatrick #ifdef _KERNEL
62f24071e5Spatrick // Change this to dair read/set, then restore.
63f24071e5Spatrick #define MCOUNT_ENTER						\
64*adc7c282Skettenis __asm__ ("mrs %x0, daif; msr daifset, #0x3": "=r"(s));
65f24071e5Spatrick #define	MCOUNT_EXIT						\
66f24071e5Spatrick __asm__ ("msr daif, %x0":: "r"(s));
67f24071e5Spatrick 
68f24071e5Spatrick #endif // _KERNEL
69