xref: /openbsd-src/lib/csu/arm/md_init.h (revision 792c719e1c08aad3979f2a64a2af253118ed058f)
1*792c719eSphessler /* $OpenBSD: md_init.h,v 1.19 2024/08/17 09:48:31 phessler Exp $ */
2bd6cd6b0Sdrahn 
3bd6cd6b0Sdrahn /*-
4bd6cd6b0Sdrahn  * Copyright (c) 2001 Ross Harvey
5bd6cd6b0Sdrahn  * All rights reserved.
6bd6cd6b0Sdrahn  *
7bd6cd6b0Sdrahn  * Redistribution and use in source and binary forms, with or without
8bd6cd6b0Sdrahn  * modification, are permitted provided that the following conditions
9bd6cd6b0Sdrahn  * are met:
10bd6cd6b0Sdrahn  * 1. Redistributions of source code must retain the above copyright
11bd6cd6b0Sdrahn  *    notice, this list of conditions and the following disclaimer.
12bd6cd6b0Sdrahn  * 2. Redistributions in binary form must reproduce the above copyright
13bd6cd6b0Sdrahn  *    notice, this list of conditions and the following disclaimer in the
14bd6cd6b0Sdrahn  *    documentation and/or other materials provided with the distribution.
15bd6cd6b0Sdrahn  * 3. All advertising materials mentioning features or use of this software
16bd6cd6b0Sdrahn  *    must display the following acknowledgement:
17bd6cd6b0Sdrahn  *      This product includes software developed by the NetBSD
18bd6cd6b0Sdrahn  *      Foundation, Inc. and its contributors.
19bd6cd6b0Sdrahn  * 4. Neither the name of The NetBSD Foundation nor the names of its
20bd6cd6b0Sdrahn  *    contributors may be used to endorse or promote products derived
21bd6cd6b0Sdrahn  *    from this software without specific prior written permission.
22bd6cd6b0Sdrahn  *
23bd6cd6b0Sdrahn  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24bd6cd6b0Sdrahn  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25bd6cd6b0Sdrahn  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26bd6cd6b0Sdrahn  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27bd6cd6b0Sdrahn  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28bd6cd6b0Sdrahn  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29bd6cd6b0Sdrahn  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30bd6cd6b0Sdrahn  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31bd6cd6b0Sdrahn  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32bd6cd6b0Sdrahn  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33bd6cd6b0Sdrahn  * POSSIBILITY OF SUCH DAMAGE.
34bd6cd6b0Sdrahn  */
35bd6cd6b0Sdrahn 
36b3fe29f4Sguenther /*
37b3fe29f4Sguenther  * arm overrides these because it uses %progbits instead of @progbits
38b3fe29f4Sguenther  */
39b3fe29f4Sguenther #define MD_DATA_SECTION_FLAGS_SYMBOL(section, flags, type, symbol)	\
40b3fe29f4Sguenther 	extern __dso_hidden type symbol[];				\
41b3fe29f4Sguenther 	__asm("	.section "section",\""flags"\",%progbits		\n" \
42b3fe29f4Sguenther 	"	.balign 4						\n" \
43b3fe29f4Sguenther 	#symbol":							\n" \
44b3fe29f4Sguenther 	"	.previous")
45b3fe29f4Sguenther #define MD_DATA_SECTION_SYMBOL_VALUE(section, type, symbol, value)	\
46b3fe29f4Sguenther 	extern __dso_hidden type symbol[];				\
47b3fe29f4Sguenther 	__asm("	.section "section",\"aw\",%progbits			\n" \
48b3fe29f4Sguenther 	"	.balign 4						\n" \
49b3fe29f4Sguenther 	#symbol":							\n" \
50b3fe29f4Sguenther 	"	.int "#value"						\n" \
51b3fe29f4Sguenther 	"	.previous")
52b3fe29f4Sguenther #define MD_DATA_SECTION_FLAGS_VALUE(section, flags, value)		\
53b3fe29f4Sguenther 	__asm("	.section "section",\""flags"\",%progbits		\n" \
54b3fe29f4Sguenther 	"	.balign 4						\n" \
55b3fe29f4Sguenther 	"	.int "#value"						\n" \
56b3fe29f4Sguenther 	"	.previous")
57b3fe29f4Sguenther 
588409f467Sdrahn #define MD_SECT_CALL_FUNC(section, func) \
598409f467Sdrahn 	__asm (".section "#section", \"ax\"		\n" \
6008c612f1Skettenis 	"	movw	r0, #:lower16:" #func "- 1f - 8	\n" \
6108c612f1Skettenis 	"	movt	r0, #:upper16:" #func "- 1f - 8	\n" \
6208c612f1Skettenis 	"1:	add	r0, r0, pc			\n" \
6308c612f1Skettenis 	"	blx	r0				\n" \
648409f467Sdrahn 	"	.previous")
65bd6cd6b0Sdrahn 
66bd6cd6b0Sdrahn #define MD_SECTION_PROLOGUE(sect, entry_pt)	\
67bd6cd6b0Sdrahn 	__asm (					\
68bd6cd6b0Sdrahn 	".section "#sect",\"ax\",%progbits	\n" \
69bd6cd6b0Sdrahn 	"	.globl " #entry_pt "		\n" \
70bd6cd6b0Sdrahn 	"	.type " #entry_pt ",%function	\n" \
71bd6cd6b0Sdrahn 	"	.align 4			\n" \
72bd6cd6b0Sdrahn 	#entry_pt":				\n" \
73306c523aSkettenis 	"	push	{r4, lr}		\n" \
74bd6cd6b0Sdrahn 	"	/* fall thru */			\n" \
75bd6cd6b0Sdrahn 	"	.previous")
76bd6cd6b0Sdrahn 
77bd6cd6b0Sdrahn 
78bd6cd6b0Sdrahn #define MD_SECTION_EPILOGUE(sect)		\
79bd6cd6b0Sdrahn 	__asm (					\
80bd6cd6b0Sdrahn 	".section "#sect",\"ax\",%progbits	\n" \
81306c523aSkettenis 	"	pop	{r4, pc}		\n" \
82bd6cd6b0Sdrahn 	"	.previous")
83453b49cdSguenther 
84453b49cdSguenther 
858b713dc6Sguenther /*
868b713dc6Sguenther  * The definitions of environ and __progname prevent the creation
878b713dc6Sguenther  * of COPY relocations for WEAK symbols.
888b713dc6Sguenther  */
89453b49cdSguenther #define	MD_CRT0_START				\
90453b49cdSguenther 	__asm(					\
91453b49cdSguenther 	".text					\n" \
92453b49cdSguenther 	"	.align	0			\n" \
93453b49cdSguenther 	"	.globl	_start			\n" \
94453b49cdSguenther 	"	.globl	__start			\n" \
95453b49cdSguenther 	"_start:				\n" \
96453b49cdSguenther 	"__start:				\n" \
97453b49cdSguenther 	"	mov	r3, r0	/* cleanup */	\n" \
98453b49cdSguenther 	"/* Get argc/argv/envp from stack */	\n" \
99dfd75ee2Skettenis 	"	ldr	r0, [sp, #0]		\n" \
100dfd75ee2Skettenis 	"	add	r1, sp, #4		\n" \
101453b49cdSguenther 	"	add	r2, r1, r0, lsl #2	\n" \
102dfd75ee2Skettenis 	"	add	r2, r2, #4		\n" \
103453b49cdSguenther 	"					\n" \
104453b49cdSguenther 	"/*					\n" \
105453b49cdSguenther 	" * Ensure the stack is properly	\n" \
106453b49cdSguenther 	" * aligned before calling C code.	\n" \
107453b49cdSguenther 	" */					\n" \
108453b49cdSguenther 	"	bic	sp, sp, #7" /*__STRING(STACKALIGNBYTES)*/ "	\n" \
109453b49cdSguenther 	"	b	___start		\n" \
110453b49cdSguenther 	".previous");
111dfd75ee2Skettenis 
112dfd75ee2Skettenis #define	MD_RCRT0_START				\
113dfd75ee2Skettenis 	char **environ, *__progname;		\
114dfd75ee2Skettenis 	__asm(					\
115dfd75ee2Skettenis 	".text					\n" \
116dfd75ee2Skettenis 	"	.align	0			\n" \
117dfd75ee2Skettenis 	"	.globl	_start			\n" \
118dfd75ee2Skettenis 	"	.globl	__start			\n" \
119dfd75ee2Skettenis 	"_start:				\n" \
120dfd75ee2Skettenis 	"__start:				\n" \
121dfd75ee2Skettenis 	"	mov	fp, sp			\n" \
122dfd75ee2Skettenis 	"	mov	r0, fp			\n" \
123dfd75ee2Skettenis 	"					\n" \
124dfd75ee2Skettenis 	"	sub	sp, sp, #4+4+(16*4)	\n" \
125dfd75ee2Skettenis 	"	add	r1, sp, #4		\n" \
126dfd75ee2Skettenis 	"					\n" \
127dfd75ee2Skettenis 	"	ldr	r8, .L_GOT		\n" \
128dfd75ee2Skettenis 	"1:	add	r8, pc, r8		\n" \
129dfd75ee2Skettenis 	"	ldr	r2, .L__DYNAMIC		\n" \
130dfd75ee2Skettenis 	"	add	r2, r2, r8		\n" \
131dfd75ee2Skettenis 	"					\n" \
132dfd75ee2Skettenis 	"	bl	_dl_boot_bind		\n" \
133dfd75ee2Skettenis 	"					\n" \
134dfd75ee2Skettenis 	"	mov	sp, fp			\n" \
135dfd75ee2Skettenis 	"	mov	fp, #0			\n" \
136dfd75ee2Skettenis 	"					\n" \
137dfd75ee2Skettenis 	"	mov	r3, #0	/* cleanup */	\n" \
138dfd75ee2Skettenis 	"/* Get argc/argv/envp from stack */	\n" \
139dfd75ee2Skettenis 	"	ldr	r0, [sp, #0]		\n" \
140dfd75ee2Skettenis 	"	add	r1, sp, #4		\n" \
141dfd75ee2Skettenis 	"	add	r2, r1, r0, lsl #2	\n" \
142dfd75ee2Skettenis 	"	add	r2, r2, #4		\n" \
143dfd75ee2Skettenis 	"					\n" \
144dfd75ee2Skettenis 	"/*					\n" \
145dfd75ee2Skettenis 	" * Ensure the stack is properly	\n" \
146dfd75ee2Skettenis 	" * aligned before calling C code.	\n" \
147dfd75ee2Skettenis 	" */					\n" \
148dfd75ee2Skettenis 	"	bic	sp, sp, #7" /*__STRING(STACKALIGNBYTES)*/ "	\n" \
149dfd75ee2Skettenis 	"	b	___start		\n" \
150dfd75ee2Skettenis 	"					\n" \
151dfd75ee2Skettenis 	".L_GOT:				\n" \
152dfd75ee2Skettenis 	"	.long	_GLOBAL_OFFSET_TABLE_-(1b+8)	\n" \
153dfd75ee2Skettenis 	".L__DYNAMIC:				\n" \
154dfd75ee2Skettenis 	"	.long	_DYNAMIC(GOTOFF)	\n" \
155dfd75ee2Skettenis 	"					\n" \
1561e43641eSderaadt 	"_csu_abort:				\n" \
1575bbf8832Snaddy 	"	udf	#0			\n" \
158dfd75ee2Skettenis 	".previous");
159