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