1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /*
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2006 Cavium Networks
- * Cache error handler
- */
- #include <asm/asm.h>
- #include <asm/regdef.h>
- #include <asm/mipsregs.h>
- #include <asm/stackframe.h>
- /*
- * Handle cache error. Indicate to the second level handler whether
- * the exception is recoverable.
- */
- LEAF(except_vec2_octeon)
- .set push
- .set mips64r2
- .set noreorder
- .set noat
- /* due to an errata we need to read the COP0 CacheErr (Dcache)
- * before any cache/DRAM access */
- rdhwr k0, $0 /* get core_id */
- PTR_LA k1, cache_err_dcache
- sll k0, k0, 3
- PTR_ADDU k1, k0, k1 /* k1 = &cache_err_dcache[core_id] */
- dmfc0 k0, CP0_CACHEERR, 1
- sd k0, (k1)
- dmtc0 $0, CP0_CACHEERR, 1
- /* check whether this is a nested exception */
- mfc0 k1, CP0_STATUS
- andi k1, k1, ST0_EXL
- beqz k1, 1f
- nop
- j cache_parity_error_octeon_non_recoverable
- nop
- /* exception is recoverable */
- 1: j handle_cache_err
- nop
- .set pop
- END(except_vec2_octeon)
- /* We need to jump to handle_cache_err so that the previous handler
- * can fit within 0x80 bytes. We also move from 0xFFFFFFFFAXXXXXXX
- * space (uncached) to the 0xFFFFFFFF8XXXXXXX space (cached). */
- LEAF(handle_cache_err)
- .set push
- .set noreorder
- .set noat
- SAVE_ALL
- KMODE
- jal cache_parity_error_octeon_recoverable
- nop
- j ret_from_exception
- nop
- .set pop
- END(handle_cache_err)
|