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