SysIII/usr/src/uts/vax/ml/start.s

Compare this file to the similar file:
Show the results in this format:

# 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