diff options
Diffstat (limited to 'sys/arch/mvme68k/stand/libsa/SRT0.S')
-rw-r--r-- | sys/arch/mvme68k/stand/libsa/SRT0.S | 122 |
1 files changed, 34 insertions, 88 deletions
diff --git a/sys/arch/mvme68k/stand/libsa/SRT0.S b/sys/arch/mvme68k/stand/libsa/SRT0.S index a938029049d..20136ffaa72 100644 --- a/sys/arch/mvme68k/stand/libsa/SRT0.S +++ b/sys/arch/mvme68k/stand/libsa/SRT0.S @@ -1,34 +1,5 @@ -| $OpenBSD: SRT0.S,v 1.5 1996/04/28 10:48:54 deraadt Exp $ +| $NetBSD: SRT0.S,v 1.2 1995/08/12 18:38:55 gwr Exp $ -| Copyright (c) 1995 Theo de Raadt -| -| 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 under OpenBSD by -| Theo de Raadt for Willowglen Singapore. -| 4. The name of the author may not be used to endorse or promote products -| derived from this software without specific prior written permission. -| -| THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -| | Copyright (c) 1995 Gordon W. Ross | All rights reserved. | @@ -57,74 +28,49 @@ | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +| this is a pre-startup wrapper for bugcrt which relocates the +| code to the correct place before exec()ing. + | SRT0.S - Stand-alone Run-Time startup code, part 0 - .file "SRT0.S" - .text - .globl __estack + .file "SRT0.S" + .text + .globl __estack __estack: - .globl start -start: -| Check to see if the code is located correctly. -| This SHOULD do a PC-relative load into a0, but... -| lea start, a0 | current location (0x4000) -| XXX - GAS version 1.93 gets the above lea wrong! - .word 0x41fa - .word 0xfffe -| Now force a long (not PC-relative) load to a1 and compare. - lea start:l, a1 | desired location (LINKADDR) - cmpl a0, a1 - beqs restart + .globl xstart +xstart: +| first, relocate code to correct place without touching critical regs +| (args are in: d0, d1, d4, a0, a1, a2, a3, a4, a5, a6) +| [a3 and a4 only when netbooting] + movl a3, d3 | SAVE a3 in d3 + movl a4, d5 | SAVE a4 in d5 + lea pc@(xstart:w), a3 | a3 = current addr (could be anywhere) + lea xstart:l, a4 | a4 = desired location (LINKADDR) + cmpl a3, a4 | already there? + beqs restart | short-circuit out -| Relocate the code and data to where they belong. - movl #_edata,d2 | Desired end of program - subl a1,d2 | Calculate length, round up. - lsrl #2,d2 -Lcp: movl a0@+, a1@+ - dbra d2, Lcp + | Relocate the code and data + movl #_edata,d2 | Desired end of program + subl a4,d2 | Calculate length, round up. + lsrl #2,d2 +Lcp: + movl a3@+, a4@+ + dbra d2, Lcp | Force a long jump to the relocated code (not pc-relative) - lea restart:l, a0 - jmp a0@ + lea restart:l, a3 + jmp a3@ restart: | now in the relocated code | Set up stack (just before relocated text) - lea __estack:l, a0 - movl a0, sp - subl a6, a6 - - movl d0, _devlun - movl d1, _ctrlun - movl a3, _oparg - movl a4, _opargend + lea __estack:l, a3 + movl a3, sp -| Call the run-time startup C code, which will: -| initialize, call main, call exit - jsr __start:l - -| If _start returns, fall into abort. - .globl _abort -_abort: - trap #0 - -| If abort returns, fall into reset. - .globl _reset -_reset: - reset - jmp _reset - -| function to get the vector base register - .globl _getvbr -_getvbr: - movc vbr, d0 - rts +| now that we have relocated, call the bugcrt (note we skip over the special +| bug header which has a PC and SP in it) + movl d3, a3 | RESTORE a3 + movl d5, a4 | RESTORE a4 + jmp _start | The end. - - .data - .globl _devlun, _ctrlun, _oparg, _opargend -_devlun: .long 0 -_ctrlun: .long 0 -_oparg: .long 0 -_opargend: .long 0 |