ctr_firmware/trunk/bootrom/build/libraries/os/common/os_irqHandler.c
nakasima bad2d57a2f Thumb-SWI命令に対応。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@223 b871894f-2f95-9b40-918c-086798483c85
2009-01-28 06:38:08 +00:00

120 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
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 <brom/code32.h>
#include <brom/os.h>
extern OSIntrFunction osIntrTable[OS_INTR_ID_NUM];
#ifdef SDK_ARM9
#include <brom/dtcm_begin.h>
#endif
OSIntrFunction i_osIrqThreadSwitch;
#ifdef SDK_ARM9
#include <brom/dtcm_end.h>
#include <brom/itcm_begin.h>
#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 <brom/itcm_end.h>
#endif