xref: /netbsd-src/lib/csu/arch/vax/crtbegin.S (revision e38ad7bbb4399e2661b2a8f1a524bab426352d57)
1*e38ad7bbSrin/*	$NetBSD: crtbegin.S,v 1.9 2023/07/28 07:17:30 rin Exp $	*/
2be5ef6fbSmatt/*-
3be5ef6fbSmatt * Copyright (c) 2013 The NetBSD Foundation, Inc.
4be5ef6fbSmatt * All rights reserved.
5be5ef6fbSmatt *
6be5ef6fbSmatt * This code is derived from software contributed to The NetBSD Foundation
7be5ef6fbSmatt * by Matt Thomas of 3am Software Foundry.
8be5ef6fbSmatt *
9be5ef6fbSmatt * Redistribution and use in source and binary forms, with or without
10be5ef6fbSmatt * modification, are permitted provided that the following conditions
11be5ef6fbSmatt * are met:
12be5ef6fbSmatt * 1. Redistributions of source code must retain the above copyright
13be5ef6fbSmatt *    notice, this list of conditions and the following disclaimer.
14be5ef6fbSmatt * 2. Redistributions in binary form must reproduce the above copyright
15be5ef6fbSmatt *    notice, this list of conditions and the following disclaimer in the
16be5ef6fbSmatt *    documentation and/or other materials provided with the distribution.
17be5ef6fbSmatt *
18be5ef6fbSmatt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19be5ef6fbSmatt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20be5ef6fbSmatt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21be5ef6fbSmatt * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22be5ef6fbSmatt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23be5ef6fbSmatt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24be5ef6fbSmatt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25be5ef6fbSmatt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26be5ef6fbSmatt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27be5ef6fbSmatt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28be5ef6fbSmatt * POSSIBILITY OF SUCH DAMAGE.
29be5ef6fbSmatt */
30be5ef6fbSmatt
31be5ef6fbSmatt#include <vax/asm.h>
32be5ef6fbSmatt
33*e38ad7bbSrinRCSID("$NetBSD: crtbegin.S,v 1.9 2023/07/28 07:17:30 rin Exp $")
34be5ef6fbSmatt
35be5ef6fbSmatt	.section	.ctors, "aw", @progbits
36be5ef6fbSmatt	.p2align 2
37be5ef6fbSmatt__CTOR_LIST__:		/* symbol is not used */
3886ffe64bSmatt	.long -1
39be5ef6fbSmatt
40be5ef6fbSmatt	.section	.dtors, "aw", @progbits
41be5ef6fbSmatt	.p2align 2
42be5ef6fbSmatt__DTOR_LIST__:
4386ffe64bSmatt	.long -1
44be5ef6fbSmatt
45be5ef6fbSmatt	.section	.eh_frame, "a", @progbits
46be5ef6fbSmatt	.p2align 2
47be5ef6fbSmatt__EH_FRAME_LIST__:
48be5ef6fbSmatt
49be5ef6fbSmatt	.section	.jcr, "aw", @progbits
50be5ef6fbSmatt	.p2align 2
51be5ef6fbSmatt__JCR_LIST__:
52be5ef6fbSmatt
53be5ef6fbSmatt	.section	.data.rel, "aw", @progbits
54be5ef6fbSmatt	.p2align 2
55be5ef6fbSmatt	.type	__dso_handle, @object
56be5ef6fbSmatt	.size	__dso_handle, 4
57be5ef6fbSmatt	.globl	__dso_handle
58be5ef6fbSmatt	.hidden	__dso_handle
59be5ef6fbSmatt__dso_handle:
60be5ef6fbSmatt#ifdef SHARED
6186ffe64bSmatt	.long	__dso_handle
62be5ef6fbSmatt#else
6386ffe64bSmatt	.long	0
64be5ef6fbSmatt#endif
65be5ef6fbSmatt
66be5ef6fbSmatt	.local	__dwarf_eh_object
6708257f91Smatt	.comm	__dwarf_eh_object,32
68be5ef6fbSmatt	.local	__initialized
69be5ef6fbSmatt	.comm	__initialized,1
70be5ef6fbSmatt	.local	__finished
71be5ef6fbSmatt	.comm	__finished,1
72be5ef6fbSmatt
73be5ef6fbSmatt	.text
74be5ef6fbSmatt/*
75be5ef6fbSmatt * All variables are local to this DSO so we can skip using GOT references
76be5ef6fbSmatt * and instead use PCREL references to access them.  We do this regardless
77be5ef6fbSmatt * of being PIC since it isn't any additional overhead to do so.
78be5ef6fbSmatt *
79be5ef6fbSmatt * We don't setup a TOC since all of ours calls are indirect so it isn't
80be5ef6fbSmatt * needed.
81be5ef6fbSmatt */
82be5ef6fbSmatt
8339f1409eSjoerg	.hidden __do_global_dtors_aux
8439f1409eSjoerg
85*e38ad7bbSrin_ENTRY(__do_global_dtors_aux, R8)
86be5ef6fbSmatt	tstb	__finished			/* done this already? */
87be5ef6fbSmatt	bneq	4f
88be5ef6fbSmatt	movb	$1, __finished			/* mark it as done */
89be5ef6fbSmatt
90be5ef6fbSmatt#ifdef SHARED
91be5ef6fbSmatt	/*
92be5ef6fbSmatt	 * if (__cxa_finalize)
93be5ef6fbSmatt	 *	__cxa_finalize(&__dso_handle);
94be5ef6fbSmatt	 */
95be5ef6fbSmatt	movab	__cxa_finalize, %r0
96cf0e8a20Smatt	beql	1f
97be5ef6fbSmatt	pushal	__dso_handle
98be5ef6fbSmatt	calls	$0, (%r0)
99be5ef6fbSmatt1:
100be5ef6fbSmatt#endif /* SHARED */
101be5ef6fbSmatt
102be5ef6fbSmatt	/*
103be5ef6fbSmatt	 * We use load with postincrement to advance the pointer along.
104be5ef6fbSmatt	 * We know the list ends with 0.  If we load one, we must be done.
105be5ef6fbSmatt	 */
10608257f91Smatt	moval	__DTOR_LIST__+4, %r8	/* skip first entry */
107be5ef6fbSmatt2:	movl	(%r8)+, %r0		/* r0 = *r8++; */
108be5ef6fbSmatt	beql	3f
109be5ef6fbSmatt	calls	$0, (%r0)
110be5ef6fbSmatt	brb	2b
111be5ef6fbSmatt3:
112be5ef6fbSmatt
113be5ef6fbSmatt#ifdef SHARED
114be5ef6fbSmatt	/*
115be5ef6fbSmatt	 * if (__deregister_frame_info)
116be5ef6fbSmatt	 *     __deregister_frame_info(&__EH_FRAME_LIST__[0]);
117be5ef6fbSmatt	 */
118be5ef6fbSmatt	moval	__deregister_frame_info, %r0
1193e1a908fSmatt	beql	4f
120be5ef6fbSmatt	pushal	__EH_FRAME_LIST__
121be5ef6fbSmatt	calls	$0, (%r0)
122be5ef6fbSmatt#endif /* SHARED */
123be5ef6fbSmatt
124be5ef6fbSmatt4:	ret
125dfa59802SmattEND(__do_global_dtors_aux)
126be5ef6fbSmatt
127be5ef6fbSmatt	.weak	__deregister_frame_info
128be5ef6fbSmatt	.weak	__cxa_finalize
129be5ef6fbSmatt
130be5ef6fbSmatt	.weak	__register_frame_info
131be5ef6fbSmatt	.weak	_Jv_RegisterClasses
132be5ef6fbSmatt
13339f1409eSjoerg	.hidden __do_global_ctors_aux
13439f1409eSjoerg
135*e38ad7bbSrin_ENTRY(__do_global_ctors_aux, R8)
136be5ef6fbSmatt	tstb	__initialized
137be5ef6fbSmatt	bneq	4f
138be5ef6fbSmatt	movb	$1, __initialized
139be5ef6fbSmatt
140be5ef6fbSmatt	/*
141be5ef6fbSmatt	 * if (__register_frame_info)
142be5ef6fbSmatt	 *     __register_frame_info(&__EH_FRAME_LIST__[0], &__dwarf_eh_object)
143be5ef6fbSmatt	 */
144be5ef6fbSmatt	movab	__register_frame_info, %r0
145be5ef6fbSmatt	beql	1f
146be5ef6fbSmatt
147be5ef6fbSmatt	pushal	__dwarf_eh_object
148be5ef6fbSmatt	pushal	__EH_FRAME_LIST__
149be5ef6fbSmatt	calls	$0, (%r0)
150be5ef6fbSmatt1:
151be5ef6fbSmatt
152be5ef6fbSmatt	/*
153be5ef6fbSmatt	 * if (_Jv_RegisterClasses && __JCR_LIST__[0])
154be5ef6fbSmatt	 *     _Jv_RegisterClasses(&__JCR_LIST__[0]);
155be5ef6fbSmatt	 */
156be5ef6fbSmatt	movab	_Jv_RegisterClasses, %r0
157be5ef6fbSmatt	beql	2f
158be5ef6fbSmatt
159be5ef6fbSmatt	pushal	__JCR_LIST__
160be5ef6fbSmatt	calls	$0, (%r0)
161be5ef6fbSmatt2:
162be5ef6fbSmatt
163be5ef6fbSmatt	/*
164be5ef6fbSmatt	 * Get the end of the CTOR list.  The first entry is -1 so if we
165be5ef6fbSmatt	 * load a negative address, we know we are done.
166be5ef6fbSmatt	 */
167be5ef6fbSmatt
168be5ef6fbSmatt	moval	__CTOR_LIST_END__, %r8	/* get end of list */
169be5ef6fbSmatt3:	movl	-(%r8), %r0		/* get function pointer with predec */
170be5ef6fbSmatt	blss	4f			/*  negative?  done. */
171be5ef6fbSmatt	calls	$0, (%r0)		/* call it */
172be5ef6fbSmatt	brb	3b			/* get next one */
173be5ef6fbSmatt
174be5ef6fbSmatt4:	ret
175dfa59802SmattEND(__do_global_ctors_aux)
176be5ef6fbSmatt
177be5ef6fbSmatt	.hidden	_C_LABEL(__CTOR_LIST_END__)
178be5ef6fbSmatt
179be5ef6fbSmatt	.section	.init, "ax", @progbits
180be5ef6fbSmatt	calls	$0, __do_global_ctors_aux
181be5ef6fbSmatt	.section	.fini, "ax", @progbits
182be5ef6fbSmatt	calls	$0, __do_global_dtors_aux
183