71 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | /* | ||
|  |  * 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) |