SRT0.S revision 1.1 1 | $NetBSD: SRT0.S,v 1.1 2001/06/14 12:57:13 fredette Exp $
2
3 | Copyright (c) 1998 The NetBSD Foundation, Inc.
4 | All rights reserved.
5 |
6 | This code is derived from software contributed to The NetBSD Foundation
7 | by Gordon W. Ross.
8 |
9 | Redistribution and use in source and binary forms, with or without
10 | modification, are permitted provided that the following conditions
11 | are met:
12 | 1. Redistributions of source code must retain the above copyright
13 | notice, this list of conditions and the following disclaimer.
14 | 2. Redistributions in binary form must reproduce the above copyright
15 | notice, this list of conditions and the following disclaimer in the
16 | documentation and/or other materials provided with the distribution.
17 | 3. All advertising materials mentioning features or use of this software
18 | must display the following acknowledgement:
19 | This product includes software developed by the NetBSD
20 | Foundation, Inc. and its contributors.
21 | 4. Neither the name of The NetBSD Foundation nor the names of its
22 | contributors may be used to endorse or promote products derived
23 | from this software without specific prior written permission.
24 |
25 | THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26 | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 | POSSIBILITY OF SUCH DAMAGE.
36
37 #include <machine/asm.h>
38
39 | SRT0.S - Stand-alone Run-Time startup code, part 0
40 .file "SRT0.S"
41 .data
42
43 | Flush the CPU cache using MC68020 values just to be safe.
44 | This will cause the MC68030 to run with the data cache
45 | disabled, but that is OK for boot programs.
46 .set IC_CLEAR,0x9
47 .set PSL_HIGHIPL,0x2700
48
49 .text
50
51 ASENTRY_NOPROFILE(start)
52 | Disable interrupts (just in case...)
53 movw #PSL_HIGHIPL,%sr
54
55 | Check to see if the code is located correctly.
56 | Get current location via PC-relative load, then...
57 lea %pc@(start:w),%a0 | current location (0x4000)
58 | ...force a long (not PC-relative) load to a1 and compare.
59 lea start:l,%a1 | desired location (LINKADDR)
60 cmpl %a0,%a1
61 beqs restart
62
63 | Relocate the code and data to where they belong.
64 movl #_edata,%d0 | Desired end of program
65 subl %a1,%d0 | Calculate length, round up.
66 lsrl #2,%d0
67 Lcp:
68 movl %a0@+,%a1@+
69 dbra %d0,Lcp
70
71 | If we are on a sun2, we don't want to clear the I-cache
72 | because we don't have one. We are on a sun2 if the PROM
73 | has pointed the vector base register to zero. This is
74 | similar to the test that SRT1.c's _start does.
75 movc %vbr, %d0
76 tstl %d0
77 beqs Ljmpreloc
78 | Clear the I-cache in case the copied code was cached.
79 movl #IC_CLEAR,%d0
80 movc %d0,%cacr
81 Ljmpreloc:
82 | Force a long jump to the relocated code (not pc-relative)
83 lea restart:l,%a0
84 jmp %a0@
85
86 | Define the location of our stack (just before relocated text).
87 | Leave room the exit jmpbuf at the end of our stack.
88 .set estack,start-60
89
90 restart:
91 | Now in the relocated code, using the monitor stack.
92 | Save this context so we can return with it.
93 pea estack
94 jsr _C_LABEL(setjmp)
95 addqw #4,%sp
96 tstl %d0
97 bne Ldone | here via longjmp
98
99 | Switch to our own stack.
100 lea estack,%a0
101 movl %a0,%sp
102 subl %a6,%a6
103
104 | Clear out BSS...
105 lea _edata,%a0
106 lea _end,%a1
107 Lclrbss:
108 clrl %a0@+
109 cmpl %a1,%a0
110 ble Lclrbss
111
112 | Call the run-time startup C code, which will:
113 | initialize, call main, call exit.
114 jsr _C_LABEL(_start)
115
116 | Switch back to the monitor stack, then either
117 | "chain" to the next program or return.
118 ENTRY(exit)
119 pea estack
120 jsr _C_LABEL(longjmp) | to next line
121 Ldone:
122 movl _C_LABEL(chain_to_func),%a0
123 movl %a0,%d0
124 beq Lret
125 jmp %a0@
126 Lret:
127 rts
128
129 | function to clear the I-cache
130 ENTRY(ICIA)
131 tstl _C_LABEL(_is2)
132 bne Lret
133 movl #IC_CLEAR,%d0
134 movc %d0,%cacr
135 rts
136
137 | function to get the vector base register
138 ENTRY(getvbr)
139 movc %vbr,%a0
140 rts
141
142 | Kernel version of setjmp/longjmp (label_t is 16 words)
143
144 ENTRY(setjmp)
145 movl %sp@(4),%a0 | savearea pointer
146 moveml #0xFCFC,%a0@ | save d2-d7/a2-a7
147 movl %sp@,%a0@(48) | and return address
148 movl #0,%d0 | return 0
149 rts
150
151 ENTRY(longjmp)
152 movl %sp@(4),%a0 | savearea pointer
153 moveml %a0@+,#0xFCFC | restore d2-d7/a2-a7
154 | Note: just changed sp!
155 movl %a0@,%sp@ | and return address
156 movl #1,%d0 | return 1
157 rts
158
159 | The end.
160