/*---------------------------------------------------------------------------* Project: CtrBrom - libraries - OS File: os_irqHandler.c Copyright 2008 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: $ $Rev$ $Author$ *---------------------------------------------------------------------------*/ #include #include extern OSIntrFunction osIntrTable[OS_INTR_ID_NUM]; #ifdef SDK_ARM9 #include #endif OSIntrFunction i_osIrqThreadSwitch; #ifdef SDK_ARM9 #include #include #endif /*---------------------------------------------------------------------------* Name: osIrqHandler Description: IRQ handler. call handler according to OS_InterruptTable Arguments: None Returns: None *---------------------------------------------------------------------------*/ asm void osIrqHandler( void ) { PRESERVE8 INASM_EXTERN( osIntrTable ) INASM_EXTERN( i_osIrqThreadSwitch ) EXPORT i_osIrqHandlerReturn #ifdef SDK_ARM11 // 不正確データアボート有効化(clear HW_PSR_IMPR_ABORT_DISABLE) msr cpsr_fsxc, #(HW_PSR_IRQ_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) #endif // SDK_ARM11 stmfd sp!, { r0-r4,r12,lr } // 割り込み要因の判定. #ifdef SDK_ARM11 // Interrupt Acknowledge Register ldr lr, =REG_CPUI_ACK_ADDR ldr lr, [lr] ldr r1, =REG_OS_CPUI_ACK_ID_MASK and r4, r1, lr // r4に割り込み要因番号が入ってる cmp r4, #__cpp(OS_INTR_ID_NUM) bge i_osIrqHandlerReturn #else // SDK_ARM9 // get IE address ldr r12, =REG_IE_ADDR // r12: REG_IE address // get IE&IF ldmia r12, { r1-r2 } // r1: IE, r2: IF ands r1, r1, r2 // r1: IE & IF //-------------------------------------------------- // IRQ HANDLING CODE for ARCHITECTURE VERSION 5 //-------------------------------------------------- // get lowest 1 bit mov r3, #1<<31 LSYM(1) clz r0, r1 // count zero of high bit bics r1, r1, r3, LSR r0 bne BSYM(1) // clear IF mov r1, r3, LSR r0 str r1, [ r12, #REG_IF_ADDR - REG_IE_ADDR ] rsbs r4, r0, #31 #endif // SDK_ARM9 // get jump vector ldr r1, =osIntrTable ldr r0, [ r1, r4, LSL #2 ] blx r0 // set return address for thread rescheduling #ifdef SDK_ARM11 // End of Interrupt Register ldr lr, =REG_CPUI_EOI_ADDR str r4, [lr] #endif // SDK_ARM11 // call osIrqHandler_ThreadSwitch ldr r1, =i_osIrqThreadSwitch ldr r1, [r1, #0] cmp r1, #0 blxne r1 i_osIrqHandlerReturn ldmfd sp!, { r0-r4,r12,lr } // return to interrupted address subs pc, lr, #4 } #ifdef SDK_ARM9 #include #endif