aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/ia64/kernel/asm-offsets.c16
-rw-r--r--arch/ia64/kernel/entry.h1
-rw-r--r--arch/ia64/kernel/mca_asm.S28
-rw-r--r--include/asm-ia64/mca.h9
4 files changed, 36 insertions, 18 deletions
diff --git a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c
index 77225659e968..16e7b6600ae6 100644
--- a/arch/ia64/kernel/asm-offsets.c
+++ b/arch/ia64/kernel/asm-offsets.c
@@ -217,16 +217,24 @@ void foo(void)
217 DEFINE(IA64_MCA_CPU_INIT_STACK_OFFSET, 217 DEFINE(IA64_MCA_CPU_INIT_STACK_OFFSET,
218 offsetof (struct ia64_mca_cpu, init_stack)); 218 offsetof (struct ia64_mca_cpu, init_stack));
219 BLANK(); 219 BLANK();
220 DEFINE(IA64_SAL_OS_STATE_COMMON_OFFSET,
221 offsetof (struct ia64_sal_os_state, sal_ra));
222 DEFINE(IA64_SAL_OS_STATE_OS_GP_OFFSET, 220 DEFINE(IA64_SAL_OS_STATE_OS_GP_OFFSET,
223 offsetof (struct ia64_sal_os_state, os_gp)); 221 offsetof (struct ia64_sal_os_state, os_gp));
224 DEFINE(IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET,
225 offsetof (struct ia64_sal_os_state, pal_min_state));
226 DEFINE(IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET, 222 DEFINE(IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET,
227 offsetof (struct ia64_sal_os_state, proc_state_param)); 223 offsetof (struct ia64_sal_os_state, proc_state_param));
224 DEFINE(IA64_SAL_OS_STATE_SAL_RA_OFFSET,
225 offsetof (struct ia64_sal_os_state, sal_ra));
226 DEFINE(IA64_SAL_OS_STATE_SAL_GP_OFFSET,
227 offsetof (struct ia64_sal_os_state, sal_gp));
228 DEFINE(IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET,
229 offsetof (struct ia64_sal_os_state, pal_min_state));
230 DEFINE(IA64_SAL_OS_STATE_OS_STATUS_OFFSET,
231 offsetof (struct ia64_sal_os_state, os_status));
232 DEFINE(IA64_SAL_OS_STATE_CONTEXT_OFFSET,
233 offsetof (struct ia64_sal_os_state, context));
228 DEFINE(IA64_SAL_OS_STATE_SIZE, 234 DEFINE(IA64_SAL_OS_STATE_SIZE,
229 sizeof (struct ia64_sal_os_state)); 235 sizeof (struct ia64_sal_os_state));
236 BLANK();
237
230 DEFINE(IA64_PMSA_GR_OFFSET, 238 DEFINE(IA64_PMSA_GR_OFFSET,
231 offsetof (struct pal_min_state_area_s, pmsa_gr)); 239 offsetof (struct pal_min_state_area_s, pmsa_gr));
232 DEFINE(IA64_PMSA_BANK1_GR_OFFSET, 240 DEFINE(IA64_PMSA_BANK1_GR_OFFSET,
diff --git a/arch/ia64/kernel/entry.h b/arch/ia64/kernel/entry.h
index 78eeb0793419..ebc3dfb88826 100644
--- a/arch/ia64/kernel/entry.h
+++ b/arch/ia64/kernel/entry.h
@@ -23,6 +23,7 @@
23 23
24#define PT(f) (IA64_PT_REGS_##f##_OFFSET) 24#define PT(f) (IA64_PT_REGS_##f##_OFFSET)
25#define SW(f) (IA64_SWITCH_STACK_##f##_OFFSET) 25#define SW(f) (IA64_SWITCH_STACK_##f##_OFFSET)
26#define SOS(f) (IA64_SAL_OS_STATE_##f##_OFFSET)
26 27
27#define PT_REGS_SAVES(off) \ 28#define PT_REGS_SAVES(off) \
28 .unwabi 3, 'i'; \ 29 .unwabi 3, 'i'; \
diff --git a/arch/ia64/kernel/mca_asm.S b/arch/ia64/kernel/mca_asm.S
index 6dff024cd62b..c1bd1feffab0 100644
--- a/arch/ia64/kernel/mca_asm.S
+++ b/arch/ia64/kernel/mca_asm.S
@@ -159,7 +159,7 @@ ia64_os_mca_spin:
159 GET_IA64_MCA_DATA(r2) 159 GET_IA64_MCA_DATA(r2)
160 // Using MCA stack, struct ia64_sal_os_state, variable proc_state_param 160 // Using MCA stack, struct ia64_sal_os_state, variable proc_state_param
161 ;; 161 ;;
162 add r3=IA64_MCA_CPU_MCA_STACK_OFFSET+MCA_SOS_OFFSET+IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET, r2 162 add r3=IA64_MCA_CPU_MCA_STACK_OFFSET+MCA_SOS_OFFSET+SOS(PROC_STATE_PARAM), r2
163 ;; 163 ;;
164 ld8 r18=[r3] // Get processor state parameter on existing PALE_CHECK. 164 ld8 r18=[r3] // Get processor state parameter on existing PALE_CHECK.
165 ;; 165 ;;
@@ -479,9 +479,11 @@ ia64_state_save:
479 st8 [temp2]=r11,16 // rv_rc 479 st8 [temp2]=r11,16 // rv_rc
480 mov r11=cr.iipa 480 mov r11=cr.iipa
481 ;; 481 ;;
482 st8 [temp1]=r18,16 // proc_state_param 482 st8 [temp1]=r18 // proc_state_param
483 st8 [temp2]=r19,16 // monarch 483 st8 [temp2]=r19 // monarch
484 mov r6=IA64_KR(CURRENT) 484 mov r6=IA64_KR(CURRENT)
485 add temp1=SOS(SAL_RA), regs
486 add temp2=SOS(SAL_GP), regs
485 ;; 487 ;;
486 st8 [temp1]=r12,16 // sal_ra 488 st8 [temp1]=r12,16 // sal_ra
487 st8 [temp2]=r10,16 // sal_gp 489 st8 [temp2]=r10,16 // sal_gp
@@ -503,12 +505,14 @@ ia64_state_save:
503 st8 [temp2]=r11,16 // cr.iipa 505 st8 [temp2]=r11,16 // cr.iipa
504 mov r12=cr.iim 506 mov r12=cr.iim
505 ;; 507 ;;
506 st8 [temp1]=r12,16 // cr.iim 508 st8 [temp1]=r12 // cr.iim
507(p1) mov r12=IA64_MCA_COLD_BOOT 509(p1) mov r12=IA64_MCA_COLD_BOOT
508(p2) mov r12=IA64_INIT_WARM_BOOT 510(p2) mov r12=IA64_INIT_WARM_BOOT
509 mov r6=cr.iha 511 mov r6=cr.iha
512 add temp1=SOS(OS_STATUS), regs
510 ;; 513 ;;
511 st8 [temp2]=r6,16 // cr.iha 514 st8 [temp2]=r6 // cr.iha
515 add temp2=SOS(CONTEXT), regs
512 st8 [temp1]=r12 // os_status, default is cold boot 516 st8 [temp1]=r12 // os_status, default is cold boot
513 mov r6=IA64_MCA_SAME_CONTEXT 517 mov r6=IA64_MCA_SAME_CONTEXT
514 ;; 518 ;;
@@ -820,8 +824,8 @@ ia64_state_restore:
820 // Restore the SAL to OS state. The previous code left regs at pt_regs. 824 // Restore the SAL to OS state. The previous code left regs at pt_regs.
821 add regs=MCA_SOS_OFFSET-MCA_PT_REGS_OFFSET, regs 825 add regs=MCA_SOS_OFFSET-MCA_PT_REGS_OFFSET, regs
822 ;; 826 ;;
823 add temp1=IA64_SAL_OS_STATE_COMMON_OFFSET, regs 827 add temp1=SOS(SAL_RA), regs
824 add temp2=IA64_SAL_OS_STATE_COMMON_OFFSET+8, regs 828 add temp2=SOS(SAL_GP), regs
825 ;; 829 ;;
826 ld8 r12=[temp1],16 // sal_ra 830 ld8 r12=[temp1],16 // sal_ra
827 ld8 r9=[temp2],16 // sal_gp 831 ld8 r9=[temp2],16 // sal_gp
@@ -842,8 +846,10 @@ ia64_state_restore:
842 ;; 846 ;;
843 mov cr.itir=temp3 847 mov cr.itir=temp3
844 mov cr.iipa=temp4 848 mov cr.iipa=temp4
845 ld8 temp3=[temp1],16 // cr.iim 849 ld8 temp3=[temp1] // cr.iim
846 ld8 temp4=[temp2],16 // cr.iha 850 ld8 temp4=[temp2] // cr.iha
851 add temp1=SOS(OS_STATUS), regs
852 add temp2=SOS(CONTEXT), regs
847 ;; 853 ;;
848 mov cr.iim=temp3 854 mov cr.iim=temp3
849 mov cr.iha=temp4 855 mov cr.iha=temp4
@@ -916,7 +922,7 @@ ia64_state_restore:
916 922
917ia64_new_stack: 923ia64_new_stack:
918 add regs=MCA_PT_REGS_OFFSET, r3 924 add regs=MCA_PT_REGS_OFFSET, r3
919 add temp2=MCA_SOS_OFFSET+IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET, r3 925 add temp2=MCA_SOS_OFFSET+SOS(PAL_MIN_STATE), r3
920 mov b0=r2 // save return address 926 mov b0=r2 // save return address
921 GET_IA64_MCA_DATA(temp1) 927 GET_IA64_MCA_DATA(temp1)
922 invala 928 invala
@@ -1020,7 +1026,7 @@ ia64_old_stack:
1020 1026
1021ia64_set_kernel_registers: 1027ia64_set_kernel_registers:
1022 add temp3=MCA_SP_OFFSET, r3 1028 add temp3=MCA_SP_OFFSET, r3
1023 add temp4=MCA_SOS_OFFSET+IA64_SAL_OS_STATE_OS_GP_OFFSET, r3 1029 add temp4=MCA_SOS_OFFSET+SOS(OS_GP), r3
1024 mov b0=r2 // save return address 1030 mov b0=r2 // save return address
1025 GET_IA64_MCA_DATA(temp1) 1031 GET_IA64_MCA_DATA(temp1)
1026 ;; 1032 ;;
diff --git a/include/asm-ia64/mca.h b/include/asm-ia64/mca.h
index 9c5389b7e623..ee97f7c2d462 100644
--- a/include/asm-ia64/mca.h
+++ b/include/asm-ia64/mca.h
@@ -69,14 +69,16 @@ typedef struct ia64_mc_info_s {
69 */ 69 */
70 70
71struct ia64_sal_os_state { 71struct ia64_sal_os_state {
72 /* SAL to OS, must be at offset 0 */ 72
73 /* SAL to OS */
73 u64 os_gp; /* GP of the os registered with the SAL, physical */ 74 u64 os_gp; /* GP of the os registered with the SAL, physical */
74 u64 pal_proc; /* PAL_PROC entry point, physical */ 75 u64 pal_proc; /* PAL_PROC entry point, physical */
75 u64 sal_proc; /* SAL_PROC entry point, physical */ 76 u64 sal_proc; /* SAL_PROC entry point, physical */
76 u64 rv_rc; /* MCA - Rendezvous state, INIT - reason code */ 77 u64 rv_rc; /* MCA - Rendezvous state, INIT - reason code */
77 u64 proc_state_param; /* from R18 */ 78 u64 proc_state_param; /* from R18 */
78 u64 monarch; /* 1 for a monarch event, 0 for a slave */ 79 u64 monarch; /* 1 for a monarch event, 0 for a slave */
79 /* common, must follow SAL to OS */ 80
81 /* common */
80 u64 sal_ra; /* Return address in SAL, physical */ 82 u64 sal_ra; /* Return address in SAL, physical */
81 u64 sal_gp; /* GP of the SAL - physical */ 83 u64 sal_gp; /* GP of the SAL - physical */
82 pal_min_state_area_t *pal_min_state; /* from R17. physical in asm, virtual in C */ 84 pal_min_state_area_t *pal_min_state; /* from R17. physical in asm, virtual in C */
@@ -98,7 +100,8 @@ struct ia64_sal_os_state {
98 u64 iipa; 100 u64 iipa;
99 u64 iim; 101 u64 iim;
100 u64 iha; 102 u64 iha;
101 /* OS to SAL, must follow common */ 103
104 /* OS to SAL */
102 u64 os_status; /* OS status to SAL, enum below */ 105 u64 os_status; /* OS status to SAL, enum below */
103 u64 context; /* 0 if return to same context 106 u64 context; /* 0 if return to same context
104 1 if return to new context */ 107 1 if return to new context */