Path: blob/master/arch/powerpc/platforms/44x/machine_check.c
26481 views
// SPDX-License-Identifier: GPL-2.0-or-later1/*2*/34#include <linux/kernel.h>5#include <linux/printk.h>6#include <linux/ptrace.h>78#include <asm/reg.h>9#include <asm/cacheflush.h>1011int machine_check_4xx(struct pt_regs *regs)12{13unsigned long reason = regs->esr;1415if (reason & ESR_IMCP) {16printk("Instruction");17mtspr(SPRN_ESR, reason & ~ESR_IMCP);18} else19printk("Data");2021printk(" machine check in kernel mode.\n");2223return 0;24}2526int machine_check_440A(struct pt_regs *regs)27{28unsigned long reason = regs->esr;2930printk("Machine check in kernel mode.\n");31if (reason & ESR_IMCP){32printk("Instruction Synchronous Machine Check exception\n");33mtspr(SPRN_ESR, reason & ~ESR_IMCP);34}35else {36u32 mcsr = mfspr(SPRN_MCSR);37if (mcsr & MCSR_IB)38printk("Instruction Read PLB Error\n");39if (mcsr & MCSR_DRB)40printk("Data Read PLB Error\n");41if (mcsr & MCSR_DWB)42printk("Data Write PLB Error\n");43if (mcsr & MCSR_TLBP)44printk("TLB Parity Error\n");45if (mcsr & MCSR_ICP){46flush_instruction_cache();47printk("I-Cache Parity Error\n");48}49if (mcsr & MCSR_DCSP)50printk("D-Cache Search Parity Error\n");51if (mcsr & MCSR_DCFP)52printk("D-Cache Flush Parity Error\n");53if (mcsr & MCSR_IMPE)54printk("Machine Check exception is imprecise\n");5556/* Clear MCSR */57mtspr(SPRN_MCSR, mcsr);58}59return 0;60}6162#ifdef CONFIG_PPC_47x63int machine_check_47x(struct pt_regs *regs)64{65unsigned long reason = regs->esr;66u32 mcsr;6768printk(KERN_ERR "Machine check in kernel mode.\n");69if (reason & ESR_IMCP) {70printk(KERN_ERR "Instruction Synchronous Machine Check exception\n");71mtspr(SPRN_ESR, reason & ~ESR_IMCP);72return 0;73}74mcsr = mfspr(SPRN_MCSR);75if (mcsr & MCSR_IB)76printk(KERN_ERR "Instruction Read PLB Error\n");77if (mcsr & MCSR_DRB)78printk(KERN_ERR "Data Read PLB Error\n");79if (mcsr & MCSR_DWB)80printk(KERN_ERR "Data Write PLB Error\n");81if (mcsr & MCSR_TLBP)82printk(KERN_ERR "TLB Parity Error\n");83if (mcsr & MCSR_ICP) {84flush_instruction_cache();85printk(KERN_ERR "I-Cache Parity Error\n");86}87if (mcsr & MCSR_DCSP)88printk(KERN_ERR "D-Cache Search Parity Error\n");89if (mcsr & PPC47x_MCSR_GPR)90printk(KERN_ERR "GPR Parity Error\n");91if (mcsr & PPC47x_MCSR_FPR)92printk(KERN_ERR "FPR Parity Error\n");93if (mcsr & PPC47x_MCSR_IPR)94printk(KERN_ERR "Machine Check exception is imprecise\n");9596/* Clear MCSR */97mtspr(SPRN_MCSR, mcsr);9899return 0;100}101#endif /* CONFIG_PPC_47x */102103104