スピンロックを8バイト単位から2バイト単位へ変更。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@166 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
nakasima 2009-01-13 07:31:53 +00:00
parent 83bec6addb
commit ec8097d404
3 changed files with 57 additions and 69 deletions

View File

@ -24,15 +24,15 @@ void _ISTDbgLib_Initialize(void);
void _ISTDbgLib_AllocateEmualtor(void); void _ISTDbgLib_AllocateEmualtor(void);
void _ISTDbgLib_FreeEmulator(void); void _ISTDbgLib_FreeEmulator(void);
s32 osLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)); s32 osLockByWord_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
s32 osUnlockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)); s32 osUnlockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
s32 osTryLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*crtlFuncp) (void)); s32 osTryLockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*crtlFuncp) (void));
static s32 i_osDoLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), static s32 i_osDoLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFiq); BOOL disableFiq);
static s32 i_osDoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), static s32 i_osDoUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFIQ); BOOL disableFIQ);
static s32 i_osDoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), static s32 i_osDoTryLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFIQ); BOOL disableFIQ);
static void i_osAllocateCartridgeBus(void); static void i_osAllocateCartridgeBus(void);
@ -164,7 +164,7 @@ void osInitLock(void)
{ {
static BOOL isInitialized = FALSE; static BOOL isInitialized = FALSE;
#ifdef SDK_NITRO #ifdef SDK_NITRO
OSLockWord *lockp; OSLockByte *lockp;
#endif #endif
if (isInitialized) if (isInitialized)
@ -189,7 +189,7 @@ void osInitLock(void)
i_osSyncWithOtherProc( OSi_SYNCTYPE_RECVER, (void*)HW_INIT_LOCK_BUF ); i_osSyncWithOtherProc( OSi_SYNCTYPE_RECVER, (void*)HW_INIT_LOCK_BUF );
//lockp->lockFlag = 0; //lockp->lockFlag = 0;
//(void)osLockByWord(OS_MAINP_SYSTEM_LOCK_ID, lockp, NULL); //(void)osLockByByte(OS_MAINP_SYSTEM_LOCK_ID, lockp, NULL);
#else // SDK_ARM9 #else // SDK_ARM9
// ロックIDカウンタ用フラグ 初期化 // ロックIDカウンタ用フラグ 初期化
@ -207,7 +207,7 @@ void osInitLock(void)
// LOCK // LOCK
//====================================================================== //======================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osDoLockByWord Name: i_osDoLockByByte
Description: do spinlock. keep to try till success Description: do spinlock. keep to try till success
@ -218,13 +218,13 @@ void osInitLock(void)
Returns: OS_LOCK_SUCCESS success to lock Returns: OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static s32 i_osDoLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), static s32 i_osDoLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFiq) BOOL disableFiq)
{ {
s32 lastLockFlag; s32 lastLockFlag;
while ((lastLockFlag = while ((lastLockFlag =
i_osDoTryLockByWord(lockID, lockp, ctrlFuncp, disableFiq)) > OS_LOCK_SUCCESS) i_osDoTryLockByByte(lockID, lockp, ctrlFuncp, disableFiq)) > OS_LOCK_SUCCESS)
{ {
i_osWaitByLoop(); i_osWaitByLoop();
} }
@ -233,7 +233,7 @@ static s32 i_osDoLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (vo
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osLockByWord Name: osLockByByte
Description: do spinlock. keep to try till success. Description: do spinlock. keep to try till success.
@ -243,13 +243,13 @@ static s32 i_osDoLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (vo
Returns: OS_LOCK_SUCCESS success to lock Returns: OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)) s32 osLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{ {
return i_osDoLockByWord(lockID, lockp, ctrlFuncp, FALSE); return i_osDoLockByByte(lockID, lockp, ctrlFuncp, FALSE);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osLockByWord_IrqAndFiq Name: osLockByByte_IrqAndFiq
Description: do spinlock. keep to try till success. Description: do spinlock. keep to try till success.
disable irq and fiq disable irq and fiq
@ -260,9 +260,9 @@ s32 osLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
Returns: OS_LOCK_SUCCESS success to lock Returns: OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)) s32 osLockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{ {
return i_osDoLockByWord(lockID, lockp, ctrlFuncp, TRUE); return i_osDoLockByByte(lockID, lockp, ctrlFuncp, TRUE);
} }
@ -270,7 +270,7 @@ s32 osLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (voi
// UNLOCK // UNLOCK
//====================================================================== //======================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osDoUnlockByWord Name: i_osDoUnlockByByte
Description: do unlock lock. Description: do unlock lock.
@ -282,7 +282,7 @@ s32 osLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (voi
Returns: OS_UNLOCK_SUCCESS success Returns: OS_UNLOCK_SUCCESS success
OS_UNLOCK_ERROR error of unlocking lock OS_UNLOCK_ERROR error of unlocking lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static s32 i_osDoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), static s32 i_osDoUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFIQ) BOOL disableFIQ)
{ {
OSIntrMode lastInterrupts; OSIntrMode lastInterrupts;
@ -318,7 +318,7 @@ static s32 i_osDoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osUnlockByWord Name: osUnlockByByte
Description: do unlock lock. Description: do unlock lock.
disable irq and fiq disable irq and fiq
@ -330,19 +330,13 @@ static s32 i_osDoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (
Returns: OS_UNLOCK_SUCCESS success Returns: OS_UNLOCK_SUCCESS success
OS_UNLOCK_ERROR error of unlocking lock OS_UNLOCK_ERROR error of unlocking lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)) s32 osUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{ {
return i_osDoUnlockByWord(lockID, lockp, ctrlFuncp, FALSE); return i_osDoUnlockByByte(lockID, lockp, ctrlFuncp, FALSE);
}
//---- for compatibility to old name ('UnLock' <-> 'Unlock')
s32 osUnLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
{
return i_osDoUnlockByWord(lockID, lockp, ctrlFuncp, FALSE);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osUnlockByWord_IrqAndFiq Name: osUnlockByByte_IrqAndFiq
Description: do unlock lock. Description: do unlock lock.
@ -353,9 +347,9 @@ s32 osUnLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
Returns: OS_UNLOCK_SUCCESS success Returns: OS_UNLOCK_SUCCESS success
OS_UNLOCK_ERROR error of unlocking lock OS_UNLOCK_ERROR error of unlocking lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osUnlockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)) s32 osUnlockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{ {
return i_osDoUnlockByWord(lockID, lockp, ctrlFuncp, TRUE); return i_osDoUnlockByByte(lockID, lockp, ctrlFuncp, TRUE);
} }
@ -363,7 +357,7 @@ s32 osUnlockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (v
// TRY LOCK // TRY LOCK
//====================================================================== //======================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osDoTryLockByWord Name: i_osDoTryLockByByte
Description: try to lock spinlock only once. Description: try to lock spinlock only once.
@ -375,7 +369,7 @@ s32 osUnlockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (v
Returns: >0 value previous locked id Returns: >0 value previous locked id
OS_LOCK_SUCCESS success to lock OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static s32 i_osDoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), static s32 i_osDoTryLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFIQ) BOOL disableFIQ)
{ {
s32 lastLockFlag; s32 lastLockFlag;
@ -386,7 +380,7 @@ static s32 i_osDoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)
//---- Disable irq/fiq or irq //---- Disable irq/fiq or irq
lastInterrupts = (disableFIQ) ? osDisableInterrupts_IrqAndFiq() : osDisableInterrupts(); lastInterrupts = (disableFIQ) ? osDisableInterrupts_IrqAndFiq() : osDisableInterrupts();
lastLockFlag = (s32)miSwapWord(lockID, &lockp->lockFlag); lastLockFlag = (s32)miSwapByte(lockID, &lockp->lockFlag);
if (lastLockFlag == OS_LOCK_SUCCESS) if (lastLockFlag == OS_LOCK_SUCCESS)
{ {
@ -411,7 +405,7 @@ static s32 i_osDoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osTryLockByWord Name: osTryLockByByte
Description: try to lock spinlock only once. Description: try to lock spinlock only once.
@ -422,13 +416,13 @@ static s32 i_osDoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)
Returns: >0 value previous locked id Returns: >0 value previous locked id
OS_LOCK_SUCCESS success to lock OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)) s32 osTryLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{ {
return i_osDoTryLockByWord(lockID, lockp, ctrlFuncp, FALSE); return i_osDoTryLockByByte(lockID, lockp, ctrlFuncp, FALSE);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osTryLockByWord_IrqAndFiq Name: osTryLockByByte_IrqAndFiq
Description: try to lock spinlock only once. Description: try to lock spinlock only once.
@ -439,9 +433,9 @@ s32 osTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
Returns: >0 value previous locked id Returns: >0 value previous locked id
OS_LOCK_SUCCESS success to lock OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osTryLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)) s32 osTryLockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{ {
return i_osDoTryLockByWord(lockID, lockp, ctrlFuncp, TRUE); return i_osDoTryLockByByte(lockID, lockp, ctrlFuncp, TRUE);
} }
@ -457,11 +451,11 @@ s32 osTryLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (
Returns: OS_LOCK_SUCCESS success to lock Returns: OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osLockCard(u16 lockID) s32 osLockCard(u8 lockID)
{ {
OSi_ASSERT_ID(lockID); OSi_ASSERT_ID(lockID);
return osLockByWord(lockID, (OSLockWord *)HW_CARD_LOCK_BUF, i_osAllocateCardBus); return osLockByByte(lockID, (OSLockByte *)HW_CARD_LOCK_BUF, i_osAllocateCardBus);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -474,11 +468,11 @@ s32 osLockCard(u16 lockID)
Returns: OS_UNLOCK_SUCCESS success Returns: OS_UNLOCK_SUCCESS success
OS_UNLOCK_ERROR error of unlocking lock OS_UNLOCK_ERROR error of unlocking lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osUnlockCard(u16 lockID) s32 osUnlockCard(u8 lockID)
{ {
OSi_ASSERT_ID(lockID); OSi_ASSERT_ID(lockID);
return osUnlockByWord(lockID, (OSLockWord *)HW_CARD_LOCK_BUF, i_osFreeCardBus); return osUnlockByByte(lockID, (OSLockByte *)HW_CARD_LOCK_BUF, i_osFreeCardBus);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -491,9 +485,9 @@ s32 osUnlockCard(u16 lockID)
Returns: >0 value previous locked id Returns: >0 value previous locked id
OS_LOCK_SUCCESS success to lock OS_LOCK_SUCCESS success to lock
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
s32 osTryLockCard(u16 lockID) s32 osTryLockCard(u8 lockID)
{ {
return osTryLockByWord(lockID, (OSLockWord *)HW_CARD_LOCK_BUF, i_osAllocateCardBus); return osTryLockByByte(lockID, (OSLockByte *)HW_CARD_LOCK_BUF, i_osAllocateCardBus);
} }
//---------------- //----------------
@ -501,7 +495,7 @@ static void i_osAllocateCardBus(void)
{ {
#ifdef SDK_ARM11 #ifdef SDK_ARM11
#ifdef SDK_TWL #ifdef SDK_TWL
// preset reset flag with status of disable interrupts in i_osDoTryLockByWord // preset reset flag with status of disable interrupts in i_osDoTryLockByByte
if ( ((reg_MI_MC & REG_MI_MC_SL1_MODE_MASK) >> REG_MI_MC_SL1_MODE_SHIFT) == 0x2 ) if ( ((reg_MI_MC & REG_MI_MC_SL1_MODE_MASK) >> REG_MI_MC_SL1_MODE_SHIFT) == 0x2 )
{ {
reg_MI_MCCNT1 |= REG_MI_MCCNT1_RESB_MASK; reg_MI_MCCNT1 |= REG_MI_MCCNT1_RESB_MASK;
@ -539,7 +533,7 @@ static void i_osFreeCardBus(void)
Returns: owner id Returns: owner id
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
u16 osReadOwnerOfLockWord(OSLockWord *lockp) u8 osReadOwnerOfLockWord(OSLockByte *lockp)
{ {
return lockp->ownerID; return lockp->ownerID;
} }
@ -648,7 +642,7 @@ LSYM(10)
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
asm void osReleaseLockID( register u16 lockID ) asm void osReleaseLockID( register u8 lockID )
{ {
//#pragma unused( lockID ) //#pragma unused( lockID )

View File

@ -58,13 +58,12 @@ extern "C" {
//---- structure of lock variable //---- structure of lock variable
typedef volatile struct OSLockWord typedef volatile struct OSLockByte
{ {
u32 lockFlag; u8 lockFlag;
u16 ownerID; u8 ownerID;
u16 extension;
} }
OSLockWord; OSLockByte;
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osInitLock Name: osInitLock
@ -99,8 +98,8 @@ void osInitLock(void);
//・戻り値: //・戻り値:
// OS_LOCK_SUCCESS ロック成功 // OS_LOCK_SUCCESS ロック成功
//---------------------------------------------------------------------- //----------------------------------------------------------------------
s32 osLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)); s32 osLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
s32 osLockCard(u16 lockID); s32 osLockCard(u8 lockID);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// ロックの解除 // ロックの解除
@ -117,13 +116,8 @@ s32 osLockCard(u16 lockID);
// OS_UNLOCK_SUCCESS ロック解除成功 // OS_UNLOCK_SUCCESS ロック解除成功
// OS_UNLOCK_ERROR ロック解除エラー // OS_UNLOCK_ERROR ロック解除エラー
//---------------------------------------------------------------------- //----------------------------------------------------------------------
s32 osUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)); s32 osUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
s32 osUnlockCard(u16 lockID); s32 osUnlockCard(u8 lockID);
//---- for compatibility to old name ('UnLock' <-> 'Unlock')
// because isd lib calls osUnLock*, these cannot be inline.
s32 osUnLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void));
s32 osUnLockCard(u16 lockID);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// ロックの試行 // ロックの試行
@ -143,8 +137,8 @@ s32 osUnLockCard(u16 lockID);
// 正 ロック中直前に格納されていたID // 正 ロック中直前に格納されていたID
// OS_LOCK_SUCCESS ロック成功 // OS_LOCK_SUCCESS ロック成功
//---------------------------------------------------------------------- //----------------------------------------------------------------------
s32 osTryLockByWord(u16 lockID, OSLockWord *lockp, void (*crtlFuncp) (void)); s32 osTryLockByByte(u8 lockID, OSLockByte *lockp, void (*crtlFuncp) (void));
s32 osTryLockCard(u16 lockID); s32 osTryLockCard(u8 lockID);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// ロック変数の所有モジュールIDの読み込み // ロック変数の所有モジュールIDの読み込み
@ -166,8 +160,8 @@ s32 osTryLockCard(u16 lockID);
// バイトアクセスはできないことに注意して下さい。 // バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に osReadOwnerOfLockWord() を使用して下さい。 // ですので、メインメモリ上では基本的に osReadOwnerOfLockWord() を使用して下さい。
//---------------------------------------------------------------------- //----------------------------------------------------------------------
u16 osReadOwnerOfLockWord(OSLockWord *lockp); u8 osReadOwnerOfLockWord(OSLockByte *lockp);
#define osReadOwnerOfLockCard() osReadOwnerOfLockWord( (OSLockWord *)HW_CARD_LOCK_BUF ) #define osReadOwnerOfLockCard() osReadOwnerOfLockWord( (OSLockByte *)HW_CARD_LOCK_BUF )
@ -201,7 +195,7 @@ s32 osGetLockID(void);
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void osReleaseLockID(u16 lockID); void osReleaseLockID(u8 lockID);

View File

@ -39,7 +39,7 @@ extern "C" {
#define HW_AXI_WRAM_SYSRV_OFS_DABT_VENEER 0x28 #define HW_AXI_WRAM_SYSRV_OFS_DABT_VENEER 0x28
#endif // SDK_ARM11 #endif // SDK_ARM11
#define HW_AXI_WRAM_SYSRV_INIT_LOCK_BUF 0x30 #define HW_AXI_WRAM_SYSRV_INIT_LOCK_BUF 0x30
#define HW_AXI_WRAM_SYSRV_CARD_LOCK_BUF 0x38 #define HW_AXI_WRAM_SYSRV_CARD_LOCK_BUF 0x34
#ifdef SDK_ARM11 #ifdef SDK_ARM11
#define HW_AXI_WRAM_SYSRV_OFS_START_VECTOR1 0x3c #define HW_AXI_WRAM_SYSRV_OFS_START_VECTOR1 0x3c
#define HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK1 0x40 #define HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK1 0x40