diff packages/hal/powerpc/arch/current/src/context.S @ 2:443894e2e912 ecos-v1_2_1-release

Block commit of eCos version 1.2.1
author jlarmour
date Tue, 11 May 1999 12:24:34 +0000
parents 3111d98ba7b3
children c38311975d4f
line wrap: on
line diff
--- a/packages/hal/powerpc/arch/current/src/context.S
+++ b/packages/hal/powerpc/arch/current/src/context.S
@@ -22,7 +22,7 @@
 # September 30, 1998.
 # 
 # The Initial Developer of the Original Code is Cygnus.  Portions created
-# by Cygnus are Copyright (C) 1998 Cygnus Solutions.  All Rights Reserved.
+# by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
 # -------------------------------------------
 #
 #####COPYRIGHTEND####
@@ -105,16 +105,25 @@ FUNC_START(hal_thread_switch_context)
         .set    _reg,_reg+1
         .endr
 
-        stw     r0,0(sp)                # R0
-        stw     r5,4(sp)                # R5 = real SP, save in R1 slot
-        stw     r2,8(sp)                # R2 = TOC
+        stw     r0,ppcreg_regs+0*4(sp)  # R0
+        stw     r5,ppcreg_regs+1*4(sp)  # R5 = real SP, save in R1 slot
+        stw     r2,ppcreg_regs+2*4(sp)  # R2 = TOC
 
         # CR cannot be treated as a special register since GCC will only
         # do partial restore of CR at function exit, depending on which
         # of CR2, CR3, and CR4 have been used in the given function.
         mfcr    r5                      # save CR.
         stw     r5,ppcreg_cr(sp)
-        
+
+#ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
+        # Make the thread context look like an exception context if thread-
+        # aware debugging is required. This state does not need restoring.
+        mflr    r5
+        stw     r5,ppcreg_pc(sp)        # pc of caller
+        mfmsr   r5
+        stw     r5,ppcreg_msr(sp)       # msr (or PS)
+#endif
+
         save_special                    # save special regs
         
         mflr    r5                      # save LR == return link for this fn
@@ -151,13 +160,11 @@ FUNC_START(hal_thread_load_context)
         .set    _reg,_reg+1
         .endr
 
-        lwz     r0,0(sp)                # R0
-        lwz     r2,8(sp)                # R2 = TOC
-        lwz     r3,12(sp)               # load r3
-#       lwz     r4,16(sp)               # load r4
-#       lwz     r5,20(sp)               # load r5
+        lwz     r0,ppcreg_regs+0*4(sp)  # R0
+        lwz     r2,ppcreg_regs+2*4(sp)  # R2 = TOC
+        lwz     r3,ppcreg_regs+3*4(sp)  # load r3
         
-        lwz     sp,4(sp)                # finally restore true SP
+        lwz     sp,ppcreg_regs+1*4(sp)  # finally restore true SP
         
         blr                             # jump to LR
                         
@@ -165,69 +172,95 @@ FUNC_START(hal_thread_load_context)
 # HAL longjmp, setjmp implementations
 # hal_setjmp saves only to callee save registers 13-31, r1[sp],r2, cr[2-4]
 # and lr into buffer supplied in r3[arg0]
+# Note: These definitions are repeated in hal_arch.h. If changes are required
+# remember to update both sets.
+
+#define CYGARC_JMP_BUF_SP        0
+#define CYGARC_JMP_BUF_R2        1
+#define CYGARC_JMP_BUF_R13       2
+#define CYGARC_JMP_BUF_R14       3
+#define CYGARC_JMP_BUF_R15       4
+#define CYGARC_JMP_BUF_R16       5
+#define CYGARC_JMP_BUF_R17       6
+#define CYGARC_JMP_BUF_R18       7
+#define CYGARC_JMP_BUF_R19       8
+#define CYGARC_JMP_BUF_R20       9
+#define CYGARC_JMP_BUF_R21      10
+#define CYGARC_JMP_BUF_R22      11
+#define CYGARC_JMP_BUF_R23      12
+#define CYGARC_JMP_BUF_R24      13
+#define CYGARC_JMP_BUF_R25      14
+#define CYGARC_JMP_BUF_R26      15
+#define CYGARC_JMP_BUF_R27      16
+#define CYGARC_JMP_BUF_R28      17
+#define CYGARC_JMP_BUF_R29      18
+#define CYGARC_JMP_BUF_R30      19
+#define CYGARC_JMP_BUF_R31      20
+#define CYGARC_JMP_BUF_LR       21
+#define CYGARC_JMP_BUF_CR       22
+
+#define CYGARC_JMP_BUF_SIZE     23
 
 FUNC_START(hal_setjmp)
         mfcr    r5
-        stw     r5,88(r3)
+        stw     r5, CYGARC_JMP_BUF_CR*4(r3)
         mflr    r5
-        stw     r5,84(r3)
-        stw     r31,80(r3)
-        stw     r30,76(r3)
-        stw     r29,72(r3)
-        stw     r28,68(r3)
-        stw     r27,64(r3)
-        stw     r26,60(r3)
-        stw     r25,56(r3)
-        stw     r24,52(r3)
-        stw     r23,48(r3)
-        stw     r22,44(r3)
-        stw     r21,40(r3)
-        stw     r20,36(r3)
-        stw     r19,32(r3)
-        stw     r18,28(r3)
-        stw     r17,24(r3)
-        stw     r16,20(r3)
-        stw     r15,16(r3)
-        stw     r14,12(r3)
-        stw     r13,8(r3)
-        stw     r2,4(r3)        # TOC, optimize out?
-        stw     sp,0(r3)
+        stw     r5, CYGARC_JMP_BUF_LR*4(r3)
+        stw     r31,CYGARC_JMP_BUF_R31*4(r3)
+        stw     r30,CYGARC_JMP_BUF_R30*4(r3)
+        stw     r29,CYGARC_JMP_BUF_R29*4(r3)
+        stw     r28,CYGARC_JMP_BUF_R28*4(r3)
+        stw     r27,CYGARC_JMP_BUF_R27*4(r3)
+        stw     r26,CYGARC_JMP_BUF_R26*4(r3)
+        stw     r25,CYGARC_JMP_BUF_R25*4(r3)
+        stw     r24,CYGARC_JMP_BUF_R24*4(r3)
+        stw     r23,CYGARC_JMP_BUF_R23*4(r3)
+        stw     r22,CYGARC_JMP_BUF_R22*4(r3)
+        stw     r21,CYGARC_JMP_BUF_R21*4(r3)
+        stw     r20,CYGARC_JMP_BUF_R20*4(r3)
+        stw     r19,CYGARC_JMP_BUF_R19*4(r3)
+        stw     r18,CYGARC_JMP_BUF_R18*4(r3)
+        stw     r17,CYGARC_JMP_BUF_R17*4(r3)
+        stw     r16,CYGARC_JMP_BUF_R16*4(r3)
+        stw     r15,CYGARC_JMP_BUF_R15*4(r3)
+        stw     r14,CYGARC_JMP_BUF_R14*4(r3)
+        stw     r13,CYGARC_JMP_BUF_R13*4(r3)
+        stw     r2, CYGARC_JMP_BUF_R2*4(r3)        # TOC, optimize out?
+        stw     sp, CYGARC_JMP_BUF_SP*4(r3)
         li      r3,0            # return 0
         blr
 
 # hal_longjmp loads state from r3[arg0] and returns
 # and lr into buffer supplied in r3[arg0]
-        
+
 FUNC_START(hal_longjmp)
-        lwz     r5,88(r3)
+        lwz     r5,CYGARC_JMP_BUF_CR*4(r3)
         mtcr    r5
-        lwz     r5,84(r3)
+        lwz     r5,CYGARC_JMP_BUF_LR*4(r3)
         mtlr    r5
-        lwz     r31,80(r3)
-        lwz     r30,76(r3)
-        lwz     r29,72(r3)
-        lwz     r28,68(r3)
-        lwz     r27,64(r3)
-        lwz     r26,60(r3)
-        lwz     r25,56(r3)
-        lwz     r24,52(r3)
-        lwz     r23,48(r3)
-        lwz     r22,44(r3)
-        lwz     r21,40(r3)
-        lwz     r20,36(r3)
-        lwz     r19,32(r3)
-        lwz     r18,28(r3)
-        lwz     r17,24(r3)
-        lwz     r16,20(r3)
-        lwz     r15,16(r3)
-        lwz     r14,12(r3)
-        lwz     r13,8(r3)
-        lwz     r2,4(r3)
-        lwz     sp,0(r3)
+        lwz     r31,CYGARC_JMP_BUF_R31*4(r3)
+        lwz     r30,CYGARC_JMP_BUF_R30*4(r3)
+        lwz     r29,CYGARC_JMP_BUF_R29*4(r3)
+        lwz     r28,CYGARC_JMP_BUF_R28*4(r3)
+        lwz     r27,CYGARC_JMP_BUF_R27*4(r3)
+        lwz     r26,CYGARC_JMP_BUF_R26*4(r3)
+        lwz     r25,CYGARC_JMP_BUF_R25*4(r3)
+        lwz     r24,CYGARC_JMP_BUF_R24*4(r3)
+        lwz     r23,CYGARC_JMP_BUF_R23*4(r3)
+        lwz     r22,CYGARC_JMP_BUF_R22*4(r3)
+        lwz     r21,CYGARC_JMP_BUF_R21*4(r3)
+        lwz     r20,CYGARC_JMP_BUF_R20*4(r3)
+        lwz     r19,CYGARC_JMP_BUF_R19*4(r3)
+        lwz     r18,CYGARC_JMP_BUF_R18*4(r3)
+        lwz     r17,CYGARC_JMP_BUF_R17*4(r3)
+        lwz     r16,CYGARC_JMP_BUF_R16*4(r3)
+        lwz     r15,CYGARC_JMP_BUF_R15*4(r3)
+        lwz     r14,CYGARC_JMP_BUF_R14*4(r3)
+        lwz     r13,CYGARC_JMP_BUF_R13*4(r3)
+        lwz     r2, CYGARC_JMP_BUF_R2*4(r3)
+        lwz     sp, CYGARC_JMP_BUF_SP*4(r3)
         mr      r3,r4           # return r4[arg1]
         blr
-                                
-        
 
 #------------------------------------------------------------------------------
 # end of context.S