181bfa949Smckusick /* 250f8aa26Smckusick * Copyright (c) 1980, 1986 Regents of the University of California. 381bfa949Smckusick * All rights reserved. The Berkeley software License Agreement 481bfa949Smckusick * specifies the terms and conditions for redistribution. 581bfa949Smckusick */ 681bfa949Smckusick 7*8f26171aSkarels /* @(#)hkboot.c 7.2 (Berkeley) 08/28/86 */ 8*8f26171aSkarels #include <sys/disklabel.h> 9d5f12ee2Skarels 10d5f12ee2Skarels .set MAJOR,3 /* major("/dev/hk0a") */ 114b71a845Ssam 124b71a845Ssam /* 134b71a845Ssam * RK07 1st level boot program: loads next 7.5Kbytes from 144b71a845Ssam * boot sector of file system and sets it up to run. 154b71a845Ssam */ 164b71a845Ssam .set RELOC,0x50000 174b71a845Ssam .set BOOTSIZE,15 /* size of boot in sectors */ 184b71a845Ssam /* UBA registers */ 194b71a845Ssam .set UBA_CNFGR,0 /* UBA configuration register */ 204b71a845Ssam .set UBA_CR,4 /* UBA control register offset */ 214b71a845Ssam .set UBA_MAP,0x800 /* UBA offset to map reg's */ 224b71a845Ssam /* RK611 registers and bits */ 23d5f12ee2Skarels .set HK_cs1,0 /* control and status */ 24d5f12ee2Skarels .set HK_wc,2 /* word count */ 25d5f12ee2Skarels .set HK_ba,4 /* bus address */ 26d5f12ee2Skarels .set HK_da,6 /* disk address */ 27d5f12ee2Skarels .set HK_cs2,8 /* control and status */ 28d5f12ee2Skarels .set HK_dc,020 /* desired cylinder */ 294b71a845Ssam .set HKBPSECT,512 /* bytes per sector */ 304b71a845Ssam .set HK_GO,1 /* go bit */ 314b71a845Ssam .set HK_PACK,2 /* pack acknowledge */ 324b71a845Ssam .set HK_RCOM,020 /* read command */ 334b71a845Ssam .set HK_SEL7,02000 /* select RK07 disk */ 344b71a845Ssam .set HK_pRDY,7 /* position of ready bit */ 354b71a845Ssam .set HK_pERR,15 /* position of error bit */ 364b71a845Ssam 374b71a845Ssam init: 384b71a845Ssam /* r9 UBA address */ 39d5f12ee2Skarels /* r8 HK addr */ 404b71a845Ssam .word 0 /* entry mask for dec monitor */ 414b71a845Ssam nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ 424b71a845Ssam nop;nop; 43d5f12ee2Skarels movl $MAJOR,r10 /* major("/dev/xx0a") */ 44d5f12ee2Skarels extzv $18,$1,r1,r9 /* get UBA number from R1 */ 45d5f12ee2Skarels xorb2 $0x01,r9 /* complement bit */ 46d5f12ee2Skarels insv r9,$24,$8,r10 /* set UBA number */ 47d5f12ee2Skarels insv r3,$16,$8,r10 /* drive number */ 48d5f12ee2Skarels extzv $12,$4,r5,r4 /* get partition from r5 */ 49d5f12ee2Skarels bicw2 $0xf000,r5 /* remove from r5 */ 50d5f12ee2Skarels insv r4,$8,$8,r10 /* set partition */ 51d5f12ee2Skarels movl r5,r11 /* boot flags */ 52*8f26171aSkarels brw start0 53*8f26171aSkarels 54*8f26171aSkarels /* 55*8f26171aSkarels * Leave space for pack label. 56*8f26171aSkarels */ 57*8f26171aSkarels pad: 58*8f26171aSkarels .space LABELOFFSET - (pad - init) 59*8f26171aSkarels packlabel: 60*8f26171aSkarels .space d_end_ 61*8f26171aSkarels 62*8f26171aSkarels start0: 63d5f12ee2Skarels movl physUBA[r9],r9 /* UNIBUS adaptor address */ 64d5f12ee2Skarels movl r2,r8 /* boot device CSR */ 65d5f12ee2Skarels movl r3,r7 /* unit number */ 66d5f12ee2Skarels 67d5f12ee2Skarels /* select unit, init rk611, set vv in drive; if any errors, give up */ 68d5f12ee2Skarels movw r7,HK_cs2(r8) 69d5f12ee2Skarels movw $HK_SEL7+HK_GO,HK_cs1(r8) 704b71a845Ssam 1: 71d5f12ee2Skarels movw HK_cs1(r8),r0 724b71a845Ssam bbc $HK_pRDY,r0,1b 734b71a845Ssam bbs $HK_pERR,r0,9f 74d5f12ee2Skarels movw $HK_SEL7+HK_PACK+HK_GO,HK_cs1(r8) 754b71a845Ssam 1: 76d5f12ee2Skarels movw HK_cs1(r8),r0 774b71a845Ssam bbc $HK_pRDY,r0,1b 784b71a845Ssam bbc $HK_pERR,r0,start 794b71a845Ssam 9: 804b71a845Ssam halt 814b71a845Ssam /* relocate to high core */ 824b71a845Ssam start: 834b71a845Ssam movl r5,r11 /* boot flags */ 844b71a845Ssam movl $RELOC,sp 854b71a845Ssam moval init,r6 864b71a845Ssam movc3 $end,(r6),(sp) 874b71a845Ssam jmp *$RELOC+start2 884b71a845Ssam /* now running relocated */ 894b71a845Ssam /* bring in the boot program */ 904b71a845Ssam .set PROGSIZE,(BOOTSIZE*HKBPSECT) 914b71a845Ssam start2: 92d5f12ee2Skarels movw $0,HK_dc(r8) 93d5f12ee2Skarels movw $1,HK_da(r8) 94d5f12ee2Skarels movw $-PROGSIZE/2,HK_wc(r8) 954b71a845Ssam clrl r0 964b71a845Ssam 1: 97*8f26171aSkarels /* bisl3 $0x80000000,r0,UBA_MAP(r9) */ 98*8f26171aSkarels /* addl2 $4,r9 */ 99*8f26171aSkarels /* aobleq $BOOTSIZE,r0,1b */ 100d5f12ee2Skarels clrw HK_ba(r8) 101d5f12ee2Skarels movw $HK_SEL7+HK_RCOM+HK_GO,HK_cs1(r8) 1024b71a845Ssam hkrdy: 103d5f12ee2Skarels movw HK_cs1(r8),r0 1044b71a845Ssam bbc $HK_pRDY,r0,hkrdy 1054b71a845Ssam bbs $HK_pERR,r0,hkerr 1064b71a845Ssam brw done 1074b71a845Ssam hkerr: 1084b71a845Ssam halt /* ungraceful */ 1094b71a845Ssam done: 1104b71a845Ssam movl $PROGSIZE,r3 1114b71a845Ssam clrcor: 1124b71a845Ssam clrq (r3) 1134b71a845Ssam acbl $RELOC,$8,r3,clrcor 1144b71a845Ssam /* start loaded program */ 1154b71a845Ssam calls $0,*$0 1164b71a845Ssam brw start2 1174b71a845Ssam physUBA: 118d5f12ee2Skarels .long 0xf30000 /* uba0 */ 119d5f12ee2Skarels .long 0xf32000 /* uba1 */ 1204b71a845Ssam end: 121