xref: /openbsd-src/sys/arch/powerpc64/include/asm.h (revision 6a684a0448534bbab8058f7b12f094dd9837d5d2)
1*6a684a04Sguenther /*	$OpenBSD: asm.h,v 1.7 2022/12/07 23:25:59 guenther Exp $	*/
28140d1b9Skettenis 
3b54ea104Sdrahn /*
4b54ea104Sdrahn  * Copyright (c) 2020 Dale Rahn <drahn@openbsd.org>
5b54ea104Sdrahn  *
6b54ea104Sdrahn  * Permission to use, copy, modify, and distribute this software for any
7b54ea104Sdrahn  * purpose with or without fee is hereby granted, provided that the above
8b54ea104Sdrahn  * copyright notice and this permission notice appear in all copies.
9b54ea104Sdrahn  *
10b54ea104Sdrahn  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11b54ea104Sdrahn  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12b54ea104Sdrahn  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13b54ea104Sdrahn  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14b54ea104Sdrahn  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15b54ea104Sdrahn  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16b54ea104Sdrahn  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17b54ea104Sdrahn  */
18b54ea104Sdrahn 
19b54ea104Sdrahn #ifndef _POWERPC64_ASM_H_
20b54ea104Sdrahn #define _POWERPC64_ASM_H_
21b54ea104Sdrahn 
22b54ea104Sdrahn #define _C_LABEL(x)	x
23b54ea104Sdrahn #define _ASM_LABEL(x)	x
24b54ea104Sdrahn 
25b54ea104Sdrahn #define _TMP_LABEL(x)	.L_ ## x
26b54ea104Sdrahn #define _GEP_LABEL(x)	.L_ ## x ## _gep0
27b54ea104Sdrahn #define _LEP_LABEL(x)	.L_ ## x ## _lep0
28b54ea104Sdrahn 
29b54ea104Sdrahn #define _ENTRY(x)						\
30b54ea104Sdrahn 	.text; .align 2; .globl x; .type x,@function; x:	\
31b54ea104Sdrahn 	_GEP_LABEL(x):						\
32b54ea104Sdrahn 	addis	%r2, %r12, .TOC.-_GEP_LABEL(x)@ha;		\
33b54ea104Sdrahn 	addi	%r2, %r2, .TOC.-_GEP_LABEL(x)@l;		\
34b54ea104Sdrahn 	_LEP_LABEL(x):						\
35*6a684a04Sguenther 	.localentry	x, _LEP_LABEL(x)-_GEP_LABEL(x);
36b54ea104Sdrahn 
37b54ea104Sdrahn #if defined(PROF) || defined(GPROF)
38b54ea104Sdrahn # define _PROF_PROLOGUE(y)					\
39b54ea104Sdrahn 	.section ".data";					\
40b54ea104Sdrahn 	.align 2;						\
41b54ea104Sdrahn _TMP_LABEL(y):;							\
42b54ea104Sdrahn 	.long	0;						\
43b54ea104Sdrahn 	.section ".text";					\
44b54ea104Sdrahn 	mflr	%r0;						\
45b54ea104Sdrahn 	addis	%r11, %r2, _TMP_LABEL(y)@toc@ha;		\
46b54ea104Sdrahn 	std	%r0, 8(%r1);					\
47b54ea104Sdrahn 	addi	%r0, %r11, _TMP_LABEL(y)@toc@l;			\
48b54ea104Sdrahn 	bl _mcount;
49b54ea104Sdrahn #else
50b54ea104Sdrahn # define _PROF_PROLOGUE(y)
51b54ea104Sdrahn #endif
52b54ea104Sdrahn 
53*6a684a04Sguenther #define ENTRY(y)	_ENTRY(y); _PROF_PROLOGUE(y)
54*6a684a04Sguenther #define ASENTRY(y)	_ENTRY(y); _PROF_PROLOGUE(y)
55b54ea104Sdrahn #define END(y)		.size y, . - y
56b54ea104Sdrahn 
57b54ea104Sdrahn #define STRONG_ALIAS(alias,sym) \
58b54ea104Sdrahn 	.global alias; .set alias,sym
59b54ea104Sdrahn #define WEAK_ALIAS(alias,sym) \
60b54ea104Sdrahn 	.weak alias; .set alias,sym
61b54ea104Sdrahn 
62af2f3395Smortimer #if defined(_RET_PROTECTOR)
63af2f3395Smortimer # define RETGUARD_SETUP(x, reg)						\
64af2f3395Smortimer 	RETGUARD_SYMBOL(x);						\
65af2f3395Smortimer 	mflr %r0;							\
66af2f3395Smortimer 	addis reg, %r2, (__retguard_ ## x)@toc@ha;			\
670c8816d3Sderaadt 	ld reg, ((__retguard_ ## x)@toc@l)(reg);			\
68af2f3395Smortimer 	xor reg, reg, %r0
69af2f3395Smortimer # define RETGUARD_CHECK(x, reg)						\
70af2f3395Smortimer 	mflr %r0;							\
71af2f3395Smortimer 	xor reg, reg, %r0;						\
72af2f3395Smortimer 	addis %r12, %r2, (__retguard_ ## x)@toc@ha;			\
730c8816d3Sderaadt 	ld %r12, ((__retguard_ ## x)@toc@l)(%r12);			\
74af2f3395Smortimer 	tdne reg, %r12
7536507d51Smortimer # define RETGUARD_SAVE(reg, loc)					\
7636507d51Smortimer 	std reg, loc
7736507d51Smortimer # define RETGUARD_LOAD(reg, loc)					\
7836507d51Smortimer 	ld reg, loc
79af2f3395Smortimer # define RETGUARD_SYMBOL(x)						\
80af2f3395Smortimer 	.ifndef __retguard_ ## x;					\
81af2f3395Smortimer 	.hidden __retguard_ ## x;					\
82af2f3395Smortimer 	.type   __retguard_ ## x,@object;				\
83af2f3395Smortimer 	.pushsection .openbsd.randomdata.retguard,"aw",@progbits; 	\
84af2f3395Smortimer 	.weak   __retguard_ ## x;					\
85af2f3395Smortimer 	.p2align 3;							\
86af2f3395Smortimer 	__retguard_ ## x: ;						\
87af2f3395Smortimer 	.quad 0;							\
88af2f3395Smortimer 	.size __retguard_ ## x, 8;					\
89af2f3395Smortimer 	.popsection;							\
90af2f3395Smortimer 	.endif
91af2f3395Smortimer #else
92af2f3395Smortimer # define RETGUARD_SETUP(x, reg)
93af2f3395Smortimer # define RETGUARD_CHECK(x, reg)
9436507d51Smortimer # define RETGUARD_SAVE(reg, loc)
9536507d51Smortimer # define RETGUARD_LOAD(reg, loc)
96af2f3395Smortimer # define RETGUARD_SYMBOL(x)
97af2f3395Smortimer #endif
98af2f3395Smortimer 
99af2f3395Smortimer 
100b54ea104Sdrahn #endif /* !_POWERPC64_ASM_H_ */
101