📄 asm_irq.s
字号:
/*
********************************************************
// Copyright (c)2004 Ark Pioneer Microelectronics Ltd.,
// All Rights Reserved
//
// Filename: asm_irq.S
// Version: 1.0
// Created: 2004.01.19 By: Philip
*********************************************************
*/
#include <stackframe.h>
#include <asm.h>
.globl ExceptionProcess
.ent ExceptionProcess
.extern OtherExcProcess
.extern Check_Exception
ExceptionProcess:
/* so we can see cp0_cause exc code*/
/*
mfc0 k1, CP0_CAUSE
li k0, 0xa1110000
sw k1, 0x0(k0)
*/
/* cache use to save all */
la k1, Protect
li k0, 0x9fffffff
and k1, k1, k0
jr k1
nop
/* save all cpu registers and disable interrupt */
Protect:
.set noat
SAVE_SOME
SAVE_AT
SAVE_TEMP
SAVE_STATIC
/* Multiple Interrupt can in after below */
/* KSU are: 00; ERL bit: 0; EXL bit: 0; IE bit: 1*/
/*
STI
nop
*/
/* when EXL='1', IE is not effect */
/*
* Check cause register to find whether interrupt has
* occured, and then process it
*/
CheckIrq:
.set noreorder
.set noat
mfc0 a0, CP0_CAUSE
nop
nop
jal Check_Exception
nop
clearIrq:
/* clear cp0 irq status registers */
mtc0 zero, CP0_CAUSE # clear s/w interrupts
nop
/* enable interrupt, because EXL is set, intr can't in */
/* restore cp0_status and cp0_epc registers */
lw v0, PT_STATUS(sp)
ori v0, STATUSF_IP4 | ST0_IE
mtc0 v0, CP0_STATUS
nop
lw v1, PT_EPC(sp)
mtc0 v1, CP0_EPC
nop
/* restore all cpu registers and return */
Restore:
RESTORE_SOME
RESTORE_AT
RESTORE_TEMP
RESTORE_STATIC
/* should set CPU mode to User mode before eret */
RESTORE_SP_AND_RET
.end ExceptionProcess
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -