[8688] in Athena Bugs

home help back first fref pref prev next nref lref last post

sys/ca/trap.c: don't crash on power failure

daemon@ATHENA.MIT.EDU (John Carr)
Thu Nov 28 12:46:46 1991

To: bugs@Athena.MIT.EDU
Date: Thu, 28 Nov 91 12:46:54 EST
From: John Carr <jfc@Athena.MIT.EDU>


This patch to trap.c in the RT kernel makes the RT survive a brief power
failure by ignoring the power fail warning (I actually wait .1 seconds in
case there is a real power failure, so it is less likely that the system
will be writing the disk).

*** /source/bsd-4.3/rt/sys/ca/trap.c	Fri Jun 16 17:55:14 1989
--- trap.c	Thu Nov 28 12:40:23 1991
***************
*** 99,109 ****
  		(trdebug & SHOW_TRAP_REGS) ? locr0 : (int *)0));
  
  	switch (mcs_pcs) {
  	default:
  		if (mcs_pcs & MCS_CHECK) {	/* machine check */
! 			if (mcs_pcs & USER) {	/* machine check in user mode */
! 				printf("machine check in user mode ...\n");
  				prstate("machine check", mcs_pcs, info, locr0[IAR], ics_cs, locr0);
  				klsreset();	/* reinitialize keyboard */
  				klswait();	/* and wait until done */
  				printf("keyboard init done.\n");
--- 98,128 ----
  		(trdebug & SHOW_TRAP_REGS) ? locr0 : (int *)0));
  
  	switch (mcs_pcs) {
+ 	case MCS_CHECK:
+ 	case MCS_CHECK+USER:
+ 		printf("Unidentified machine check ignored.\n");
+ 		return;
+ 	case MCS_PMUC_CK+MCS_CHECK:
+ 	case MCS_PMUC_CK+MCS_CHECK+USER:
+ 		printf("machine check: Processor Channel Check\n");
+ 		prstate("machine check", mcs_pcs, info, locr0[IAR],
+ 			ics_cs, locr0);
+ 		return;
  	default:
  		if (mcs_pcs & MCS_CHECK) {	/* machine check */
! 			if (mcs_pcs & USER)	/* machine check in user mode */
! 				printf("machine check in user mode\n");
! 			else
! 				printf("machine check\n");
  			prstate("machine check", mcs_pcs, info, locr0[IAR], ics_cs, locr0);
+ 			if ((_csr & CSR_EPOW) && !(_csr & CSR_OHOH)) {
+ 				int s;
+ 				printf("power fail warning\n");
+ 				/* Wait a moment to see if it is a real
+ 				   power failure. */
+ 				DELAY(100000);
+ 				return;
+ 			} else if (mcs_pcs & USER) {
  				klsreset();	/* reinitialize keyboard */
  				klswait();	/* and wait until done */
  				printf("keyboard init done.\n");
***************
*** 816,823 ****
  register int ics_cs;
  {
  #ifdef IBMRTPC
! 	register int csr = *(int *)CSR;
! #endif IBMRTPC
  	register int mcs_pcs = mfsr(SCR_MCSPCS);
  	extern int ser;		/* saved ser */
  
--- 758,765 ----
  register int ics_cs;
  {
  #ifdef IBMRTPC
! 	register int csr = *(volatile int *)CSR;
! #endif
  	register int mcs_pcs = mfsr(SCR_MCSPCS);
  	extern int ser;		/* saved ser */
  

home help back first fref pref prev next nref lref last post