[BACK]Return to srt0.S CVS log [TXT][DIR] Up to [local] / sys / arch / hp300 / stand / uboot

Annotation of sys/arch/hp300/stand/uboot/srt0.S, Revision 1.1

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

CVSweb