|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 University of Utah. ! 3: * Copyright (c) 1982, 1990 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * This code is derived from software contributed to Berkeley by ! 7: * the Systems Programming Group of the University of Utah Computer ! 8: * Science Department. ! 9: * ! 10: * Redistribution and use in source and binary forms, with or without ! 11: * modification, are permitted provided that the following conditions ! 12: * are met: ! 13: * 1. Redistributions of source code must retain the above copyright ! 14: * notice, this list of conditions and the following disclaimer. ! 15: * 2. Redistributions in binary form must reproduce the above copyright ! 16: * notice, this list of conditions and the following disclaimer in the ! 17: * documentation and/or other materials provided with the distribution. ! 18: * 3. All advertising materials mentioning features or use of this software ! 19: * must display the following acknowledgement: ! 20: * This product includes software developed by the University of ! 21: * California, Berkeley and its contributors. ! 22: * 4. Neither the name of the University nor the names of its contributors ! 23: * may be used to endorse or promote products derived from this software ! 24: * without specific prior written permission. ! 25: * ! 26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 36: * SUCH DAMAGE. ! 37: * ! 38: * from: Utah $Hdr: srt0.c 1.12 91/04/25$ ! 39: * ! 40: * @(#)srt0.c 7.4 (Berkeley) 5/7/91 ! 41: */ ! 42: ! 43: /* ! 44: * Startup code for standalone system ! 45: */ ! 46: ! 47: .globl begin ! 48: .globl _end ! 49: .globl _edata ! 50: .globl _main ! 51: .globl _configure ! 52: .globl _bootdev ! 53: .globl _firstopen ! 54: .globl __rtt ! 55: .globl _lowram,_howto,_devtype,_internalhpib,_machineid ! 56: ! 57: STACK = 0xfffff000 | below the ROM page ! 58: BOOTTYPE = 0xfffffdc0 ! 59: LOWRAM = 0xfffffdce ! 60: SYSFLAG = 0xfffffed2 | system flags ! 61: MSUS = 0xfffffedc | MSUS (?) structure ! 62: VECTORS = 0xfffffee0 | beginning of jump vectors ! 63: NMIRESET = 0xffffff9c | reset vector ! 64: BUSERR = 0xfffffffc ! 65: MAXADDR = 0xfffff000 ! 66: NBPG = 4096 ! 67: MMUCMD = 0x005f400c | MMU command/status register ! 68: ! 69: .data ! 70: _bootdev: ! 71: .long 0 ! 72: _devtype: ! 73: .long 0 ! 74: _howto: ! 75: .long 0 ! 76: _lowram: ! 77: .long 0 ! 78: _machineid: ! 79: .long 0 ! 80: ! 81: .text ! 82: begin: ! 83: movl #STACK,sp ! 84: moveq #47,d0 | # of vectors - 1 ! 85: movl #VECTORS+2,a0 | addr part of first vector ! 86: vecloop: ! 87: movl #trap,a0@ | make it direct to trap ! 88: addql #6,a0 | move to next vector addr ! 89: dbf d0,vecloop | go til done ! 90: movl #NMIRESET,a0 | NMI keyboard reset addr ! 91: movl #nmi,a0@ | catch in reset routine ! 92: /* ! 93: * Determine our CPU type and look for internal HP-IB ! 94: * (really only care about detecting 320 (no DIO-II) right now). ! 95: */ ! 96: lea _machineid,a0 ! 97: movl #0x808,d0 ! 98: movc d0,cacr | clear and disable on-chip cache(s) ! 99: movl #0x200,d0 | data freeze bit ! 100: movc d0,cacr | only exists on 68030 ! 101: movc cacr,d0 | read it back ! 102: tstl d0 | zero? ! 103: jeq is68020 | yes, we have 68020 ! 104: movl #0x808,d0 ! 105: movc d0,cacr | clear data freeze bit again ! 106: movl #0x80,MMUCMD | set magic cookie ! 107: movl MMUCMD,d0 | read it back ! 108: btst #7,d0 | cookie still on? ! 109: jeq not370 | no, 360 or 375 ! 110: movl #4,a0@ | consider a 370 for now ! 111: movl #0,MMUCMD | clear magic cookie ! 112: movl MMUCMD,d0 | read it back ! 113: btst #7,d0 | still on? ! 114: jeq ihpibcheck | no, a 370 ! 115: movl #5,a0@ | yes, must be a 340 ! 116: jra ihpibcheck ! 117: not370: ! 118: movl #3,a0@ | type is at least a 360 ! 119: movl #0,MMUCMD | clear magic cookie2 ! 120: movl MMUCMD,d0 | read it back ! 121: btst #16,d0 | still on? ! 122: jeq ihpibcheck | no, a 360 ! 123: movl #6,a0@ | yes, must be a 345/375/400 ! 124: jra ihpibcheck ! 125: is68020: ! 126: movl #1,a0@ | consider a 330 for now ! 127: movl #1,MMUCMD | a 68020, write HP MMU location ! 128: movl MMUCMD,d0 | read it back ! 129: btst #0,d0 | zero? ! 130: jeq ihpibcheck | yes, a 330 ! 131: movl #0,a0@ | no, consider a 320 for now ! 132: movl #0x80,MMUCMD | set magic cookie ! 133: movl MMUCMD,d0 | read it back ! 134: btst #7,d0 | cookie still on? ! 135: jeq ihpibcheck | no, just a 320 ! 136: movl #2,a0@ | yes, a 350 ! 137: ihpibcheck: ! 138: movl #0,MMUCMD | make sure MMU is off ! 139: btst #5,SYSFLAG | do we have an internal HP-IB? ! 140: jeq boottype | yes, continue ! 141: clrl _internalhpib | no, clear the internal address ! 142: /* ! 143: * If this is a reboot, extract howto/devtype stored by kernel ! 144: */ ! 145: boottype: ! 146: cmpw #12,BOOTTYPE | is this a reboot (REQ_REBOOT)? ! 147: jne notreboot | no, skip ! 148: movl #MAXADDR,a0 | find last page ! 149: movl a0@+,d7 | and extract howto, devtype ! 150: movl a0@+,d6 | from where doboot() left them ! 151: jra boot1 ! 152: /* ! 153: * At this point we do not know which logical hpib the given select ! 154: * code refers to. So we just put the select code in the adaptor field ! 155: * where hpibinit() can replace it with the logical hpib number. ! 156: * Note that this may clobber the B_DEVMAGIC field but that isn't set ! 157: * til later anyway. ! 158: */ ! 159: notreboot: ! 160: cmpw #18,BOOTTYPE | does the user want to interact? ! 161: jeq askme | yes, go to it ! 162: movl MSUS,d1 | no, get rom info ! 163: movw d1,d6 | MSUS comes with SC in upper, unit in lower ! 164: swap d6 | put in place ! 165: movw #2,d6 | assume 'a' partition of rd disk ! 166: moveq #0,d7 | default to RB_AUTOBOOT ! 167: jra boot1 ! 168: askme: ! 169: moveq #7,d6 | default to HP-IB at sc7 ! 170: lslw #8,d6 | position as adaptor number ! 171: swap d6 | put in place (note implied unit 0) ! 172: movw #2,d6 | assume 'a' partition of rd disk ! 173: moveq #3,d7 | default to RB_SINGLE|RB_ASKNAME ! 174: boot1: ! 175: movl d6,_devtype | save devtype and howto ! 176: movl d7,_howto | globally so all can access ! 177: movl LOWRAM,d0 | read lowram value from bootrom ! 178: addl #NBPG,d0 | must preserve this for bootrom to reboot ! 179: andl #0xfffff000,d0 | round to next page ! 180: movl d0,_lowram | stash that value ! 181: start: ! 182: movl #_edata,a2 | start of BSS ! 183: movl #_end,a3 | end ! 184: clr: ! 185: clrb a2@+ | clear BSS ! 186: cmpl a2,a3 | done? ! 187: bne clr | no, keep going ! 188: jsr _configure | configure critical devices ! 189: movl #1,_firstopen | mark this as the first open ! 190: jsr _main | lets go ! 191: __rtt: ! 192: movl #3,_howto | restarts get RB_SINGLE|RB_ASKNAME ! 193: jmp start ! 194: ! 195: /* ! 196: * probe a location and see if it causes a bus error ! 197: */ ! 198: .globl _badaddr ! 199: _badaddr: ! 200: movl BUSERR,__bsave | save ROM bus error handler address ! 201: movl sp,__ssave | and current stack pointer ! 202: movl #catchbad,BUSERR| plug in our handler ! 203: movl sp@(4),a0 | address to probe ! 204: movw a0@,d1 | do it ! 205: movl __bsave,BUSERR | if we got here, it didn't fault ! 206: clrl d0 | return that this was not a bad addr ! 207: rts ! 208: ! 209: catchbad: ! 210: movl __bsave,BUSERR | got a bus error, so restore old handler ! 211: movl __ssave,sp | manually restore stack ! 212: moveq #1,d0 | indicate that we got a fault ! 213: rts | return to caller of badaddr() ! 214: ! 215: __bsave: ! 216: .long 0 ! 217: __ssave: ! 218: .long 0 ! 219: ! 220: .globl _trap ! 221: trap: ! 222: moveml #0xFFFF,sp@- | save registers ! 223: movl sp,sp@- | push pointer to frame ! 224: jsr _trap | call C routine to deal with it ! 225: stop #0x2700 | stop cold ! 226: ! 227: nmi: ! 228: movw #18,BOOTTYPE | mark as system switch ! 229: jsr _kbdnmi | clear the interrupt ! 230: jra begin | start over ! 231: ! 232: #ifdef ROMPRF ! 233: .globl _romout ! 234: _romout: ! 235: movl sp@(4),d0 | line number ! 236: movl sp@(8),a0 | string ! 237: jsr 0x150 | do it ! 238: rts ! 239: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.