1*1e43641eSderaadt /* $OpenBSD: md_init.h,v 1.11 2023/11/18 16:26:16 deraadt Exp $ */ 2cf252584Smiod /* $NetBSD: dot_init.h,v 1.3 2005/12/24 22:02:10 perry Exp $ */ 3cf252584Smiod 4cf252584Smiod /*- 5cf252584Smiod * Copyright (c) 2001 Ross Harvey 6cf252584Smiod * All rights reserved. 7cf252584Smiod * 8cf252584Smiod * Redistribution and use in source and binary forms, with or without 9cf252584Smiod * modification, are permitted provided that the following conditions 10cf252584Smiod * are met: 11cf252584Smiod * 1. Redistributions of source code must retain the above copyright 12cf252584Smiod * notice, this list of conditions and the following disclaimer. 13cf252584Smiod * 2. Redistributions in binary form must reproduce the above copyright 14cf252584Smiod * notice, this list of conditions and the following disclaimer in the 15cf252584Smiod * documentation and/or other materials provided with the distribution. 16cf252584Smiod * 3. All advertising materials mentioning features or use of this software 17cf252584Smiod * must display the following acknowledgement: 18cf252584Smiod * This product includes software developed by the NetBSD 19cf252584Smiod * Foundation, Inc. and its contributors. 20cf252584Smiod * 4. Neither the name of The NetBSD Foundation nor the names of its 21cf252584Smiod * contributors may be used to endorse or promote products derived 22cf252584Smiod * from this software without specific prior written permission. 23cf252584Smiod * 24cf252584Smiod * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 25cf252584Smiod * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 26cf252584Smiod * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 27cf252584Smiod * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 28cf252584Smiod * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29cf252584Smiod * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30cf252584Smiod * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31cf252584Smiod * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32cf252584Smiod * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33cf252584Smiod * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34cf252584Smiod * POSSIBILITY OF SUCH DAMAGE. 35cf252584Smiod */ 36cf252584Smiod 37cf252584Smiod #define MD_SECTION_PROLOGUE(sect, entry_pt) \ 38cf252584Smiod __asm ( \ 39cf252584Smiod ".section "#sect",\"ax\",@progbits \n" \ 40cf252584Smiod " .globl " #entry_pt " \n" \ 41cf252584Smiod " .type " #entry_pt ",@function \n" \ 42cf252584Smiod #entry_pt": \n" \ 43cf252584Smiod " sts.l pr, @-r15 \n" \ 44cf252584Smiod " .align 2 \n" \ 45cf252584Smiod " /* fall thru */ \n" \ 46cf252584Smiod ".previous") 47cf252584Smiod 48cf252584Smiod #define MD_SECTION_EPILOGUE(sect) \ 49cf252584Smiod __asm ( \ 50cf252584Smiod ".section "#sect",\"ax\",@progbits \n" \ 51cf252584Smiod " lds.l @r15+, pr \n" \ 52cf252584Smiod " rts \n" \ 53cf252584Smiod " nop \n" \ 54cf252584Smiod ".previous") 55cf252584Smiod 56cf252584Smiod /* 57cf252584Smiod * We need to put the function pointer in our own constant 58cf252584Smiod * pool (otherwise it might be too far away to reference). 59cf252584Smiod */ 60cf252584Smiod #define MD_SECT_CALL_FUNC(section, func) \ 61cf252584Smiod __asm(".section " #section "\n" \ 62cf252584Smiod " mov.l 1f, r1 \n" \ 63cf252584Smiod " mova 2f, r0 \n" \ 64cf252584Smiod " braf r1 \n" \ 65cf252584Smiod " lds r0, pr \n" \ 66cf252584Smiod "0: .p2align 2 \n" \ 67cf252584Smiod "1: .long " #func " - 0b \n" \ 68cf252584Smiod "2: .previous"); 69453b49cdSguenther 70453b49cdSguenther 71453b49cdSguenther #if defined(__SH4__) && !defined(__SH4_NOFPU__) 72453b49cdSguenther #include <machine/fpu.h> 73453b49cdSguenther 749fccad30Smiod #define MD_FPU_START \ 75453b49cdSguenther void __set_fpscr(unsigned int); \ 769fccad30Smiod unsigned int __fpscr_values[2]; 77453b49cdSguenther 78453b49cdSguenther #define MD_START_SETUP \ 79453b49cdSguenther __set_fpscr(0); \ 80453b49cdSguenther __fpscr_values[0] |= FPSCR_DN; \ 81453b49cdSguenther __fpscr_values[1] |= FPSCR_DN; \ 82b5aa3b33Sguenther __asm volatile ("lds %0, fpscr" \ 83453b49cdSguenther : : "r" (__fpscr_values[1])); 849fccad30Smiod #else 859fccad30Smiod #define MD_FPU_START 86453b49cdSguenther #endif /* defined(__SH4__) && !defined(__SH4_NOFPU__) */ 87453b49cdSguenther 889fccad30Smiod #define MD_CRT0_START \ 899fccad30Smiod MD_FPU_START \ 909fccad30Smiod __asm (".globl __start; __start = ___start") 919fccad30Smiod 929fccad30Smiod #define MD_RCRT0_START \ 939fccad30Smiod MD_FPU_START \ 949fccad30Smiod __asm ( \ 959fccad30Smiod ".text \n" \ 969fccad30Smiod " .align 2 \n" \ 979fccad30Smiod " .globl __start \n" \ 989fccad30Smiod " .type __start,@function \n" \ 999fccad30Smiod "__start: \n" \ 1009fccad30Smiod " mov r15, r12 \n" \ 1019fccad30Smiod " mov r15, r4 \n" \ 1029fccad30Smiod " add #-72, r15 \n" \ 1039fccad30Smiod " mov r15, r5 \n" \ 1049fccad30Smiod " bsr 1f \n" \ 1059fccad30Smiod " nop \n" \ 1069fccad30Smiod "1: \n" \ 1079fccad30Smiod ".L_offbase: \n" \ 1089fccad30Smiod " sts pr, r0 \n" \ 1099fccad30Smiod " mov.l .L_dynamic, r6 \n" \ 1109fccad30Smiod " add r0, r6 \n" \ 1119fccad30Smiod " mov.l .L_boot_bind, r0 \n" \ 1129fccad30Smiod " bsrf r0 \n" \ 1139fccad30Smiod " nop \n" \ 1149fccad30Smiod ".L_call_boot_bind: \n" \ 1159fccad30Smiod " mov r12, r15 \n" \ 1169fccad30Smiod " mov.l @r15, r4 /* argc */ \n" \ 1179fccad30Smiod " mov r15, r5 \n" \ 1189fccad30Smiod " add #4, r5 /* argv */ \n" \ 1199fccad30Smiod " mov r4, r6 \n" \ 1209fccad30Smiod " add #1, r6 \n" \ 1219fccad30Smiod " shll2 r6 \n" \ 1229fccad30Smiod " add r5, r6 /* envp */ \n" \ 1239fccad30Smiod " bra ___start \n" \ 1249fccad30Smiod " mov #0, r7 /* cleanup */ \n" \ 1259fccad30Smiod " .align 2 \n" \ 1269fccad30Smiod ".L_boot_bind: \n" \ 1279fccad30Smiod " .long _dl_boot_bind - .L_call_boot_bind \n" \ 1289fccad30Smiod ".L_datasize: \n" \ 1299fccad30Smiod " .long 4 + 4 + (16 * 4) \n" \ 1309fccad30Smiod ".L_dynamic: \n" \ 1319fccad30Smiod " .long _DYNAMIC - .L_offbase \n" \ 1329fccad30Smiod \ 1339fccad30Smiod " .align 2 \n" \ 134*1e43641eSderaadt " .globl _csu_abort \n" \ 135*1e43641eSderaadt " .type _csu_abort,@function \n" \ 136*1e43641eSderaadt "_csu_abort: \n" \ 1372bc3a8c0Sderaadt " sleep /* illegal */ \n" \ 1389fccad30Smiod ".previous") 139