1| $NetBSD: SRT0.S,v 1.2 2008/05/04 00:18:16 martin Exp $ 2 3| Copyright (c) 1998 The NetBSD Foundation, Inc. 4| All rights reserved. 5| 6| This code is derived from software contributed to The NetBSD Foundation 7| by Gordon W. Ross. 8| 9| Redistribution and use in source and binary forms, with or without 10| modification, are permitted provided that the following conditions 11| are met: 12| 1. Redistributions of source code must retain the above copyright 13| notice, this list of conditions and the following disclaimer. 14| 2. Redistributions in binary form must reproduce the above copyright 15| notice, this list of conditions and the following disclaimer in the 16| documentation and/or other materials provided with the distribution. 17| 18| THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19| ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20| TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21| PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22| BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28| POSSIBILITY OF SUCH DAMAGE. 29 30#include <machine/asm.h> 31 32| SRT0.S - Stand-alone Run-Time startup code, part 0 33 .file "SRT0.S" 34 .data 35 36| Flush the CPU cache using MC68020 values just to be safe. 37| This will cause the MC68030 to run with the data cache 38| disabled, but that is OK for boot programs. 39 .set IC_CLEAR,0x9 40 .set PSL_HIGHIPL,0x2700 41 42 .text 43 44ASENTRY_NOPROFILE(start) 45| Disable interrupts (just in case...) 46 movw #PSL_HIGHIPL,%sr 47 48| Check to see if the code is located correctly. 49| Get current location via PC-relative load, then... 50 lea %pc@(start:w),%a0 | current location (0x4000) 51| ...force a long (not PC-relative) load to a1 and compare. 52 lea start:l,%a1 | desired location (LINKADDR) 53 cmpl %a0,%a1 54 beqs restart 55 56| Relocate the code and data to where they belong. 57 movl #_edata,%d0 | Desired end of program 58 subl %a1,%d0 | Calculate length, round up. 59 lsrl #2,%d0 60Lcp: 61 movl %a0@+,%a1@+ 62 dbra %d0,Lcp 63 64| If we are on a sun2, we don't want to clear the I-cache 65| because we don't have one. We are on a sun2 if the PROM 66| has pointed the vector base register to zero. This is 67| similar to the test that SRT1.c's _start does. 68 movc %vbr, %d0 69 tstl %d0 70 beqs Ljmpreloc 71| Clear the I-cache in case the copied code was cached. 72 movl #IC_CLEAR,%d0 73 movc %d0,%cacr 74Ljmpreloc: 75| Force a long jump to the relocated code (not pc-relative) 76 lea restart:l,%a0 77 jmp %a0@ 78 79| Define the location of our stack (just before relocated text). 80| Leave room the exit jmpbuf at the end of our stack. 81 .set estack,start-60 82 83restart: 84| Now in the relocated code, using the monitor stack. 85| Save this context so we can return with it. 86 pea estack 87 jsr _C_LABEL(setjmp) 88 addqw #4,%sp 89 tstl %d0 90 bne Ldone | here via longjmp 91 92| Switch to our own stack. 93 lea estack,%a0 94 movl %a0,%sp 95 subl %a6,%a6 96 97| Clear out BSS... 98 lea _edata,%a0 99 lea _end,%a1 100Lclrbss: 101 clrl %a0@+ 102 cmpl %a1,%a0 103 ble Lclrbss 104 105| Call the run-time startup C code, which will: 106| initialize, call main, call exit. 107 jsr _C_LABEL(_start) 108 109| Switch back to the monitor stack, then either 110| "chain" to the next program or return. 111ENTRY(exit) 112 pea estack 113 jsr _C_LABEL(longjmp) | to next line 114Ldone: 115 movl _C_LABEL(chain_to_func),%a0 116 movl %a0,%d0 117 beq Lret 118 jmp %a0@ 119Lret: 120 rts 121 122| function to clear the I-cache 123ENTRY(ICIA) 124 tstl _C_LABEL(_is2) 125 bne Lret 126 movl #IC_CLEAR,%d0 127 movc %d0,%cacr 128 rts 129 130| function to get the vector base register 131ENTRY(getvbr) 132 movc %vbr,%a0 133 rts 134 135| Kernel version of setjmp/longjmp (label_t is 16 words) 136 137ENTRY(setjmp) 138 movl %sp@(4),%a0 | savearea pointer 139 moveml #0xFCFC,%a0@ | save d2-d7/a2-a7 140 movl %sp@,%a0@(48) | and return address 141 movl #0,%d0 | return 0 142 rts 143 144ENTRY(longjmp) 145 movl %sp@(4),%a0 | savearea pointer 146 moveml %a0@+,#0xFCFC | restore d2-d7/a2-a7 147 | Note: just changed sp! 148 movl %a0@,%sp@ | and return address 149 movl #1,%d0 | return 1 150 rts 151 152| The end. 153