hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 */
 
#include <linux/kernel.h>
#include <linux/printk.h>
#include <linux/ptrace.h>
 
#include <asm/reg.h>
#include <asm/cacheflush.h>
 
int machine_check_440A(struct pt_regs *regs)
{
   unsigned long reason = regs->dsisr;
 
   printk("Machine check in kernel mode.\n");
   if (reason & ESR_IMCP){
       printk("Instruction Synchronous Machine Check exception\n");
       mtspr(SPRN_ESR, reason & ~ESR_IMCP);
   }
   else {
       u32 mcsr = mfspr(SPRN_MCSR);
       if (mcsr & MCSR_IB)
           printk("Instruction Read PLB Error\n");
       if (mcsr & MCSR_DRB)
           printk("Data Read PLB Error\n");
       if (mcsr & MCSR_DWB)
           printk("Data Write PLB Error\n");
       if (mcsr & MCSR_TLBP)
           printk("TLB Parity Error\n");
       if (mcsr & MCSR_ICP){
           flush_instruction_cache();
           printk("I-Cache Parity Error\n");
       }
       if (mcsr & MCSR_DCSP)
           printk("D-Cache Search Parity Error\n");
       if (mcsr & MCSR_DCFP)
           printk("D-Cache Flush Parity Error\n");
       if (mcsr & MCSR_IMPE)
           printk("Machine Check exception is imprecise\n");
 
       /* Clear MCSR */
       mtspr(SPRN_MCSR, mcsr);
   }
   return 0;
}
 
#ifdef CONFIG_PPC_47x
int machine_check_47x(struct pt_regs *regs)
{
   unsigned long reason = regs->dsisr;
   u32 mcsr;
 
   printk(KERN_ERR "Machine check in kernel mode.\n");
   if (reason & ESR_IMCP) {
       printk(KERN_ERR "Instruction Synchronous Machine Check exception\n");
       mtspr(SPRN_ESR, reason & ~ESR_IMCP);
       return 0;
   }
   mcsr = mfspr(SPRN_MCSR);
   if (mcsr & MCSR_IB)
       printk(KERN_ERR "Instruction Read PLB Error\n");
   if (mcsr & MCSR_DRB)
       printk(KERN_ERR "Data Read PLB Error\n");
   if (mcsr & MCSR_DWB)
       printk(KERN_ERR "Data Write PLB Error\n");
   if (mcsr & MCSR_TLBP)
       printk(KERN_ERR "TLB Parity Error\n");
   if (mcsr & MCSR_ICP) {
       flush_instruction_cache();
       printk(KERN_ERR "I-Cache Parity Error\n");
   }
   if (mcsr & MCSR_DCSP)
       printk(KERN_ERR "D-Cache Search Parity Error\n");
   if (mcsr & PPC47x_MCSR_GPR)
       printk(KERN_ERR "GPR Parity Error\n");
   if (mcsr & PPC47x_MCSR_FPR)
       printk(KERN_ERR "FPR Parity Error\n");
   if (mcsr & PPC47x_MCSR_IPR)
       printk(KERN_ERR "Machine Check exception is imprecise\n");
 
   /* Clear MCSR */
   mtspr(SPRN_MCSR, mcsr);
 
   return 0;
}
#endif /* CONFIG_PPC_47x */