1 /* $OpenBSD: md_init.h,v 1.2 2020/06/26 19:57:02 drahn Exp $ */ 2 3 /* 4 * Copyright (c) 2020 Dale Rahn <drahn@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #define MD_SECT_CALL_FUNC(section, func) \ 20 __asm (".section "#section", \"ax\" \n" \ 21 " bl " #func " \n" \ 22 " .previous") 23 24 #define MD_SECTION_PROLOGUE(sect, entry_pt) \ 25 __asm ( \ 26 ".section "#sect",\"ax\",@progbits \n" \ 27 " .globl " #entry_pt " \n" \ 28 " .type " #entry_pt ",@function \n" \ 29 " .align 4 \n" \ 30 #entry_pt": \n" \ 31 ".L_"sect"_gep: \n" \ 32 " addis %r2, %r12, .TOC.-.L_"sect"_gep@ha \n" \ 33 " addi %r2, %r2, .TOC.-.L_"sect"_gep@l \n" \ 34 ".L_"sect"_lep: \n" \ 35 " .localentry " #entry_pt", .L_"sect"_lep-.L_"sect"_gep; \n" \ 36 " mflr %r0 \n" \ 37 " std %r0,16(%r1) \n" \ 38 " stdu %r1,-64(%r1) \n" \ 39 " /* fall thru */ \n" \ 40 " .previous") 41 42 43 #define MD_SECTION_EPILOGUE(sect) \ 44 __asm ( \ 45 ".section "#sect",\"ax\",@progbits \n" \ 46 " addi %r1,%r1,64 \n" \ 47 " ld %r0,16(%r1) \n" \ 48 " mtlr %r0 \n" \ 49 " blr \n" \ 50 " .previous") 51 52 #include <sys/syscall.h> /* for SYS_mprotect */ 53 54 #define STR(x) __STRING(x) 55 56 #define MD_CRT0_START \ 57 __asm( \ 58 " .text \n" \ 59 " .section \".text\" \n" \ 60 " .align 2 \n" \ 61 " .globl _start \n" \ 62 " .type _start, @function \n" \ 63 " .globl __start \n" \ 64 " .type __start, @function \n" \ 65 "_start: \n" \ 66 "__start: \n" \ 67 " bl 1f \n" \ 68 "1: \n" \ 69 " mflr %r30 \n" \ 70 " addis %r2, %r30, .TOC.-1b@ha \n" \ 71 " addi %r2, %r2, .TOC.-1b@l \n" \ 72 " # put cleanup in r6 instead of r7 \n" \ 73 " mr %r6, %r7 \n" \ 74 " li %r7, 0 \n" \ 75 " stdu %r7, -64(%r1) \n" \ 76 " b ___start \n" \ 77 ) 78 79 #define MD_RCRT0_START \ 80 __asm( \ 81 " .text \n" \ 82 " .section \".text\" \n" \ 83 " .align 2 \n" \ 84 " .globl _start \n" \ 85 " .type _start, @function \n" \ 86 " .globl __start \n" \ 87 " .type __start, @function \n" \ 88 "_start: \n" \ 89 "__start: \n" \ 90 " bl 1f \n" \ 91 "1: \n" \ 92 " mflr %r31 \n" \ 93 " addis %r2, %r31, .TOC.-1b@ha \n" \ 94 " addi %r2, %r2, .TOC.-1b@l \n" \ 95 " stdu 1, (-48 -((9+3)*8))(%r1) # allocate dl_data \n" \ 96 " \n" \ 97 " # Preserve program parameters during setup \n" \ 98 " mr %r15, %r3 # argc \n" \ 99 " mr %r16, %r4 # argv \n" \ 100 " mr %r17, %r5 # envp \n" \ 101 " \n" \ 102 " addis %r14, %r2, _DYNAMIC@toc@ha \n" \ 103 " addi %r14, %r14, _DYNAMIC@toc@l \n" \ 104 " \n" \ 105 " subi %r3, %r16, 8 # pointer to argc on stack. \n" \ 106 " addi %r4, %r1, 48 # dl_data \n" \ 107 " mr %r5, %r14 # dynamicp \n" \ 108 " \n" \ 109 " bl _dl_boot_bind \n" \ 110 " \n" \ 111 " # restore program arguments \n" \ 112 " mr %r3, %r15 \n" \ 113 " mr %r4, %r16 \n" \ 114 " mr %r5, %r17 \n" \ 115 " li %r6, 0 \n" \ 116 " bl ___start \n" \ 117 " \n" \ 118 " .globl _dl_exit \n" \ 119 " .type _dl_exit, @function \n" \ 120 "_dl_exit: \n" \ 121 " li %r0, " STR(SYS_exit) " \n" \ 122 " sc \n" \ 123 " blr \n" \ 124 ) 125