[IA64] Sanitize assembler code for ia64_sal_os_state
authorKeith Owens <kaos@ocs.com.au>
Fri, 7 Apr 2006 08:08:11 +0000 (18:08 +1000)
committerTony Luck <tony.luck@intel.com>
Wed, 21 Jun 2006 21:44:26 +0000 (14:44 -0700)
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>
arch/ia64/kernel/asm-offsets.c
arch/ia64/kernel/entry.h
arch/ia64/kernel/mca_asm.S
include/asm-ia64/mca.h

index 7722565..16e7b66 100644 (file)
@@ -217,16 +217,24 @@ void foo(void)
        DEFINE(IA64_MCA_CPU_INIT_STACK_OFFSET,
               offsetof (struct ia64_mca_cpu, init_stack));
        BLANK();
-       DEFINE(IA64_SAL_OS_STATE_COMMON_OFFSET,
-              offsetof (struct ia64_sal_os_state, sal_ra));
        DEFINE(IA64_SAL_OS_STATE_OS_GP_OFFSET,
               offsetof (struct ia64_sal_os_state, os_gp));
-       DEFINE(IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET,
-              offsetof (struct ia64_sal_os_state, pal_min_state));
        DEFINE(IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET,
               offsetof (struct ia64_sal_os_state, proc_state_param));
+       DEFINE(IA64_SAL_OS_STATE_SAL_RA_OFFSET,
+              offsetof (struct ia64_sal_os_state, sal_ra));
+       DEFINE(IA64_SAL_OS_STATE_SAL_GP_OFFSET,
+              offsetof (struct ia64_sal_os_state, sal_gp));
+       DEFINE(IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET,
+              offsetof (struct ia64_sal_os_state, pal_min_state));
+       DEFINE(IA64_SAL_OS_STATE_OS_STATUS_OFFSET,
+              offsetof (struct ia64_sal_os_state, os_status));
+       DEFINE(IA64_SAL_OS_STATE_CONTEXT_OFFSET,
+              offsetof (struct ia64_sal_os_state, context));
        DEFINE(IA64_SAL_OS_STATE_SIZE,
               sizeof (struct ia64_sal_os_state));
+       BLANK();
+
        DEFINE(IA64_PMSA_GR_OFFSET,
               offsetof (struct pal_min_state_area_s, pmsa_gr));
        DEFINE(IA64_PMSA_BANK1_GR_OFFSET,
index 78eeb07..ebc3dfb 100644 (file)
@@ -23,6 +23,7 @@
 
 #define PT(f)          (IA64_PT_REGS_##f##_OFFSET)
 #define SW(f)          (IA64_SWITCH_STACK_##f##_OFFSET)
+#define SOS(f)         (IA64_SAL_OS_STATE_##f##_OFFSET)
 
 #define PT_REGS_SAVES(off)                     \
        .unwabi 3, 'i';                         \
index 6dff024..c1bd1fe 100644 (file)
@@ -159,7 +159,7 @@ ia64_os_mca_spin:
        GET_IA64_MCA_DATA(r2)
        // Using MCA stack, struct ia64_sal_os_state, variable proc_state_param
        ;;
-       add r3=IA64_MCA_CPU_MCA_STACK_OFFSET+MCA_SOS_OFFSET+IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET, r2
+       add r3=IA64_MCA_CPU_MCA_STACK_OFFSET+MCA_SOS_OFFSET+SOS(PROC_STATE_PARAM), r2
        ;;
        ld8 r18=[r3]                            // Get processor state parameter on existing PALE_CHECK.
        ;;
@@ -479,9 +479,11 @@ ia64_state_save:
        st8 [temp2]=r11,16      // rv_rc
        mov r11=cr.iipa
        ;;
-       st8 [temp1]=r18,16      // proc_state_param
-       st8 [temp2]=r19,16      // monarch
+       st8 [temp1]=r18         // proc_state_param
+       st8 [temp2]=r19         // monarch
        mov r6=IA64_KR(CURRENT)
+       add temp1=SOS(SAL_RA), regs
+       add temp2=SOS(SAL_GP), regs
        ;;
        st8 [temp1]=r12,16      // sal_ra
        st8 [temp2]=r10,16      // sal_gp
@@ -503,12 +505,14 @@ ia64_state_save:
        st8 [temp2]=r11,16      // cr.iipa
        mov r12=cr.iim
        ;;
-       st8 [temp1]=r12,16      // cr.iim
+       st8 [temp1]=r12         // cr.iim
 (p1)   mov r12=IA64_MCA_COLD_BOOT
 (p2)   mov r12=IA64_INIT_WARM_BOOT
        mov r6=cr.iha
+       add temp1=SOS(OS_STATUS), regs
        ;;
-       st8 [temp2]=r6,16       // cr.iha
+       st8 [temp2]=r6          // cr.iha
+       add temp2=SOS(CONTEXT), regs
        st8 [temp1]=r12         // os_status, default is cold boot
        mov r6=IA64_MCA_SAME_CONTEXT
        ;;
@@ -820,8 +824,8 @@ ia64_state_restore:
        // Restore the SAL to OS state. The previous code left regs at pt_regs.
        add regs=MCA_SOS_OFFSET-MCA_PT_REGS_OFFSET, regs
        ;;
-       add temp1=IA64_SAL_OS_STATE_COMMON_OFFSET, regs
-       add temp2=IA64_SAL_OS_STATE_COMMON_OFFSET+8, regs
+       add temp1=SOS(SAL_RA), regs
+       add temp2=SOS(SAL_GP), regs
        ;;
        ld8 r12=[temp1],16      // sal_ra
        ld8 r9=[temp2],16       // sal_gp
@@ -842,8 +846,10 @@ ia64_state_restore:
        ;;
        mov cr.itir=temp3
        mov cr.iipa=temp4
-       ld8 temp3=[temp1],16    // cr.iim
-       ld8 temp4=[temp2],16    // cr.iha
+       ld8 temp3=[temp1]       // cr.iim
+       ld8 temp4=[temp2]               // cr.iha
+       add temp1=SOS(OS_STATUS), regs
+       add temp2=SOS(CONTEXT), regs
        ;;
        mov cr.iim=temp3
        mov cr.iha=temp4
@@ -916,7 +922,7 @@ ia64_state_restore:
 
 ia64_new_stack:
        add regs=MCA_PT_REGS_OFFSET, r3
-       add temp2=MCA_SOS_OFFSET+IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET, r3
+       add temp2=MCA_SOS_OFFSET+SOS(PAL_MIN_STATE), r3
        mov b0=r2                       // save return address
        GET_IA64_MCA_DATA(temp1)
        invala
@@ -1020,7 +1026,7 @@ ia64_old_stack:
 
 ia64_set_kernel_registers:
        add temp3=MCA_SP_OFFSET, r3
-       add temp4=MCA_SOS_OFFSET+IA64_SAL_OS_STATE_OS_GP_OFFSET, r3
+       add temp4=MCA_SOS_OFFSET+SOS(OS_GP), r3
        mov b0=r2               // save return address
        GET_IA64_MCA_DATA(temp1)
        ;;
index 9c5389b..ee97f7c 100644 (file)
@@ -69,14 +69,16 @@ typedef struct ia64_mc_info_s {
  */
 
 struct ia64_sal_os_state {
-       /* SAL to OS, must be at offset 0 */
+
+       /* SAL to OS */
        u64                     os_gp;                  /* GP of the os registered with the SAL, physical */
        u64                     pal_proc;               /* PAL_PROC entry point, physical */
        u64                     sal_proc;               /* SAL_PROC entry point, physical */
        u64                     rv_rc;                  /* MCA - Rendezvous state, INIT - reason code */
        u64                     proc_state_param;       /* from R18 */
        u64                     monarch;                /* 1 for a monarch event, 0 for a slave */
-       /* common, must follow SAL to OS */
+
+       /* common */
        u64                     sal_ra;                 /* Return address in SAL, physical */
        u64                     sal_gp;                 /* GP of the SAL - physical */
        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 {
        u64                     iipa;
        u64                     iim;
        u64                     iha;
-       /* OS to SAL, must follow common */
+
+       /* OS to SAL */
        u64                     os_status;              /* OS status to SAL, enum below */
        u64                     context;                /* 0 if return to same context
                                                           1 if return to new context */