| $NetBSD: SRT0.S,v 1.4 1998/02/05 04:57:05 gwr Exp $ | Copyright (c) 1998 The NetBSD Foundation, Inc. | All rights reserved. | | This code is derived from software contributed to The NetBSD Foundation | by Gordon W. Ross. | | Redistribution and use in source and binary forms, with or without | modification, are permitted provided that the following conditions | are met: | 1. Redistributions of source code must retain the above copyright | notice, this list of conditions and the following disclaimer. | 2. Redistributions in binary form must reproduce the above copyright | notice, this list of conditions and the following disclaimer in the | documentation and/or other materials provided with the distribution. | 3. All advertising materials mentioning features or use of this software | must display the following acknowledgement: | This product includes software developed by the NetBSD | Foundation, Inc. and its contributors. | 4. Neither the name of The NetBSD Foundation nor the names of its | contributors may be used to endorse or promote products derived | from this software without specific prior written permission. | | THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | POSSIBILITY OF SUCH DAMAGE. | SRT0.S - Stand-alone Run-Time startup code, part 0 .file "SRT0.S" .data | Flush the CPU cache using MC68020 values just to be safe. | This will cause the MC68030 to run with the data cache | disabled, but that is OK for boot programs. .set IC_CLEAR,0x9 .set PSL_HIGHIPL,0x2700 .text .globl start .globl _exit .globl ___main .globl _ICIA .globl _getvbr .globl _setjmp .globl _longjmp start: | Disable interrupts (just in case...) movw #PSL_HIGHIPL, sr | Check to see if the code is located correctly. | Get current location via PC-relative load, then... lea pc@(start:w), a0 | current location (0x4000) | ...force a long (not PC-relative) load to a1 and compare. lea start:l, a1 | desired location (LINKADDR) cmpl a0, a1 beqs restart | Relocate the code and data to where they belong. movl #_edata,d0 | Desired end of program subl a1,d0 | Calculate length, round up. lsrl #2,d0 Lcp: movl a0@+, a1@+ dbra d0, Lcp | Clear the I-cache in case the copied code was cached. movl #IC_CLEAR, d0 movc d0, cacr | Force a long jump to the relocated code (not pc-relative) lea restart:l, a0 jmp a0@ | Define the location of our stack (just before relocated text). | Leave room the exit jmpbuf at the end of our stack. .set estack,start-60 restart: | Now in the relocated code, using the monitor stack. | Save this context so we can return with it. pea estack jbsr _setjmp addqw #4,sp tstl d0 bne Ldone | here via longjmp | Switch to our own stack. lea estack, a0 movl a0, sp subl a6, a6 | Clear out BSS... lea _edata, a0 lea _end, a1 Lclrbss: clrl a0@++ cmpl a1,a0 ble Lclrbss | Call the run-time startup C code, which will: | initialize, call main, call exit. jbsr __start | Switch back to the monitor stack, then either | "chain" to the next program or return. _exit: pea estack jbsr _longjmp | to next line Ldone: movl _chain_to_func,a0 tstl a0 beq Lret jmp a0@ Lret: rts | function to clear the I-cache _ICIA: movl #IC_CLEAR, d0 movc d0, cacr rts | function to get the vector base register _getvbr: movc vbr, d0 rts | Kernel version of setjmp/longjmp (label_t is 16 words) _setjmp: movl sp@(4),a0 | savearea pointer moveml #0xFCFC,a0@ | save d2-d7/a2-a7 movl sp@,a0@(48) | and return address moveq #0,d0 | return 0 rts _longjmp: movl sp@(4),a0 | savearea pointer moveml a0@+,#0xFCFC | restore d2-d7/a2-a7 | Note: just changed sp! movl a0@,sp@ | and return address moveq #1,d0 | return 1 rts | The end.