1/* $NetBSD: startit.s,v 1.8 2001/03/02 16:43:26 mhitch Exp $ */ 2 3/* 4 * Copyright (c) 1996 Ignatios Souvatzis 5 * Copyright (c) 1994 Michael L. Hitch 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by Michael L. Hitch. 19 * 4. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 * 34 * From: $NetBSD: startit.s,v 1.8 2001/03/02 16:43:26 mhitch Exp $ 35 */ 36#include <machine/asm.h> 37 38 .set ABSEXECBASE,4 39 40 .text 41 42ENTRY_NOPROFILE(startit) 43#if TESTONAMIGA 44 movew #0x999,0xdff180 | gray 45#endif 46#if TESTONDRACO 47 moveb #0,0x200003c8 48 moveb #31,0x200003c9 49 moveb #31,0x200003c9 50 moveb #31,0x200003c9 51#endif 52 movel %sp,%a3 53 movel 4:w,%a6 54 lea %pc@(start_super:w),%a5 55 jmp %a6@(-0x1e) | supervisor-call 56 57start_super: 58#if TESTONAMIGA 59 movew #0x900,0xdff180 | dark red 60#endif 61 movew #0x2700,%sr 62 63 | the BSD kernel wants values into the following registers: 64 | %a0: fastmem-start 65 | %d0: fastmem-size 66 | %d1: chipmem-size 67 | %d3: Amiga specific flags 68 | %d4: E clock frequency 69 | %d5: AttnFlags (cpuid) 70 | %d6: boot partition offset 71 | %d7: boothowto 72 | %a4: esym location 73 | %a2: Inhibit sync flags 74 | All other registers zeroed for possible future requirements. 75 76 lea %pc@(_C_LABEL(startit):w),%sp | make sure we have a good stack *** 77 78 movel %a3@(4),%a1 | loaded kernel 79 movel %a3@(8),%d2 | length of loaded kernel 80| movel %a3@(12),%sp | entry point in stack pointer 81 movel %a3@(12),%a6 | entry point *** 82 movel %a3@(16),%a0 | fastmem-start 83 movel %a3@(20),%d0 | fastmem-size 84 movel %a3@(24),%d1 | chipmem-size 85 movel %a3@(28),%d7 | boothowto 86 movel %a3@(32),%a4 | esym 87 movel %a3@(36),%d5 | cpuid 88 movel %a3@(40),%d4 | E clock frequency 89 movel %a3@(44),%d3 | Amiga flags 90 movel %a3@(48),%a2 | Inhibit sync flags 91 movel %a3@(52),%d6 | boot partition offset 92 93 cmpb #0x7D,%a3@(36) | is it DraCo? 94 movel %a3@(56),%a3 | Load to fastmem flag 95 jeq nott | yes, switch off MMU later 96 97 | no, it is an Amiga: 98 99#if TESTONAMIGA 100 movew #0xf00,0xdff180 |red 101#endif 102#if TESTONDRACO 103 moveb #0,0x200003c8 104 moveb #63,0x200003c9 105 moveb #0,0x200003c9 106 moveb #0,0x200003c9 107#endif 108 109 movew #(1<<9),0xdff096 | disable DMA on Amigas. 110 111| ------ mmu off start ----- 112 113 btst #3,%d5 | AFB_68040,SysBase->AttnFlags 114 jeq not040 115 116| Turn off 68040/060 MMU 117 118 subl %a5,%a5 119 .word 0x4e7b,0xd003 | movec %a5,tc 120 .word 0x4e7b,0xd806 | movec %a5,urp 121 .word 0x4e7b,0xd807 | movec %a5,srp 122 .word 0x4e7b,0xd004 | movec %a5,itt0 123 .word 0x4e7b,0xd005 | movec %a5,itt1 124 .word 0x4e7b,0xd006 | movec %a5,dtt0 125 .word 0x4e7b,0xd007 | movec %a5,dtt1 126 jra nott 127 128not040: 129 lea %pc@(zero:w),%a5 130 pmove %a5@,%tc | Turn off MMU 131 lea %pc@(nullrp:w),%a5 132 pmove %a5@,%crp | Turn off MMU some more 133 pmove %a5@,%srp | Really, really, turn off MMU 134 135| Turn off 68030 TT registers 136 137 btst #2,%d5 | AFB_68030,SysBase->AttnFlags 138 jeq nott | Skip TT registers if not 68030 139 lea %pc@(zero:w),%a5 140 .word 0xf015,0x0800 | pmove %a5@,tt0 (gas only knows about 68851 ops..) 141 .word 0xf015,0x0c00 | pmove %a5@,tt1 (gas only knows about 68851 ops..) 142 143nott: 144| ---- mmu off end ---- 145#if TESTONAMIGA 146 movew #0xf60,0xdff180 | orange 147#endif 148#if TESTONDRACO 149 moveb #0,0x200003c8 150 moveb #63,0x200003c9 151 moveb #24,0x200003c9 152 moveb #0,0x200003c9 153#endif 154 155 156| ---- copy kernel start ---- 157 158| removed Z flag 159| tstl %a3 | Can we load to fastmem? 160| jeq L0 | No, leave destination at 0 161 movl %a0,%a3 | Move to start of fastmem chunk 162 addl %a0,%a6 | relocate kernel entry point 163 164 addl #3,%d2 165 andl #0xfffffffc,%d2 | round up. 166 167 | determine if the kernel need be copied upwards or downwards 168 169 cmpl %a1,%a3 | %a3-a1 170 bcs above | source is above 171 172 movl %a0,%sp 173 addl %d0,%sp | move the stack to the end of segment 174 175 | copy from below upwards requires copying from end to start. 176 177 addl %d2,%a3 | one long word past 178 addl %d2,%a1 | one long word past 179 180 subl #4,%sp | alloc space 181 movl %a1,%sp@- | save source 182 movl %a3,%sp@- | save destination 183 184 | copy copier to end of segment 185 186 movl %sp,%a3 187 subl #256,%a3 | end of segment save our stack 188 189 lea %pc@(_C_LABEL(startit_end):w),%a1 190 movl %a0,%sp@- | save segment start 191 lea %pc@(below:w),%a0 192 193L0: movw %a1@-,%a3@- 194 cmpl %a0,%a1 195 bne L0 196 movl %sp@,%a0 | restore segment start 197 movl %a3,%sp@ | address of relocated below 198 addl #(ckend - below),%a3 199 movl %a3,%sp@(12) | address of ckend for later 200| ---- switch off cache ---- 201 bra Lchoff | and to relocated below 202 203 204below: movl %sp@+,%a3 | recover destination 205 movl %sp@+,%a1 | recover source 206 207L1: movl %a1@-,%a3@- | copy kernel 208 subl #4,%d2 209 bne L1 210 211| ---- switch off cache ---- 212 bra Lchoff | and to relocated ckend 213 214above: movl %a1@+,%a3@+ 215 subl #4,%d2 216 bne above 217 218 lea %pc@(ckend:w),%a1 219 movl %a3,%sp@- 220 pea %pc@(_C_LABEL(startit_end):w) 221L2: 222 movl %a1@+,%a3@+ 223 cmpl %sp@,%a1 224 bcs L2 225 addql #4,%sp 226 227#if TESTONAMIGA 228 movew #0xFF0,0xdff180 | yellow 229#endif 230#if TESTONDRACO 231 moveb #0,0x200003c8 232 moveb #63,0x200003c9 233 moveb #63,0x200003c9 234 moveb #0,0x200003c9 235#endif 236 237| ---- switch off cache ---- 238Lchoff: btst #3,%d5 239 jeq L3c 240 .word 0xf4f8 241L3c: movl %d2,%sp@- | save %d2 242 movql #0,%d2 | switch off cache to ensure we use 243 movec %d2,%cacr | valid kernel data 244 movl %sp@+,%d2 | restore %d2 245 rts 246 247| ---- copy kernel end ---- 248 249ckend: 250#if TESTONAMIGA 251 movew #0x0ff,0xdff180 | petrol 252#endif 253#if TESTONDRACO 254 moveb #0,0x200003c8 255 moveb #0,0x200003c9 256 moveb #63,0x200003c9 257 moveb #63,0x200003c9 258#endif 259 260 movl %d5,%d2 261 roll #8,%d2 262 cmpb #0x7D,%d2 263 jne noDraCo 264 265| DraCo: switch off MMU now: 266 267 subl %a5,%a5 268 .word 0x4e7b,0xd003 | movec %a5,tc 269 .word 0x4e7b,0xd806 | movec %a5,urp 270 .word 0x4e7b,0xd807 | movec %a5,srp 271 .word 0x4e7b,0xd004 | movec %a5,itt0 272 .word 0x4e7b,0xd005 | movec %a5,itt1 273 .word 0x4e7b,0xd006 | movec %a5,dtt0 274 .word 0x4e7b,0xd007 | movec %a5,dtt1 275 276noDraCo: 277 moveq #0,%d2 | zero out unused registers 278 movel %d2,%a1 | (might make future compatibility 279 movel %d2,%a3 | would have known contents) 280 movel %d2,%a5 281 movel %a6,%sp | entry point into stack pointer 282 movel %d2,%a6 283 284#if TESTONAMIGA 285 movew #0x0F0,0xdff180 | green 286#endif 287#if TESTONDRACO 288 moveb #0,0x200003c8 289 moveb #0,0x200003c9 290 moveb #63,0x200003c9 291 moveb #0,0x200003c9 292#endif 293 294 jmp %sp@ | jump to kernel entry point 295 296 297| A do-nothing MMU root pointer (includes the following long as well) 298 299nullrp: .long 0x7fff0001 300zero: .long 0 301 302ENTRY_NOPROFILE(startit_end) 303