diff options
Diffstat (limited to 'arch/ia64/kernel/mca_drv.c')
-rw-r--r-- | arch/ia64/kernel/mca_drv.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c index afc1403799c9..5e2d18fbce40 100644 --- a/arch/ia64/kernel/mca_drv.c +++ b/arch/ia64/kernel/mca_drv.c | |||
@@ -607,6 +607,33 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx, | |||
607 | return status; | 607 | return status; |
608 | } | 608 | } |
609 | 609 | ||
610 | /* | ||
611 | * recover_from_tlb_check | ||
612 | * @peidx: pointer of index of processor error section | ||
613 | * | ||
614 | * Return value: | ||
615 | * 1 on Success / 0 on Failure | ||
616 | */ | ||
617 | static int | ||
618 | recover_from_tlb_check(peidx_table_t *peidx) | ||
619 | { | ||
620 | sal_log_mod_error_info_t *smei; | ||
621 | pal_tlb_check_info_t *ptci; | ||
622 | |||
623 | smei = (sal_log_mod_error_info_t *)peidx_tlb_check(peidx, 0); | ||
624 | ptci = (pal_tlb_check_info_t *)&(smei->check_info); | ||
625 | |||
626 | /* | ||
627 | * Look for signature of a duplicate TLB DTC entry, which is | ||
628 | * a SW bug and always fatal. | ||
629 | */ | ||
630 | if (ptci->op == PAL_TLB_CHECK_OP_PURGE | ||
631 | && !(ptci->itr || ptci->dtc || ptci->itc)) | ||
632 | return fatal_mca("Duplicate TLB entry"); | ||
633 | |||
634 | return mca_recovered("TLB check recovered"); | ||
635 | } | ||
636 | |||
610 | /** | 637 | /** |
611 | * recover_from_processor_error | 638 | * recover_from_processor_error |
612 | * @platform: whether there are some platform error section or not | 639 | * @platform: whether there are some platform error section or not |
@@ -652,6 +679,12 @@ recover_from_processor_error(int platform, slidx_table_t *slidx, | |||
652 | return fatal_mca("error not contained"); | 679 | return fatal_mca("error not contained"); |
653 | 680 | ||
654 | /* | 681 | /* |
682 | * Look for recoverable TLB check | ||
683 | */ | ||
684 | if (psp->tc && !(psp->cc || psp->bc || psp->rc || psp->uc)) | ||
685 | return recover_from_tlb_check(peidx); | ||
686 | |||
687 | /* | ||
655 | * The cache check and bus check bits have four possible states | 688 | * The cache check and bus check bits have four possible states |
656 | * cc bc | 689 | * cc bc |
657 | * 0 0 Weird record, not recovered | 690 | * 0 0 Weird record, not recovered |