⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 excep.s

📁 这是单板上DPRAM的驱动程序
💻 S
字号:
*******************************************************************************
*   异常处理向量                                                              *
*   完成无法使用C的处理                                                       *
*   主要存储必要的寄存器,以便于C的调用                                       *
*   修改:陈钧                                                                *
*******************************************************************************

    .include "macros.ia"
    .extern ExcepRegInfo
    .extern ExcepStack

    EXCEP_SAVE_TEMPAREA =    ExcepRegInfo            #寄存器临时存储首址
    
    EXCEP_SP_POINTER    =    ExcepStack              #异常使用的堆栈指针 
    
    EXCEP_SRR0_PTR      =    0                       #寄存器SRR0的存储地址
    EXCEP_SRR1_PTR      =    (EXCEP_SRR0_PTR + 4)    #寄存器SRR1的存储地址
    EXCEP_DSISR_PTR     =    (EXCEP_SRR1_PTR + 4)    #寄存器DSISR的存储地址
    EXCEP_DAR_PTR       =    (EXCEP_DSISR_PTR + 4)   #寄存器DAR的存储地址
    EXCEP_CR_PTR        =    (EXCEP_DAR_PTR + 4)     #寄存器CR的存储地址
    EXCEP_XER_PTR       =    (EXCEP_CR_PTR + 4)      #寄存器XER的存储地址
    EXCEP_LR_PTR        =    (EXCEP_XER_PTR + 4)     #寄存器LR的存储地址
    EXCEP_CTR_PTR       =    (EXCEP_LR_PTR + 4)      #寄存器CTR的存储地址
    EXCEP_R00_PTR       =    (EXCEP_CTR_PTR + 4)     #寄存器R00的存储地址
    EXCEP_R01_PTR       =    (EXCEP_R00_PTR + 4)     #寄存器R01的存储地址
    EXCEP_R02_PTR       =    (EXCEP_R01_PTR + 4)     #寄存器R02的存储地址
    EXCEP_R03_PTR       =    (EXCEP_R02_PTR + 4)     #寄存器R03的存储地址
    EXCEP_R04_PTR       =    (EXCEP_R03_PTR + 4)     #寄存器R04的存储地址
    EXCEP_R05_PTR       =    (EXCEP_R04_PTR + 4)     #寄存器R05的存储地址
    EXCEP_R06_PTR       =    (EXCEP_R05_PTR + 4)     #寄存器R06的存储地址
    EXCEP_R07_PTR       =    (EXCEP_R06_PTR + 4)     #寄存器R07的存储地址    
    EXCEP_R08_PTR       =    (EXCEP_R07_PTR + 4)     #寄存器R08的存储地址
    EXCEP_R09_PTR       =    (EXCEP_R08_PTR + 4)     #寄存器R09的存储地址
    EXCEP_R10_PTR       =    (EXCEP_R09_PTR + 4)     #寄存器R10的存储地址
    EXCEP_R11_PTR       =    (EXCEP_R10_PTR + 4)     #寄存器R11的存储地址
    EXCEP_R12_PTR       =    (EXCEP_R11_PTR + 4)     #寄存器R12的存储地址
    EXCEP_R13_PTR       =    (EXCEP_R12_PTR + 4)     #寄存器R13的存储地址
    EXCEP_R14_PTR       =    (EXCEP_R13_PTR + 4)     #寄存器R14的存储地址    
    EXCEP_R15_PTR       =    (EXCEP_R14_PTR + 4)     #寄存器R15的存储地址
    EXCEP_R16_PTR       =    (EXCEP_R15_PTR + 4)     #寄存器R16的存储地址
    EXCEP_R17_PTR       =    (EXCEP_R16_PTR + 4)     #寄存器R17的存储地址
    EXCEP_R18_PTR       =    (EXCEP_R17_PTR + 4)     #寄存器R18的存储地址
    EXCEP_R19_PTR       =    (EXCEP_R18_PTR + 4)     #寄存器R19的存储地址
    EXCEP_R20_PTR       =    (EXCEP_R19_PTR + 4)     #寄存器R20的存储地址
    EXCEP_R21_PTR       =    (EXCEP_R20_PTR + 4)     #寄存器R21的存储地址
    EXCEP_R22_PTR       =    (EXCEP_R21_PTR + 4)     #寄存器R22的存储地址
    EXCEP_R23_PTR       =    (EXCEP_R22_PTR + 4)     #寄存器R23的存储地址
    EXCEP_R24_PTR       =    (EXCEP_R23_PTR + 4)     #寄存器R24的存储地址
    EXCEP_R25_PTR       =    (EXCEP_R24_PTR + 4)     #寄存器R25的存储地址
    EXCEP_R26_PTR       =    (EXCEP_R25_PTR + 4)     #寄存器R26的存储地址
    EXCEP_R27_PTR       =    (EXCEP_R26_PTR + 4)     #寄存器R27的存储地址
    EXCEP_R28_PTR       =    (EXCEP_R27_PTR + 4)     #寄存器R28的存储地址    
    EXCEP_R29_PTR       =    (EXCEP_R28_PTR + 4)     #寄存器R29的存储地址
    EXCEP_R30_PTR       =    (EXCEP_R29_PTR + 4)     #寄存器R30的存储地址
    EXCEP_R31_PTR       =    (EXCEP_R30_PTR + 4)     #寄存器R31的存储地址

    EXCEP_MSR_PTR       =    (EXCEP_R31_PTR + 4)     #寄存器MSR的存储地址    
    EXCEP_VECTOR_PTR1   =    (EXCEP_MSR_PTR + 4)     #异常向量的存储地址,判别异常种类1

    EXCEP_VECTOR_PTR2   =    (EXCEP_VECTOR_PTR1+4) #异常的存储地址,判异常种类2
    
    V_SAVE_AREA         =    200                 #异常信息存储偏址
    
    
    #以下是PSOS异常处理中的一些寄存器存储地址
    R29_OLD_PTR         =    4
    R30_OLD_PTR         =    8
    R31_OLD_PTR         =    12
    LR_OLD_PTR          =    28
    SRR0_OLD_PTR        =    36
    SRR1_OLD_PTR        =    40
    CR_OLD_PTR          =    16

    VECTOR_OLD_PTR      =    52
 
        .text
        .extern ExceptionStore       #供oss使用的函数 (用于存储异常信息)
        .globl ExceptionHandle

        .align        2

#########################################################################
#    函数:        ExceptionHandle            
#    功能:        将异常发生时的寄存器内容拷贝到以EXCEP_SAVE_TEMPAREA为首址
#                的区域中
#   r31 为异常矢量地址中的存贮区的地址 vector->save_area
#########################################################################
ExceptionHandle:

    LA      r29,EXCEP_SAVE_TEMPAREA                #将存储区地址指向r29
    
    stw     r0,EXCEP_R00_PTR(r29)
    
    stw     r1,EXCEP_R01_PTR(r29)                
    LA      r1,EXCEP_SP_POINTER                    #将SP堆栈指针强制指向指定堆栈
        
    stw     r2,EXCEP_R02_PTR(r29)                #保存未被PSOS破坏的寄存器
    stw     r3,EXCEP_R03_PTR(r29)        
    stw     r4,EXCEP_R04_PTR(r29)
    stw     r5,EXCEP_R05_PTR(r29)        
    stw     r6,EXCEP_R06_PTR(r29)
    stw     r7,EXCEP_R07_PTR(r29)        
    stw     r8,EXCEP_R08_PTR(r29)
    stw     r9,EXCEP_R09_PTR(r29)        
    stw     r10,EXCEP_R10_PTR(r29)
    stw     r11,EXCEP_R11_PTR(r29)    
    stw     r12,EXCEP_R12_PTR(r29)
    stw     r13,EXCEP_R13_PTR(r29)        
    stw     r14,EXCEP_R14_PTR(r29)
    stw     r15,EXCEP_R15_PTR(r29)        
    stw     r16,EXCEP_R16_PTR(r29)
    stw     r17,EXCEP_R17_PTR(r29)        
    stw     r18,EXCEP_R18_PTR(r29)
    stw     r19,EXCEP_R19_PTR(r29)        
    stw     r20,EXCEP_R20_PTR(r29)
    stw     r21,EXCEP_R21_PTR(r29)    
    stw     r22,EXCEP_R22_PTR(r29)
    stw     r23,EXCEP_R23_PTR(r29)        
    stw     r24,EXCEP_R24_PTR(r29)
    stw     r25,EXCEP_R25_PTR(r29)        
    stw     r26,EXCEP_R26_PTR(r29)
    stw     r27,EXCEP_R27_PTR(r29)        
    stw     r28,EXCEP_R28_PTR(r29)
    
    mfmsr   r3
    stw     r3,EXCEP_MSR_PTR(r29)
    
    lwz     r3,R29_OLD_PTR(r31)                        #保存被PSOS异常处理使用过
    stw     r3,EXCEP_R29_PTR(r29)                    #的寄存器
    
    lwz     r3,R30_OLD_PTR(r31)
    stw     r3,EXCEP_R30_PTR(r29)
    
    lwz     r3,R31_OLD_PTR(r31)
    stw     r3,EXCEP_R31_PTR(r29)    
    
    lwz     r3,LR_OLD_PTR(r31)
    stw     r3,EXCEP_LR_PTR(r29)                    #跳转指令返回地址    
    
    lwz     r3,SRR0_OLD_PTR(r31)                    #异常发生现场的IP值
    stw     r3,EXCEP_SRR0_PTR(r29)    
    
    lwz     r3,SRR1_OLD_PTR(r31)                    #MSR的状态
    stw     r3,EXCEP_SRR1_PTR(r29)    
    
    lwz     r3,CR_OLD_PTR(r31)
    stw     r3,EXCEP_CR_PTR(r29)                    #特殊寄存器
    
    mfspr   r3,dsisr
    stw     r3,EXCEP_DSISR_PTR(r29)                    #异常发生的种类
    
    mfspr   r3,dar
    stw     r3,EXCEP_DAR_PTR(r29)                    #DAR寄存器
    
    mfspr   r3,xer
    stw     r3,EXCEP_XER_PTR(r29)
    
    mfspr   r3,ctr
    stw     r3,EXCEP_CTR_PTR(r29)

    lwz     r3,VECTOR_OLD_PTR(r31)
    andi.    r3,r3,0x0FFFF
    stw     r3,EXCEP_VECTOR_PTR1(r29)
           
    subi    r3,r31,V_SAVE_AREA
    stw     r3,EXCEP_VECTOR_PTR2(r29)
                                     
    LA      r3,ExceptionStore
    lwz     r3,0(r3)
    cmpwi   r3,0
    beq      next
    mtlr    r3
    mr      r3,r29              #保存存储区首址作为OSS调用的输入参数

    bclrl   4,0              #将异常记录存储    

next:
    lwz     r0,EXCEP_R00_PTR(r29) 
    lwz     r1,EXCEP_R01_PTR(r29)                
    lwz     r2,EXCEP_R02_PTR(r29)        #恢复被PSOS破坏的寄存器
    lwz     r3,EXCEP_R03_PTR(r29)        
    lwz     r4,EXCEP_R04_PTR(r29)
    lwz     r5,EXCEP_R05_PTR(r29)        
    lwz     r6,EXCEP_R06_PTR(r29)
    lwz     r7,EXCEP_R07_PTR(r29)        
    lwz     r8,EXCEP_R08_PTR(r29)
    lwz     r9,EXCEP_R09_PTR(r29)        
    lwz     r10,EXCEP_R10_PTR(r29)
    lwz     r11,EXCEP_R11_PTR(r29)    
    lwz     r12,EXCEP_R12_PTR(r29)
    lwz     r13,EXCEP_R13_PTR(r29)        
    lwz     r14,EXCEP_R14_PTR(r29)
    lwz     r15,EXCEP_R15_PTR(r29)        
    lwz     r16,EXCEP_R16_PTR(r29)
    lwz     r17,EXCEP_R17_PTR(r29)        
    lwz     r18,EXCEP_R18_PTR(r29)
    lwz     r19,EXCEP_R19_PTR(r29)        
    lwz     r20,EXCEP_R20_PTR(r29)
    lwz     r21,EXCEP_R21_PTR(r29)    
    lwz     r22,EXCEP_R22_PTR(r29)
    lwz     r23,EXCEP_R23_PTR(r29)        
    lwz     r24,EXCEP_R24_PTR(r29)
    lwz     r25,EXCEP_R25_PTR(r29)        
    lwz     r26,EXCEP_R26_PTR(r29)
    lwz     r27,EXCEP_R27_PTR(r29)        
    lwz     r28,EXCEP_R28_PTR(r29)

    mr      r4,r31                   #r31->r4指向异常存储的首地址

    lwz     r3,R29_OLD_PTR(r4)                        
    mr      r29,r3                                 #恢复被PSOS异常处理使用过的寄存器

    lwz     r3,R30_OLD_PTR(r4)
    mr      r30,r3
    
    lwz     r3,R31_OLD_PTR(r4)
    mr      r31,r3   
    
    lwz     r3,LR_OLD_PTR(r4)
    mtlr    r3                                    #跳转指令返回地址    
    
    lwz     r3,SRR0_OLD_PTR(r4)                    #异常发生现场的IP值
    mtsrr0  r3    
    
    lwz     r3,SRR1_OLD_PTR(r31)                    #MSR的状态
    mtsrr1  r3    
    
    lwz     r3,CR_OLD_PTR(r4)
    mtcrf   0xFF,r3                    #特殊寄存器
       
    sync                                       #
    isync                                      #
    rfi
#      .end           

⌨️ 快捷键说明

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