xref: /openbsd-src/lib/csu/riscv64/md_init.h (revision 1e43641e997f17b3e752e4bc940b17070ff580a3)
1 /* $OpenBSD: md_init.h,v 1.4 2023/11/18 16:26:16 deraadt Exp $ */
2 /*
3  * Copyright (c) 2020 Dale Rahn <drahn@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #define MD_SECT_CALL_FUNC(section, func) 				\
19 	__asm (".section "#section", \"ax\"				\n" \
20 	"call " # func "@plt 						\n" \
21 	"	.previous")
22 
23 #define MD_SECTION_PROLOGUE(sect, entry_pt)				\
24 	__asm (								\
25 	".section "#sect",\"ax\",%progbits				\n" \
26 	"	.globl " #entry_pt "					\n" \
27 	"	.type " #entry_pt ",@function				\n" \
28 	"	.align 4						\n" \
29 	#entry_pt":							\n" \
30 	"	addi	sp, sp, -16					\n" \
31 	"	sd	ra,8(sp)					\n" \
32 	"	sd	s0,0(sp)					\n" \
33 	"	addi	s0, sp, 16					\n" \
34 	"	/* fall thru */						\n" \
35 	"	.previous")
36 
37 
38 #define MD_SECTION_EPILOGUE(sect)					\
39 	__asm (								\
40 	".section "#sect",\"ax\",%progbits				\n" \
41 	"	ld	ra, 8(sp)					\n" \
42 	"	ld	s0, 0(sp)					\n" \
43 	"	addi	sp, sp, 16					\n" \
44 	"	jr	ra						\n" \
45 	"	.previous")
46 
47 
48 #define	MD_CRT0_START							\
49 	__asm(								\
50 	".text								\n" \
51 	"	.align	0						\n" \
52 	"	.globl	_start						\n" \
53 	"	.globl	__start						\n" \
54 	"	.type	_start, @function				\n" \
55 	"	.type	__start, @function				\n" \
56 	"_start:							\n" \
57 	"__start:							\n" \
58 	"/* Get argc/argv/envp from stack */				\n" \
59 	"	ld	a0, (sp)					\n" \
60 	"	addi	a1, sp, 0x8					\n" \
61 	"	slli	t0, a0, 0x3					\n" \
62 	"	add	a2, a1, t0					\n" \
63 	"	addi	a2, a2, 0x8					\n" \
64 	"								\n" \
65 	"	addi	sp, sp, -16					\n" \
66 	"	li	t0, 0						\n" \
67 	"	sd	t0,(sp)						\n" \
68 	"								\n" \
69 	"	j	___start					\n" \
70 	"	.size	_start, .-_start				\n" \
71 	"	.size	__start, .-__start				\n" \
72 	".previous");
73 
74 #define	MD_RCRT0_START							\
75 	char **environ, *__progname;					\
76 	__asm(								\
77 	".text								\n" \
78 	"	.align	0						\n" \
79 	"	.globl	_start						\n" \
80 	"	.globl	__start						\n" \
81 	"	.type	_start, @function				\n" \
82 	"	.type	__start, @function				\n" \
83 	"_start:							\n" \
84 	"__start:							\n" \
85 	"	mv	a0, sp						\n" \
86 	"	mv	fp, sp						\n" \
87 	"								\n" \
88 	"	addi	sp, sp, -(8+8+(16*8))				\n" \
89 	"	addi	a1, sp, 4					\n" \
90 	"								\n" \
91 	"1:	auipc	a2, %pcrel_hi(_DYNAMIC)				\n" \
92 	"	addi	a2, a2, %pcrel_lo(1b)				\n" \
93 	"								\n" \
94 	"	call	_dl_boot_bind					\n" \
95 	"								\n" \
96 	"	mv	sp, fp						\n" \
97 	"	li	fp, 0x0						\n" \
98 	"								\n" \
99 	"	li	a3, 0x0	/* cleanup */				\n" \
100 	"/* Get argc/argv/envp from stack */				\n" \
101 	"	ld	a0, (sp)					\n" \
102 	"	addi	a1, sp, 0x0008					\n" \
103 	"	slli	a2, a0, 0x3					\n" \
104 	"	add	a2, a1, a2					\n" \
105 	"	addi	a2, a2, 0x0008					\n" \
106 	"								\n" \
107 	"	j	___start					\n" \
108 	"	.size	_start, .-_start				\n" \
109 	"	.size	__start, .-__start				\n" \
110 	"_csu_abort:							\n" \
111 	"	unimp							\n" \
112 	".previous");
113