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