complete revise of sun3 SRT0 so that it works with bugcrt by me.
This commit is contained in:
parent
316f45753f
commit
86a71fe9e7
|
@ -1,4 +1,4 @@
|
|||
| $NetBSD: SRT0.S,v 1.1.1.1 1995/07/25 23:12:21 chuck Exp $
|
||||
| $NetBSD: SRT0.S,v 1.2 1996/05/17 20:53:49 chuck Exp $
|
||||
|
||||
| Copyright (c) 1995 Gordon W. Ross
|
||||
| All rights reserved.
|
||||
|
@ -28,59 +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
|
||||
__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,d0 | Desired end of program
|
||||
subl a1,d0 | Calculate length, round up.
|
||||
lsrl #2,d0
|
||||
| Relocate the code and data
|
||||
movl #_edata,d2 | Desired end of program
|
||||
subl a4,d2 | Calculate length, round up.
|
||||
lsrl #2,d2
|
||||
Lcp:
|
||||
movl a0@+, a1@+
|
||||
dbra d0, 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
|
||||
|
||||
movl a6@(8), __cmd_buf | get cmd_line from sboot
|
||||
|
||||
| Set up stack (just before relocated text)
|
||||
lea __estack:l, a0
|
||||
movl a0, sp
|
||||
subl a6, a6
|
||||
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:
|
||||
jsr 0x4000
|
||||
|
||||
| If abort returns, fall into reset.
|
||||
.globl _reset
|
||||
_reset:
|
||||
reset
|
||||
jmp _reset
|
||||
| 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.
|
||||
|
|
Loading…
Reference in New Issue