スピンロックを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_FreeEmulator(void);
s32 osLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void));
s32 osUnlockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void));
s32 osTryLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*crtlFuncp) (void));
s32 osLockByWord_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
s32 osUnlockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (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);
static s32 i_osDoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void),
static s32 i_osDoUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
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);
static void i_osAllocateCartridgeBus(void);
@ -164,7 +164,7 @@ void osInitLock(void)
{
static BOOL isInitialized = FALSE;
#ifdef SDK_NITRO
OSLockWord *lockp;
OSLockByte *lockp;
#endif
if (isInitialized)
@ -189,7 +189,7 @@ void osInitLock(void)
i_osSyncWithOtherProc( OSi_SYNCTYPE_RECVER, (void*)HW_INIT_LOCK_BUF );
//lockp->lockFlag = 0;
//(void)osLockByWord(OS_MAINP_SYSTEM_LOCK_ID, lockp, NULL);
//(void)osLockByByte(OS_MAINP_SYSTEM_LOCK_ID, lockp, NULL);
#else // SDK_ARM9
// ロックIDカウンタ用フラグ 初期化
@ -207,7 +207,7 @@ void osInitLock(void)
// LOCK
//======================================================================
/*---------------------------------------------------------------------------*
Name: i_osDoLockByWord
Name: i_osDoLockByByte
Description: do spinlock. keep to try till success
@ -218,13 +218,13 @@ void osInitLock(void)
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)
{
s32 lastLockFlag;
while ((lastLockFlag =
i_osDoTryLockByWord(lockID, lockp, ctrlFuncp, disableFiq)) > OS_LOCK_SUCCESS)
i_osDoTryLockByByte(lockID, lockp, ctrlFuncp, disableFiq)) > OS_LOCK_SUCCESS)
{
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.
@ -243,13 +243,13 @@ static s32 i_osDoLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (vo
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.
disable irq and fiq
@ -260,9 +260,9 @@ s32 osLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
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
//======================================================================
/*---------------------------------------------------------------------------*
Name: i_osDoUnlockByWord
Name: i_osDoUnlockByByte
Description: do unlock lock.
@ -282,7 +282,7 @@ s32 osLockByWord_IrqAndFiq(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (voi
Returns: OS_UNLOCK_SUCCESS success
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)
{
OSIntrMode lastInterrupts;
@ -318,7 +318,7 @@ static s32 i_osDoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (
}
/*---------------------------------------------------------------------------*
Name: osUnlockByWord
Name: osUnlockByByte
Description: do unlock lock.
disable irq and fiq
@ -330,19 +330,13 @@ static s32 i_osDoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (
Returns: OS_UNLOCK_SUCCESS success
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);
}
//---- for compatibility to old name ('UnLock' <-> 'Unlock')
s32 osUnLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
{
return i_osDoUnlockByWord(lockID, lockp, ctrlFuncp, FALSE);
return i_osDoUnlockByByte(lockID, lockp, ctrlFuncp, FALSE);
}
/*---------------------------------------------------------------------------*
Name: osUnlockByWord_IrqAndFiq
Name: osUnlockByByte_IrqAndFiq
Description: do unlock lock.
@ -353,9 +347,9 @@ s32 osUnLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
Returns: OS_UNLOCK_SUCCESS success
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
//======================================================================
/*---------------------------------------------------------------------------*
Name: i_osDoTryLockByWord
Name: i_osDoTryLockByByte
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
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)
{
s32 lastLockFlag;
@ -386,7 +380,7 @@ static s32 i_osDoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)
//---- Disable irq/fiq or irq
lastInterrupts = (disableFIQ) ? osDisableInterrupts_IrqAndFiq() : osDisableInterrupts();
lastLockFlag = (s32)miSwapWord(lockID, &lockp->lockFlag);
lastLockFlag = (s32)miSwapByte(lockID, &lockp->lockFlag);
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.
@ -422,13 +416,13 @@ static s32 i_osDoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)
Returns: >0 value previous locked id
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.
@ -439,9 +433,9 @@ s32 osTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void))
Returns: >0 value previous locked id
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
*---------------------------------------------------------------------------*/
s32 osLockCard(u16 lockID)
s32 osLockCard(u8 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
OS_UNLOCK_ERROR error of unlocking lock
*---------------------------------------------------------------------------*/
s32 osUnlockCard(u16 lockID)
s32 osUnlockCard(u8 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
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_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 )
{
reg_MI_MCCNT1 |= REG_MI_MCCNT1_RESB_MASK;
@ -539,7 +533,7 @@ static void i_osFreeCardBus(void)
Returns: owner id
*---------------------------------------------------------------------------*/
u16 osReadOwnerOfLockWord(OSLockWord *lockp)
u8 osReadOwnerOfLockWord(OSLockByte *lockp)
{
return lockp->ownerID;
}
@ -648,7 +642,7 @@ LSYM(10)
Returns: None.
*---------------------------------------------------------------------------*/
asm void osReleaseLockID( register u16 lockID )
asm void osReleaseLockID( register u8 lockID )
{
//#pragma unused( lockID )

View File

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