hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
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)