1| $NetBSD: SRT0.S,v 1.2 1996/05/17 20:53:49 chuck Exp $ 2 3| Copyright (c) 1995 Gordon W. Ross 4| All rights reserved. 5| 6| Redistribution and use in source and binary forms, with or without 7| modification, are permitted provided that the following conditions 8| are met: 9| 1. Redistributions of source code must retain the above copyright 10| notice, this list of conditions and the following disclaimer. 11| 2. Redistributions in binary form must reproduce the above copyright 12| notice, this list of conditions and the following disclaimer in the 13| documentation and/or other materials provided with the distribution. 14| 3. The name of the author may not be used to endorse or promote products 15| derived from this software without specific prior written permission. 16| 4. All advertising materials mentioning features or use of this software 17| must display the following acknowledgement: 18| This product includes software developed by Gordon Ross 19| 20| THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21| IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23| IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25| NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29| THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31| this is a pre-startup wrapper for bugcrt which relocates the 32| code to the correct place before exec()ing. 33 34| SRT0.S - Stand-alone Run-Time startup code, part 0 35 .file "SRT0.S" 36 .text 37 .globl __estack 38__estack: 39 .globl xstart 40xstart: 41| first, relocate code to correct place without touching critical regs 42| (args are in: d0, d1, d4, a0, a1, a2, a3, a4, a5, a6) 43| [a3 and a4 only when netbooting] 44 movl a3, d3 | SAVE a3 in d3 45 movl a4, d5 | SAVE a4 in d5 46 lea pc@(xstart:w), a3 | a3 = current addr (could be anywhere) 47 lea xstart:l, a4 | a4 = desired location (LINKADDR) 48 cmpl a3, a4 | already there? 49 beqs restart | short-circuit out 50 51 | Relocate the code and data 52 movl #_edata,d2 | Desired end of program 53 subl a4,d2 | Calculate length, round up. 54 lsrl #2,d2 55Lcp: 56 movl a3@+, a4@+ 57 dbra d2, Lcp 58 59| Force a long jump to the relocated code (not pc-relative) 60 lea restart:l, a3 61 jmp a3@ 62 63restart: 64| now in the relocated code 65 66| Set up stack (just before relocated text) 67 lea __estack:l, a3 68 movl a3, sp 69 70| now that we have relocated, call the bugcrt (note we skip over the special 71| bug header which has a PC and SP in it) 72 movl d3, a3 | RESTORE a3 73 movl d5, a4 | RESTORE a4 74 jmp _start 75 76| The end. 77