diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2011-09-27 15:15:36 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2011-09-27 15:15:36 +0000 |
commit | a0d563a0542570d0173bdc746038ace23eae3c17 (patch) | |
tree | 6ed9138300ffbe31829d2354b3f8ad6ac6605250 | |
parent | 217f55d7f0d5a0a6a0178df5003192a72cd4adfc (diff) |
Try to put more sanity in the machine check handling:
- only handle a machine check as caused by badaddr() if the local `memtest'
variable is nonzero, instead of abusing `cold'. And be sure to clear
`memtest' upon returning from badaddr, of course.
- do not write to the MCESR register on microVAX II and SOC processors, as
this register is not implemented on those models.
- get rid of the `write the SBIFS and EHSR registers depending upon the
cpu model' chunk, since these only matter on true 11/780 and 86x0 models,
support for which has been removed recently.
-rw-r--r-- | sys/arch/vax/vax/genassym.cf | 3 | ||||
-rw-r--r-- | sys/arch/vax/vax/locore.S | 38 |
2 files changed, 19 insertions, 22 deletions
diff --git a/sys/arch/vax/vax/genassym.cf b/sys/arch/vax/vax/genassym.cf index 0caf8adc02c..f73ca305bf3 100644 --- a/sys/arch/vax/vax/genassym.cf +++ b/sys/arch/vax/vax/genassym.cf @@ -1,4 +1,4 @@ -# $OpenBSD: genassym.cf,v 1.10 2008/08/18 23:05:38 miod Exp $ +# $OpenBSD: genassym.cf,v 1.11 2011/09/27 15:15:35 miod Exp $ # $NetBSD: genassym.cf,v 1.10 1999/11/19 22:09:55 ragge Exp $ # # Copyright (c) 1997 Ludd, University of Lule}, Sweden. @@ -112,4 +112,5 @@ member ec_count export SYS_sigreturn export SYS_exit +export VAX_TYP_SOC export VAX_TYP_UV2 diff --git a/sys/arch/vax/vax/locore.S b/sys/arch/vax/vax/locore.S index ce3eba0e020..683e3c32514 100644 --- a/sys/arch/vax/vax/locore.S +++ b/sys/arch/vax/vax/locore.S @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.S,v 1.5 2010/12/21 14:56:24 claudio Exp $ */ +/* $OpenBSD: locore.S,v 1.6 2011/09/27 15:15:35 miod Exp $ */ /* $NetBSD: intvec.s,v 1.39 1999/06/28 08:20:48 itojun Exp $ */ /* @@ -150,11 +150,11 @@ _rpb: # # mcheck is the badaddress trap, also called when referencing # a invalid address (busserror) -# _memtest (memtest in C) holds the address to continue execution -# at when returning from a intentional test. +# memtest holds the address to continue execution at when returning +# from a intentional test. # mcheck: .globl mcheck - tstl _cold # Are we still in coldstart? + tstl _ASM_LABEL(memtest) # Are we expecting a machine check? bneq L4 # Yes. pushr $0x7f @@ -173,20 +173,14 @@ mcheck: .globl mcheck rei L4: addl2 (sp)+,sp # remove info pushed on stack - cmpl _vax_cputype,$1 # Is it a 11/780? - bneq 1f # No... - - mtpr $0, $PR_SBIFS # Clear SBI fault register - brb 2f - -1: cmpl _vax_cputype,$4 # Is it a 8600? - bneq 3f - - mtpr $0, $PR_EHSR # Clear Error status register - brb 2f - -3: mtpr $0xF,$PR_MCESR # clear the bus error bit -2: movl _memtest,(sp) # REI to new address + # Clear the machine check condition by writing to the + # MCESR register if available. + cmpl $VAX_TYP_UV2, _C_LABEL(vax_cputype) + beql 2f + cmpl $VAX_TYP_SOC, _C_LABEL(vax_cputype) + beql 2f + mtpr $0,$PR_MCESR # clear the bus error bit +2: movl _ASM_LABEL(memtest),(sp) # REI to new address rei TRAPCALL(invkstk, T_KSPNOTVAL) @@ -500,7 +494,7 @@ ENTRY_NOPROFILE(badaddr,R2|R3) # Called with addr,b/w/l movl 8(ap),r1 # Sec arg, b,w,l pushl r0 # Save old IPL clrl r3 - movab 4f,_memtest # Set the return address + movab 4f,_ASM_LABEL(memtest) # Set the return address caseb r1,$1,$4 # What is the size 1: .word 1f-1b @@ -518,7 +512,8 @@ ENTRY_NOPROFILE(badaddr,R2|R3) # Called with addr,b/w/l brb 5f 4: incl r3 # Got machine chk => addr bad -5: mtpr (sp)+,$0x12 +5: clrl _ASM_LABEL(memtest) # do not ignore further mchk + mtpr (sp)+,$0x12 movl r3,r0 ret @@ -721,6 +716,7 @@ ENTRY_NOPROFILE(copystr,0) # .data -_memtest: .long 0 ; .globl _memtest # Memory test in progress. +_ASM_LABEL(memtest): # badaddr() in progress + .long 0 pcbtrap: .long 0x800001fc; .globl pcbtrap # Safe place _bootdev: .long 0; .globl _bootdev |