1 /* $OpenBSD: md_init.h,v 1.4 2020/10/15 16:30:23 deraadt 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 #define MD_CRT0_START \ 53 __asm( \ 54 " .text \n" \ 55 " .section \".text\" \n" \ 56 " .align 2 \n" \ 57 " .globl _start \n" \ 58 " .type _start, @function \n" \ 59 " .globl __start \n" \ 60 " .type __start, @function \n" \ 61 "_start: \n" \ 62 "__start: \n" \ 63 " bl 1f \n" \ 64 "1: \n" \ 65 " mflr %r30 \n" \ 66 " addis %r2, %r30, .TOC.-1b@ha \n" \ 67 " addi %r2, %r2, .TOC.-1b@l \n" \ 68 " # put cleanup in r6 instead of r7 \n" \ 69 " mr %r6, %r7 \n" \ 70 " li %r7, 0 \n" \ 71 " stdu %r7, -64(%r1) \n" \ 72 " b ___start \n" \ 73 ) 74 75 #define MD_RCRT0_START \ 76 __asm( \ 77 " .text \n" \ 78 " .section \".text\" \n" \ 79 " .align 2 \n" \ 80 " .globl _start \n" \ 81 " .type _start, @function \n" \ 82 " .globl __start \n" \ 83 " .type __start, @function \n" \ 84 "_start: \n" \ 85 "__start: \n" \ 86 " bl 1f \n" \ 87 "1: \n" \ 88 " mflr %r31 \n" \ 89 " addis %r2, %r31, .TOC.-1b@ha \n" \ 90 " addi %r2, %r2, .TOC.-1b@l \n" \ 91 " stdu 1, (-48 -((9+3)*8))(%r1) # allocate dl_data \n" \ 92 " \n" \ 93 " # Preserve program parameters during setup \n" \ 94 " mr %r15, %r3 # argc \n" \ 95 " mr %r16, %r4 # argv \n" \ 96 " mr %r17, %r5 # envp \n" \ 97 " \n" \ 98 " addis %r14, %r2, _DYNAMIC@toc@ha \n" \ 99 " addi %r14, %r14, _DYNAMIC@toc@l \n" \ 100 " \n" \ 101 " subi %r3, %r16, 8 # pointer to argc on stack. \n" \ 102 " addi %r4, %r1, 48 # dl_data \n" \ 103 " mr %r5, %r14 # dynamicp \n" \ 104 " \n" \ 105 " bl _dl_boot_bind \n" \ 106 " \n" \ 107 " # restore program arguments \n" \ 108 " mr %r3, %r15 \n" \ 109 " mr %r4, %r16 \n" \ 110 " mr %r5, %r17 \n" \ 111 " li %r6, 0 \n" \ 112 " bl ___start \n" \ 113 " \n" \ 114 " .globl _dl_exit \n" \ 115 " .type _dl_exit, @function \n" \ 116 "_dl_exit: \n" \ 117 " li %r0, " STR(SYS_exit) " \n" \ 118 " sc \n" \ 119 " .long 0 # illegal \n" \ 120 ) 121