mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@223 b871894f-2f95-9b40-918c-086798483c85
120 lines
3.5 KiB
C
120 lines
3.5 KiB
C
/*---------------------------------------------------------------------------*
|
||
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
|