1 /* $OpenBSD: md_init.h,v 1.4 2023/11/18 16:26:16 deraadt Exp $ */ 2 /* 3 * Copyright (c) 2020 Dale Rahn <drahn@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #define MD_SECT_CALL_FUNC(section, func) \ 19 __asm (".section "#section", \"ax\" \n" \ 20 "call " # func "@plt \n" \ 21 " .previous") 22 23 #define MD_SECTION_PROLOGUE(sect, entry_pt) \ 24 __asm ( \ 25 ".section "#sect",\"ax\",%progbits \n" \ 26 " .globl " #entry_pt " \n" \ 27 " .type " #entry_pt ",@function \n" \ 28 " .align 4 \n" \ 29 #entry_pt": \n" \ 30 " addi sp, sp, -16 \n" \ 31 " sd ra,8(sp) \n" \ 32 " sd s0,0(sp) \n" \ 33 " addi s0, sp, 16 \n" \ 34 " /* fall thru */ \n" \ 35 " .previous") 36 37 38 #define MD_SECTION_EPILOGUE(sect) \ 39 __asm ( \ 40 ".section "#sect",\"ax\",%progbits \n" \ 41 " ld ra, 8(sp) \n" \ 42 " ld s0, 0(sp) \n" \ 43 " addi sp, sp, 16 \n" \ 44 " jr ra \n" \ 45 " .previous") 46 47 48 #define MD_CRT0_START \ 49 __asm( \ 50 ".text \n" \ 51 " .align 0 \n" \ 52 " .globl _start \n" \ 53 " .globl __start \n" \ 54 " .type _start, @function \n" \ 55 " .type __start, @function \n" \ 56 "_start: \n" \ 57 "__start: \n" \ 58 "/* Get argc/argv/envp from stack */ \n" \ 59 " ld a0, (sp) \n" \ 60 " addi a1, sp, 0x8 \n" \ 61 " slli t0, a0, 0x3 \n" \ 62 " add a2, a1, t0 \n" \ 63 " addi a2, a2, 0x8 \n" \ 64 " \n" \ 65 " addi sp, sp, -16 \n" \ 66 " li t0, 0 \n" \ 67 " sd t0,(sp) \n" \ 68 " \n" \ 69 " j ___start \n" \ 70 " .size _start, .-_start \n" \ 71 " .size __start, .-__start \n" \ 72 ".previous"); 73 74 #define MD_RCRT0_START \ 75 char **environ, *__progname; \ 76 __asm( \ 77 ".text \n" \ 78 " .align 0 \n" \ 79 " .globl _start \n" \ 80 " .globl __start \n" \ 81 " .type _start, @function \n" \ 82 " .type __start, @function \n" \ 83 "_start: \n" \ 84 "__start: \n" \ 85 " mv a0, sp \n" \ 86 " mv fp, sp \n" \ 87 " \n" \ 88 " addi sp, sp, -(8+8+(16*8)) \n" \ 89 " addi a1, sp, 4 \n" \ 90 " \n" \ 91 "1: auipc a2, %pcrel_hi(_DYNAMIC) \n" \ 92 " addi a2, a2, %pcrel_lo(1b) \n" \ 93 " \n" \ 94 " call _dl_boot_bind \n" \ 95 " \n" \ 96 " mv sp, fp \n" \ 97 " li fp, 0x0 \n" \ 98 " \n" \ 99 " li a3, 0x0 /* cleanup */ \n" \ 100 "/* Get argc/argv/envp from stack */ \n" \ 101 " ld a0, (sp) \n" \ 102 " addi a1, sp, 0x0008 \n" \ 103 " slli a2, a0, 0x3 \n" \ 104 " add a2, a1, a2 \n" \ 105 " addi a2, a2, 0x0008 \n" \ 106 " \n" \ 107 " j ___start \n" \ 108 " .size _start, .-_start \n" \ 109 " .size __start, .-__start \n" \ 110 "_csu_abort: \n" \ 111 " unimp \n" \ 112 ".previous"); 113