crt0.s

来自「IBM PowerPC 405 在DiabData开发环境下的ucosII移植代」· S 代码 · 共 815 行 · 第 1/3 页

S
815
字号
Ready:        addi    r7, r3, -4              # r7-> dest addr (sub 4 to start)        addi    r5, r5, -4              # r5-> src addr (sub 4 to start)        mtctr   r8                      # CTR: # instrs (words) to move#Loop:        lwzu    r0, 4(r5)        stwu    r0, 4(r7)        bc      0x10, 0, Loop        blr                             # All done!#        .align  2#TC.VECTORS:        .long   0                       # dummy entry!        .long   VT_INTR#        .text##************************************************************************#      VT_INTR: Interrupt exception vector                              *#                                                                       *#      NOTE(S): It is necessary to save SRR0 and SRR1 in the vector's   *#       "register save area" before extending the stack and storing     *#       them there, because accessing the stack might cause a TLB miss  *#       exception, which will change SRR0 and SRR1.                     *#                                                                       *#************************************************************************VT_INTR:#------------------------------------------------------------------------# Set r31 to point to the beginning of this vector.  In order to do this*# it is necessary to first save the current values of LR and r31 in     *# SPRG2 and SPRG3 respectively.                                         *#------------------------------------------------------------------------        mtspr   SPRG3, r31              # SPRG3: saved value of r31        mflr    r31        mtspr   SPRG2, r31              # SPRG2: saved value of LR         bl      1f                      # LR: current IP1:        mflr    r31                     # r31: current IP        rlwinm  r31, r31, 0, 0, 23      # r31->beginning of vector##------------------------------------------------------------------------# Store values of r30 and SRR0 & SRR1 in the vector's save area#------------------------------------------------------------------------        stw     r30, V_SAVE_AREA+8(r31) # save r30#        mfsrr0  r30        stw     r30, V_SAVE_AREA+36(r31)# Save SRR0        mfsrr1  r30        stw     r30, V_SAVE_AREA+40(r31)# Save SRR1#------------------------------------------------------------------------# Create a stack frame and put r29-r31, LR, CR, SRR0 and SRR1 on it.    *#------------------------------------------------------------------------        stwu    sp,  SC_STK_FRAME(sp)   # Allocate a stack frame        stw     r29, SC_STK_R29(sp)     # Save r29        lwz     r29, V_SAVE_AREA+8(r31) #         stw     r29, SC_STK_R30(sp)     # Save r30        mfspr   r29, SPRG3        stw     r29, SC_STK_R31(sp)     # Save r31        lwz     r29, V_SAVE_AREA+36(r31)            stw     r29, SC_STK_SRR0(sp)    # Save SRR0        mfspr   r29, SPRG2        stw     r29, SC_STK_LR(sp)      # Save LR        lwz     r30, V_SAVE_AREA+40(r31)        stw     r30, SC_STK_SRR1(sp)    # Save SRR1        mfcr    r29                     # r29: CR        stw     r29, SC_STK_CR(sp)      # Save CR		mfxer	r29						# r29: XER		stw		r29, SC_STK_XER(sp)		# save XER		mfctr	r29						# r29: CTR		stw		r29, SC_STK_CTR(sp)		# save CTR		##------------------------------------------------------------------------# SRR0 & SRR1 are now saved, so exceptions can be re-enabled now if     *# need be.                                                              *# Pick up "enable_mask" value and "or" it with the MSR, thus re-enabling*# desired exceptions.                                                   *#                                                                       *# The value of MSR_IR and MSR_DR will be restored to the values         *# prior to the exception.                                               *#------------------------------------------------------------------------        lis     r29, (MSR_IR|MSR_DR)@ha # restore MSR_IR & MSR_DR        addi    r29, r29, (MSR_IR|MSR_DR)@l     # restore MSR_IR & MSR_DR        and     r30, r30, r29           # restore MSR_IR & MSR_DR        mfmsr   r29                     # r29: MSR        or      r29, r29, r30           # #        lwz     r30, V_ENABLE_MASK(r31)        or      r29, r30, r29           # r29: MSR | V_ENABLE_MASK        mtmsr   r29                     # store new MSR        isync##------------------------------------------------------------------------# Finish filling in the stack frame: save CR and format/offset word.    *# Then transfer control to the specified handler.                       *#------------------------------------------------------------------------        oris    r30, r31, 2             # r30: format (2) & vect offset        lwz     r29, V_HANDLER(r31)     # r29-> handler        stw     r30, SC_STK_VECTOR(sp)  # Save format/offset word        mtlr    r29                     # LR-> handler        blr                             # jump to handler#Vector information. Vectors are 256 bytes long.    V_CODE          =   0    V_ENDCODE       =   184    V_ENABLE_MASK   =   192    V_HANDLER       =   196    V_SAVE_AREA     =   200    SC_STK_FRAME    =   -184    SC_STK_LINK     =   0x00    SC_STK_R0       =   (SC_STK_LINK + 16)    SC_STK_R1       =   (SC_STK_R0 + 4)    SC_STK_R2       =   (SC_STK_R1 + 4)    SC_STK_R3       =   (SC_STK_R2 + 4)    SC_STK_R4       =   (SC_STK_R3 + 4)    SC_STK_R5       =   (SC_STK_R4 + 4)    SC_STK_R6       =   (SC_STK_R5 + 4)    SC_STK_R7       =   (SC_STK_R6 + 4)    SC_STK_R8       =   (SC_STK_R7 + 4)    SC_STK_R9       =   (SC_STK_R8 + 4)    SC_STK_R10      =   (SC_STK_R9 + 4)    SC_STK_R11      =   (SC_STK_R10 + 4)    SC_STK_R12      =   (SC_STK_R11 + 4)    SC_STK_R13      =   (SC_STK_R12 + 4)    SC_STK_R14      =   (SC_STK_R13 + 4)    SC_STK_R15      =   (SC_STK_R14 + 4)    SC_STK_R16      =   (SC_STK_R15 + 4)    SC_STK_R17      =   (SC_STK_R16 + 4)    SC_STK_R18      =   (SC_STK_R17 + 4)    SC_STK_R19      =   (SC_STK_R18 + 4)    SC_STK_R20      =   (SC_STK_R19 + 4)    SC_STK_R21      =   (SC_STK_R20 + 4)    SC_STK_R22      =   (SC_STK_R21 + 4)    SC_STK_R23      =   (SC_STK_R22 + 4)    SC_STK_R24      =   (SC_STK_R23 + 4)    SC_STK_R25      =   (SC_STK_R24 + 4)    SC_STK_R26      =   (SC_STK_R25 + 4)    SC_STK_R27      =   (SC_STK_R26 + 4)    SC_STK_R28      =   (SC_STK_R27 + 4)    SC_STK_R29      =   (SC_STK_R28 + 4)    SC_STK_R30      =   (SC_STK_R29 + 4)    SC_STK_R31      =   (SC_STK_R30 + 4)    SC_STK_CR       =   (SC_STK_R31 + 4)    SC_STK_MQ       =   (SC_STK_CR + 4)    SC_STK_XER      =   (SC_STK_MQ + 4)    SC_STK_LR       =   (SC_STK_XER + 4)    SC_STK_CTR      =   (SC_STK_LR + 4)    SC_STK_SRR0     =   (SC_STK_CTR + 4)    SC_STK_SRR1     =   (SC_STK_SRR0 + 4)    SC_STK_SRR2     =   (SC_STK_SRR1 + 4)    SC_STK_SRR3     =   (SC_STK_SRR2 + 4)    SC_STK_VECTOR       =   (SC_STK_SRR3 + 4)# The stack pointer register.    sp  =   r1        .align 2        .globl  interrupt_save_registersinterrupt_save_registers:#------------------------------------------------------------------------# r1,r29-31 already saved in vector code and have been changed          *#------------------------------------------------------------------------        stw     r0 , SC_STK_R0(sp)        stw     r2 , SC_STK_R2(sp)        stw     r3 , SC_STK_R3(sp)        stw     r4 , SC_STK_R4(sp)        stw     r5 , SC_STK_R5(sp)        stw     r6 , SC_STK_R6(sp)        stw     r7 , SC_STK_R7(sp)        stw     r8 , SC_STK_R8(sp)        stw     r9 , SC_STK_R9(sp)        stw     r10, SC_STK_R10(sp)        stw     r11, SC_STK_R11(sp)        stw     r12, SC_STK_R12(sp)        stw     r13, SC_STK_R13(sp)        stw     r14, SC_STK_R14(sp)        stw     r15, SC_STK_R15(sp)        stw     r16, SC_STK_R16(sp)        stw     r17, SC_STK_R17(sp)        stw     r18, SC_STK_R18(sp)        stw     r19, SC_STK_R19(sp)        stw     r20, SC_STK_R20(sp)        stw     r21, SC_STK_R21(sp)        stw     r22, SC_STK_R22(sp)        stw     r23, SC_STK_R23(sp)        stw     r24, SC_STK_R24(sp)        stw     r25, SC_STK_R25(sp)        stw     r26, SC_STK_R26(sp)        stw     r27, SC_STK_R27(sp)        stw     r28, SC_STK_R28(sp)        isync        blr        .align 2        .globl  interrupt_restore_registers#interrupt_restore_registers:        lwz     r0 , SC_STK_R0(sp)        lwz     r2 , SC_STK_R2(sp)        lwz     r3 , SC_STK_R3(sp)        lwz     r4 , SC_STK_R4(sp)        lwz     r5 , SC_STK_R5(sp)        lwz     r6 , SC_STK_R6(sp)        lwz     r7 , SC_STK_R7(sp)        lwz     r8 , SC_STK_R8(sp)        lwz     r9 , SC_STK_R9(sp)        lwz     r10, SC_STK_R10(sp)        lwz     r11, SC_STK_R11(sp)        lwz     r12, SC_STK_R12(sp)        lwz     r13, SC_STK_R13(sp)        lwz     r14, SC_STK_R14(sp)        lwz     r15, SC_STK_R15(sp)        lwz     r16, SC_STK_R16(sp)        lwz     r17, SC_STK_R17(sp)        lwz     r18, SC_STK_R18(sp)        lwz     r19, SC_STK_R19(sp)        lwz     r20, SC_STK_R20(sp)        lwz     r21, SC_STK_R21(sp)        lwz     r22, SC_STK_R22(sp)        lwz     r23, SC_STK_R23(sp)        lwz     r24, SC_STK_R24(sp)        lwz     r25, SC_STK_R25(sp)        lwz     r26, SC_STK_R26(sp)        lwz     r27, SC_STK_R27(sp)        lwz     r28, SC_STK_R28(sp)        lwz     r29, SC_STK_R29(sp)        lwz     r30, SC_STK_R30(sp)#************************************************************************#       Use r31 as a swap reg to reload the SRR0, SRR1, CR, LR, then r31*#************************************************************************        lwz     r31,SC_STK_SRR0(sp)        mtsrr0  r31        lwz     r31,SC_STK_SRR1(sp)        mtsrr1  r31        lwz     r31,SC_STK_CR(sp)        mtcr    r31        lwz     r31,SC_STK_CTR(sp)        mtctr   r31        lwz     r31,SC_STK_XER(sp)        mtxer   r31        lwz     r31,SC_STK_LR(sp)        mtlr    r31        lwz     r31, SC_STK_R31(sp)        subi    sp, sp, SC_STK_FRAME    # dealloc the stack frame        isync        rfi

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?