Commit 761552e7 authored by Tony Luck's avatar Tony Luck Committed by David Mosberger

[PATCH] ia64: MCA min_state area must be uncacheable

Software Developer's Manual page 2:270, section 11.3.2.3
says that the processor min-state save area must be in an
uncacheable region ... but current MCA recovery code
allocates the min-state area "ia64_mca_min_state_save_info"
in regular kernel data/bss.

This patch re-uses the same min-state area that the PAL/SAL
used to report the error to Linux ... which mostly requires
deleting code and declarations (some of which were wrong,
MIN_STATE_AREA_SIZE ought to have been 58).  The real "work"
is copying the pointer to the min-state area from the
sal_to_os handoff structure into the os_to_sal structure.
parent 04f8dec9
...@@ -81,8 +81,6 @@ u64 ia64_init_stack[KERNEL_STACK_SIZE/8] __attribute__((aligned(16))); ...@@ -81,8 +81,6 @@ u64 ia64_init_stack[KERNEL_STACK_SIZE/8] __attribute__((aligned(16)));
u64 ia64_mca_sal_data_area[1356]; u64 ia64_mca_sal_data_area[1356];
u64 ia64_tlb_functional; u64 ia64_tlb_functional;
u64 ia64_os_mca_recovery_successful; 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_ipi_wait(void);
static void ia64_mca_wakeup(int cpu); static void ia64_mca_wakeup(int cpu);
static void ia64_mca_wakeup_all(void); static void ia64_mca_wakeup_all(void);
...@@ -465,26 +463,6 @@ ia64_mca_register_cpev (int cpev) ...@@ -465,26 +463,6 @@ ia64_mca_register_cpev (int cpev)
#endif /* PLATFORM_MCA_HANDLERS */ #endif /* PLATFORM_MCA_HANDLERS */
/*
* 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)
{
int i, max = MIN_STATE_AREA_SIZE;
u64 *tpmss_ptr = (u64 *)pmss;
u64 *return_min_state_ptr = ia64_mca_min_state_save_info;
for (i=0;i<max;i++) {
/* copy min-state register info for eventual return to PAL */
*return_min_state_ptr++ = *tpmss_ptr;
tpmss_ptr++; /* skip to next entry */
}
}
/* /*
* ia64_mca_cmc_vector_setup * ia64_mca_cmc_vector_setup
* *
...@@ -961,9 +939,8 @@ ia64_return_to_sal_check(void) ...@@ -961,9 +939,8 @@ ia64_return_to_sal_check(void)
/* Default = tell SAL to return to same context */ /* Default = tell SAL to return to same context */
ia64_os_to_sal_handoff_state.imots_context = IA64_MCA_SAME_CONTEXT; ia64_os_to_sal_handoff_state.imots_context = IA64_MCA_SAME_CONTEXT;
/* Register pointer to new min state values */
ia64_os_to_sal_handoff_state.imots_new_min_state = ia64_os_to_sal_handoff_state.imots_new_min_state =
ia64_mca_min_state_save_info; (u64 *)ia64_sal_to_os_handoff_state.pal_min_state;
} }
/* /*
...@@ -2154,9 +2131,6 @@ ia64_log_proc_dev_err_info_print (sal_log_processor_info_t *slpi, ...@@ -2154,9 +2131,6 @@ ia64_log_proc_dev_err_info_print (sal_log_processor_info_t *slpi,
if (slpi->valid.psi_static_struct) { if (slpi->valid.psi_static_struct) {
spsi = (sal_processor_static_info_t *)p_data; 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 */ /* Print branch register contents if valid */
if (spsi->valid.br) if (spsi->valid.br)
ia64_log_processor_regs_print(spsi->br, 8, "Branch", "br", ia64_log_processor_regs_print(spsi->br, 8, "Branch", "br",
......
...@@ -77,12 +77,11 @@ ...@@ -77,12 +77,11 @@
(p6) movl r10=IA64_MCA_SAME_CONTEXT; \ (p6) movl r10=IA64_MCA_SAME_CONTEXT; \
(p6) add _tmp=0x18,_tmp;; \ (p6) add _tmp=0x18,_tmp;; \
(p6) ld8 r9=[_tmp],0x10; \ (p6) ld8 r9=[_tmp],0x10; \
(p6) movl r22=ia64_mca_min_state_save_info;; \ (p6) mov r22=r0;; \
(p7) ld8 r8=[_tmp],0x08;; \ (p7) ld8 r8=[_tmp],0x08;; \
(p7) ld8 r9=[_tmp],0x08;; \ (p7) ld8 r9=[_tmp],0x08;; \
(p7) ld8 r10=[_tmp],0x08;; \ (p7) ld8 r10=[_tmp],0x08;; \
(p7) ld8 r22=[_tmp],0x08;; \ (p7) ld8 r22=[_tmp],0x08;;
DATA_VA_TO_PA(r22)
// now _tmp is pointing to SAL rtn save location // now _tmp is pointing to SAL rtn save location
...@@ -97,7 +96,6 @@ ...@@ -97,7 +96,6 @@
.global ia64_init_stack .global ia64_init_stack
.global ia64_mca_sal_data_area .global ia64_mca_sal_data_area
.global ia64_tlb_functional .global ia64_tlb_functional
.global ia64_mca_min_state_save_info
.text .text
.align 16 .align 16
......
...@@ -108,8 +108,6 @@ enum { ...@@ -108,8 +108,6 @@ enum {
IA64_MCA_NEW_CONTEXT = -1 /* SAL to return to new context */ 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 { typedef struct ia64_mca_os_to_sal_state_s {
u64 imots_os_status; /* OS status to SAL as to what happened u64 imots_os_status; /* OS status to SAL as to what happened
* with the MCA handling. * with the MCA handling.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment