Commit 53846184 authored by David Mosberger's avatar David Mosberger

mca.h, mca_asm.S, mca.c:

  ia64: cleaning up the INIT code
parent 95238af9
...@@ -322,7 +322,7 @@ fetch_min_state (pal_min_state_area_t *ms, struct pt_regs *pt, struct switch_sta ...@@ -322,7 +322,7 @@ fetch_min_state (pal_min_state_area_t *ms, struct pt_regs *pt, struct switch_sta
} }
void void
init_handler_platform (sal_log_processor_info_t *proc_ptr, init_handler_platform (pal_min_state_area_t *ms,
struct pt_regs *pt, struct switch_stack *sw) struct pt_regs *pt, struct switch_stack *sw)
{ {
struct unw_frame_info info; struct unw_frame_info info;
...@@ -337,10 +337,10 @@ init_handler_platform (sal_log_processor_info_t *proc_ptr, ...@@ -337,10 +337,10 @@ init_handler_platform (sal_log_processor_info_t *proc_ptr,
*/ */
printk("Delaying for 5 seconds...\n"); printk("Delaying for 5 seconds...\n");
udelay(5*1000000); udelay(5*1000000);
show_min_state(&SAL_LPI_PSI_INFO(proc_ptr)->min_state_area); show_min_state(ms);
printk("Backtrace of current task (pid %d, %s)\n", current->pid, current->comm); printk("Backtrace of current task (pid %d, %s)\n", current->pid, current->comm);
fetch_min_state(&SAL_LPI_PSI_INFO(proc_ptr)->min_state_area, pt, sw); fetch_min_state(ms, pt, sw);
unw_init_from_interruption(&info, current, pt, sw); unw_init_from_interruption(&info, current, pt, sw);
ia64_do_show_stack(&info, NULL); ia64_do_show_stack(&info, NULL);
...@@ -1240,32 +1240,19 @@ device_initcall(ia64_mca_late_init); ...@@ -1240,32 +1240,19 @@ device_initcall(ia64_mca_late_init);
void void
ia64_init_handler (struct pt_regs *pt, struct switch_stack *sw) ia64_init_handler (struct pt_regs *pt, struct switch_stack *sw)
{ {
sal_log_processor_info_t *proc_ptr; pal_min_state_area_t *ms;
ia64_err_rec_t *plog_ptr;
printk(KERN_INFO "Entered OS INIT handler\n"); printk(KERN_INFO "Entered OS INIT handler. PSP=%lx\n",
ia64_sal_to_os_handoff_state.proc_state_param);
/* Get the INIT processor log */
if (!ia64_log_get(SAL_INFO_TYPE_INIT, (prfunc_t)printk))
return; // no record retrieved
#ifdef IA64_DUMP_ALL_PROC_INFO
ia64_log_print(SAL_INFO_TYPE_INIT, (prfunc_t)printk);
#endif
/* /*
* get pointer to min state save area * Address of minstate area provided by PAL is physical,
* * uncacheable (bit 63 set). Convert to Linux virtual
* address in region 6.
*/ */
plog_ptr=(ia64_err_rec_t *)IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_INIT); ms = (pal_min_state_area_t *)(ia64_sal_to_os_handoff_state.pal_min_state | (6ul<<61));
proc_ptr = &plog_ptr->proc_err;
ia64_process_min_state_save(&SAL_LPI_PSI_INFO(proc_ptr)->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);
init_handler_platform(proc_ptr, pt, sw); /* call platform specific routines */ init_handler_platform(ms, pt, sw); /* call platform specific routines */
} }
/* /*
......
...@@ -50,14 +50,15 @@ ...@@ -50,14 +50,15 @@
* 6. GR12 = Return address to location within SAL_CHECK * 6. GR12 = Return address to location within SAL_CHECK
*/ */
#define SAL_TO_OS_MCA_HANDOFF_STATE_SAVE(_tmp) \ #define SAL_TO_OS_MCA_HANDOFF_STATE_SAVE(_tmp) \
movl _tmp=ia64_sal_to_os_handoff_state;; \ LOAD_PHYSICAL(nop 0, p0, _tmp, ia64_sal_to_os_handoff_state);; \
DATA_VA_TO_PA(_tmp);; \
st8 [_tmp]=r1,0x08;; \ st8 [_tmp]=r1,0x08;; \
st8 [_tmp]=r8,0x08;; \ st8 [_tmp]=r8,0x08;; \
st8 [_tmp]=r9,0x08;; \ st8 [_tmp]=r9,0x08;; \
st8 [_tmp]=r10,0x08;; \ st8 [_tmp]=r10,0x08;; \
st8 [_tmp]=r11,0x08;; \ st8 [_tmp]=r11,0x08;; \
st8 [_tmp]=r12,0x08 st8 [_tmp]=r12,0x08;; \
st8 [_tmp]=r17,0x08;; \
st8 [_tmp]=r18,0x08
/* /*
* OS_MCA_TO_SAL_HANDOFF_STATE (SAL 3.0 spec) * OS_MCA_TO_SAL_HANDOFF_STATE (SAL 3.0 spec)
...@@ -70,9 +71,8 @@ ...@@ -70,9 +71,8 @@
* returns ptr to SAL rtn save loc in _tmp * returns ptr to SAL rtn save loc in _tmp
*/ */
#define OS_MCA_TO_SAL_HANDOFF_STATE_RESTORE(_tmp) \ #define OS_MCA_TO_SAL_HANDOFF_STATE_RESTORE(_tmp) \
(p6) movl _tmp=ia64_sal_to_os_handoff_state;; \ LOAD_PHYSICAL(nop 0, p6, _tmp, ia64_sal_to_os_handoff_state);; \
(p7) movl _tmp=ia64_os_to_sal_handoff_state;; \ LOAD_PHYSICAL(nop 0, p7, _tmp, ia64_os_to_sal_handoff_state);; \
DATA_VA_TO_PA(_tmp);; \
(p6) movl r8=IA64_MCA_COLD_BOOT; \ (p6) movl r8=IA64_MCA_COLD_BOOT; \
(p6) movl r10=IA64_MCA_SAME_CONTEXT; \ (p6) movl r10=IA64_MCA_SAME_CONTEXT; \
(p6) add _tmp=0x18,_tmp;; \ (p6) add _tmp=0x18,_tmp;; \
......
...@@ -92,6 +92,8 @@ typedef struct ia64_mca_sal_to_os_state_s { ...@@ -92,6 +92,8 @@ typedef struct ia64_mca_sal_to_os_state_s {
u64 imsto_sal_check_ra; /* Return address in SAL_CHECK while going u64 imsto_sal_check_ra; /* Return address in SAL_CHECK while going
* back to SAL from OS after MCA handling. * back to SAL from OS after MCA handling.
*/ */
u64 pal_min_state; /* from PAL in r17 */
u64 proc_state_param; /* from PAL in r18. See SDV 2:268 11.3.2.1 */
} ia64_mca_sal_to_os_state_t; } ia64_mca_sal_to_os_state_t;
enum { enum {
......
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