Annotation of 41BSD/4.0.upgrade/sys/mdec/upboot.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * UP disk boot program to load "/boot" from
                      3:  * a UNIX filesystem (starting at block 1 on pack on
                      4:  * drive 0) into low core and to execute that file.
                      5:  *
                      6:  * This program can only read regular small 1k byte (3bsd+) files
                      7:  * from the root of a UNIX filesystem.
                      8:  */
                      9:        .set    BLKSIZ,1024             /* file system block size */
                     10:        .set    RELOC,0x50000
                     11:        .set    INOSIZ,64               /* no. bytes/inode entry */
                     12:        .set    INOBLK,BLKSIZ/INOSIZ    /* no. inodes/disc block */
                     13:        .set    INOMSK,0xfffffff0       /* changes with inode size */
                     14:        .set    NAMSIZ,14               /* bytes in directory name */
                     15:        .set    ENTADR,024              /* offset to entry addr in a.out */
                     16:        .set    DIRSIZ,16               /* size of directory entry, bytes */
                     17:        .set    ROOTINO,2               /* root dir inode no. */
                     18:        .set    NBOO,1
                     19:        .set    NSUP,1
                     20:        .set    SID,62                  /* system ID register */
                     21: /* UBA registers */
                     22:        .set    UBA_CNFGR,0             /* UBA configuration register */
                     23:        .set    UBA_CR,4                /* UBA control register offset */
                     24:        .set    UBA_MAP,0x800           /* UBA offset to map reg's */
                     25:        .set    UBAinit,1               /* UBA init bit in UBA control reg */
                     26:        .set    pUBIC,16                /* Unibus init complete */
                     27: /* UP registers and bits */
                     28:        .set    UP,0176700-0160000      /* address of UP controller */
                     29:        .set    UP_cs1,UP+0             /* control and status */
                     30:        .set    UP_wc,UP+2              /* word count */
                     31:        .set    UP_ba,UP+4              /* bus address */
                     32:        .set    UP_da,UP+6              /* disk address */
                     33:        .set    UP_cs2,UP+010           /* cs2 register */
                     34:        .set    UP_of,UP+032            /* offset register */
                     35:        .set    UP_dc,UP+034            /* desired cylinder */
                     36:        .set    UP_hr,UP+036            /* holding register */
                     37:        .set    UPHR_MAXTRAK,0100030
                     38:        .set    UPSEC,32
                     39:        .set    UP_GO,1                 /* go bit */
                     40:        .set    UP_PACK,022             /* pack acknowledge */
                     41:        .set    UP_DCLR,010             /* drive clear */
                     42:        .set    UP_PRESET,020           /* read-in-preset */
                     43:        .set    UP_RCOM,070             /* read command */
                     44:        .set    UPCS2_CLR,040
                     45:        .set    UP_pRDY,7               /* position of ready bit */
                     46:        .set    UP_pERR,15              /* position of error bit */
                     47:        .set    UP_FMT22,010000
                     48: 
                     49: init:
                     50:        .word   0                       /* entry mask for dec monitor */
                     51:        nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */
                     52:        nop;nop;
                     53: /* get cpu type and find the first uba */
                     54:        mfpr    $SID,r0
                     55:        extzv   $24,$8,r0,r0            /* get cpu type */
                     56:        ashl    $2,r0,r1
                     57:        movab   physUBA,r2              /* get physUBA[cpu] */
                     58:        addl2   r1,r2
                     59:        movl    (r2),r9
                     60:        movab   physUMEM,r2             /* get physUMEM[cpu] */
                     61:        addl2   r1,r2
                     62:        movl    (r2),r10
                     63: /* if 780, init uba */
                     64:        cmpl    r0,$1
                     65:        bneq    2f
                     66:        movl    $UBAinit,UBA_CR(r9)
                     67: 1:
                     68:        bbc     $pUBIC,UBA_CNFGR(r9),1b
                     69: 2:
                     70:        movl    $5000000,r0
                     71: 1:
                     72:        sobgtr  r0,1b
                     73: /* init up, set vv in drive 0; if any errors, give up */
                     74:        movw    $UPCS2_CLR,UP_cs2(r10)
                     75:        movw    $UP_DCLR+UP_GO,UP_cs1(r10)
                     76:        movw    $UP_PRESET+UP_GO,UP_cs1(r10)
                     77:        movw    $UP_FMT22,UP_of(r10)
                     78: 1:
                     79:        movw    UP_cs1(r10),r0
                     80:        bbc     $UP_pRDY,r0,1b
                     81: /* relocate to high core */
                     82: start:
                     83:        movl    r5,r11                  /* boot flags */
                     84:        movl    $RELOC,sp
                     85:        moval   init,r6
                     86:        movc3   $end,(r6),(sp)
                     87:        jmp     *$RELOC+start2
                     88: /* now running relocated */
                     89: start2:
                     90: /* determine tracks; for now must get 10 or 19, otw assume 19 */
                     91: /* always assume 32 sectors for now; this all handles fuji's and 300mbs */
                     92:        movw    $UPHR_MAXTRAK,UP_hr(r10)
                     93:        movw    UP_hr(r10),r0
                     94:        incl    r0
                     95:        movw    r0,*$uptrk
                     96: 1:
                     97:        mull3   $32,r0,*$upst
                     98: /* search for ``boot'' in root inode */
                     99:        movl    $names+RELOC,r6
                    100:        movzbl  $ROOTINO,r0
                    101: nxti:
                    102:        clrw    *$bno
                    103:        bsbw    iget
                    104:        tstb    (r6)
                    105:        beql    getfil
                    106: get1b:
                    107:        bsbw    rmblk
                    108:        beql    start2
                    109:        movl    $buf,r7
                    110: nxtent:
                    111:        tstw    (r7)
                    112:        beql    dirchk
                    113:        cmpc3   $NAMSIZ,(r6),2(r7)
                    114:        bneq    dirchk
                    115:        movzwl  (r7),r0
                    116:        addl2   $NAMSIZ,r6
                    117:        brb     nxti
                    118: dirchk:
                    119:        acbl    $buf+BLKSIZ-1,$DIRSIZ,r7,nxtent 
                    120:        brb     get1b
                    121: /* found inode for desired file... read it in */
                    122: getfil:
                    123:        clrl    bufptr
                    124: getlop:
                    125:        bsbb    rmblk
                    126:        beql    clear
                    127:        addl2   $BLKSIZ,bufptr
                    128:        brb     getlop
                    129: clear:
                    130:        movl    *$size,r3
                    131: clrcor:
                    132:        clrq    (r3)
                    133:        acbl    $RELOC,$8,r3,clrcor
                    134: /* run loaded program */
                    135:        movl    $2,r10                  /* major("/dev/up0a") */
                    136:        calls   $0,*$0
                    137:        brw     start2
                    138: /* iget: get inode block whose # is in r0 */
                    139: iget:
                    140:        addl3   $(INOBLK*(NBOO+NSUP))-1,r0,r8
                    141:        divl3   $INOBLK,r8,r4
                    142:        bsbw    rblk
                    143:        bicl2   $INOMSK,r8
                    144:        mull2   $INOSIZ,r8
                    145:        addl2   $buf,r8
                    146:        movc3   $time-inode,(r8),*$inode
                    147:        rsb
                    148: /* rmblk: read in bno into addr */
                    149: rmblk:
                    150:        movzwl  *$bno,r0
                    151:        addw2   $3,*$bno
                    152:        addl2   $addr,r0
                    153: /* this boot assumes only small files (<=20 blocks) */
                    154:        extzv   $0,$24,(r0),r4
                    155:        bneq    rblk
                    156:        rsb
                    157: /* rblk: read disk block whose number is in r4 */
                    158: rblk:
                    159:        mull2   $BLKSIZ/512,r4
                    160:        clrl    r5
                    161:        ediv    *$upst,r4,r0,r1
                    162:        movw    r0,UP_dc(r10)
                    163:        clrl    r2
                    164:        ediv    $UPSEC,r1,r1,r0
                    165:        insv    r1,$8,$5,r0
                    166:        movw    r0,UP_da(r10)
                    167:        movw    $-BLKSIZ/2,UP_wc(r10)
                    168:        ashl    $-9,bufptr,r0
                    169:        bisl3   $0x80000000,r0,UBA_MAP(r9)
                    170:        incl    r0
                    171:        bisl3   $0x80000000,r0,UBA_MAP+4(r9)
                    172:        clrw    UP_ba(r10)
                    173:        movw    $UP_RCOM+UP_GO,UP_cs1(r10)
                    174: uprdy:
                    175:        movw    UP_cs1(r10),r0
                    176:        bbc     $UP_pRDY,r0,uprdy
                    177:        rsb
                    178: bufptr:        .long  buf
                    179: names: .byte   'b,'o,'o,'t,0,0,0,0,0,0,0,0,0,0
                    180:        .byte  0
                    181: physUBA:
                    182:        .long   0
                    183:        .long   0x20006000      /* 11/780 */
                    184:        .long   0xf30000        /* 11/750 */
                    185:        .long   0xf26000        /* 11/7ZZ */
                    186: physUMEM:
                    187:        .long   0
                    188:        .long   0x2013e000      /* 11/780 */
                    189:        .long   0xffe000        /* 11/750 */
                    190:        .long   0xffe000        /* 11/7ZZ */
                    191: end:
                    192:        .set    buf,RELOC-1536
                    193:        .set    inode,RELOC-512
                    194:        .set    mode,inode
                    195:        .set    nlink,mode+2
                    196:        .set    uid,nlink+2
                    197:        .set    gid,uid+2
                    198:        .set    size,gid+2
                    199:        .set    addr,size+4
                    200:        .set    time,addr+40
                    201:        .set    bno,time+12
                    202:        .set    uptrk,bno+4
                    203:        .set    upst,uptrk+4

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.