📄 locore.s
字号:
.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 + -