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