[BACK]Return to start.S CVS log [TXT][DIR] Up to [local] / sys / arch / vax / boot / xxboot

Annotation of sys/arch/vax/boot/xxboot/start.S, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: start.S,v 1.2 2003/11/07 10:16:45 jmc Exp $ */
                      2: /*     $NetBSD: start.S,v 1.1 2002/02/24 01:04:26 matt Exp $ */
                      3: /*
                      4:  * Copyright (c) 1995 Ludd, University of Lule}, Sweden.
                      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to Ludd by
                      8:  * Bertram Barth.
                      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 at Ludd, University of
                     21:  *     Lule}, Sweden and its contributors.
                     22:  * 4. The name of the author may not be used to endorse or promote products
                     23:  *    derived from this software without specific prior written permission
                     24:  *
                     25:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     26:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     27:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     28:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     29:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     30:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     31:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     32:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     33:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     34:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     35:  */
                     36:
                     37:  /* All bugs are subject to removal without further notice */
                     38:
                     39:
                     40: #define _LOCORE
                     41:
                     42: #include "sys/disklabel.h"
                     43:
                     44: #include "../include/mtpr.h"
                     45: #include "../include/asm.h"
                     46:
                     47: _C_LABEL(_start):
                     48: _C_LABEL(start):
                     49:        .globl _C_LABEL(start)  # this is the symbolic name for the start
                     50:        .globl _C_LABEL(_start) # of code to be relocated. We can use this
                     51:                                # to get the actual/real address (pc-rel)
                     52:                                # or to get the relocated address (abs).
                     53:
                     54: .org   0x00                    # uVAX booted from TK50 starts here
                     55:        brb     from_0x00       # continue behind dispatch-block
                     56:
                     57: .org   0x02                    # information used by uVAX-ROM
                     58:        .byte   0xff            # offset in words to identification area
                     59:        .byte   1               # this byte must be 1
                     60:        .word   0               # logical block number (word swapped)
                     61:        .word   0               # of the secondary image
                     62:
                     63: .org   0x08                    #
                     64:        brb     from_0x08       # skip ...
                     65:
                     66: .org   0x0C                    # 11/750  & 8200 starts here
                     67:        movzbl  $1,_C_LABEL(from)# We booted from "old" rom.
                     68:        brw     cont_750
                     69:
                     70:
                     71: from_0x00:                     # uVAX from TK50
                     72:        brw     start_uvax      # all uVAXen continue there
                     73:
                     74: from_0x08:                     # Any machine from VMB
                     75:        movzbl  $4,_C_LABEL(from)               # Booted from full VMB
                     76:        brw     start_vmb
                     77:
                     78: # the complete area reserved for label
                     79: # must be empty (i.e. filled with zeroes).
                     80: # disklabel(8) checks that before installing
                     81: # the bootblocks over existing label.
                     82:
                     83: .org   LABELOFFSET
                     84:        .globl  _C_LABEL(romlabel)
                     85: _C_LABEL(romlabel):
                     86:        .long   0
                     87:
                     88: .org   LABELOFFSET + d_end_
                     89: start_vmb:
                     90:        /*
                     91:         * Read in block 1-15.
                     92:         */
                     93:        movl    52(r11), r7     # load iovec/bqo into %r7
                     94:        addl3   (r7), r7, r6    # load qio into %r6
                     95:        pushl   r11             # base of rpb
                     96:        pushl   $0              # virtual-flag
                     97:        pushl   $33             # read-logical-block
                     98:        pushl   $1              # lbn to start reading
                     99:        pushl   $7680           # number of bytes to read
                    100:        pushab  start_uvax      # buffer-address
                    101:        calls   $6, (r6)        # call the qio-routine
                    102:        brw     start_uvax
                    103:
                    104: /*
                    105:  * Parameter block for uVAX boot.
                    106:  */
                    107: #define VOLINFO                0       /* 1=single-sided  81=double-sided volumes */
                    108: #define SISIZE         16      /* size in blocks of secondary image */
                    109: #define SILOAD         0       /* load offset (usually 0) from the default */
                    110: #define SIOFF          0x260   /* byte offset into secondary image */
                    111:
                    112: .org   0x1fe
                    113:        .byte   0x18            # must be 0x18
                    114:        .byte   0x00            # must be 0x00 (MBZ)
                    115:        .byte   0x00            # any value
                    116:        .byte   0xFF - (0x18 + 0x00 + 0x00)
                    117:                /* 4th byte holds 1s' complement of sum of previous 3 bytes */
                    118:
                    119:        .byte   0x00            # must be 0x00 (MBZ)
                    120:        .byte   VOLINFO
                    121:        .byte   0x00            # any value
                    122:        .byte   0x00            # any value
                    123:
                    124:        .long   SISIZE          # size in blocks of secondary image
                    125:        .long   SILOAD          # load offset (usually 0)
                    126:        .long   SIOFF           # byte offset into secondary image
                    127:        .long   (SISIZE + SILOAD + SIOFF)       # sum of previous 3
                    128:
                    129:
                    130:        .align  2
                    131:        .globl  _C_LABEL(from)
                    132: _C_LABEL(from):
                    133:        .long   0
                    134:
                    135: /*
                    136:  * After bootblock (LBN0) has been loaded into the first page
                    137:  * of good memory by 11/750's ROM-code (transfer address
                    138:  * of bootblock-code is: base of good memory + 0x0C) registers
                    139:  * are initialized as:
                    140:  *     R0:     type of boot-device
                    141:  *                     0:      Massbus device
                    142:  *                     1:      RK06/RK07
                    143:  *                     2:      RL02
                    144:  *                     17:     UDA50
                    145:  *                     35:     TK50
                    146:  *                     64:     TU58
                    147:  *     R1:     (UBA) address of UNIBUS I/O-page
                    148:  *             (MBA) address of boot device's adapter
                    149:  *     R2:     (UBA) address of the boot device's CSR
                    150:  *             (MBA) controller number of boot device
                    151:  *     R6:     address of driver subroutine in ROM
                    152:  *
                    153:  * cont_750 reads in LBN1-15 for further execution.
                    154:  */
                    155: cont_750:
                    156:        movl    $_C_LABEL(start), sp    # move stack to avoid clobbering the code
                    157:        pushr   $0x131          # save clobbered registers
                    158:        clrl    r4              # %r4 == # of blocks transferred
                    159:        movab   _C_LABEL(start),r5      # %r5 have base address for next transfer
                    160:        pushl   r5              # ...on stack also (Why?)
                    161: 1:     incl    r4              # increment block count
                    162:        movl    r4,r8           # LBN is in %r8 for rom routine
                    163:        addl2   $0x200,r5       # Increase address for next read
                    164:        cmpl    $16,r4          # read 15 blocks?
                    165:        beql    2f              # Yep
                    166:        movl    r5,(sp)         # move address to stack also
                    167:        jsb     (r6)            # read 512 bytes
                    168:        blbs    r0,1b           # jump if read succeeded
                    169:        halt                    # otherwise die...
                    170: 2:     tstl    (sp)+           # remove boring arg from stack
                    171:        popr    $0x131          # restore clobbered registers
                    172:        brw     start_all       # Ok, continue...
                    173:
                    174: /* uVAX main entry is at the start of the second disk block.  This is
                    175:  * needed for multi-arch CD booting where multiple architecture need
                    176:  * to shove stuff in boot block 0.
                    177:  */
                    178:        .org    0x260           # uVAX booted from disk starts here
                    179:
                    180: start_uvax:
                    181:        movzbl  $2,_C_LABEL(from)       # Booted from subset-VMB
                    182:        brb     start_all
                    183:
                    184: /*
                    185:  * start_all: stack already at RELOC, we save registers, move ourself
                    186:  * to RELOC and loads boot.
                    187:  */
                    188: start_all:
                    189:        movl    $_C_LABEL(start), sp    # move stack to a better
                    190:        pushr   $0x1fff                 # save all regs, used later.
                    191:
                    192:        subl3   $_C_LABEL(start), $_C_LABEL(edata), r0
                    193:                                        # get size of text+data (w/o bss)
                    194:        moval   _C_LABEL(start), r1     # get actual base-address of code
                    195:        subl3   $_C_LABEL(start), $_C_LABEL(end), r2
                    196:                                        # get complete size (incl. bss)
                    197:        movl    $_C_LABEL(start), r3    # get relocated base-address of code
                    198:        movc5   r0, (r1), $0, r2, (r3)  # copy code to new location
                    199:
                    200:        movpsl  -(sp)
                    201:        movl    $relocated, -(sp)       # return-address on top of stack
                    202:        rei                             # can be replaced with new address
                    203: relocated:                             # now relocation is done !!!
                    204:        movl    sp, _C_LABEL(bootregs)
                    205:        calls   $0, _C_LABEL(Xmain)     # call Xmain (gcc workaround)which is
                    206:        halt                            # not intended to return ...
                    207:
                    208: /*
                    209:  * hoppabort() is called when jumping to the newly loaded program.
                    210:  */
                    211: ENTRY(hoppabort, 0)
                    212:        movl    4(ap),r6
                    213:        movl    _C_LABEL(rpb),r11
                    214:        mnegl   $1,ap           # Hack to figure out boot device.
                    215:        movpsl  -(sp)
                    216:        pushab  2(r6)
                    217:        mnegl   $1,_C_LABEL(vax_load_failure)
                    218:        rei
                    219: #      calls   $0,(r6)
                    220:        halt
                    221:
                    222: ENTRY(unit_init, R6|R7|R8|R9|R10|R11)
                    223:        mfpr    $17,r7                  # Wanted bu KDB
                    224:        movl    4(ap),r0                # init routine address
                    225:        movl    8(ap),r9                # RPB in %r9
                    226:        movl    12(ap),r1               # VMB argument list
                    227:        callg   (r1),(r0)
                    228:        ret
                    229:
                    230: # A bunch of functions unwanted in boot blocks.
                    231: ENTRY(getchar, 0)
                    232:        halt
                    233:
                    234: #ifndef USE_PRINTF
                    235: ENTRY(putchar, 0)
                    236:        ret
                    237:
                    238: #endif
                    239:
                    240: ENTRY(panic, 0)
                    241:        halt

CVSweb