1 1.17 rmind /* $NetBSD: srt0.S,v 1.17 2011/02/08 20:20:14 rmind Exp $ */ 2 1.1 thorpej 3 1.1 thorpej /* 4 1.17 rmind * Copyright (c) 1988 University of Utah. 5 1.1 thorpej * Copyright (c) 1982, 1990, 1993 6 1.1 thorpej * The Regents of the University of California. All rights reserved. 7 1.12 agc * 8 1.12 agc * This code is derived from software contributed to Berkeley by 9 1.12 agc * the Systems Programming Group of the University of Utah Computer 10 1.12 agc * Science Department. 11 1.12 agc * 12 1.12 agc * Redistribution and use in source and binary forms, with or without 13 1.12 agc * modification, are permitted provided that the following conditions 14 1.12 agc * are met: 15 1.12 agc * 1. Redistributions of source code must retain the above copyright 16 1.12 agc * notice, this list of conditions and the following disclaimer. 17 1.12 agc * 2. Redistributions in binary form must reproduce the above copyright 18 1.12 agc * notice, this list of conditions and the following disclaimer in the 19 1.12 agc * documentation and/or other materials provided with the distribution. 20 1.12 agc * 3. Neither the name of the University nor the names of its contributors 21 1.12 agc * may be used to endorse or promote products derived from this software 22 1.12 agc * without specific prior written permission. 23 1.12 agc * 24 1.12 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 1.12 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 1.12 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 1.12 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 1.12 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 1.12 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 1.12 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 1.12 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 1.12 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 1.12 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 1.12 agc * SUCH DAMAGE. 35 1.12 agc * 36 1.12 agc * from: Utah $Hdr: srt0.c 1.18 92/12/21$ 37 1.12 agc * 38 1.12 agc * @(#)srt0.c 8.1 (Berkeley) 6/10/93 39 1.12 agc */ 40 1.1 thorpej 41 1.1 thorpej /* 42 1.1 thorpej * Startup code for standalone system 43 1.1 thorpej */ 44 1.1 thorpej 45 1.3 thorpej /* For machineid and mmuid constants */ 46 1.3 thorpej #include <machine/hp300spu.h> 47 1.1 thorpej 48 1.3 thorpej /* For _C_LABEL() and friends. */ 49 1.3 thorpej #include <machine/asm.h> 50 1.3 thorpej 51 1.9 thorpej STACK = 0xfffff000 /* below the ROM page */ 52 1.1 thorpej BOOTTYPE = 0xfffffdc0 53 1.1 thorpej LOWRAM = 0xfffffdce 54 1.9 thorpej SYSFLAG = 0xfffffed2 /* system flags */ 55 1.9 thorpej MSUS = 0xfffffedc /* MSUS (?) structure */ 56 1.9 thorpej VECTORS = 0xfffffee0 /* beginning of jump vectors */ 57 1.9 thorpej NMIRESET = 0xffffff9c /* reset vector */ 58 1.1 thorpej BUSERR = 0xfffffffc 59 1.1 thorpej MAXADDR = 0xfffff000 60 1.1 thorpej NBPG = 4096 61 1.9 thorpej MMUCMD = 0x005f400c /* MMU command/status register */ 62 1.1 thorpej 63 1.1 thorpej .data 64 1.3 thorpej GLOBAL(bootdev) 65 1.1 thorpej .long 0 66 1.3 thorpej 67 1.3 thorpej GLOBAL(howto) 68 1.1 thorpej .long 0 69 1.3 thorpej 70 1.3 thorpej GLOBAL(lowram) 71 1.1 thorpej .long 0 72 1.3 thorpej 73 1.3 thorpej GLOBAL(machineid) 74 1.1 thorpej .long 0 75 1.1 thorpej 76 1.7 thorpej GLOBAL(mmuid) 77 1.7 thorpej .long 0 78 1.7 thorpej 79 1.1 thorpej .text 80 1.3 thorpej ASENTRY_NOPROFILE(begin) 81 1.10 thorpej movl #STACK,%sp 82 1.10 thorpej moveq #47,%d0 /* # of vectors - 1 */ 83 1.10 thorpej movl #VECTORS+2,%a0 /* addr part of first vector */ 84 1.3 thorpej 1: 85 1.10 thorpej movl #_ASM_LABEL(__trap),%a0@ /* make it direct to __trap */ 86 1.10 thorpej addql #6,%a0 /* move to next vector addr */ 87 1.10 thorpej dbf %d0,1b /* go til done */ 88 1.8 thorpej #ifdef ITECONSOLE 89 1.10 thorpej movl #NMIRESET,%a0 /* NMI keyboard reset addr */ 90 1.10 thorpej movl #nmi,%a0@ /* catch in reset routine */ 91 1.8 thorpej #else 92 1.8 thorpej /* 93 1.8 thorpej * Built without ITE console support; leave the ROM's NMI 94 1.8 thorpej * vector in place, so the system will still reset if a 95 1.8 thorpej * keyboard NMI is issued. 96 1.8 thorpej */ 97 1.8 thorpej #endif 98 1.3 thorpej 99 1.1 thorpej /* 100 1.3 thorpej * Determine our SPU type and look for internal HP-IB 101 1.1 thorpej */ 102 1.10 thorpej lea _C_LABEL(machineid),%a0 103 1.10 thorpej movl #0x808,%d0 104 1.10 thorpej movc %d0,%cacr /* clear and disable on-chip cache(s) */ 105 1.10 thorpej movl #0x200,%d0 /* data freeze bit */ 106 1.10 thorpej movc %d0,%cacr /* only exists on 68030 */ 107 1.10 thorpej movc %cacr,%d0 /* read it back */ 108 1.10 thorpej tstl %d0 /* zero? */ 109 1.9 thorpej jeq not68030 /* yes, we have 68020/68040 */ 110 1.3 thorpej 111 1.3 thorpej /* 112 1.3 thorpej * 68030 models 113 1.3 thorpej */ 114 1.1 thorpej 115 1.14 tsutsui movl #0x808,%d0 116 1.14 tsutsui movc %d0,%cacr /* clear data freeze bit again */ 117 1.14 tsutsui 118 1.9 thorpej movl #0x80,MMUCMD /* set magic cookie */ 119 1.10 thorpej movl MMUCMD,%d0 /* read it back */ 120 1.10 thorpej btst #7,%d0 /* cookie still on? */ 121 1.15 tsutsui jeq not370 /* no, 360, 362 or 375 */ 122 1.10 thorpej movl #HP_370,%a0@ /* consider a 370 for now */ 123 1.9 thorpej movl #0,MMUCMD /* clear magic cookie */ 124 1.10 thorpej movl MMUCMD,%d0 /* read it back */ 125 1.10 thorpej btst #7,%d0 /* still on? */ 126 1.9 thorpej jeq ihpibcheck /* no, a 370 */ 127 1.10 thorpej movl #HP_340,%a0@ /* yes, must be a 340 */ 128 1.1 thorpej jra ihpibcheck 129 1.3 thorpej 130 1.1 thorpej not370: 131 1.10 thorpej movl #HP_360,%a0@ /* type is at least a 360 */ 132 1.9 thorpej movl #0,MMUCMD /* clear magic cookie2 */ 133 1.10 thorpej movl MMUCMD,%d0 /* read it back */ 134 1.10 thorpej btst #16,%d0 /* still on? */ 135 1.15 tsutsui jeq isa36x /* no, a 360 or a 362 */ 136 1.10 thorpej lea _C_LABEL(mmuid),%a0 137 1.10 thorpej lsrl #MMUID_SHIFT,%d0 /* save MMU ID */ 138 1.10 thorpej andl #MMUID_MASK,%d0 139 1.10 thorpej movl %d0,%a0@ 140 1.10 thorpej lea _C_LABEL(machineid),%a0 141 1.10 thorpej cmpb #MMUID_345,%d0 /* are we a 345? */ 142 1.3 thorpej jeq isa345 143 1.10 thorpej cmpb #MMUID_375,%d0 /* how about a 375? */ 144 1.3 thorpej jeq isa375 145 1.10 thorpej movl #HP_400,%a0@ /* must be a 400 */ 146 1.3 thorpej jra ihpibcheck 147 1.15 tsutsui isa36x: 148 1.16 tsutsui movl #0x01000000,%sp@- /* check DIOII_BASE (scode 132) */ 149 1.15 tsutsui jbsr _C_LABEL(badaddr) 150 1.15 tsutsui addql #4,%sp 151 1.15 tsutsui tstl %d0 152 1.16 tsutsui jne ihpibcheck /* no device, assume 360 */ 153 1.16 tsutsui movl #0x01000000,%a0 154 1.16 tsutsui movb %a0@(0x01),%d0 /* check device ID at DIO_IDOFF */ 155 1.16 tsutsui cmpb #0x39,%d0 /* framebuffer? */ 156 1.16 tsutsui jne ihpibcheck /* no, assume 360 */ 157 1.16 tsutsui movb %a0@(0x15),%d0 /* check sec ID at DIO_SECIDOFF */ 158 1.16 tsutsui cmpb #0x11,%d0 /* VRX sti on 362? */ 159 1.16 tsutsui jne ihpibcheck /* no, assume 360 */ 160 1.15 tsutsui lea _C_LABEL(machineid),%a0 161 1.15 tsutsui movl #HP_362,%a0@ 162 1.15 tsutsui jra ihpibcheck 163 1.3 thorpej isa345: 164 1.10 thorpej movl #HP_345,%a0@ 165 1.1 thorpej jra ihpibcheck 166 1.3 thorpej isa375: 167 1.10 thorpej movl #HP_375,%a0@ 168 1.3 thorpej jra ihpibcheck 169 1.3 thorpej 170 1.3 thorpej /* 171 1.3 thorpej * End of 68030 section 172 1.3 thorpej */ 173 1.3 thorpej 174 1.1 thorpej not68030: 175 1.10 thorpej bset #31,%d0 /* data cache enable bit */ 176 1.10 thorpej movc %d0,%cacr /* only exists on 68040 */ 177 1.10 thorpej movc %cacr,%d0 /* read it back */ 178 1.10 thorpej tstl %d0 /* zero? */ 179 1.9 thorpej beq is68020 /* yes, we have 68020 */ 180 1.14 tsutsui 181 1.14 tsutsui /* 182 1.14 tsutsui * 68040 models 183 1.14 tsutsui */ 184 1.14 tsutsui 185 1.10 thorpej moveq #0,%d0 /* now turn it back off */ 186 1.10 thorpej movec %d0,%cacr /* before we access any data */ 187 1.9 thorpej 188 1.10 thorpej .long 0x4e7b0004 /* movc %d0,%itt0 */ 189 1.10 thorpej .long 0x4e7b0005 /* movc %d0,%itt1 */ 190 1.10 thorpej .long 0x4e7b0006 /* movc %d0,%dtt0 */ 191 1.10 thorpej .long 0x4e7b0007 /* movc %d0,%dtt1 */ 192 1.9 thorpej .word 0xf4d8 /* cinva bc */ 193 1.3 thorpej 194 1.10 thorpej lea _C_LABEL(mmuid),%a0 195 1.10 thorpej movl MMUCMD,%d0 /* get MMU ID */ 196 1.10 thorpej lsrl #MMUID_SHIFT,%d0 197 1.10 thorpej andl #MMUID_MASK,%d0 198 1.10 thorpej movl %d0,%a0@ /* save it */ 199 1.10 thorpej lea _C_LABEL(machineid),%a0 200 1.10 thorpej cmpb #MMUID_425_T,%d0 /* are we a 425t? */ 201 1.3 thorpej jeq isa425 202 1.10 thorpej cmpb #MMUID_425_S,%d0 /* how about 425s? */ 203 1.3 thorpej jeq isa425 204 1.10 thorpej cmpb #MMUID_425_E,%d0 /* or maybe a 425e? */ 205 1.6 thorpej jeq isa425 206 1.10 thorpej cmpb #MMUID_433_T,%d0 /* or a 433t? */ 207 1.3 thorpej jeq isa433 208 1.10 thorpej cmpb #MMUID_433_S,%d0 /* or a 433s? */ 209 1.3 thorpej jeq isa433 210 1.10 thorpej cmpb #MMUID_385,%d0 /* or a 385? */ 211 1.6 thorpej jeq isa385 212 1.15 tsutsui cmpb #MMUID_382,%d0 /* or a 382? */ 213 1.15 tsutsui jeq isa382 214 1.10 thorpej movl #HP_380,%a0@ /* guess we are a 380 */ 215 1.1 thorpej jra ihpibcheck 216 1.3 thorpej isa425: 217 1.10 thorpej movl #HP_425,%a0@ 218 1.1 thorpej jra ihpibcheck 219 1.3 thorpej isa433: 220 1.10 thorpej movl #HP_433,%a0@ 221 1.6 thorpej jra ihpibcheck 222 1.6 thorpej isa385: 223 1.10 thorpej movl #HP_385,%a0@ 224 1.3 thorpej jra ihpibcheck 225 1.15 tsutsui isa382: 226 1.15 tsutsui movl #HP_382,%a0@ 227 1.15 tsutsui jra ihpibcheck 228 1.3 thorpej 229 1.3 thorpej /* 230 1.3 thorpej * End 68040 section 231 1.3 thorpej */ 232 1.3 thorpej 233 1.3 thorpej /* 234 1.3 thorpej * 68020 models 235 1.3 thorpej */ 236 1.3 thorpej 237 1.1 thorpej is68020: 238 1.10 thorpej movl #HP_330,%a0@ /* consider a 330 for now */ 239 1.9 thorpej movl #1,MMUCMD /* a 68020, write HP MMU location */ 240 1.10 thorpej movl MMUCMD,%d0 /* read it back */ 241 1.10 thorpej btst #0,%d0 /* zero? */ 242 1.9 thorpej jeq ihpibcheck /* yes, a 330 */ 243 1.10 thorpej movl #HP_320,%a0@ /* no, consider a 320 for now */ 244 1.9 thorpej movl #0x80,MMUCMD /* set magic cookie */ 245 1.10 thorpej movl MMUCMD,%d0 /* read it back */ 246 1.10 thorpej btst #7,%d0 /* cookie still on? */ 247 1.9 thorpej jeq ihpibcheck /* no, just a 320 */ 248 1.10 thorpej movl #HP_350,%a0@ /* yes, a 350 */ 249 1.3 thorpej 250 1.3 thorpej /* 251 1.3 thorpej * End 68020 section 252 1.3 thorpej */ 253 1.3 thorpej 254 1.1 thorpej ihpibcheck: 255 1.9 thorpej movl #0,MMUCMD /* make sure MMU is off */ 256 1.9 thorpej btst #5,SYSFLAG /* do we have an internal HP-IB? */ 257 1.9 thorpej jeq boottype /* yes, continue */ 258 1.9 thorpej clrl _C_LABEL(internalhpib) /* no, clear the internal address */ 259 1.1 thorpej /* 260 1.1 thorpej * If this is a reboot, extract howto/bootdev stored by kernel 261 1.1 thorpej */ 262 1.1 thorpej boottype: 263 1.9 thorpej cmpw #12,BOOTTYPE /* is this a reboot (REQ_REBOOT)? */ 264 1.9 thorpej jne notreboot /* no, skip */ 265 1.10 thorpej lea MAXADDR,%a0 /* find last page */ 266 1.10 thorpej movl %a0@+,%d7 /* and extract howto, bootdev */ 267 1.10 thorpej movl %a0@+,%d6 /* from where doboot() left them */ 268 1.1 thorpej jra boot1 269 1.1 thorpej /* 270 1.1 thorpej * At this point we do not know which logical device the MSUS select 271 1.1 thorpej * code refers to so we cannot construct bootdev. So we just punt 272 1.1 thorpej * and let configure() construct it. 273 1.1 thorpej */ 274 1.1 thorpej notreboot: 275 1.10 thorpej moveq #0,%d6 /* make sure bootdev is invalid */ 276 1.9 thorpej cmpw #18,BOOTTYPE /* does the user want to interact? */ 277 1.9 thorpej jeq askme /* yes, go to it */ 278 1.10 thorpej moveq #0,%d7 /* default to RB_AUTOBOOT */ 279 1.1 thorpej jra boot1 280 1.1 thorpej askme: 281 1.10 thorpej moveq #3,%d7 /* default to RB_SINGLE|RB_ASKNAME */ 282 1.1 thorpej boot1: 283 1.10 thorpej movl %d6,_C_LABEL(bootdev) /* save bootdev and howto */ 284 1.10 thorpej movl %d7,_C_LABEL(howto) /* globally so all can access */ 285 1.10 thorpej movl LOWRAM,%d0 /* read lowram value from bootrom */ 286 1.2 thorpej /* 287 1.2 thorpej * Must preserve the scratch area for the BOOT ROM. 288 1.2 thorpej * Round up to the next 8k boundary. 289 1.2 thorpej */ 290 1.10 thorpej addl #((2*NBPG)-1),%d0 291 1.10 thorpej andl #-(2*NBPG),%d0 292 1.10 thorpej movl %d0,_C_LABEL(lowram) /* stash that value */ 293 1.1 thorpej start: 294 1.10 thorpej movl #_C_LABEL(edata),%a2 /* start of BSS */ 295 1.10 thorpej movl #_C_LABEL(end),%a3 /* end */ 296 1.3 thorpej 1: 297 1.10 thorpej clrb %a2@+ /* clear BSS */ 298 1.10 thorpej cmpl %a2,%a3 /* done? */ 299 1.9 thorpej bne 1b /* no, keep going */ 300 1.9 thorpej jsr _C_LABEL(configure) /* configure critical devices */ 301 1.9 thorpej jsr _C_LABEL(main) /* lets go */ 302 1.3 thorpej GLOBAL(_rtt) 303 1.9 thorpej movl #3,_C_LABEL(howto) /* restarts get RB_SINGLE|RB_ASKNAME */ 304 1.1 thorpej jmp start 305 1.1 thorpej 306 1.1 thorpej /* 307 1.1 thorpej * probe a location and see if it causes a bus error 308 1.1 thorpej */ 309 1.3 thorpej ENTRY_NOPROFILE(badaddr) 310 1.9 thorpej movl BUSERR,_C_LABEL(_bsave) /* save ROM bus error handler address */ 311 1.10 thorpej movl %sp,_C_LABEL(_ssave) /* and current stack pointer */ 312 1.9 thorpej movl #catchbad,BUSERR /* plug in our handler */ 313 1.10 thorpej movl %sp@(4),%a0 /* address to probe */ 314 1.10 thorpej movw %a0@,%d1 /* do it */ 315 1.9 thorpej movl _C_LABEL(_bsave),BUSERR /* if we got here, it did not fault */ 316 1.10 thorpej clrl %d0 /* return that this was not a bad */ 317 1.9 thorpej /* addr */ 318 1.1 thorpej rts 319 1.1 thorpej 320 1.1 thorpej catchbad: 321 1.9 thorpej movl _C_LABEL(_bsave),BUSERR /* got a bus error, so restore */ 322 1.9 thorpej /* old handler */ 323 1.10 thorpej movl _C_LABEL(_ssave),%sp /* manually restore stack */ 324 1.10 thorpej moveq #1,%d0 /* indicate that we got a fault */ 325 1.9 thorpej rts /* return to caller of badaddr() */ 326 1.1 thorpej 327 1.3 thorpej .data 328 1.3 thorpej GLOBAL(_bsave) 329 1.1 thorpej .long 0 330 1.3 thorpej 331 1.3 thorpej GLOBAL(_ssave) 332 1.1 thorpej .long 0 333 1.1 thorpej 334 1.3 thorpej ASENTRY_NOPROFILE(__trap) 335 1.10 thorpej moveml #0xFFFF,%sp@- /* save registers */ 336 1.10 thorpej movl %sp,%sp@- /* push pointer to frame */ 337 1.9 thorpej jsr _C_LABEL(trap) /* call C routine to deal with it */ 338 1.10 thorpej tstl %d0 339 1.1 thorpej jeq Lstop 340 1.10 thorpej addql #4,%sp 341 1.10 thorpej moveml %sp@+,#0x7FFF 342 1.10 thorpej addql #8,%sp 343 1.1 thorpej rte 344 1.1 thorpej Lstop: 345 1.9 thorpej stop #0x2700 /* stop cold */ 346 1.1 thorpej 347 1.8 thorpej #ifdef ITECONSOLE 348 1.3 thorpej ASENTRY_NOPROFILE(nmi) 349 1.9 thorpej movw #18,BOOTTYPE /* mark as system switch */ 350 1.9 thorpej jsr _C_LABEL(kbdnmi) /* clear the interrupt, and */ 351 1.9 thorpej /* reset the system */ 352 1.9 thorpej stop #0 /* SCREEEECH! */ 353 1.8 thorpej #endif 354 1.3 thorpej 355 1.3 thorpej ENTRY_NOPROFILE(call_req_reboot) 356 1.9 thorpej jmp 0x1A4 /* call ROM reboot function */ 357 1.9 thorpej rts /* XXX: just in case? */ 358 1.1 thorpej 359 1.3 thorpej ENTRY_NOPROFILE(romout) 360 1.10 thorpej movl %sp@(4),%d0 /* line number */ 361 1.10 thorpej movl %sp@(8),%a0 /* string */ 362 1.9 thorpej jsr 0x150 /* do it */ 363 1.1 thorpej rts 364 1.11 thorpej 365 1.11 thorpej /* 366 1.11 thorpej * _transfer(entry, howto, opendev, conscode, lowram, esym) 367 1.11 thorpej * 368 1.11 thorpej * Transfer control to the kernel. We also set up registers 369 1.11 thorpej * as older kernels expect. 370 1.11 thorpej */ 371 1.11 thorpej ENTRY_NOPROFILE(_transfer) 372 1.11 thorpej movl %sp@(8),%d7 /* howto */ 373 1.11 thorpej movl %sp@(12),%d6 /* opendev (compat) */ 374 1.11 thorpej movl %sp@(16),%d5 /* conscode (compat) */ 375 1.11 thorpej movl %sp@(20),%a5 /* lowram */ 376 1.11 thorpej movl %sp@(24),%a4 /* esym (compat) */ 377 1.11 thorpej 378 1.11 thorpej movl %sp@(4),%a0 /* load entry point */ 379 1.11 thorpej jbsr %a0@ /* GO! */ 380