|
|
// "@(#) NEC cacherr.s 1.2 94/10/17 11:02:44"
// TITLE("Cache Error Handling") //++ // // Copyright (c) 1993-1994 Microsoft Corporation // // Module Name: // // cacherr.s // // Abstract: // // This module implements cache error handling. It is entered in KSEG1 // directly from the cache error vector wiht ERL set in the processor // state. // // N.B. All the code in this routine MUST run in KSEG1 and reference // data only in KSEG1 until which time as any cache errors have // been corrected. // // N.B. This routine is NOT COMPLETE. All cache errors result in a // soft reset. // // Environment: // // Kernel mode only. // // Revision History: // //--
#include "halmips.h"
// // Define local save area for register state. //
.data SavedAt:.space 4 // saved integer register at - a3 SavedV0:.space 4 // SavedV1:.space 4 // SavedA0:.space 4 // SavedA1:.space 4 // SavedA2:.space 4 // SavedA3:.space 4 //
SBTTL("Cache Error Handling") //++ // // VOID // HalpCacheErrorRoutine ( // VOID // ) // // Routine Description: // // This function is entered from the cache error vector executing // in KSEG1. If the error is a single bit ECC error in the second // level data cache or the error is in the primary instruction cache, // then the error is corrected and execution is continued. Otherwise, // a fatal system error has occured and control is transfered to the // soft reset vector. // // N.B. No state has been saved when this routine is entered. // // Arguments: // // None. // // Return Value: // // None. // //--
LEAF_ENTRY(HalpCacheErrorRoutine)
// // Save volatile registers needed to fix cache error. //
.set noreorder .set noat la k0,SavedAt // get address of register save area li k1,KSEG1_BASE // convert address of KSEG1 address or k0,k0,k1 // sw AT,0(k0) // save registers AT - a3 sw v0,4(k0) // sw v1,8(k0) // sw a0,12(k0) // sw a1,16(k0) // sw a2,20(k0) //
// // Get the current processor state and cache error register, and check // if the error can be corrected. //
mfc0 v0,psr // get current processor state mfc0 v1,cacheerr // get cache error state .set at .set reorder
// // ****** temp ****** // // The following code is temporary and will be removed when full cache // error support is included. // // ****** temp ****** //
b SoftReset // ****** all error soft rest
// // If the EXL bit is set in the processor state, then the error is not // recoverable because the EXL bit may be erroneously set (errata) and // it cannot be determined whether is should or should not be set, e.g., // the exact addresses ranges over which EXL might be correctly set are // not verifiable. Also, k0 and k1 are destroyed before they are saved // and are used by the exception handling code (there is no way to save // a register in noncached memory wihtout the use of a register). //
sll a0,v0,31 - PSR_EXL // shift EXL bit in sign bltz a0,SoftReset // if ltz, error not correctable
// // If the error occured on the SysAd bus, then the error is not correctable. //
sll a0,v1,31 - CACHEERR_EE // shift EE bit into sign bltz a0,SoftReset // if ltz, error not correctable
// // Determine whether the error is in the instruction or data cache. //
sll a0,v1,31 - CACHEERR_ER // shift ER bit into sign bgez a0,IcacheError // if gez, instruction cache error
// // The error occured in the data cache. // // If the error is a data error in the primary cache, then the error // is not correctable since the cache line dirty bit is included in // the parity calculation and therefore may be wrong. //
DcacheError: // sll a0,v1,31 - CACHEERR_EC // shift EC bit into sign bgez a0,SoftReset // if gez, error in primary cache b ExitError // exit error
// // The error occured in the instruction cache. // // If the error occured in the secondary data cache, then the error is not // correctable since there is not secondary instruciton cache. //
IcacheError: // sll a0,v1,31 - CACHEERR_EC // shift EC bit into sign bltz a0,SoftReset // if ltz, error in secondary cache
// // The cache error has been corrected - restore register state and continue // execution. //
ExitError: //
.set noreorder .set noat la k0,SavedAt // get address of register save area li k1,KSEG1_BASE // convert address of KSEG1 address or k0,k0,k1 // lw AT,0(k0) // restore registers AT - a3 lw v0,4(k0) // lw v1,8(k0) // lw a0,12(k0) // lw a1,16(k0) // lw a2,20(k0) // eret // .set at .set reorder
// // Cache error cannot be corrected - transfer control to soft reset vector. //
SoftReset: // la k0,SOFT_RESET_VECTOR // get address of soft reset vector j k0 // perform a soft reset
.end HalpCacheErrorRoutine
|