Blame view

arch/mips/mm/cex-oct.S 1.54 KB
5b3b16880   David Daney   MIPS: Add Cavium ...
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)