diff -Nur linux-2.6.8-rc3/arch/ia64/kernel/mca.c linux-2.6.8-rc3-mcadrv-v2/arch/ia64/kernel/mca.c --- linux-2.6.8-rc3/arch/ia64/kernel/mca.c 2004-08-04 06:27:37.000000000 +0900 +++ linux-2.6.8-rc3-mcadrv-v2/arch/ia64/kernel/mca.c 2004-08-04 18:08:39.000000000 +0900 @@ -828,6 +828,12 @@ } +/* This is a function pointer to other error recovery from MCA */ +int (*ia64_mca_ucmc_other_recover_fp) + (void*,ia64_mca_sal_to_os_state_t*,ia64_mca_os_to_sal_state_t*) + = NULL; +EXPORT_SYMBOL(ia64_mca_ucmc_other_recover_fp); + /* * ia64_mca_ucmc_handler * @@ -849,11 +855,20 @@ { pal_processor_state_info_t *psp = (pal_processor_state_info_t *) &ia64_sal_to_os_handoff_state.proc_state_param; - int recover = psp->tc && !(psp->cc || psp->bc || psp->rc || psp->uc); + int recover; /* Get the MCA error record and log it */ ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA); + /* No error other than TLB error exist in this SAL error record */ + recover = (psp->tc && !(psp->cc || psp->bc || psp->rc || psp->uc)) + /* Extra error recovery */ + || (ia64_mca_ucmc_other_recover_fp + && ia64_mca_ucmc_other_recover_fp( + IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_MCA), + &ia64_sal_to_os_handoff_state, + &ia64_os_to_sal_handoff_state)); + /* * Wakeup all the processors which are spinning in the rendezvous * loop. diff -Nur linux-2.6.8-rc3/include/asm-ia64/mca.h linux-2.6.8-rc3-mcadrv-v2/include/asm-ia64/mca.h --- linux-2.6.8-rc3/include/asm-ia64/mca.h 2004-08-04 06:27:13.000000000 +0900 +++ linux-2.6.8-rc3-mcadrv-v2/include/asm-ia64/mca.h 2004-08-04 18:08:39.000000000 +0900 @@ -114,6 +114,7 @@ extern void ia64_monarch_init_handler(void); extern void ia64_slave_init_handler(void); extern void ia64_mca_cmc_vector_setup(void); +extern int (*ia64_mca_ucmc_other_recover_fp)(void *,ia64_mca_sal_to_os_state_t *,ia64_mca_os_to_sal_state_t *); #endif /* !__ASSEMBLY__ */ #endif /* _ASM_IA64_MCA_H */