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 --- |