SysIII/usr/src/uts/vax/ml/start.s
# Initialization
#
# IPL == 1F
# MAPEN == off
# SCBB, PCBB not set
# SBR, SLR not set
# ISP, KSP not set
#
.set MCKVEC,4 # offset into Scbbase of machine check vector
.globl start
start:
.word 0x0000
mtpr $HIGH,$IPL # no interrupts yet
mtpr $Scbbase,$SCBB # set SCBB
mtpr $_Sysmap,$SBR # set SBR
mtpr $Syssize,$SLR # set SLR
mtpr $_Sysmap,$P0BR # set temp P0BR
mtpr $Syssize,$P0LR # set temp P0LR
movl $ispstend,sp # set ISP
# initialize i/o adatpers
movl $1,PHYSMBA0+4 # init
movl $4,PHYSMBA0+4 # interrupt enable
movl $1,PHYSMBA1+4 # init
movl $4,PHYSMBA1+4 # interrupt enable
movl $1,PHYSUBA+4 # init
movl $0x78,PHYSUBA+4 # interrupt enable
#
# Setup restart parameter block
#
moval Rpbbase,r6
movl $Rpbbase-0x80000000,RPB_BASE(r6)
movl $restart-0x80000000,RPB_RESTART(r6)
clrl RPB_CHKSUM(r6)
moval restart,r0
movl $0x1f,r1
chksum:
addl2 (r0)+,RPB_CHKSUM(r6)
sobgtr r1,chksum
clrl RPB_FLAG(r6)
movl Scbbase+MCKVEC,r5 # save machine check entry
movab startint+ISTK,Scbbase+MCKVEC # set new vector address
#
# will now see how much memory there really is
# in 64kb chunks, save number of bytes in r7
#
mtpr $HIGH-1,$IPL # allow machine check interrupts
clrl r7
startlp:
tstl (r7) # this chunk really there?
acbl $8096*1024-1,$64*1024,r7,startlp # loop til machine check
brb startint # full load of memory, avoid .align
.align 2
startint:
mtpr $0,$SBIFS # clear sbi fault status
movl r5,Scbbase+MCKVEC # restore machine check vector
movl $ispstend,sp # reset ISP
# clear memory starting with unitialized data (kernal)
movab _edata,r6
movab _end+8096,r5 # clear uninitialized data and some slop
strtclr:
clrq (r6)
acbl r5,$8,r6,strtclr
#
# initialize system page table
#
movab _etext+511,r1 # end of kernal text segment
bbcc $31,r1,strt1 # turn off high order bit
strt1:
ashl $-9,r1,r1 # last page of kernal text
clrl r2 # point at first kernal text page
strtlp1:
bisl3 $PG_V|PG_KR,r2,_Sysmap[r2] # initialize page table entry
aoblss r1,r2,strtlp1 # fill text entries
movab _end+511,r1 # end of kernal data segment
bbcc $31,r1,strt2 # turn off high order bit
strt2:
ashl $-9,r1,r1 # last page of kernal data
strtlp2:
bisl3 $PG_V|PG_KW,r2,_Sysmap[r2] # fill data entries
aoblss r1,r2,strtlp2
# init i/o space page table entries
movl $PHYSUBA/512,r1 # page frame number for uba
movab uba_pte,r2 # page table address
movab 15(r1),r3 # last pt entry
strtlp3:
bisl3 $PG_V|PG_KW,r1,(r2)+ # init pt entry
aobleq r3,r1,strtlp3
movl $PHYSUMEM/512,r1
movab umem_pte,r2 # page table address
movab 15(r1),r3 # limit
strtlp4:
bisl3 $PG_V|PG_KW,r1,(r2)+
aobleq r3,r1,strtlp4
movl $PHYSMBA0/512,r1
movab mba0_pte,r2
movab 15(r1),r3
strtlp5:
bisl3 $PG_V|PG_KW,r1,(r2)+
aobleq r3,r1,strtlp5
movl $PHYSMBA1/512,r1
movab mba1_pte,r2
movab 15(r1),r3
strtlp6:
bisl3 $PG_V|PG_KW,r1,(r2)+
aobleq r3,r1,strtlp6
mtpr $1,$TBIA # invalidate all trans buffer entries
mtpr $1,$MAPEN # turn on memory mapping
jmp *$startmap # put system virtual address in pc
startmap:
# set maxmem = btoc(r7)
ashl $-9,r7,_maxmem
movl _maxmem,_physmem
movl _maxmem,_freemem
#
# Setup context for proc[0] == Scheduler
#
# address first page past _end
# this will be u area for proc[0].
# initialize u area page table entries.
# initialize (slightly) the pcb.
movab _end+511,r6
bicl2 $0x1ff,r6 # make page boundary
# set up u area page table
bbcc $31,r6,strt3
strt3:
ashl $-9,r6,r3 # r3 = btoc(r6)
bisl3 $PG_V|PG_KW,r3,_Sysmap+u_ptoffset # init first u pt entry
movab _u,r1 # point at _u area
mtpr r1,$TBIS
movab usize*512(r1),PCB_KSP(r1) # init ksp
mnegl $1,PCB_ESP(r1) # invalidate esp
mnegl $1,PCB_SSP(r1) # invalidate ssp
movl $0x80000000,PCB_USP(r1) # set user sp
movab _u+usize*512,PCB_P0BR(r1) # p0 page table pointer
clrl PCB_P0LR(r1) # size zero page table
movb $4,PCB_P0LR+3(r1) # disable ast
movab _u+(usize+1)*512-0x800000,PCB_P1BR(r1) # p1 page table pointer
movl $0x200000,PCB_P1LR(r1) # invalid p1 p t length
movl $1,PCB_SZPT(r1) # init number pages usr page table
addl3 $usize,r3,PCB_SZPT+4(r1) # store into u.u_ptable[0]
movl $1,r2
strt5:
incl r3
bisl3 $PG_V|PG_KW,r3,_Sysmap+u_ptoffset[r2]
addl2 $512,r1
mtpr r1,$TBIS
aoblss $usize,r2,strt5
mtpr r6,$PCBB # first pcb
ldpctx # set regs, p0br, p0lr, p1br, p1lr,
# astlvl, ksp, and change to kernal mode
addl2 $8,sp # pop dummy pc, psl
mtpr $0,$IPL # enable interrupts
movab _end+511,r0 # calculate firstaddr
bbcc $31,r0,strt4
strt4:
ashl $-9,r0,-(sp) # convert to clicks and stack
calls $1,_main # startup, fork off /etc/init
#
# proc[1] == /etc/init now running here.
# execute code at location 0, in user mode.
#
pushl $PSL_CURMOD|PSL_PRVMOD # psl, user mode, ipl= 0
pushl $0 # pc, $location 0
rei # do /etc/init