1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 2006 Cavium Networks 7 * Cache error handler 8 */ 9 10#include <asm/asm.h> 11#include <asm/regdef.h> 12#include <asm/mipsregs.h> 13#include <asm/stackframe.h> 14 15/* 16 * Handle cache error. Indicate to the second level handler whether 17 * the exception is recoverable. 18 */ 19 LEAF(except_vec2_octeon) 20 21 .set push 22 .set mips64r2 23 .set noreorder 24 .set noat 25 26 27 /* due to an errata we need to read the COP0 CacheErr (Dcache) 28 * before any cache/DRAM access */ 29 30 rdhwr k0, $0 /* get core_id */ 31 PTR_LA k1, cache_err_dcache 32 sll k0, k0, 3 33 PTR_ADDU k1, k0, k1 /* k1 = &cache_err_dcache[core_id] */ 34 35 dmfc0 k0, CP0_CACHEERR, 1 36 sd k0, (k1) 37 dmtc0 $0, CP0_CACHEERR, 1 38 39 /* check whether this is a nested exception */ 40 mfc0 k1, CP0_STATUS 41 andi k1, k1, ST0_EXL 42 beqz k1, 1f 43 nop 44 j cache_parity_error_octeon_non_recoverable 45 nop 46 47 /* exception is recoverable */ 481: j handle_cache_err 49 nop 50 51 .set pop 52 END(except_vec2_octeon) 53 54 /* We need to jump to handle_cache_err so that the previous handler 55 * can fit within 0x80 bytes. We also move from 0xFFFFFFFFAXXXXXXX 56 * space (uncached) to the 0xFFFFFFFF8XXXXXXX space (cached). */ 57 LEAF(handle_cache_err) 58 .set push 59 .set noreorder 60 .set noat 61 62 SAVE_ALL 63 KMODE 64 jal cache_parity_error_octeon_recoverable 65 nop 66 j ret_from_exception 67 nop 68 69 .set pop 70 END(handle_cache_err) 71