summaryrefslogtreecommitdiff
path: root/arch/mips/mm/cex-oct.S
blob: 3db8553fcd3442d190d0aa5a03890cc13337e85a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * 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)