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

📄 ecomexcep.s

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

	.include "macros.ia"
	.include "board.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使用的函数 (用于存储异常信息)
		.extern Ecom_ExceptionStore  
		.globl EcomExceptionHandle

		.align        2

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

	LA      r29,EXCEP_SAVE_TEMPAREA                 #将存储区地址指向r29
	
	stw     r0,EXCEP_R00_PTR(r29)
	
	stw     r1,EXCEP_R01_PTR(r29)                

	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)
    mfcr    r9
	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      r5, 0x80000000
    lhz     r4,0x178(r5)         #  MSTAT Register Value
    
    andi.   r3,r4,0x0C00         #Check Bank 4,5      
	cmpwi   r3,0
	beq     other

    mr      r28,r3                     
	stw     r4,0x178(r5)
	bl      Ecom_ExceptionStore         #将异常记录存储    
	b       next 
		 
other:                                     
	LA      r3,ExceptionStore
	lwz     r3,0(r3)
	cmpwi   r3,0
	beq     next
	mtlr    r3
	mr      r3,r29                     #保存存储区首址作为OSS调用的输入参数

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

next:	
	LA      r29,EXCEP_SAVE_TEMPAREA                 #将存储区地址指向r29

	lwz     r0,EXCEP_R00_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)        
	mtcr	r9		                             # restore CR

	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)        
    mr      r3,r28
	lwz     r28,EXCEP_R28_PTR(r29)

    cmpwi   r3,0
    beq     Last

	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,SRR1_OLD_PTR(r4)                   #MSR的状态
	mtsrr1  r3    
	
	lwz     r3,SRR0_OLD_PTR(r4)                  #异常发生现场的IP值
	mtsrr0  r3    

    addic   r4,r3,0x04
    mtlr    r4
    
	sync                                       #
	isync                                      #
	blr
Last:
	sync                                       #
	isync                                      #
	rfi

⌨️ 快捷键说明

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