xref: /openbsd/lib/csu/powerpc64/md_init.h (revision 73471bf0)
1 /* $OpenBSD: md_init.h,v 1.4 2020/10/15 16:30:23 deraadt Exp $ */
2 
3 /*
4  * Copyright (c) 2020 Dale Rahn <drahn@openbsd.org>
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 MD_SECT_CALL_FUNC(section, func)				\
20 	__asm (".section "#section", \"ax\"				\n" \
21 	"	bl " #func "						\n" \
22 	"	.previous")
23 
24 #define MD_SECTION_PROLOGUE(sect, entry_pt)				\
25 	__asm (								\
26 	".section "#sect",\"ax\",@progbits				\n" \
27 	"	.globl " #entry_pt "					\n" \
28 	"	.type " #entry_pt ",@function				\n" \
29 	"	.align 4						\n" \
30 	#entry_pt":							\n" \
31 	".L_"sect"_gep:							\n" \
32 	"	addis %r2, %r12, .TOC.-.L_"sect"_gep@ha			\n" \
33 	"	addi %r2, %r2, .TOC.-.L_"sect"_gep@l			\n" \
34 	".L_"sect"_lep:							\n" \
35 	"	.localentry " #entry_pt", .L_"sect"_lep-.L_"sect"_gep;	\n" \
36 	"	mflr	%r0						\n" \
37 	"	std	%r0,16(%r1)					\n" \
38 	"	stdu	%r1,-64(%r1)					\n" \
39 	"	/* fall thru */						\n" \
40 	"	.previous")
41 
42 
43 #define MD_SECTION_EPILOGUE(sect)					\
44 	__asm (								\
45 	".section "#sect",\"ax\",@progbits				\n" \
46 	"	addi	%r1,%r1,64					\n" \
47 	"	ld	%r0,16(%r1)					\n" \
48 	"	mtlr	%r0						\n" \
49 	"	blr							\n" \
50 	"	.previous")
51 
52 #define	MD_CRT0_START							\
53 __asm(									\
54 "	.text								\n" \
55 "	.section	\".text\"					\n" \
56 "	.align 2							\n" \
57 "	.globl	_start							\n" \
58 "	.type	_start, @function					\n" \
59 "	.globl	__start							\n" \
60 "	.type	__start, @function					\n" \
61 "_start:								\n" \
62 "__start:								\n" \
63 "	bl	1f							\n" \
64 "1:									\n" \
65 "	mflr	%r30							\n" \
66 "	addis	%r2, %r30, .TOC.-1b@ha					\n" \
67 "	addi	%r2, %r2, .TOC.-1b@l					\n" \
68 "	# put cleanup in r6 instead of r7				\n" \
69 "	mr	%r6, %r7						\n" \
70 "	li	%r7, 0							\n" \
71 "	stdu	%r7, -64(%r1)						\n" \
72 "	b ___start							\n" \
73 )
74 
75 #define	MD_RCRT0_START							\
76 __asm(									\
77 "	.text								\n" \
78 "	.section	\".text\"					\n" \
79 "	.align 2							\n" \
80 "	.globl	_start							\n" \
81 "	.type	_start, @function					\n" \
82 "	.globl	__start							\n" \
83 "	.type	__start, @function					\n" \
84 "_start:								\n" \
85 "__start:								\n" \
86 "	bl	1f							\n" \
87 "1:									\n" \
88 "	mflr	%r31							\n" \
89 "	addis	%r2, %r31, .TOC.-1b@ha					\n" \
90 "	addi	%r2, %r2, .TOC.-1b@l					\n" \
91 "	stdu	1, (-48 -((9+3)*8))(%r1) # allocate dl_data		\n" \
92 "									\n" \
93 "	# Preserve program parameters during setup 			\n" \
94 "	mr %r15, %r3			# argc				\n" \
95 "	mr %r16, %r4			# argv				\n" \
96 "	mr %r17, %r5			# envp				\n" \
97 "									\n" \
98 "	addis	%r14, %r2, _DYNAMIC@toc@ha				\n" \
99 "	addi	%r14, %r14, _DYNAMIC@toc@l				\n" \
100 "									\n" \
101 "	subi	%r3, %r16, 8	# pointer to argc on stack.		\n" \
102 "	addi	%r4, %r1, 48	# dl_data				\n" \
103 "	mr	%r5, %r14	# dynamicp				\n" \
104 "									\n" \
105 "      bl      _dl_boot_bind						\n" \
106 "									\n" \
107 "	# restore program arguments 					\n" \
108 "	mr %r3, %r15							\n" \
109 "	mr %r4, %r16							\n" \
110 "	mr %r5, %r17							\n" \
111 "	li %r6, 0							\n" \
112 "	bl ___start							\n" \
113 "									\n" \
114 "	.globl	_dl_exit						\n" \
115 "	.type	_dl_exit, @function					\n" \
116 "_dl_exit:								\n" \
117 "	li	%r0, " STR(SYS_exit) "					\n" \
118 "	sc								\n" \
119 "	.long 0 # illegal						\n" \
120 )
121