xref: /openbsd/lib/csu/powerpc/md_init.h (revision 09467b48)
1 /* $OpenBSD: md_init.h,v 1.9 2017/08/11 20:13:31 guenther Exp $ */
2 
3 /*-
4  * Copyright (c) 2001 Ross Harvey
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by the NetBSD
18  *      Foundation, Inc. and its contributors.
19  * 4. Neither the name of The NetBSD Foundation nor the names of its
20  *    contributors may be used to endorse or promote products derived
21  *    from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #define MD_SECT_CALL_FUNC(section, func) \
37 	__asm (".section "#section", \"ax\"\n"	\
38 	"	bl " #func "\n"		\
39 	"	.previous")
40 
41 #define MD_SECTION_PROLOGUE(sect, entry_pt)	\
42 	__asm (					\
43 	".section "#sect",\"ax\",@progbits	\n" \
44 	"	.globl " #entry_pt "		\n" \
45 	"	.type " #entry_pt ",@function	\n" \
46 	"	.align 4			\n" \
47 	#entry_pt":				\n" \
48 	"	stwu	%r1,-16(%r1)		\n" \
49 	"	mflr	%r0			\n" \
50 	"	stw	%r0,12(%r1)		\n" \
51 	"	/* fall thru */			\n" \
52 	"	.previous")
53 
54 
55 #define MD_SECTION_EPILOGUE(sect)		\
56 	__asm (					\
57 	".section "#sect",\"ax\",@progbits	\n" \
58 	"	lwz	%r0,12(%r1)		\n" \
59 	"	mtlr	%r0			\n" \
60 	"	addi	%r1,%r1,16		\n" \
61 	"	blr				\n" \
62 	"	.previous")
63 
64 #include <sys/syscall.h>	/* for SYS_mprotect */
65 
66 #define STR(x) __STRING(x)
67 
68 #define	MD_CRT0_START							\
69 __asm(									\
70 "	.text								\n" \
71 "	.section	\".text\"					\n" \
72 "	.align 2							\n" \
73 "	.globl	_start							\n" \
74 "	.type	_start, @function					\n" \
75 "	.globl	__start							\n" \
76 "	.type	__start, @function					\n" \
77 "_start:								\n" \
78 "__start:								\n" \
79 "	# put cleanup in r6 instead of r7				\n" \
80 "	mr %r6, %r7							\n" \
81 "	b ___start							\n" \
82 )
83 
84 #define	MD_RCRT0_START							\
85 __asm(									\
86 "	.text								\n" \
87 "	.section	\".text\"					\n" \
88 "	.align 2							\n" \
89 "	.globl	_start							\n" \
90 "	.type	_start, @function					\n" \
91 "	.globl	__start							\n" \
92 "	.type	__start, @function					\n" \
93 "_start:								\n" \
94 "__start:								\n" \
95 "	mr	%r19, %r1		# save stack in r19		\n" \
96 "	stwu	1, (-16 -((9+3)*4))(%r1) # allocate dl_data		\n" \
97 "									\n" \
98 "	# move argument registers to saved registers for startup flush	\n" \
99 "	mr %r20, %r3			# argc				\n" \
100 "	mr %r21, %r4			# argv				\n" \
101 "	mr %r22, %r5			# envp				\n" \
102 "	mflr	%r27	/* save off old link register */		\n" \
103 "	stw	%r27, 4(%r19)		# save in normal location	\n" \
104 "									\n" \
105 "	bcl	20, 31, 1f						\n" \
106 "1:	mflr	%r18							\n" \
107 "	addis	%r18, %r18, _DYNAMIC-1b@ha				\n" \
108 "	addi	%r18, %r18, _DYNAMIC-1b@l				\n" \
109 "									\n" \
110 "	subi	%r3, %r21, 4	# Get stack pointer (arg0 for _dl_boot). \n" \
111 "	addi	%r4, %r1, 8	# dl_data				\n" \
112 "	mr	%r5, %r18	# dynamicp				\n" \
113 "									\n" \
114 "	bl	_dl_boot_bind@local					\n" \
115 "									\n" \
116 "	mtlr %r27							\n" \
117 "	# move argument registers back from saved registers		\n" \
118 "	mr %r3, %r20							\n" \
119 "	mr %r4, %r21							\n" \
120 "	mr %r5, %r22							\n" \
121 "	li %r6, 0							\n" \
122 "	b ___start							\n" \
123 "									\n" \
124 "	.text								\n" \
125 "	.align 2							\n" \
126 "	.globl	_dl_exit						\n" \
127 "	.type	_dl_exit, @function					\n" \
128 "_dl_exit:								\n" \
129 "	li	%r0, " STR(SYS_exit) "					\n" \
130 "	sc								\n" \
131 "	blr								\n" \
132 )
133