[8688] in Athena Bugs
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 */