mce_power.c (99ead78afd1128bfcebe7f88f3b102fb2da09aee) mce_power.c (895e3dceeb97855dc9990136cbb80a842fe581aa)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Machine check exception handling CPU-side for power7 and power8
4 *
5 * Copyright 2013 IBM Corporation
6 * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
7 */
8
9#undef DEBUG
10#define pr_fmt(fmt) "mce_power: " fmt
11
12#include <linux/types.h>
13#include <linux/ptrace.h>
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Machine check exception handling CPU-side for power7 and power8
4 *
5 * Copyright 2013 IBM Corporation
6 * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
7 */
8
9#undef DEBUG
10#define pr_fmt(fmt) "mce_power: " fmt
11
12#include <linux/types.h>
13#include <linux/ptrace.h>
14#include <linux/extable.h>
14#include <asm/mmu.h>
15#include <asm/mce.h>
16#include <asm/machdep.h>
17#include <asm/pgtable.h>
18#include <asm/pte-walk.h>
19#include <asm/sstep.h>
20#include <asm/exception-64s.h>
15#include <asm/mmu.h>
16#include <asm/mce.h>
17#include <asm/machdep.h>
18#include <asm/pgtable.h>
19#include <asm/pte-walk.h>
20#include <asm/sstep.h>
21#include <asm/exception-64s.h>
22#include <asm/extable.h>
21
22/*
23 * Convert an address related to an mm to a PFN. NOTE: we are in real
24 * mode, we could potentially race with page table updates.
25 */
26unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr)
27{
28 pte_t *ptep;

--- 531 unchanged lines hidden (view full) ---

560 mce_err->error_class = MCE_ECLASS_UNKNOWN;
561 mce_err->severity = MCE_SEV_SEVERE;
562 mce_err->initiator = MCE_INITIATOR_CPU;
563 mce_err->sync_error = true;
564
565 return 0;
566}
567
23
24/*
25 * Convert an address related to an mm to a PFN. NOTE: we are in real
26 * mode, we could potentially race with page table updates.
27 */
28unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr)
29{
30 pte_t *ptep;

--- 531 unchanged lines hidden (view full) ---

562 mce_err->error_class = MCE_ECLASS_UNKNOWN;
563 mce_err->severity = MCE_SEV_SEVERE;
564 mce_err->initiator = MCE_INITIATOR_CPU;
565 mce_err->sync_error = true;
566
567 return 0;
568}
569
568static long mce_handle_ue_error(struct pt_regs *regs)
570static long mce_handle_ue_error(struct pt_regs *regs,
571 struct mce_error_info *mce_err)
569{
570 long handled = 0;
572{
573 long handled = 0;
574 const struct exception_table_entry *entry;
571
575
576 entry = search_kernel_exception_table(regs->nip);
577 if (entry) {
578 mce_err->ignore_event = true;
579 regs->nip = extable_fixup(entry);
580 return 1;
581 }
582
572 /*
573 * On specific SCOM read via MMIO we may get a machine check
574 * exception with SRR0 pointing inside opal. If that is the
575 * case OPAL may have recovery address to re-read SCOM data in
576 * different way and hence we can recover from this MC.
577 */
578
579 if (ppc_md.mce_check_early_recovery) {

--- 15 unchanged lines hidden (view full) ---

595 if (SRR1_MC_LOADSTORE(srr1))
596 handled = mce_handle_derror(regs, dtable, &mce_err, &addr,
597 &phys_addr);
598 else
599 handled = mce_handle_ierror(regs, itable, &mce_err, &addr,
600 &phys_addr);
601
602 if (!handled && mce_err.error_type == MCE_ERROR_TYPE_UE)
583 /*
584 * On specific SCOM read via MMIO we may get a machine check
585 * exception with SRR0 pointing inside opal. If that is the
586 * case OPAL may have recovery address to re-read SCOM data in
587 * different way and hence we can recover from this MC.
588 */
589
590 if (ppc_md.mce_check_early_recovery) {

--- 15 unchanged lines hidden (view full) ---

606 if (SRR1_MC_LOADSTORE(srr1))
607 handled = mce_handle_derror(regs, dtable, &mce_err, &addr,
608 &phys_addr);
609 else
610 handled = mce_handle_ierror(regs, itable, &mce_err, &addr,
611 &phys_addr);
612
613 if (!handled && mce_err.error_type == MCE_ERROR_TYPE_UE)
603 handled = mce_handle_ue_error(regs);
614 handled = mce_handle_ue_error(regs, &mce_err);
604
605 save_mce_event(regs, handled, &mce_err, regs->nip, addr, phys_addr);
606
607 return handled;
608}
609
610long __machine_check_early_realmode_p7(struct pt_regs *regs)
611{

--- 28 unchanged lines hidden ---
615
616 save_mce_event(regs, handled, &mce_err, regs->nip, addr, phys_addr);
617
618 return handled;
619}
620
621long __machine_check_early_realmode_p7(struct pt_regs *regs)
622{

--- 28 unchanged lines hidden ---