aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
authorKeith Owens <kaos@ocs.com.au>2006-04-07 04:08:11 -0400
committerTony Luck <tony.luck@intel.com>2006-06-21 17:44:26 -0400
commitd270acbc24f0ce451c773c214ac0e92e95396b2f (patch)
tree46fb1417fd85a4fe477afe391975bc3bc3dec1ab /arch/ia64
parentb7bb575c3fa3694811a072109f4e9c2f4705d8f5 (diff)
[IA64] Sanitize assembler code for ia64_sal_os_state
struct ia64_sal_os_state has three semi-independent sections. The code in mca_asm.S assumes that these three sections are contiguous, which makes it very awkward to add new data to this structure. Remove the assumption that the sections are contiguous. Define a macro to shorten references to offsets in ia64_sal_os_state. This patch does not change the way that the code behaves. It just makes it easier to update the code in future and to add fields to ia64_sal_os_state when debugging the MCA/INIT handlers. Signed-off-by: Keith Owens <kaos@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64')
-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
3 files changed, 30 insertions, 15 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 ;;