145347268Smckusick /* 267c3a6e4Smckusick * Copyright (c) 1980, 1986 Regents of the University of California. 345347268Smckusick * All rights reserved. The Berkeley software License Agreement 445347268Smckusick * specifies the terms and conditions for redistribution. 545347268Smckusick */ 645347268Smckusick 7*785337c1Skarels /* "@(#)upboot.c 7.3 (Berkeley) 02/21/87" */ 88f26171aSkarels #include <sys/disklabel.h> 9d5f12ee2Skarels 10d5f12ee2Skarels .set MAJOR,2 /* major("/dev/up0a") */ 11482a8a1dSsam 12482a8a1dSsam /* 13482a8a1dSsam * UP 1st level boot program: loads next 7.5Kbytes from 14482a8a1dSsam * boot sector of file system and sets it up to run. 15482a8a1dSsam * Always reads from drive 0. 16482a8a1dSsam */ 17482a8a1dSsam .set BOOTSIZE,15 /* size of boot in sectors */ 18482a8a1dSsam .set RELOC,0x50000 19482a8a1dSsam .set UPBPSECT,512 /* bytes per sector */ 20482a8a1dSsam /* UBA registers */ 21482a8a1dSsam .set UBA_CNFGR,0 /* UBA configuration register */ 22482a8a1dSsam .set UBA_CR,4 /* UBA control register offset */ 23482a8a1dSsam .set UBA_MAP,0x800 /* UBA offset to map reg's */ 24482a8a1dSsam /* UP registers and bits */ 25d5f12ee2Skarels .set UP_cs1,0 /* control and status */ 26d5f12ee2Skarels .set UP_wc,2 /* word count */ 27d5f12ee2Skarels .set UP_ba,4 /* bus address */ 28d5f12ee2Skarels .set UP_da,6 /* disk address */ 29d5f12ee2Skarels .set UP_cs2,010 /* cs2 register */ 30d5f12ee2Skarels .set UP_of,032 /* offset register */ 31d5f12ee2Skarels .set UP_dc,034 /* desired cylinder */ 32d5f12ee2Skarels .set UP_hr,036 /* holding register */ 33482a8a1dSsam .set UP_GO,1 /* go bit */ 34482a8a1dSsam .set UP_PACK,022 /* pack acknowledge */ 35482a8a1dSsam .set UP_DCLR,010 /* drive clear */ 36482a8a1dSsam .set UP_PRESET,020 /* read-in-preset */ 37482a8a1dSsam .set UP_RCOM,070 /* read command */ 38482a8a1dSsam .set UPCS2_CLR,040 39482a8a1dSsam .set UP_pRDY,7 /* position of ready bit */ 40482a8a1dSsam .set UP_pERR,15 /* position of error bit */ 41482a8a1dSsam .set UP_FMT22,010000 42482a8a1dSsam 43482a8a1dSsam init: 44d5f12ee2Skarels /* r9 UBA address */ 45d5f12ee2Skarels /* r8 UP addr */ 46482a8a1dSsam .word 0 /* entry mask for dec monitor */ 47482a8a1dSsam nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ 48482a8a1dSsam nop;nop; 49d5f12ee2Skarels movl $MAJOR,r10 /* major("/dev/xx0a") */ 50d5f12ee2Skarels extzv $18,$1,r1,r9 /* get UBA number from R1 */ 51d5f12ee2Skarels xorb2 $0x01,r9 /* complement bit */ 52d5f12ee2Skarels insv r9,$24,$8,r10 /* set UBA number */ 53d5f12ee2Skarels insv r3,$16,$8,r10 /* drive number */ 54d5f12ee2Skarels extzv $12,$4,r5,r4 /* get partition from r5 */ 55d5f12ee2Skarels bicw2 $0xf000,r5 /* remove from r5 */ 56d5f12ee2Skarels insv r4,$8,$8,r10 /* set partition */ 57d5f12ee2Skarels movl r5,r11 /* boot flags */ 588f26171aSkarels 59*785337c1Skarels movl r2,r8 /* boot device CSR */ 608f26171aSkarels brw start0 618f26171aSkarels 628f26171aSkarels /* 638f26171aSkarels * Leave space for pack label. 648f26171aSkarels */ 658f26171aSkarels pad: 668f26171aSkarels .space LABELOFFSET - (pad - init) 678f26171aSkarels packlabel: 688f26171aSkarels .space d_end_ 698f26171aSkarels 708f26171aSkarels start0: 71d5f12ee2Skarels movl physUBA[r9],r9 /* UNIBUS adaptor address */ 72d5f12ee2Skarels movl r3,r7 /* unit number */ 73d5f12ee2Skarels movl $RELOC,sp 74d5f12ee2Skarels moval init,r4 75d5f12ee2Skarels movc3 $end,(r4),(sp) 76d5f12ee2Skarels /* init up, set vv in drive; if any errors, give up */ 77*785337c1Skarels /* probably unneeded: rom should have already done this */ 78d5f12ee2Skarels bisw3 r7,$UPCS2_CLR,UP_cs2(r8) 79d5f12ee2Skarels movw $UP_DCLR+UP_GO,UP_cs1(r8) 80d5f12ee2Skarels movw $UP_PRESET+UP_GO,UP_cs1(r8) 81d5f12ee2Skarels movw $UP_FMT22,UP_of(r8) 82482a8a1dSsam 1: 83d5f12ee2Skarels movw UP_cs1(r8),r0 84482a8a1dSsam bbc $UP_pRDY,r0,1b 85482a8a1dSsam /* relocate to high core */ 86482a8a1dSsam start: 87482a8a1dSsam movl $RELOC,sp 88482a8a1dSsam moval init,r6 89482a8a1dSsam movc3 $end,(r6),(sp) 90482a8a1dSsam jmp *$RELOC+start2 91482a8a1dSsam /* now running relocated */ 92482a8a1dSsam .set PROGSIZE,(BOOTSIZE*UPBPSECT) 93482a8a1dSsam start2: 94d5f12ee2Skarels movw $0,UP_dc(r8) 95d5f12ee2Skarels movw $1,UP_da(r8) 96d5f12ee2Skarels movw $-PROGSIZE/2,UP_wc(r8) 97482a8a1dSsam clrl r0 98482a8a1dSsam 1: 99482a8a1dSsam bisl3 $0x80000000,r0,UBA_MAP(r9) 100482a8a1dSsam addl2 $4,r9 101482a8a1dSsam aobleq $BOOTSIZE,r0,1b 102d5f12ee2Skarels clrw UP_ba(r8) 103d5f12ee2Skarels movw $UP_RCOM+UP_GO,UP_cs1(r8) 104482a8a1dSsam uprdy: 105d5f12ee2Skarels movw UP_cs1(r8),r0 106482a8a1dSsam bbc $UP_pRDY,r0,uprdy 107482a8a1dSsam clear: 108482a8a1dSsam movl $PROGSIZE,r3 109482a8a1dSsam clrcor: 110482a8a1dSsam clrq (r3) 111482a8a1dSsam acbl $RELOC,$8,r3,clrcor 112482a8a1dSsam /* run loaded program */ 113482a8a1dSsam calls $0,*$0 114482a8a1dSsam brw start2 115482a8a1dSsam physUBA: 116d5f12ee2Skarels .long 0xf30000 /* uba0 */ 117d5f12ee2Skarels .long 0xf32000 /* uba1 */ 118482a8a1dSsam end: 119