1| $NetBSD: SRT0.S,v 1.3 2000/11/30 22:26:27 scw 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 36#include <m68k/asm.h> 37 38 .file "SRT0.S" 39 .text 40GLOBAL(_estack) 41 42xstart: 43| first, relocate code to correct place without touching critical regs 44| (args are in: d0, d1, d4, a0, a1, a2, a3, a4, a5, a6) 45| [a3 and a4 only when netbooting] 46 movl %a3, %d3 | SAVE a3 in d3 47 movl %a4, %d5 | SAVE a4 in d5 48 lea %pc@(xstart:w), %a3 | a3 = current addr (could be anywhere) 49 lea xstart:l, %a4 | a4 = desired location (LINKADDR) 50 cmpl %a3, %a4 | already there? 51 beqs restart | short-circuit out 52 53 | Relocate the code and data 54 movl #_C_LABEL(edata),%d2 | Desired end of program 55 subl %a4,%d2 | Calculate length, round up. 56 lsrl #2,%d2 57Lcp: 58 movl %a3@+, %a4@+ 59 dbra %d2, Lcp 60 61| Force a long jump to the relocated code (not pc-relative) 62 lea restart:l, %a3 63 jmp %a3@ 64 65restart: 66| now in the relocated code 67 68| Set up stack (just before relocated text) 69 lea _C_LABEL(_estack):l, %a3 70 movl %a3, %sp 71 72| now that we have relocated, call the bugcrt (note we skip over the special 73| bug header which has a PC and SP in it) 74 movl %d3, %a3 | RESTORE a3 75 movl %d5, %a4 | RESTORE a4 76 jmp _start 77 78| The end. 79