diff -ru ../../REF/linux-2.5.45-ia64-021031/arch/ia64/kernel/mca.c linux/arch/ia64/kernel/mca.c --- ../../REF/linux-2.5.45-ia64-021031/arch/ia64/kernel/mca.c Wed Oct 30 16:42:55 2002 +++ linux/arch/ia64/kernel/mca.c Wed Nov 6 14:09:00 2002 @@ -69,10 +69,10 @@ u64 ia64_mca_bspstore[1024]; u64 ia64_init_stack[KERNEL_STACK_SIZE] __attribute__((aligned(16))); u64 ia64_mca_sal_data_area[1356]; -u64 ia64_mca_min_state_save_info; u64 ia64_tlb_functional; u64 ia64_os_mca_recovery_successful; - +/* TODO: need to assign min-state structure to UC memory */ +u64 ia64_mca_min_state_save_info[MIN_STATE_AREA_SIZE] __attribute__((aligned(512))); static void ia64_mca_wakeup_ipi_wait(void); static void ia64_mca_wakeup(int cpu); static void ia64_mca_wakeup_all(void); @@ -116,7 +116,7 @@ * Outputs : platform error status */ int -ia64_mca_log_sal_error_record(int sal_info_type) +ia64_mca_log_sal_error_record(int sal_info_type, int called_from_init) { int platform_err = 0; @@ -131,7 +131,10 @@ */ platform_err = ia64_log_print(sal_info_type, (prfunc_t)printk); - ia64_sal_clear_state_info(sal_info_type); + /* temporary: only clear SAL logs on hardware-corrected errors + or if we're logging an error after an MCA-initiated reboot */ + if ((sal_info_type > 1) || (called_from_init)) + ia64_sal_clear_state_info(sal_info_type); return platform_err; } @@ -152,7 +155,7 @@ IA64_MCA_DEBUG("ia64_mca_cpe_int_handler: received interrupt. vector = %#x\n", cpe_irq); /* Get the CMC error record and log it */ - ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE); + ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE, 0); } /* @@ -199,13 +202,15 @@ * * Outputs : None */ -void +int ia64_mca_check_errors (void) { /* * If there is an MCA error record pending, get it and log it. */ - ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA); + ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA, 1); + + return 0; } device_initcall(ia64_mca_check_errors); @@ -237,49 +242,26 @@ #endif /* PLATFORM_MCA_HANDLERS */ -static char *min_state_labels[] = { - "nat", - "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", - "r9", "r10","r11", "r12","r13","r14", "r15", - "b0r16","b0r17", "b0r18", "b0r19", "b0r20", - "b0r21", "b0r22","b0r23", "b0r24", "b0r25", - "b0r26", "b0r27", "b0r28","b0r29", "b0r30", "b0r31", - "r16", "r17", "r18","r19", "r20", "r21","r22", - "r23", "r24","r25", "r26", "r27","r28", "r29", "r30","r31", - "preds", "br0", "rsc", - "iip", "ipsr", "ifs", - "xip", "xpsr", "xfs" -}; - -int ia64_pmss_dump_bank0=0; /* dump bank 0 ? */ - /* * routine to process and prepare to dump min_state_save * information for debugging purposes. * */ void -ia64_process_min_state_save (pal_min_state_area_t *pmss, struct pt_regs *ptregs) +ia64_process_min_state_save (pal_min_state_area_t *pmss) { - int i, max=57; - u64 *tpmss_ptr=(u64 *)pmss; + int i, max = MIN_STATE_AREA_SIZE; + u64 *tpmss_ptr = (u64 *)pmss; + u64 *return_min_state_ptr = ia64_mca_min_state_save_info; /* dump out the min_state_area information */ for (i=0;iproc_err; - ia64_process_min_state_save(&proc_ptr->processor_static_info.min_state_area, - regs); + ia64_process_min_state_save(&proc_ptr->processor_static_info.min_state_area); /* Clear the INIT SAL logs now that they have been saved in the OS buffer */ ia64_sal_clear_state_info(SAL_INFO_TYPE_INIT); @@ -1677,6 +1655,9 @@ if (slpi->valid.psi_static_struct) { spsi = (sal_processor_static_info_t *)p_data; + /* copy interrupted context PAL min-state info */ + ia64_process_min_state_save(&spsi->min_state_area); + /* Print branch register contents if valid */ if (spsi->valid.br) ia64_log_processor_regs_print(spsi->br, 8, "Branch", "br", diff -ru ../../REF/linux-2.5.45-ia64-021031/arch/ia64/pci/pci.c linux/arch/ia64/pci/pci.c --- ../../REF/linux-2.5.45-ia64-021031/arch/ia64/pci/pci.c Wed Oct 30 16:42:54 2002 +++ linux/arch/ia64/pci/pci.c Tue Nov 5 15:08:17 2002 @@ -44,10 +44,6 @@ #define DBG(x...) #endif -#ifdef CONFIG_IA64_MCA -extern void ia64_mca_check_errors( void ); -#endif - struct pci_fixup pcibios_fixups[1]; /* diff -ru ../../REF/linux-2.5.45-ia64-021031/include/asm-ia64/mca.h linux/include/asm-ia64/mca.h --- ../../REF/linux-2.5.45-ia64-021031/include/asm-ia64/mca.h Wed Oct 30 16:42:20 2002 +++ linux/include/asm-ia64/mca.h Tue Nov 5 15:06:29 2002 @@ -103,6 +103,8 @@ IA64_MCA_NEW_CONTEXT = -1 /* SAL to return to new context */ }; +#define MIN_STATE_AREA_SIZE 57 + typedef struct ia64_mca_os_to_sal_state_s { u64 imots_os_status; /* OS status to SAL as to what happened * with the MCA handling. @@ -133,7 +135,7 @@ extern void ia64_mca_cpe_int_handler(int,void *,struct pt_regs *); extern int ia64_log_print(int,prfunc_t); extern void ia64_mca_cmc_vector_setup(void); -extern void ia64_mca_check_errors( void ); +extern int ia64_mca_check_errors( void ); extern u64 ia64_log_get(int, prfunc_t); #define PLATFORM_CALL(fn, args) printk("Platform call TBD\n") diff -ru ../../REF/linux-2.5.45-ia64-021031/include/asm-ia64/mca_asm.h linux/include/asm-ia64/mca_asm.h --- ../../REF/linux-2.5.45-ia64-021031/include/asm-ia64/mca_asm.h Wed Oct 30 16:43:43 2002 +++ linux/include/asm-ia64/mca_asm.h Tue Nov 5 14:12:30 2002 @@ -16,6 +16,7 @@ #define PSR_I 14 #define PSR_DT 17 #define PSR_RT 27 +#define PSR_MC 35 #define PSR_IT 36 #define PSR_BN 44 @@ -107,6 +108,8 @@ ;; \ dep temp1 = 0, temp1, PSR_IC, 1; \ ;; \ + dep temp1 = -1, temp1, PSR_MC, 1; \ + ;; \ movl temp2 = start_addr; \ mov cr.ipsr = temp1; \ ;; \