📄 ecomexcep.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 + -