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