diff options
| -rw-r--r-- | arch/ia64/kernel/mca.c | 8 | ||||
| -rw-r--r-- | arch/ia64/kernel/mca_drv.c | 33 | ||||
| -rw-r--r-- | include/asm-ia64/pal.h | 1 |
3 files changed, 36 insertions, 6 deletions
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index a76add3e76a2..491687f84fb5 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
| @@ -1192,8 +1192,6 @@ void | |||
| 1192 | ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | 1192 | ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, |
| 1193 | struct ia64_sal_os_state *sos) | 1193 | struct ia64_sal_os_state *sos) |
| 1194 | { | 1194 | { |
| 1195 | pal_processor_state_info_t *psp = (pal_processor_state_info_t *) | ||
| 1196 | &sos->proc_state_param; | ||
| 1197 | int recover, cpu = smp_processor_id(); | 1195 | int recover, cpu = smp_processor_id(); |
| 1198 | struct task_struct *previous_current; | 1196 | struct task_struct *previous_current; |
| 1199 | struct ia64_mca_notify_die nd = | 1197 | struct ia64_mca_notify_die nd = |
| @@ -1223,10 +1221,8 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
| 1223 | /* Get the MCA error record and log it */ | 1221 | /* Get the MCA error record and log it */ |
| 1224 | ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA); | 1222 | ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA); |
| 1225 | 1223 | ||
| 1226 | /* TLB error is only exist in this SAL error record */ | 1224 | /* MCA error recovery */ |
| 1227 | recover = (psp->tc && !(psp->cc || psp->bc || psp->rc || psp->uc)) | 1225 | recover = (ia64_mca_ucmc_extension |
| 1228 | /* other error recovery */ | ||
| 1229 | || (ia64_mca_ucmc_extension | ||
| 1230 | && ia64_mca_ucmc_extension( | 1226 | && ia64_mca_ucmc_extension( |
| 1231 | IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_MCA), | 1227 | IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_MCA), |
| 1232 | sos)); | 1228 | sos)); |
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 |
diff --git a/include/asm-ia64/pal.h b/include/asm-ia64/pal.h index e43021a99a20..67656ce767c2 100644 --- a/include/asm-ia64/pal.h +++ b/include/asm-ia64/pal.h | |||
| @@ -371,6 +371,7 @@ typedef u64 pal_mc_info_index_t; | |||
| 371 | * dependent | 371 | * dependent |
| 372 | */ | 372 | */ |
| 373 | 373 | ||
| 374 | #define PAL_TLB_CHECK_OP_PURGE 8 | ||
| 374 | 375 | ||
| 375 | typedef struct pal_process_state_info_s { | 376 | typedef struct pal_process_state_info_s { |
| 376 | u64 reserved1 : 2, | 377 | u64 reserved1 : 2, |
