^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Machine check exception handling CPU-side for power7 and power8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2013 IBM Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #undef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define pr_fmt(fmt) "mce_power: " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/extable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/pgtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/mmu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <asm/mce.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <asm/machdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <asm/pte-walk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <asm/sstep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/exception-64s.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <asm/extable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <asm/inst.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * Convert an address related to an mm to a PFN. NOTE: we are in real
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * mode, we could potentially race with page table updates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) pte_t *ptep, pte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) unsigned int shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) unsigned long pfn, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct mm_struct *mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) if (user_mode(regs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) mm = current->mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) mm = &init_mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ptep = __find_linux_pte(mm->pgd, addr, NULL, &shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) if (!ptep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) pfn = ULONG_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) pte = READ_ONCE(*ptep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) if (!pte_present(pte) || pte_special(pte)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) pfn = ULONG_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) if (shift <= PAGE_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) pfn = pte_pfn(pte);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned long rpnmask = (1ul << shift) - PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) pfn = pte_pfn(__pte(pte_val(pte) | (addr & rpnmask)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) return pfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* flush SLBs and reload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #ifdef CONFIG_PPC_BOOK3S_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) void flush_and_reload_slb(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* Invalidate all SLBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) slb_flush_all_realmode();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #ifdef CONFIG_KVM_BOOK3S_HANDLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * If machine check is hit when in guest or in transition, we will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * only flush the SLBs and continue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (get_paca()->kvm_hstate.in_guest)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if (early_radix_enabled())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * This probably shouldn't happen, but it may be possible it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * called in early boot before SLB shadows are allocated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) if (!get_slb_shadow())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) slb_restore_bolted_realmode();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static void flush_erat(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #ifdef CONFIG_PPC_BOOK3S_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) flush_and_reload_slb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) asm volatile(PPC_ISA_3_0_INVALIDATE_ERAT : : :"memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define MCE_FLUSH_SLB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define MCE_FLUSH_TLB 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define MCE_FLUSH_ERAT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static int mce_flush(int what)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #ifdef CONFIG_PPC_BOOK3S_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (what == MCE_FLUSH_SLB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) flush_and_reload_slb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (what == MCE_FLUSH_ERAT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) flush_erat();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) if (what == MCE_FLUSH_TLB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) tlbiel_all();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define SRR1_MC_LOADSTORE(srr1) ((srr1) & PPC_BIT(42))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) struct mce_ierror_table {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) unsigned long srr1_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) unsigned long srr1_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) bool nip_valid; /* nip is a valid indicator of faulting address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) unsigned int error_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) unsigned int error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) unsigned int error_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) unsigned int initiator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) unsigned int severity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) bool sync_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static const struct mce_ierror_table mce_p7_ierror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) { 0x00000000001c0000, 0x0000000000040000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) { 0x00000000001c0000, 0x0000000000080000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) { 0x00000000001c0000, 0x00000000000c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { 0x00000000001c0000, 0x0000000000100000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_INDETERMINATE, /* BOTH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { 0x00000000001c0000, 0x0000000000140000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) { 0x00000000001c0000, 0x0000000000180000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) { 0x00000000001c0000, 0x00000000001c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) { 0, 0, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static const struct mce_ierror_table mce_p8_ierror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) { 0x00000000081c0000, 0x0000000000040000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { 0x00000000081c0000, 0x0000000000080000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) { 0x00000000081c0000, 0x00000000000c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) { 0x00000000081c0000, 0x0000000000100000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) { 0x00000000081c0000, 0x0000000000140000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) { 0x00000000081c0000, 0x0000000000180000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) { 0x00000000081c0000, 0x00000000001c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) { 0x00000000081c0000, 0x0000000008000000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_IFETCH_TIMEOUT, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) { 0x00000000081c0000, 0x0000000008040000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) { 0, 0, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) static const struct mce_ierror_table mce_p9_ierror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { 0x00000000081c0000, 0x0000000000040000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { 0x00000000081c0000, 0x0000000000080000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { 0x00000000081c0000, 0x00000000000c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) { 0x00000000081c0000, 0x0000000000100000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) { 0x00000000081c0000, 0x0000000000140000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) { 0x00000000081c0000, 0x0000000000180000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) { 0x00000000081c0000, 0x00000000001c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH_FOREIGN, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) { 0x00000000081c0000, 0x0000000008000000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_IFETCH_TIMEOUT, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) { 0x00000000081c0000, 0x0000000008040000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) { 0x00000000081c0000, 0x00000000080c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) { 0x00000000081c0000, 0x0000000008100000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) { 0x00000000081c0000, 0x0000000008140000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_STORE, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) MCE_INITIATOR_CPU, MCE_SEV_FATAL, false }, /* ASYNC is fatal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) { 0x00000000081c0000, 0x0000000008180000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_STORE_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) MCE_INITIATOR_CPU, MCE_SEV_FATAL, false }, /* ASYNC is fatal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { 0x00000000081c0000, 0x00000000081c0000, true, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { 0, 0, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) static const struct mce_ierror_table mce_p10_ierror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) { 0x00000000081c0000, 0x0000000000040000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) { 0x00000000081c0000, 0x0000000000080000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) { 0x00000000081c0000, 0x00000000000c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) { 0x00000000081c0000, 0x0000000000100000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) { 0x00000000081c0000, 0x0000000000140000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) { 0x00000000081c0000, 0x0000000000180000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { 0x00000000081c0000, 0x00000000001c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH_FOREIGN, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) { 0x00000000081c0000, 0x0000000008080000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) MCE_ERROR_TYPE_USER,MCE_USER_ERROR_SCV, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) { 0x00000000081c0000, 0x00000000080c0000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) { 0x00000000081c0000, 0x0000000008100000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) { 0x00000000081c0000, 0x0000000008140000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_STORE, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) MCE_INITIATOR_CPU, MCE_SEV_FATAL, false }, /* ASYNC is fatal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) { 0x00000000081c0000, 0x00000000081c0000, true, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) { 0, 0, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) struct mce_derror_table {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) unsigned long dsisr_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) bool dar_valid; /* dar is a valid indicator of faulting address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) unsigned int error_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) unsigned int error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) unsigned int error_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) unsigned int initiator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) unsigned int severity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) bool sync_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) static const struct mce_derror_table mce_p7_derror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) { 0x00008000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) { 0x00004000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) { 0x00000800, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) { 0x00000400, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) { 0x00000080, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) { 0x00000100, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { 0x00000040, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_INDETERMINATE, /* BOTH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) { 0, false, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) static const struct mce_derror_table mce_p8_derror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) { 0x00008000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { 0x00004000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) { 0x00002000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_LOAD_TIMEOUT, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) { 0x00001000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) { 0x00000800, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) { 0x00000400, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) { 0x00000200, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, /* SECONDARY ERAT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) { 0x00000080, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) { 0x00000100, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) { 0, false, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) static const struct mce_derror_table mce_p9_derror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) { 0x00008000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) { 0x00004000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) { 0x00002000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_LOAD_TIMEOUT, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) { 0x00001000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) { 0x00000800, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) { 0x00000400, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) { 0x00000200, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) MCE_ERROR_TYPE_USER, MCE_USER_ERROR_TLBIE, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) { 0x00000080, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) { 0x00000100, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) { 0x00000040, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) { 0x00000020, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) { 0x00000010, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) { 0x00000008, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD_STORE_FOREIGN, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) { 0, false, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static const struct mce_derror_table mce_p10_derror_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) { 0x00008000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) { 0x00004000, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) { 0x00000800, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) { 0x00000400, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) { 0x00000200, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) MCE_ERROR_TYPE_USER, MCE_USER_ERROR_TLBIE, MCE_ECLASS_SOFTWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) { 0x00000080, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) MCE_ECLASS_SOFT_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) MCE_INITIATOR_CPU, MCE_SEV_WARNING, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) { 0x00000100, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, MCE_ECLASS_HARD_INDETERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) { 0x00000040, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) { 0x00000020, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) { 0x00000010, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) { 0x00000008, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD_STORE_FOREIGN, MCE_ECLASS_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) { 0, false, 0, 0, 0, 0, 0 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) static int mce_find_instr_ea_and_phys(struct pt_regs *regs, uint64_t *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) uint64_t *phys_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) * Carefully look at the NIP to determine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) * the instruction to analyse. Reading the NIP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) * in real-mode is tricky and can lead to recursive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) * faults
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) struct ppc_inst instr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) unsigned long pfn, instr_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) struct instruction_op op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) struct pt_regs tmp = *regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) pfn = addr_to_pfn(regs, regs->nip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) if (pfn != ULONG_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) instr_addr = (pfn << PAGE_SHIFT) + (regs->nip & ~PAGE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) instr = ppc_inst_read((struct ppc_inst *)instr_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) if (!analyse_instr(&op, &tmp, instr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) pfn = addr_to_pfn(regs, op.ea);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) *addr = op.ea;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) *phys_addr = (pfn << PAGE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) * analyse_instr() might fail if the instruction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) * is not a load/store, although this is unexpected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) * for load/store errors or if we got the NIP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) *addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) static int mce_handle_ierror(struct pt_regs *regs, unsigned long srr1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) const struct mce_ierror_table table[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) struct mce_error_info *mce_err, uint64_t *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) uint64_t *phys_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) int handled = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) *addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) for (i = 0; table[i].srr1_mask; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) if ((srr1 & table[i].srr1_mask) != table[i].srr1_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) /* attempt to correct the error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) switch (table[i].error_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) case MCE_ERROR_TYPE_SLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (local_paca->in_mce == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) slb_save_contents(local_paca->mce_faulty_slbs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) handled = mce_flush(MCE_FLUSH_SLB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) case MCE_ERROR_TYPE_ERAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) handled = mce_flush(MCE_FLUSH_ERAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) case MCE_ERROR_TYPE_TLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) handled = mce_flush(MCE_FLUSH_TLB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) /* now fill in mce_error_info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) mce_err->error_type = table[i].error_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) mce_err->error_class = table[i].error_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) switch (table[i].error_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) case MCE_ERROR_TYPE_UE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) mce_err->u.ue_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) case MCE_ERROR_TYPE_SLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) mce_err->u.slb_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) case MCE_ERROR_TYPE_ERAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) mce_err->u.erat_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) case MCE_ERROR_TYPE_TLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) mce_err->u.tlb_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) case MCE_ERROR_TYPE_USER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) mce_err->u.user_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) case MCE_ERROR_TYPE_RA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) mce_err->u.ra_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) case MCE_ERROR_TYPE_LINK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) mce_err->u.link_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) mce_err->sync_error = table[i].sync_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) mce_err->severity = table[i].severity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) mce_err->initiator = table[i].initiator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (table[i].nip_valid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) *addr = regs->nip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (mce_err->sync_error &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) table[i].error_type == MCE_ERROR_TYPE_UE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) unsigned long pfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) if (get_paca()->in_mce < MAX_MCE_DEPTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) pfn = addr_to_pfn(regs, regs->nip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) if (pfn != ULONG_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) *phys_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) (pfn << PAGE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) return handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) mce_err->error_type = MCE_ERROR_TYPE_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) mce_err->error_class = MCE_ECLASS_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) mce_err->severity = MCE_SEV_SEVERE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) mce_err->initiator = MCE_INITIATOR_CPU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) mce_err->sync_error = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) static int mce_handle_derror(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) const struct mce_derror_table table[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) struct mce_error_info *mce_err, uint64_t *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) uint64_t *phys_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) uint64_t dsisr = regs->dsisr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) int handled = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) int found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) *addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) for (i = 0; table[i].dsisr_value; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) if (!(dsisr & table[i].dsisr_value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) /* attempt to correct the error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) switch (table[i].error_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) case MCE_ERROR_TYPE_SLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) if (local_paca->in_mce == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) slb_save_contents(local_paca->mce_faulty_slbs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) if (mce_flush(MCE_FLUSH_SLB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) handled = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) case MCE_ERROR_TYPE_ERAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) if (mce_flush(MCE_FLUSH_ERAT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) handled = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) case MCE_ERROR_TYPE_TLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (mce_flush(MCE_FLUSH_TLB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) handled = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) * Attempt to handle multiple conditions, but only return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) * one. Ensure uncorrectable errors are first in the table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) * to match.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) if (found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /* now fill in mce_error_info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) mce_err->error_type = table[i].error_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) mce_err->error_class = table[i].error_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) switch (table[i].error_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) case MCE_ERROR_TYPE_UE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) mce_err->u.ue_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) case MCE_ERROR_TYPE_SLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) mce_err->u.slb_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) case MCE_ERROR_TYPE_ERAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) mce_err->u.erat_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) case MCE_ERROR_TYPE_TLB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) mce_err->u.tlb_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) case MCE_ERROR_TYPE_USER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) mce_err->u.user_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) case MCE_ERROR_TYPE_RA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) mce_err->u.ra_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) case MCE_ERROR_TYPE_LINK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) mce_err->u.link_error_type = table[i].error_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) mce_err->sync_error = table[i].sync_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) mce_err->severity = table[i].severity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) mce_err->initiator = table[i].initiator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) if (table[i].dar_valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) *addr = regs->dar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) else if (mce_err->sync_error &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) table[i].error_type == MCE_ERROR_TYPE_UE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) * We do a maximum of 4 nested MCE calls, see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * kernel/exception-64s.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) if (get_paca()->in_mce < MAX_MCE_DEPTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) mce_find_instr_ea_and_phys(regs, addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) phys_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) found = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) if (found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) return handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) mce_err->error_type = MCE_ERROR_TYPE_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) mce_err->error_class = MCE_ECLASS_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) mce_err->severity = MCE_SEV_SEVERE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) mce_err->initiator = MCE_INITIATOR_CPU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) mce_err->sync_error = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) static long mce_handle_ue_error(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) struct mce_error_info *mce_err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) long handled = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) mce_common_process_ue(regs, mce_err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (mce_err->ignore_event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * On specific SCOM read via MMIO we may get a machine check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) * exception with SRR0 pointing inside opal. If that is the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) * case OPAL may have recovery address to re-read SCOM data in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) * different way and hence we can recover from this MC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) if (ppc_md.mce_check_early_recovery) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) if (ppc_md.mce_check_early_recovery(regs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) handled = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) return handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) static long mce_handle_error(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) unsigned long srr1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) const struct mce_derror_table dtable[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) const struct mce_ierror_table itable[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) struct mce_error_info mce_err = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) uint64_t addr, phys_addr = ULONG_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) long handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) if (SRR1_MC_LOADSTORE(srr1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) handled = mce_handle_derror(regs, dtable, &mce_err, &addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) &phys_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) handled = mce_handle_ierror(regs, srr1, itable, &mce_err, &addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) &phys_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (!handled && mce_err.error_type == MCE_ERROR_TYPE_UE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) handled = mce_handle_ue_error(regs, &mce_err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) save_mce_event(regs, handled, &mce_err, regs->nip, addr, phys_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) return handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) long __machine_check_early_realmode_p7(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) /* P7 DD1 leaves top bits of DSISR undefined */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) regs->dsisr &= 0x0000ffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) return mce_handle_error(regs, regs->msr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) mce_p7_derror_table, mce_p7_ierror_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) long __machine_check_early_realmode_p8(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) return mce_handle_error(regs, regs->msr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) mce_p8_derror_table, mce_p8_ierror_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) long __machine_check_early_realmode_p9(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) unsigned long srr1 = regs->msr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) * On POWER9 DD2.1 and below, it's possible to get a machine check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) * caused by a paste instruction where only DSISR bit 25 is set. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) * will result in the MCE handler seeing an unknown event and the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) * crashing. An MCE that occurs like this is spurious, so we don't need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) * to do anything in terms of servicing it. If there is something that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) * needs to be serviced, the CPU will raise the MCE again with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * correct DSISR so that it can be serviced properly. So detect this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) * case and mark it as handled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (SRR1_MC_LOADSTORE(regs->msr) && regs->dsisr == 0x02000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * Async machine check due to bad real address from store or foreign
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * link time out comes with the load/store bit (PPC bit 42) set in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) * SRR1, but the cause comes in SRR1 not DSISR. Clear bit 42 so we're
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) * directed to the ierror table so it will find the cause (which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) * describes it correctly as a store error).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) if (SRR1_MC_LOADSTORE(srr1) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) ((srr1 & 0x081c0000) == 0x08140000 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) (srr1 & 0x081c0000) == 0x08180000)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) srr1 &= ~PPC_BIT(42);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) return mce_handle_error(regs, srr1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) mce_p9_derror_table, mce_p9_ierror_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) long __machine_check_early_realmode_p10(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) unsigned long srr1 = regs->msr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) * Async machine check due to bad real address from store comes with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) * the load/store bit (PPC bit 42) set in SRR1, but the cause comes in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) * SRR1 not DSISR. Clear bit 42 so we're directed to the ierror table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) * so it will find the cause (which describes it correctly as a store
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) * error).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) if (SRR1_MC_LOADSTORE(srr1) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) (srr1 & 0x081c0000) == 0x08140000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) srr1 &= ~PPC_BIT(42);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) return mce_handle_error(regs, srr1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) mce_p10_derror_table, mce_p10_ierror_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) }