Mercurial > ecos
diff packages/hal/powerpc/arch/current/src/context.S @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | bf00f99aec69 |
| children | e0c0827131d1 |
line wrap: on
line diff
--- a/packages/hal/powerpc/arch/current/src/context.S +++ b/packages/hal/powerpc/arch/current/src/context.S @@ -45,15 +45,8 @@ #include <pkgconf/hal.h> -#include "cyg/hal/ppc.inc" - -#------------------------------------------------------------------------------ -# function declaration macro - -#define FUNC_START(name) \ - .type name,@function; \ - .globl name; \ -name: +#include <cyg/hal/arch.inc> +#include <cyg/hal/ppc_offsets.inc> #------------------------------------------------------------------------------ # Configure to use either a minimal or maximal thread state @@ -76,13 +69,13 @@ name: .macro save_special mfxer r6 mfctr r7 - stw r6,ppcreg_xer(sp) - stw r7,ppcreg_ctr(sp) + stw r6,CYGARC_PPCREG_XER(sp) + stw r7,CYGARC_PPCREG_CTR(sp) .endm .macro load_special - lwz r6,ppcreg_xer(sp) - lwz r7,ppcreg_ctr(sp) + lwz r6,CYGARC_PPCREG_XER(sp) + lwz r7,CYGARC_PPCREG_CTR(sp) mtxer r6 mtctr r7 .endm @@ -98,38 +91,39 @@ name: FUNC_START(hal_thread_switch_context) mr r5,sp # R5 = saved stack pointer - subi sp,sp,ppcreg_context_size # space for state + subi sp,sp,CYGARC_PPC_CONTEXT_SIZE # space for state # Save registers MIN..MAX .set _reg,MIN_SAVE_REG .rept MAX_SAVE_REG+1-MIN_SAVE_REG - stw _reg,(ppcreg_regs+_reg*4)(sp) + stw _reg,(CYGARC_PPCREG_REGS+_reg*4)(sp) .set _reg,_reg+1 .endr - 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 + stw r0,CYGARC_PPCREG_REGS+0*4(sp) # R0 + stw r5,CYGARC_PPCREG_REGS+1*4(sp) # R5 = real SP, save in R1 slot + stw r2,CYGARC_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) + stw r5,CYGARC_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 + stw r5,CYGARC_PPCREG_PC(sp) # pc of caller +#endif + mfmsr r5 - stw r5,ppcreg_msr(sp) # msr (or PS) -#endif + stw r5,CYGARC_PPCREG_MSR(sp)# msr (or PS) save_special # save special regs mflr r5 # save LR == return link for this fn - stw r5,ppcreg_lr(sp) + stw r5,CYGARC_PPCREG_LR(sp) stw sp,0(r4) # save SP into save location @@ -149,24 +143,27 @@ FUNC_START(hal_thread_load_context) load_special # load special registers - lwz r5,ppcreg_cr(sp) # restore CR + lwz r5,CYGARC_PPCREG_CR(sp) # restore CR mtcr r5 - lwz r5,ppcreg_lr(sp) # get LR as set as return link + lwz r5,CYGARC_PPCREG_LR(sp) # get LR as set as return link mtlr r5 # Load registers MIN..MAX .set _reg,MIN_SAVE_REG .rept MAX_SAVE_REG+1-MIN_SAVE_REG - lwz _reg,(ppcreg_regs+_reg*4)(sp) + lwz _reg,(CYGARC_PPCREG_REGS+_reg*4)(sp) .set _reg,_reg+1 .endr - 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 r3,CYGARC_PPCREG_MSR(sp) # merge interrupt state + hal_cpu_int_merge r3 + + lwz r0,CYGARC_PPCREG_REGS+0*4(sp) # R0 + lwz r2,CYGARC_PPCREG_REGS+2*4(sp) # R2 = TOC + lwz r3,CYGARC_PPCREG_REGS+3*4(sp) # load r3 - lwz sp,ppcreg_regs+1*4(sp) # finally restore true SP + lwz sp,CYGARC_PPCREG_REGS+1*4(sp) # finally restore true SP blr # jump to LR @@ -174,93 +171,65 @@ 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, CYGARC_JMP_BUF_CR*4(r3) + stw r5, CYGARC_JMPBUF_CR(r3) mflr r5 - 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) + stw r5, CYGARC_JMPBUF_LR(r3) + stw r31,CYGARC_JMPBUF_R31(r3) + stw r30,CYGARC_JMPBUF_R30(r3) + stw r29,CYGARC_JMPBUF_R29(r3) + stw r28,CYGARC_JMPBUF_R28(r3) + stw r27,CYGARC_JMPBUF_R27(r3) + stw r26,CYGARC_JMPBUF_R26(r3) + stw r25,CYGARC_JMPBUF_R25(r3) + stw r24,CYGARC_JMPBUF_R24(r3) + stw r23,CYGARC_JMPBUF_R23(r3) + stw r22,CYGARC_JMPBUF_R22(r3) + stw r21,CYGARC_JMPBUF_R21(r3) + stw r20,CYGARC_JMPBUF_R20(r3) + stw r19,CYGARC_JMPBUF_R19(r3) + stw r18,CYGARC_JMPBUF_R18(r3) + stw r17,CYGARC_JMPBUF_R17(r3) + stw r16,CYGARC_JMPBUF_R16(r3) + stw r15,CYGARC_JMPBUF_R15(r3) + stw r14,CYGARC_JMPBUF_R14(r3) + stw r13,CYGARC_JMPBUF_R13(r3) + stw r2, CYGARC_JMPBUF_R2(r3) # TOC, optimize out? + stw sp, CYGARC_JMPBUF_SP(r3) li r3,0 # return 0 blr # hal_longjmp loads state from r3[arg0] and returns -# and lr into buffer supplied in r3[arg0] +# to the setjmp caller with r4[arg1] as return value FUNC_START(hal_longjmp) - lwz r5,CYGARC_JMP_BUF_CR*4(r3) + lwz r5,CYGARC_JMPBUF_CR(r3) mtcr r5 - lwz r5,CYGARC_JMP_BUF_LR*4(r3) + lwz r5,CYGARC_JMPBUF_LR(r3) mtlr r5 - 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) + lwz r31,CYGARC_JMPBUF_R31(r3) + lwz r30,CYGARC_JMPBUF_R30(r3) + lwz r29,CYGARC_JMPBUF_R29(r3) + lwz r28,CYGARC_JMPBUF_R28(r3) + lwz r27,CYGARC_JMPBUF_R27(r3) + lwz r26,CYGARC_JMPBUF_R26(r3) + lwz r25,CYGARC_JMPBUF_R25(r3) + lwz r24,CYGARC_JMPBUF_R24(r3) + lwz r23,CYGARC_JMPBUF_R23(r3) + lwz r22,CYGARC_JMPBUF_R22(r3) + lwz r21,CYGARC_JMPBUF_R21(r3) + lwz r20,CYGARC_JMPBUF_R20(r3) + lwz r19,CYGARC_JMPBUF_R19(r3) + lwz r18,CYGARC_JMPBUF_R18(r3) + lwz r17,CYGARC_JMPBUF_R17(r3) + lwz r16,CYGARC_JMPBUF_R16(r3) + lwz r15,CYGARC_JMPBUF_R15(r3) + lwz r14,CYGARC_JMPBUF_R14(r3) + lwz r13,CYGARC_JMPBUF_R13(r3) + lwz r2, CYGARC_JMPBUF_R2(r3) + lwz sp, CYGARC_JMPBUF_SP(r3) mr r3,r4 # return r4[arg1] blr
