1 /* $OpenBSD: md_init.h,v 1.10 2018/11/22 21:37:29 guenther Exp $ */ 2 /*- 3 * Copyright (c) 2001 Ross Harvey 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by the NetBSD 17 * Foundation, Inc. and its contributors. 18 * 4. Neither the name of The NetBSD Foundation nor the names of its 19 * contributors may be used to endorse or promote products derived 20 * from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 * POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #define MD_SECT_CALL_FUNC(section, func) \ 36 __asm (".section "#section", \"ax\"\n" \ 37 " jsr $26," #func " \n" \ 38 " ldgp $29,0($26) \n" \ 39 " .previous") 40 41 #define MD_SECTION_PROLOGUE(sect, entry_pt) \ 42 __asm ( \ 43 ".section "#sect",\"ax\",@progbits \n" \ 44 " .globl " #entry_pt " \n" \ 45 " .type " #entry_pt ",@function \n" \ 46 #entry_pt": \n" \ 47 " ldgp $29, 0($27) \n" \ 48 " lda $30, -16($30) \n" \ 49 " stq $26, 0($30) \n" \ 50 " stq $15, 8($30) \n" \ 51 " .align 5 \n" \ 52 " /* fall thru */ \n" \ 53 " .previous") 54 55 56 #define MD_SECTION_EPILOGUE(sect) \ 57 __asm ( \ 58 ".section "#sect",\"ax\",@progbits \n" \ 59 " ldq $15, 8($30) \n" \ 60 " ldq $26, 0($30) \n" \ 61 " lda $30, 16($30) \n" \ 62 " ret \n" \ 63 " .previous") 64 65 66 #define MD_CRT0_START \ 67 __asm ( \ 68 " .globl __start \n" \ 69 " .type __start@function \n" \ 70 "__start = ___start") 71 72 #define MD_RCRT0_START \ 73 __asm ( \ 74 " .globl __start \n" \ 75 " .type __start@function \n" \ 76 "__start: \n" \ 77 " .set noreorder \n" \ 78 " br $27, L1 \n" \ 79 "L1: \n" \ 80 " ldgp $gp, 0($27) \n" \ 81 " mov $16, $9 \n" \ 82 " br $11, L2 \n" \ 83 "L2: ldiq $12, L2 \n" \ 84 " subq $11, $12, $10 \n" \ 85 " lda $6, _DYNAMIC \n" \ 86 " addq $10, $6, $15 \n" \ 87 " lda $sp, -80($sp) \n" \ 88 " mov $9, $16 \n" \ 89 " lda $11, 0($sp) \n" \ 90 " mov $11, $17 \n" \ 91 " mov $15, $18 \n" \ 92 " lda $27, _dl_boot_bind \n" \ 93 " addq $10, $27, $27 \n" \ 94 " bsr $26, _dl_boot_bind \n" \ 95 " mov $9, $16 \n" \ 96 " mov 0, $17 \n" \ 97 " jsr $26, ___start \n" \ 98 ".globl _dl_exit \n" \ 99 ".type _dl_exit@function \n" \ 100 "_dl_exit: \n" \ 101 " lda $0, 1 \n" \ 102 " callsys \n" \ 103 " ret") 104 105 #define MD_START_ARGS char **sp, void (*cleanup)(void) 106 #define MD_START_SETUP \ 107 char **argv, **envp; \ 108 long argc; \ 109 \ 110 argc = *(long *)sp; \ 111 argv = sp + 1; \ 112 envp = sp + 2 + argc; /* 2: argc + NULL ending argv */ 113