os_interrupt_common.cをos_interrupt.cへマージ。

ARM11のosHalt修正。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@134 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
nakasima 2008-12-19 09:16:29 +00:00
parent bf0f695510
commit a458bc04a7
5 changed files with 336 additions and 418 deletions

View File

@ -36,7 +36,6 @@ SRCS = \
os_alarm.c \
os_irqHandler.c \
os_interrupt.c \
os_interrupt_common.c \
os_thread.c \
os_context.c \

View File

@ -39,7 +39,6 @@ SRCS = \
os_alarm.c \
os_irqHandler.c \
os_interrupt.c \
os_interrupt_common.c \
os_thread.c \
os_context.c \

View File

@ -17,6 +17,13 @@
#include <brom/os.h>
#ifdef SDK_ARM11
OSIntrFunction osIntrTable[OS_INTR_ID_NUM];
#else // SDK_ARM9
OSIntrFunction osIntrTable[OS_INTR_ID_NUM] ATTRIBUTE_SECTION(.dtcm);
#endif // SDK_ARM9
asm void i_osIrqVeneer( void );
/*---------------------------------------------------------------------------*
@ -28,7 +35,6 @@ asm void i_osIrqVeneer( void );
Returns: None
*---------------------------------------------------------------------------*/
void osInitInterrupt( void )
{
static BOOL isInit;
@ -96,7 +102,6 @@ void osInitInterrupt( void )
Returns: None
*---------------------------------------------------------------------------*/
#include <brom/code32.h>
asm void i_osIrqVeneer( void )
{
INASM_EXTERN( osIrqHandler )
@ -107,6 +112,308 @@ asm void i_osIrqVeneer( void )
#include <brom/codereset.h>
/*---------------------------------------------------------------------------*
Name: i_osInitInterruptTable
Description: Initialize InterruptTable
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void i_osInitInterruptTable( void )
{
int i;
for (i=0; i<OS_INTR_ID_NUM; i++)
{
osIntrTable[i] = NULL;
}
}
/*---------------------------------------------------------------------------*
Name: osSetInterruptHandler
Description: Set interrupt handler
Arguments: interrupt ID
interrupt handler
Returns: None
*---------------------------------------------------------------------------*/
void osSetInterruptHandler( OSIntrID id, OSIntrFunction handler )
{
osIntrTable[id] = handler;
}
/*---------------------------------------------------------------------------*
Name: osGetInterruptHandler
Description: Get interrupt handler
Arguments: interrupt ID
interrupt handler
Returns: None
*---------------------------------------------------------------------------*/
OSIntrFunction osGetInterruptHandler( OSIntrID id )
{
return osIntrTable[id];
}
//============================================================================
// Control the master of all interrupts
//============================================================================
/*---------------------------------------------------------------------------*
Name: osEnableInterrupts
Description: Set CPSR to enable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
OSIntrMode osEnableInterrupts( void )
{
return osEnableIrq();
}
/*---------------------------------------------------------------------------*
Name: osDisableInterrupts
Description: Set CPSR to disable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
OSIntrMode osDisableInterrupts( void )
{
return osDisableIrq();
}
/*---------------------------------------------------------------------------*
Name: osRestoreInterrupts
Description: Restore CPSR irq and fiq interrupts
Arguments: state of irq interrupt bit
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
OSIntrMode osRestoreInterrupts( OSIntrMode state )
{
return osRestoreIrq( state );
}
#include <brom/code32.h>
/*---------------------------------------------------------------------------*
Name: osEnableIrq
Description: Set CPSR to enable irq interrupt
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osEnableIrq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsie i
#else
bic r1, r0, #HW_PSR_IRQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osDisableIrq
Description: Set CPSR to disable irq interrupt
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osDisableIrq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsid i
#else
orr r1, r0, #HW_PSR_IRQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osRestoreIrq
Description: Restore CPSR irq interrupt
Arguments: state of irq and fiq interrupt bit
Returns: last state of HW_PSR_IRQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osRestoreIrq( OSIntrMode state )
{
mrs r1, cpsr
bic r2, r1, #HW_PSR_IRQ_DISABLE
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #HW_PSR_IRQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osEnableFiq
Description: Set CPSR to enable fiq interrupt
Arguments: None.
Returns: last state of HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osEnableFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsie f
#else
bic r1, r0, #HW_PSR_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osDisableFiq
Description: Set CPSR to disable fiq interrupt
Arguments: None.
Returns: last state of HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osDisableFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsid f
#else
orr r1, r0, #HW_PSR_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osRestoreFiq
Description: Restore CPSR fiq interrupt
Arguments: state of fiq interrupt bit
Returns: last state of HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osRestoreFiq( OSIntrMode state )
{
mrs r1, cpsr
bic r2, r1, #HW_PSR_FIQ_DISABLE
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #HW_PSR_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osEnableIrqAndFiq
Description: Set CPSR to enable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osEnableIrqAndFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsie if
#else
bic r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osDisableIrqAndFiq
Description: Set CPSR to disable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osDisableIrqAndFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsid if
#else
orr r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osRestoreIrqAndFiq
Description: Restore CPSR irq and fiq interrupts
Arguments: state of irq and fiq interrupt bit
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osRestoreIrqAndFiq( OSIntrMode state )
{
mrs r1, cpsr
bic r2, r1, #HW_PSR_IRQ_FIQ_DISABLE
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #HW_PSR_IRQ_FIQ_DISABLE
bx lr
}
#include <brom/codereset.h>
//================================================================================
// InterruptMask
//================================================================================
@ -119,7 +426,6 @@ asm void i_osIrqVeneer( void )
Returns: TRUE if last state is enabled
*---------------------------------------------------------------------------*/
BOOL osEnableInterruptID( OSIntrID id )
{
BOOL retval;
@ -151,7 +457,6 @@ BOOL osEnableInterruptID( OSIntrID id )
Returns: previous factors
*---------------------------------------------------------------------------*/
OSIntrMask osEnableInterruptMask( OSIntrMask mask )
{
OSIntrMode enabled = osDisableInterrupts();
@ -176,7 +481,6 @@ OSIntrMask osEnableInterruptMask( OSIntrMask mask )
Returns: TRUE if last state is enabled
*---------------------------------------------------------------------------*/
BOOL osDisableInterruptID( OSIntrID id )
{
BOOL retval;
@ -208,7 +512,6 @@ BOOL osDisableInterruptID( OSIntrID id )
Returns: previous factors
*---------------------------------------------------------------------------*/
OSIntrMask osDisableInterruptMask( OSIntrMask mask )
{
OSIntrMode enabled = osDisableInterrupts();
@ -234,7 +537,6 @@ OSIntrMask osDisableInterruptMask( OSIntrMask mask )
Returns: TRUE if last state is enabled
*---------------------------------------------------------------------------*/
BOOL osRestoreInterruptID( OSIntrID id, BOOL state )
{
BOOL retval;
@ -311,7 +613,6 @@ OSIntrMask osSetInterruptMask( OSIntrMask mask )
Returns: TRUE if last state is pending
*---------------------------------------------------------------------------*/
BOOL osClearInterruptPendingID( OSIntrID id )
{
OSIntrMode enabled = osDisableInterrupts();
@ -344,7 +645,6 @@ BOOL osClearInterruptPendingID( OSIntrID id )
Returns: previous factors
*---------------------------------------------------------------------------*/
OSIntrMask osClearInterruptPendingMask( OSIntrMask mask )
{
OSIntrMode enabled = osDisableInterrupts();
@ -371,7 +671,6 @@ OSIntrMask osClearInterruptPendingMask( OSIntrMask mask )
Returns: TRUE if last state is pending
*---------------------------------------------------------------------------*/
BOOL osSetInterruptPendingID( OSIntrID id )
{
u32 ofs = id/32;
@ -395,7 +694,6 @@ BOOL osSetInterruptPendingID( OSIntrID id )
Returns: TRUE if last state is pending
*---------------------------------------------------------------------------*/
BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state )
{
u32 ofs = id/32;
@ -427,13 +725,11 @@ BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state )
Returns: None
*---------------------------------------------------------------------------*/
void osSetEndOfInterruptRegister( OSIntrID id )
{
reg_OS_CPUI_EOI = id;
}
/*---------------------------------------------------------------------------*
Name: i_osReadHighestPendingInterruptRegister
@ -443,7 +739,6 @@ void osSetEndOfInterruptRegister( OSIntrID id )
Returns: Interrupt Distributor ID
*---------------------------------------------------------------------------*/
OSIntrID i_osReadHighestPendingInterruptRegister( void )
{
return (OSIntrID)(reg_OS_CPUI_HI_PND & REG_OS_CPUI_HI_PND_ID_MASK);
@ -460,7 +755,6 @@ OSIntrID i_osReadHighestPendingInterruptRegister( void )
Returns: Interrupt Distributor ID
*---------------------------------------------------------------------------*/
OSIntrID i_osReadInterruptAcknowledgeRegister( void )
{
return (OSIntrID)(reg_OS_CPUI_ACK & REG_OS_CPUI_ACK_ID_MASK);

View File

@ -1,400 +0,0 @@
/*---------------------------------------------------------------------------*
Project: CtrBrom - libraries - OS
File: os_interrupt_common.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/os.h>
#ifdef SDK_ARM11
OSIntrFunction osIntrTable[OS_INTR_ID_NUM];
#else // SDK_ARM9
OSIntrFunction osIntrTable[OS_INTR_ID_NUM] ATTRIBUTE_SECTION(.dtcm);
#endif // SDK_ARM9
/*---------------------------------------------------------------------------*
Name: i_osInitInterruptTable
Description: Initialize InterruptTable
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void i_osInitInterruptTable( void )
{
int i;
for (i=0; i<OS_INTR_ID_NUM; i++)
{
osIntrTable[i] = NULL;
}
}
/*---------------------------------------------------------------------------*
Name: osSetInterruptHandler
Description: Set interrupt handler
Arguments: interrupt ID
interrupt handler
Returns: None
*---------------------------------------------------------------------------*/
void osSetInterruptHandler( OSIntrID id, OSIntrFunction handler )
{
osIntrTable[id] = handler;
}
/*---------------------------------------------------------------------------*
Name: osGetInterruptHandler
Description: Get interrupt handler
Arguments: interrupt ID
interrupt handler
Returns: None
*---------------------------------------------------------------------------*/
OSIntrFunction osGetInterruptHandler( OSIntrID id )
{
return osIntrTable[id];
}
/*---------------------------------------------------------------------------*
Name: osEnableInterrupts
Description: Set CPSR to enable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
OSIntrMode osEnableInterrupts( void )
{
return osEnableIrq();
}
/*---------------------------------------------------------------------------*
Name: osDisableInterrupts
Description: Set CPSR to disable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
OSIntrMode osDisableInterrupts( void )
{
return osDisableIrq();
}
/*---------------------------------------------------------------------------*
Name: osRestoreInterrupts
Description: Restore CPSR irq and fiq interrupts
Arguments: state of irq interrupt bit
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
OSIntrMode osRestoreInterrupts( OSIntrMode state )
{
return osRestoreIrq( state );
}
#include <brom/code32.h>
/*---------------------------------------------------------------------------*
Name: osHaltUntilInterrupt
Description: Halt CPU Core until Interrupt
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
ASM void osHaltUntilInterrupt( void )
{
PRESERVE8
mov r0, #0
mcr p15, 0, r0, c7, c0, 4
bx lr
}
#ifdef SDK_ARM11
/*---------------------------------------------------------------------------*
Name: osHaltUntilEvent
Description: Halt CPU Core until Event
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
ASM void osHaltUntilEvent( void )
{
wfe
bx lr
}
#endif // SDK_ARM11
//============================================================================
// Control the master of all interrupts
//============================================================================
/*---------------------------------------------------------------------------*
Name: osEnableIrq
Description: Set CPSR to enable irq interrupt
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osEnableIrq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsie i
#else
bic r1, r0, #HW_PSR_IRQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osDisableIrq
Description: Set CPSR to disable irq interrupt
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osDisableIrq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsid i
#else
orr r1, r0, #HW_PSR_IRQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osRestoreIrq
Description: Restore CPSR irq interrupt
Arguments: state of irq and fiq interrupt bit
Returns: last state of HW_PSR_IRQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osRestoreIrq( OSIntrMode state )
{
mrs r1, cpsr
bic r2, r1, #HW_PSR_IRQ_DISABLE
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #HW_PSR_IRQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osEnableFiq
Description: Set CPSR to enable fiq interrupt
Arguments: None.
Returns: last state of HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osEnableFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsie f
#else
bic r1, r0, #HW_PSR_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osDisableFiq
Description: Set CPSR to disable fiq interrupt
Arguments: None.
Returns: last state of HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osDisableFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsid f
#else
orr r1, r0, #HW_PSR_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osRestoreFiq
Description: Restore CPSR fiq interrupt
Arguments: state of fiq interrupt bit
Returns: last state of HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osRestoreFiq( OSIntrMode state )
{
mrs r1, cpsr
bic r2, r1, #HW_PSR_FIQ_DISABLE
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #HW_PSR_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osEnableIrqAndFiq
Description: Set CPSR to enable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osEnableIrqAndFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsie if
#else
bic r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osDisableIrqAndFiq
Description: Set CPSR to disable irq and fiq interrupts
Arguments: None.
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osDisableIrqAndFiq( void )
{
mrs r0, cpsr
#ifdef SDK_USE_MPCORE_EXTEND_OP
cpsid if
#else
orr r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
msr cpsr_c, r1
#endif
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
bx lr
}
/*---------------------------------------------------------------------------*
Name: osRestoreIrqAndFiq
Description: Restore CPSR irq and fiq interrupts
Arguments: state of irq and fiq interrupt bit
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
*---------------------------------------------------------------------------*/
ASM OSIntrMode osRestoreIrqAndFiq( OSIntrMode state )
{
mrs r1, cpsr
bic r2, r1, #HW_PSR_IRQ_FIQ_DISABLE
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #HW_PSR_IRQ_FIQ_DISABLE
bx lr
}
#include <brom/codereset.h>

View File

@ -85,6 +85,8 @@ void osTerminate(void)
}
}
#include <brom/code32.h>
/*---------------------------------------------------------------------------*
Name: osHalt
@ -94,13 +96,37 @@ void osTerminate(void)
Returns: None
*---------------------------------------------------------------------------*/
#include <brom/code32.h>
ASM void osHalt( void )
{
#ifdef SDK_ARM11
wfi
#else // SDK_ARM9
mov r0, #0
mcr p15, 0, r0, c7, c0, 4
#endif // SDK_ARM9
bx lr
}
#ifdef SDK_ARM11
/*---------------------------------------------------------------------------*
Name: osHaltUntilEvent
Description: Halt CPU Core until Event
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
ASM void osHaltUntilEvent( void )
{
wfe
bx lr
}
#endif // SDK_ARM11
#include <brom/codereset.h>
/*---------------------------------------------------------------------------*