⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 locore.s

📁 著名的AT&T UNIX v6 源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.set	HIGH,31		# mask for total disable	.set	MCKVEC,4	# offset into Scbbase of machine check vector# Trap vectors and C interface for Vax#### System control block#	.set	INTSTK,1	# handle this interrupt on the interrupt stack	.set	HALT,3		# halt if this interrupt occurs	.align	9	.globl	ScbbaseScbbase:	.long	Xrandom + HALT	# unused	.long	Xmachcheck + HALT	# machine check interrupt	.long	Xkspnotval + HALT	# kernal stack not valid	.long	Xpowfail + HALT	# power fail	.long	Xprivinflt	# privileged instruction 	.long	Xxfcflt		# xfc instruction 	.long	Xresopflt	# reserved operand 	.long	Xresadflt	# reserved addressing 	.long	Xprotflt	# protection 	.long	Xsegflt		# segmentation 	.long	Xtracep		# trace pending	.long	Xbptflt		# bpt instruction	.long	Xcompatflt	# compatibility mode fault	.long	Xarithtrap	# arithmetic trap	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xsyscall	# chmk	.long	Xchme+HALT		# chme	.long	Xchms+HALT		# chms	.long	Xchmu+HALT		# chmu	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# software level 1	.long	Xrandom + HALT	# software level 2 (asts)	.long	Xresched	# reschedule nudge	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unusedubabase:	.long	Xclockint + INTSTK	# clock	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xconsrint + INTSTK	# console receiver 	.long	Xconsxint + INTSTK	# console transmitter#	I/O vectors# IPL 14	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xua0int + INTSTK	# UBA 0 br4	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused# IPL 15	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xua0int + INTSTK	# UBA 0 br5	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xmba0int + INTSTK	# mass bus adapter 0	.long	Xmba1int + INTSTK	# mass bus adapter 1	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused# IPL 16	.long	Xrandom + HALT		# unused	.long	Xrandom + HALT		# unused	.long	Xrandom + HALT		# unused	.long	Xua0int + INTSTK	# UBA 0 br6	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused# IPL 17	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused	.long	Xrandom + HALT	# unused#  0x200# Produce a core image dump on mag tape	.globl	doadumpdoadump:	movl	sp,dumpstack	# save stack pointer	movab	dumpstack,sp	# reinit stack	mfpr	$PCBB,-(sp)	# save u-area pointer	mfpr	$MAPEN,-(sp)	# save value	mfpr	$IPL,-(sp)	# ...	mtpr	$0,$MAPEN		# turn off memory mapping	mtpr	$HIGH,$IPL		# disable interrupts	pushr	$0x3fff			# save regs 0 - 13	calls	$0,_dump	# produce dump	halt	.data	.align	2	.globl	dumpstack	.space	58*4		# seperate stack for tape dumpsdumpstack: 	.space	4	.text# I/O interrupt vector routines## Catch random or unexpected interrupts	.align	2Xrandom:Xmachcheck:Xkspnotval:Xpowfail:Xchme:Xchms:Xchmu:	halt# Massbus 0 adapter interrupts	.align	2Xmba0int:	pushr	$0x3f		# save r0 - r5	movab	MBA0_CSR,r0	# point at mba regs	movl	MBA_AS(r0),r1		# get attn summary bits	cvtwl	r1,-(sp)		# push attn summary as arg	pushl	MBA_SR(r0)	# pass sr as argument	mnegl	$1,MBA_SR(r0)	# clear attention bit	calls	$2,_hpintr	# call rp06 interrupt dispatcher	brw 	int_ret		# merge with common interrupt code# Massbus 1 adapter interrupts	.align	2Xmba1int:	pushr	$0x3f	movab	MBA1_CSR,r0	pushl	MBA_AS(r0)	mnegl	$1,MBA_AS(r0)	pushl	MBA_SR(r0)		# pass cr as argument_	mnegl	$1,MBA_SR(r0)	# clear attention bit	calls	$2,_htintr	# call te16 interrupt dispatcher	brw 	int_ret		# return from interrupt# Unibus adapter interrupts	.align	2Xua0int:	#  UBA 0 interrupts	pushr	$0x3f  #  save regs 0-5	pushab	UBA0  # save UBA base addr	brb	Xuacom  #  jump to common codeXua1int :	#  UBA 1 interruptsXuacom :	#  common code for UBA interrupts	popr	$1		# UBA base addr	mfpr	$IPL,r2		# get br level	movl	UBR_OFF-20*4(r0)[r2],r3	# get unibus device vector	bleq	ubasrv  # branch if zero vector or UBA service required#  normal UBA interrupt point - device on a UBA has generated an#    interrupt - r3 holds interrupt vectorubanorm :	movl	_UNIvec(r3),r1  #  get interrupt service routine address#			and controller code from UNIBUS vector area	extzv	$27,$4,r1,-(sp)  #  controller code is in 4 most#				significant bits-1 of ISR addr	bicl2	$0x78000000,r1  #  clear code	calls	$1,(r1)  #  call ISR	brw	int_ret  #  go to common interrupt return#  here for zero or negative UBA interrupt vector.#  negative vector -> UBA requires serviceubasrv :	beql	ubapass##  UBA service required#  The following 'printf' calls should probably be replaced#    with calls to an error logger and/or some corrective action.	bitl	$CFGFLT,UCN_OFF(r0)  #  any SBI faults ?	beql	UBAflt	pushr	$0xf  #  save regs 0-3	pushab	SBImsg	calls	$1,_printf	popr	$0xf	halt##  no SBI fault bits set in UBA config reg - must be#    some error bits set in UBA status regUBAflt :	movl	UST_OFF(r0),r2  #  UBA status reg	pushr	$0xf  #  save regs 0-3	pushr	r2	pushab	UBAmsg	calls	$2,_printf	popr	$0xf	movl	r2,UST_OFF(r0)  #  clear error bits	bicl2	$0x80000000,r1  #  clear neg bit in vector	bneq	ubanorm  #  branch if normal UBA interrupt to process	brb 	int_ret		# restore regs and return##  zero interrupt vector - print message & continueubapass :	pushr	$0xf	pushab	ZERmsg	calls	$1,_printf	popr	$0xf	brb	int_ret# Console receiver interrupt	.align	2Xconsrint:	pushr	$0x3f		# save registers 0 - 5	calls	$0,_consrint	brb 	int_ret		# merge# Console transmit interrupt	.align	2Xconsxint:	pushr	$0x3f		# save registers 0 - 5	calls	$0,_consxint	brb 	int_ret# Clock interrupt	.align	2Xclockint:	pushr	$0x3f		# save regs 0 - 5	pushl	4+6*4(sp)	# push psl	pushl	4+6*4(sp)	# push pc	calls	$2,_clock	brb 	int_ret## Common code for interrupts# At this point, the interrupt stack looks like:##		 ___________#		|    r0     | :isp#		|-----------|#		|    ...    |#		|-----------|#		|    r5     |#		|-----------|#		|    pc     |#		|-----------|#		|    psl    |#		|___________|int_ret:	bbssi	$0,idleflag,int_r0		# set idle escape flag (no wait instr)int_r0:	popr	$0x3f		# restore regs 0 - 5	bitl	$PSL_CURMOD,4(sp)	# interrupt from user mode?	beql	int_r1		# no, from kernal, just rei	tstb	_runrun		# should we reschedule?	beql	int_r1		# no, just rei## If here, interrupt from user mode, and time to reschedule.#	to do this, we set a software level 3 interrupt to#	change to kernal mode, switch stacks,#	and format kernal stack for a `qswitch' trap to force#	a reschedule.#	mtpr	$0x18,$IPL	# make sure int won't happen now	mtpr	$3,$SIRR	# request level 3 software interruptint_r1:	rei 			# return to interrupted process## Trap and fault vector routines##	Reschedule trap (Software level 3 interrupt)	.align	2Xresched:	movpsl	-(sp)	# get ps	bicl2	$PSL_IPL,(sp)	# lower ipl	pushab	resc1		# push pc	rei			# lower ipl, jump to resc1resc1:	pushl	$0			# dummy code	pushl	$RESCHED	# type	brb 	alltraps	# merge#	privileged instruction fault	.align	2Xprivinflt:	pushl	$0		# push dummy code	pushl	$PRIVINFLT	# push type	brb 	alltraps	# merge#	xfc instruction fault	.align	2Xxfcflt:	pushl	$0		# push dummy code value	pushl	$XFCFLT		# push type value	brb 	alltraps	# merge#	reserved operand fault	.align	2Xresopflt:	pushl	$0		# push dummy code value	pushl	$RESOPFLT	# push type value	brb 	alltraps	# merge#	reserved addressing mode fault	.align	2Xresadflt:	pushl	$0		# push dummy code value	pushl	$RESADFLT	# push type value	brb 	alltraps	# merge with common code#	bpt instruction fault	.align	2Xbptflt:	pushl	$0		# push dummy code value	pushl	$BPTFLT		# push type value	brb 	alltraps	# merge with common code#	Compatibility mode fault	.align	2Xcompatflt:	pushl	$COMPATFLT	# push type value	brb 	alltraps	#merge with common code#	Trace trap	.align	2Xtracep:	pushl	$0		# push dummy code value	pushl	$TRCTRAP	# push type value	brb 	alltraps	# go do it#	Arithmitic trap	.align	2Xarithtrap:	pushl	$ARITHTRAP	# push type value	brb 	alltraps	# merge with common code#	Protection  fault	.align	2Xprotflt:	blbs	(sp),Xsegflt		# check for pt length violation	addl2	$4,sp		# pop fault param word 	pushl	$PROTFLT	brb 	alltraps#	Segmentation fault	.align	2Xsegflt:	addl2	$4,sp	pushl	$SEGFLT	brb 	alltraps## CHMK trap (syscall trap)#	on entry, kernal stack:##		 ___________ #		|    code   | :ksp#		|-----------|#		|    pc     |#		|-----------|#		|    psl    |#		|___________|####	stack (parameters) at calls to _trap:##		 ___________ #		|    ap     | :ksp#		|-----------|#		|    r0     |#		|-----------|#		|    ...    |#		|-----------|#		|    r13    |#		|-----------|#		|    usp    |#		|-----------|#		|    type   |#		|-----------|#		|    code   |#		|-----------|#		|    pc     |#		|-----------|#		|    psl    |#		|___________|#	.align	2Xsyscall:	pushl	$SYSCALL	# push type valuealltraps:	movq	8(sp),_u+PCB_PC	# save pc	bitl	$PSL_CURMOD,12(sp)	# from user mode?	beql	sysc1		# no# Prepare arguments to _trap, note that type has already been pushed	mfpr	$USP,-(sp)	# get usp	pushr	$0x3fff		# registers 0 - 13	pushl	ap		# ptr to syscall parameters## Call _trap with wrong number of arguments#   so args not popped by ret#	calls	$1,_trap# Restore	popr	$0x3fff		# restore regs 0 - 13	mtpr	(sp)+,$USP	# restore usp	addl2	$8,sp		# pop type, code#	bitl	$PSL_CURMOD,4(sp)		# are we returning to user mode?	beql	sysc2		# no# Return	reisysc1:	movab	emsg1,eptr	# set message pointer	brb 	err_print	# print message and haltsysc2:	movab	emsg2,eptr	# pointer to error message	brb 	err_print	# print msg and halt## err_print#	print message on console and die#	message pointed to by eptr, terminated by zero byte.#err_print:	mtpr	$HIGH,$IPL	# disable all interrupts	mtpr	$0,$TXCS	# disable interrupts on console transmittereloop1:	mfpr	$TXCS,ewk1	# get transmitter status	bbc 	$TXCS_BRDY,ewk1,eloop1	# loop if not ready to transmit	tstb	*eptr		# end of message?	beql	eout		# yes, out of loop	movzbl	*eptr,ewk1	# get byte of message	incl	eptr		# bump pointer	mtpr	ewk1,$TXDB	# give byte to transmitter	brb 	eloop1		# loopeout:	halt	.dataeptr:	.long	0ewk1:	.long	0	.text## Initialization##	IPL == 1F#	MAPEN == off#	SCBB, PCBB not set#	SBR, SLR not set#	ISP, KSP not set#	.globl	startstart:	.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	$_intstack+2048,sp	# set ISP# initialize i/o adatpers	movl	$1,PHYSMBA0+4	# init & interrupt enable	movl	$4,PHYSMBA0+4	# init & interrupt enable	movl	$1,PHYSMBA1+4	# init  interrupt enable	movl	$4,PHYSMBA1+4	# init  interrupt enable	movl	$1,PHYSUBA+4	# init  interrupt enable	movl	$0x78,PHYSUBA+4	# init  interrupt enable	movl	Scbbase+MCKVEC,r5	# save machine check entry	movab	startint+INTSTK,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	r7startlp:	tstl	(r7)		# this chunk really there?	acbl	$8096*1024-1,$64*1024,r7,startlp	# loop till machine check	brb 	startint	# full load of memory, avoid .align	.align	2startint:	mtpr	$0,$SBIFS		# clear sbi fault status	movl	r5,Scbbase+MCKVEC	# restore machine check vector	movl	$_intstack+2048,sp	# reset interrupt stack pointer#	clear memory starting with unitialized data (kernal)	movab	_edata,r6	movab	_end+8096,r5	# clear uninitialized data and some slopstrtclr:	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 bitstrt1:	ashl	$-9,r1,r1	# last page of kernal text	clrl	r2		# point at first kernal text pagestrtlp1:	bisl3	$PG_V|PG_KR,r2,_Sysmap[r2]	# initialize page table entry

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -