| /* | |
| * 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) |