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@268 b871894f-2f95-9b40-918c-086798483c85
667 lines
21 KiB
C
667 lines
21 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlSDK - OS -
|
||
File: os_spinLock.c
|
||
|
||
Copyright 2003-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.h>
|
||
|
||
|
||
void _ISDbgLib_Initialize(void);
|
||
void _ISDbgLib_AllocateEmualtor(void);
|
||
void _ISDbgLib_FreeEmulator(void);
|
||
void _ISTDbgLib_Initialize(void);
|
||
void _ISTDbgLib_AllocateEmualtor(void);
|
||
void _ISTDbgLib_FreeEmulator(void);
|
||
|
||
s32 osLockWord_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
|
||
s32 osUnlockByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
|
||
s32 osTryLockByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*crtlFuncp) (void));
|
||
|
||
static s32 i_osDoLockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
|
||
BOOL disableFiq);
|
||
static s32 i_osDoUnlockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
|
||
BOOL disableFIQ);
|
||
static s32 i_osDoTryLockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
|
||
BOOL disableFIQ);
|
||
|
||
static void i_osAllocateCartridgeBus(void);
|
||
static void i_osFreeCartridgeBus(void);
|
||
|
||
static void i_osAllocateCardBus(void);
|
||
static void i_osFreeCardBus(void);
|
||
|
||
static void i_osWaitByLoop(void);
|
||
|
||
|
||
#ifdef SDK_ARM11
|
||
#define OSi_ASSERT_ID( id ) SDK_ASSERTMSG( id >= OS_MAINP_LOCK_ID_START && id <= OS_MAINP_SYSTEM_LOCK_ID, \
|
||
"lock ID %d is out of bounds", id )
|
||
#else
|
||
#define OSi_ASSERT_ID( id ) SDK_ASSERTMSG( id >= OS_SUBP_LOCK_ID_START && id <= OS_SUBP_SYSTEM_LOCK_ID, \
|
||
"lock ID %d is out of bounds", id )
|
||
#endif
|
||
|
||
|
||
#define OSi_LOCKID_INITIAL_FLAG_0 0xffffffff
|
||
#define OSi_LOCKID_INITIAL_FLAG_1 0xffff0000
|
||
|
||
|
||
u32 OSi_ANYP_LOCK_ID_FLAG[2];
|
||
#ifdef SDK_ARM11
|
||
//#define OSi_ANYP_LOCK_ID_FLAG HW_LOCK_ID_FLAG_MAIN
|
||
#define OSi_ANYP_LOCK_ID_START OS_MAINP_LOCK_ID_START
|
||
#else
|
||
//#define OSi_ANYP_LOCK_ID_FLAG HW_LOCK_ID_FLAG_SUB
|
||
#define OSi_ANYP_LOCK_ID_START OS_SUBP_LOCK_ID_START
|
||
#endif
|
||
|
||
//======================================================================
|
||
// SYNC
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_osSyncWithOtherProc
|
||
|
||
Description: sync with other processor.
|
||
|
||
Arguments: type : OSi_SYNCTYPE_SENDER/RECVER
|
||
syncBuf : work area. use 4byte.
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
void i_osSyncWithOtherProc( int type, void* syncBuf )
|
||
{
|
||
vu8* ptr1 = (vu8*)syncBuf;
|
||
vu8* ptr2 = (vu8*)syncBuf +1;
|
||
vu8* pfinish = (vu8*)syncBuf +2;
|
||
vu8* pconf = (vu8*)syncBuf +3;
|
||
|
||
if ( type == OSi_SYNCTYPE_SENDER )
|
||
{
|
||
int n=0;
|
||
*pfinish = FALSE;
|
||
do
|
||
{
|
||
*ptr1 = (u8)( 0x80 | (n&0xf) );
|
||
while ( *ptr1 != *ptr2 && *pfinish == FALSE )
|
||
{
|
||
i_osWaitByLoop();
|
||
}
|
||
n ++;
|
||
} while( *pfinish == FALSE );
|
||
*pconf = TRUE;
|
||
}
|
||
else
|
||
{
|
||
int sum = 0;
|
||
*ptr2 = 0;
|
||
while( sum < 0x300 )
|
||
{
|
||
if ( *ptr2 != *ptr1 )
|
||
{
|
||
*ptr2 = *ptr1;
|
||
sum += *ptr2;
|
||
}
|
||
else
|
||
{
|
||
i_osWaitByLoop();
|
||
}
|
||
}
|
||
*pconf = FALSE;
|
||
*pfinish = TRUE;
|
||
while( *pconf == FALSE )
|
||
{
|
||
i_osWaitByLoop();
|
||
}
|
||
}
|
||
}
|
||
|
||
//======================================================================
|
||
// DUMMY LOOP
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_osWaitByLoop
|
||
|
||
Description: wait by for() loop
|
||
|
||
Arguments: None.
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
static inline void i_osWaitByLoop(void)
|
||
{
|
||
i_osWaitCpuCycles(0x1000 / 4);
|
||
// svcWaitByLoop(0x1000 / 4);
|
||
}
|
||
|
||
//======================================================================
|
||
// INITIALIZE
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osInitLock
|
||
|
||
Description: initialize system lock variable
|
||
and privilege to access shared resources
|
||
|
||
* cartridge exclusive control area is not cleared
|
||
because debugger uses.
|
||
|
||
Arguments: None.
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
void osInitLock(void)
|
||
{
|
||
static BOOL isInitialized = FALSE;
|
||
#ifdef SDK_NITRO
|
||
OSLockByte *lockp;
|
||
#endif
|
||
|
||
if (isInitialized)
|
||
{
|
||
return; // do it only once
|
||
}
|
||
isInitialized = TRUE;
|
||
|
||
#ifdef SDK_ARM11
|
||
// <20><><EFBFBD>b<EFBFBD>NID<49>J<EFBFBD>E<EFBFBD><45><EFBFBD>^<5E>p<EFBFBD>t<EFBFBD><74><EFBFBD>O <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
((u32 *)OSi_ANYP_LOCK_ID_FLAG)[0] = OSi_LOCKID_INITIAL_FLAG_0;
|
||
((u32 *)OSi_ANYP_LOCK_ID_FLAG)[1] = OSi_LOCKID_INITIAL_FLAG_1;
|
||
|
||
// <20><><EFBFBD>b<EFBFBD>N<EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@ <20>N<EFBFBD><4E><EFBFBD>A<EFBFBD>i<EFBFBD>J<EFBFBD>[<5B>g<EFBFBD><67><EFBFBD>b<EFBFBD>W<EFBFBD>̈<EFBFBD><CC88>ȊO<C88A>j
|
||
// miCpuClear32((void *)HW_SHARED_LOCK_BUF, HW_CTRDG_LOCK_BUF - HW_SHARED_LOCK_BUF);
|
||
|
||
// NITRO <20>J<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>N<EFBFBD>Z<EFBFBD>X<EFBFBD><58> <20><> <20>T<EFBFBD>u<EFBFBD>v<EFBFBD><76><EFBFBD>Z<EFBFBD>b<EFBFBD>T
|
||
// i_miSetCardProcessor(MI_PROCESSOR_ARM9);
|
||
|
||
//---- sync with ARM7
|
||
i_osSyncWithOtherProc( OSi_SYNCTYPE_SENDER, (void*)HW_INIT_LOCK_BUF );
|
||
i_osSyncWithOtherProc( OSi_SYNCTYPE_RECVER, (void*)HW_INIT_LOCK_BUF );
|
||
|
||
//lockp->lockFlag = 0;
|
||
//(void)osLockByte(OS_MAINP_SYSTEM_LOCK_ID, lockp, NULL);
|
||
|
||
#else // SDK_ARM9
|
||
// <20><><EFBFBD>b<EFBFBD>NID<49>J<EFBFBD>E<EFBFBD><45><EFBFBD>^<5E>p<EFBFBD>t<EFBFBD><74><EFBFBD>O <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
((u32 *)OSi_ANYP_LOCK_ID_FLAG)[0] = OSi_LOCKID_INITIAL_FLAG_0;
|
||
((u32 *)OSi_ANYP_LOCK_ID_FLAG)[1] = OSi_LOCKID_INITIAL_FLAG_1;
|
||
|
||
//---- sync with ARM9
|
||
i_osSyncWithOtherProc( OSi_SYNCTYPE_RECVER, (void*)HW_INIT_LOCK_BUF );
|
||
i_osSyncWithOtherProc( OSi_SYNCTYPE_SENDER, (void*)HW_INIT_LOCK_BUF );
|
||
|
||
#endif // SDK_ARM9
|
||
}
|
||
|
||
//======================================================================
|
||
// LOCK
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_osDoLockByte
|
||
|
||
Description: do spinlock. keep to try till success
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to lock variable
|
||
ctrlFuncp function
|
||
disableFiq whether do disable fiq
|
||
|
||
Returns: OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
static s32 i_osDoLockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
|
||
BOOL disableFiq)
|
||
{
|
||
s32 lastLockFlag;
|
||
|
||
while ((lastLockFlag =
|
||
i_osDoTryLockByte(lockID, lockp, ctrlFuncp, disableFiq)) > OS_LOCK_SUCCESS)
|
||
{
|
||
i_osWaitByLoop();
|
||
}
|
||
|
||
return lastLockFlag;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osLockByte
|
||
|
||
Description: do spinlock. keep to try till success.
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to lock variable
|
||
ctrlFuncp function
|
||
|
||
Returns: OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osLockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
|
||
{
|
||
return i_osDoLockByte(lockID, lockp, ctrlFuncp, FALSE);
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osLockByte_IrqAndFiq
|
||
|
||
Description: do spinlock. keep to try till success.
|
||
disable irq and fiq
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to lock variable
|
||
ctrlFuncp function
|
||
|
||
Returns: OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osLockByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
|
||
{
|
||
return i_osDoLockByte(lockID, lockp, ctrlFuncp, TRUE);
|
||
}
|
||
|
||
|
||
//======================================================================
|
||
// UNLOCK
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_osDoUnlockByte
|
||
|
||
Description: do unlock lock.
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to unlock variable
|
||
ctrlFuncp function
|
||
disableFiq whether do disable fiq
|
||
|
||
Returns: OS_UNLOCK_SUCCESS success
|
||
OS_UNLOCK_ERROR error of unlocking lock
|
||
*---------------------------------------------------------------------------*/
|
||
static s32 i_osDoUnlockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
|
||
BOOL disableFIQ)
|
||
{
|
||
OSIntrMode lastInterrupts;
|
||
|
||
OSi_ASSERT_ID(lockID);
|
||
|
||
if (lockID != lockp->ownerID)
|
||
{
|
||
return OS_UNLOCK_ERROR;
|
||
}
|
||
|
||
//---- Disable irq/fiq or irq
|
||
lastInterrupts = (disableFIQ) ? osDisableInterrupts_IrqAndFiq() : osDisableInterrupts();
|
||
|
||
lockp->ownerID = 0;
|
||
if (ctrlFuncp)
|
||
{
|
||
ctrlFuncp();
|
||
}
|
||
lockp->lockFlag = 0;
|
||
|
||
//---- Restore irq/fiq or irq
|
||
if (disableFIQ)
|
||
{
|
||
(void)osRestoreInterrupts_IrqAndFiq(lastInterrupts);
|
||
}
|
||
else
|
||
{
|
||
(void)osRestoreInterrupts(lastInterrupts);
|
||
}
|
||
|
||
return OS_UNLOCK_SUCCESS;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osUnlockByte
|
||
|
||
Description: do unlock lock.
|
||
disable irq and fiq
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to unlock variable
|
||
ctrlFuncp function
|
||
|
||
Returns: OS_UNLOCK_SUCCESS success
|
||
OS_UNLOCK_ERROR error of unlocking lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osUnlockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
|
||
{
|
||
return i_osDoUnlockByte(lockID, lockp, ctrlFuncp, FALSE);
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osUnlockByte_IrqAndFiq
|
||
|
||
Description: do unlock lock.
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to unlock variable
|
||
ctrlFuncp function
|
||
|
||
Returns: OS_UNLOCK_SUCCESS success
|
||
OS_UNLOCK_ERROR error of unlocking lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osUnlockByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
|
||
{
|
||
return i_osDoUnlockByte(lockID, lockp, ctrlFuncp, TRUE);
|
||
}
|
||
|
||
|
||
//======================================================================
|
||
// TRY LOCK
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_osDoTryLockByte
|
||
|
||
Description: try to lock spinlock only once.
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to trying to lock variable
|
||
ctrlFuncp function
|
||
disableFiq whether do disable fiq
|
||
|
||
Returns: >0 value previous locked id
|
||
OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
static s32 i_osDoTryLockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
|
||
BOOL disableFIQ)
|
||
{
|
||
s32 lastLockFlag;
|
||
OSIntrMode lastInterrupts;
|
||
|
||
OSi_ASSERT_ID(lockID);
|
||
|
||
//---- Disable irq/fiq or irq
|
||
lastInterrupts = (disableFIQ) ? osDisableInterrupts_IrqAndFiq() : osDisableInterrupts();
|
||
|
||
lastLockFlag = (s32)miSwapByte(lockID, &lockp->lockFlag);
|
||
|
||
if (lastLockFlag == OS_LOCK_SUCCESS)
|
||
{
|
||
if (ctrlFuncp)
|
||
{
|
||
ctrlFuncp();
|
||
}
|
||
lockp->ownerID = lockID;
|
||
}
|
||
|
||
//---- Restore irq/fiq or irq
|
||
if (disableFIQ)
|
||
{
|
||
(void)osRestoreInterrupts_IrqAndFiq(lastInterrupts);
|
||
}
|
||
else
|
||
{
|
||
(void)osRestoreInterrupts(lastInterrupts);
|
||
}
|
||
|
||
return lastLockFlag;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osTryLockByte
|
||
|
||
Description: try to lock spinlock only once.
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to trying to lock variable
|
||
ctrlFuncp function
|
||
|
||
Returns: >0 value previous locked id
|
||
OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osTryLockByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
|
||
{
|
||
return i_osDoTryLockByte(lockID, lockp, ctrlFuncp, FALSE);
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osTryLockByte_IrqAndFiq
|
||
|
||
Description: try to lock spinlock only once.
|
||
|
||
Arguments: lockID lock ID
|
||
lockp pointer to trying to lock variable
|
||
ctrlFuncp function
|
||
|
||
Returns: >0 value previous locked id
|
||
OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osTryLockByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
|
||
{
|
||
return i_osDoTryLockByte(lockID, lockp, ctrlFuncp, TRUE);
|
||
}
|
||
|
||
|
||
//======================================================================
|
||
// CARD
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osLockCard
|
||
|
||
Description: lock card
|
||
|
||
Arguments: lockID lock ID
|
||
|
||
Returns: OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osLockCard(u8 lockID)
|
||
{
|
||
OSi_ASSERT_ID(lockID);
|
||
|
||
return osLockByte(lockID, (OSLockByte *)HW_CARD_LOCK_BUF, i_osAllocateCardBus);
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osUnlockCard
|
||
|
||
Description: unlock card
|
||
|
||
Arguments: lockID lock ID
|
||
|
||
Returns: OS_UNLOCK_SUCCESS success
|
||
OS_UNLOCK_ERROR error of unlocking lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osUnlockCard(u8 lockID)
|
||
{
|
||
OSi_ASSERT_ID(lockID);
|
||
|
||
return osUnlockByte(lockID, (OSLockByte *)HW_CARD_LOCK_BUF, i_osFreeCardBus);
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osTryLockCard
|
||
|
||
Description: try to lock card
|
||
|
||
Arguments: lockID lock ID
|
||
|
||
Returns: >0 value previous locked id
|
||
OS_LOCK_SUCCESS success to lock
|
||
*---------------------------------------------------------------------------*/
|
||
s32 osTryLockCard(u8 lockID)
|
||
{
|
||
return osTryLockByte(lockID, (OSLockByte *)HW_CARD_LOCK_BUF, i_osAllocateCardBus);
|
||
}
|
||
|
||
//----------------
|
||
static void i_osAllocateCardBus(void)
|
||
{
|
||
#ifdef SDK_ARM11
|
||
#ifdef SDK_TWL
|
||
// preset reset flag with status of disable interrupts in i_osDoTryLockByte
|
||
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;
|
||
}
|
||
#endif
|
||
// i_miSetCardProcessor(MI_PROCESSOR_ARM9); // Card for MAIN
|
||
#endif
|
||
}
|
||
|
||
//----------------
|
||
static void i_osFreeCardBus(void)
|
||
{
|
||
#ifdef SDK_ARM11
|
||
// i_miSetCardProcessor(MI_PROCESSOR_ARM7); // Card for SUB
|
||
#endif
|
||
}
|
||
|
||
|
||
//======================================================================
|
||
// READ OWNER
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osReadOwnerOfLockWord
|
||
|
||
Description: read owner id of lock
|
||
|
||
<20>E<EFBFBD><45><EFBFBD>W<EFBFBD><57><EFBFBD>[<5B><>ID <20><><EFBFBD><EFBFBD>0 <20>̏ꍇ<CC8F>͂<EFBFBD><CD82>̎<EFBFBD><CC8E>_<EFBFBD>łǂ<C582><C782><EFBFBD><EFBFBD>̃v<CC83><76><EFBFBD>Z<EFBFBD>b<EFBFBD>T<EFBFBD><54><EFBFBD><EFBFBD>
|
||
<20><><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EFBFBD>m<EFBFBD>F<EFBFBD>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||
<20>E<EFBFBD><45><EFBFBD>L<EFBFBD><4C><EFBFBD>\<5C>[<5B>X<EFBFBD>̏ꍇ<CC8F>́u<CD81><75><EFBFBD>C<EFBFBD><43><EFBFBD>v<EFBFBD><76><EFBFBD>Z<EFBFBD>b<EFBFBD>T<EFBFBD><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԁv
|
||
<20>݂̂<CC82><DD82><EFBFBD><EFBFBD>荞<EFBFBD>݂<EFBFBD><DD82>֎~<7E><><EFBFBD>邱<EFBFBD>Ƃɂ<C682><C982><EFBFBD><EFBFBD>Ĉێ<C488><DB8E><EFBFBD><EFBFBD>邱<EFBFBD>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||
<20><><EFBFBD>̑<EFBFBD><CC91>̏<EFBFBD><CC8F>Ԃ̓T<CD83>u<EFBFBD>v<EFBFBD><76><EFBFBD>Z<EFBFBD>b<EFBFBD>T<EFBFBD><54><EFBFBD>ω<EFBFBD><CF89><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||
<20>E<EFBFBD><45><EFBFBD>L<EFBFBD><4C><EFBFBD>W<EFBFBD><57><EFBFBD>[<5B><>ID <20><> 0 <20>ł<EFBFBD><C582><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>b<EFBFBD>N<EFBFBD>ϐ<EFBFBD><CF90><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ƃ͌<C682><CD8C><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||
|
||
Arguments: lockp pointer to lock
|
||
|
||
Returns: owner id
|
||
*---------------------------------------------------------------------------*/
|
||
u8 osReadOwnerOfLockWord(OSLockByte *lockp)
|
||
{
|
||
return lockp->ownerID;
|
||
}
|
||
|
||
//======================================================================
|
||
// LOCK ID
|
||
//======================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osGetLockID
|
||
|
||
Description: get lock ID
|
||
|
||
Arguments: None.
|
||
|
||
Returns: OS_LOCK_ID_ERROR, if fail to get ID
|
||
|
||
if ARM9
|
||
0x40<34>`0x6f lockID
|
||
else if ARM7
|
||
0x80<38>`0xaf lockID
|
||
endif
|
||
|
||
*Notice: ID is allocated only 48 pattern at a highest.
|
||
|
||
ID<49><44>48<34><38><EFBFBD>ނ܂ł<DC82><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蓖<EFBFBD>Ă邱<C482>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||
<20><><EFBFBD>W<EFBFBD><57><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>ɂĕ<C982><C495><EFBFBD><EFBFBD>̃<EFBFBD><CC83>b<EFBFBD>N<EFBFBD>ϐ<EFBFBD><CF90>𐧌䂷<F090A78C><E482B7><EFBFBD>ꍇ<EFBFBD><EA8D87>
|
||
<20>ł<EFBFBD><C582>邾<EFBFBD><E982BE>1<EFBFBD><EFBFBD>ID<49><44><EFBFBD>g<EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>ĉ<EFBFBD><C489><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||
*---------------------------------------------------------------------------*/
|
||
#include <brom/code32.h>
|
||
asm s32 osGetLockID( void )
|
||
{
|
||
INASM_EXTERN( OSi_ANYP_LOCK_ID_FLAG )
|
||
|
||
//---- <20>t<EFBFBD><74><EFBFBD>O<EFBFBD>̑O32<33>r<EFBFBD>b<EFBFBD>g<EFBFBD>ɗ<EFBFBD><C997><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>t<EFBFBD><74><EFBFBD>O(<28><><EFBFBD><EFBFBD>ID)<29><><EFBFBD><EFBFBD><EFBFBD>邩
|
||
ldr r3, =OSi_ANYP_LOCK_ID_FLAG
|
||
ldr r1, [r3, #0]
|
||
|
||
#ifndef SDK_ARM7
|
||
clz r2, r1
|
||
#else
|
||
mov r2, #0
|
||
mov r0, #0x80000000
|
||
_lp1:
|
||
tst r1, r0
|
||
bne _ex1
|
||
add r2, r2, #1
|
||
cmp r2, #32
|
||
beq _ex1
|
||
|
||
mov r0, r0, lsr #1
|
||
b _lp1
|
||
_ex1:
|
||
#endif
|
||
cmp r2, #32
|
||
|
||
//---- <20><><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD>
|
||
movne r0, #OSi_ANYP_LOCK_ID_START
|
||
bne FSYM(10)
|
||
|
||
//---- <20><><EFBFBD><EFBFBD>323<32>r<EFBFBD>b<EFBFBD>g<EFBFBD>ɗ<EFBFBD><C997><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>t<EFBFBD><74><EFBFBD>O(<28><><EFBFBD><EFBFBD>ID)<29><><EFBFBD><EFBFBD><EFBFBD>邩
|
||
add r3, r3, #4
|
||
ldr r1, [r3, #0]
|
||
#ifndef SDK_ARM7
|
||
clz r2, r1
|
||
#else
|
||
mov r2, #0
|
||
mov r0, #0x80000000
|
||
_lp2:
|
||
tst r1, r0
|
||
bne _ex2
|
||
add r2, r2, #1
|
||
cmp r2, #32
|
||
beq _ex2
|
||
|
||
mov r0, r0, lsr #1
|
||
b _lp2
|
||
_ex2:
|
||
#endif
|
||
cmp r2, #32
|
||
|
||
//---- <20><><EFBFBD><EFBFBD>ID<49><44><EFBFBD>Ȃ<EFBFBD>
|
||
ldr r0, =OS_LOCK_ID_ERROR
|
||
bxeq lr
|
||
|
||
//---- <20><><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD>
|
||
mov r0, #OSi_ANYP_LOCK_ID_START+32
|
||
|
||
LSYM(10)
|
||
add r0, r0, r2
|
||
mov r1, #0x80000000
|
||
mov r1, r1, lsr r2
|
||
|
||
ldr r2, [r3, #0]
|
||
bic r2, r2, r1
|
||
str r2, [r3, #0]
|
||
|
||
bx lr
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: osReleaseLockID
|
||
|
||
Description: release lock ID
|
||
|
||
Arguments: id to tend to release
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
asm void osReleaseLockID( register u8 lockID )
|
||
{
|
||
//#pragma unused( lockID )
|
||
|
||
ldr r3, =OSi_ANYP_LOCK_ID_FLAG
|
||
|
||
cmp r0, #OSi_ANYP_LOCK_ID_START+32
|
||
addpl r3, r3, #4
|
||
|
||
subpl r0, r0, #OSi_ANYP_LOCK_ID_START+32
|
||
submi r0, r0, #OSi_ANYP_LOCK_ID_START
|
||
|
||
mov r1, #0x80000000
|
||
mov r1, r1, lsr r0
|
||
|
||
ldr r2, [r3, #0]
|
||
orr r2, r2, r1
|
||
str r2, [r3, #0]
|
||
|
||
bx lr
|
||
}
|
||
#include <brom/codereset.h>
|