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