ctr_firmware/trunk/bootrom/build/libraries/os/common/os_spinLock.c
nakasima ec8097d404 スピンロックを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
2009-01-13 07:31:53 +00:00

667 lines
21 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
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 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_osDoLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFiq);
static s32 i_osDoUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFIQ);
static s32 i_osDoTryLockByByte(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)osLockByByte(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_osDoLockByByte
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_osDoLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void),
BOOL disableFiq)
{
s32 lastLockFlag;
while ((lastLockFlag =
i_osDoTryLockByByte(lockID, lockp, ctrlFuncp, disableFiq)) > OS_LOCK_SUCCESS)
{
i_osWaitByLoop();
}
return lastLockFlag;
}
/*---------------------------------------------------------------------------*
Name: osLockByByte
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 osLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{
return i_osDoLockByByte(lockID, lockp, ctrlFuncp, FALSE);
}
/*---------------------------------------------------------------------------*
Name: osLockByByte_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 osLockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{
return i_osDoLockByByte(lockID, lockp, ctrlFuncp, TRUE);
}
//======================================================================
// UNLOCK
//======================================================================
/*---------------------------------------------------------------------------*
Name: i_osDoUnlockByByte
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_osDoUnlockByByte(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: osUnlockByByte
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 osUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{
return i_osDoUnlockByByte(lockID, lockp, ctrlFuncp, FALSE);
}
/*---------------------------------------------------------------------------*
Name: osUnlockByByte_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 osUnlockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{
return i_osDoUnlockByByte(lockID, lockp, ctrlFuncp, TRUE);
}
//======================================================================
// TRY LOCK
//======================================================================
/*---------------------------------------------------------------------------*
Name: i_osDoTryLockByByte
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_osDoTryLockByByte(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: osTryLockByByte
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 osTryLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{
return i_osDoTryLockByByte(lockID, lockp, ctrlFuncp, FALSE);
}
/*---------------------------------------------------------------------------*
Name: osTryLockByByte_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 osTryLockByByte_IrqAndFiq(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void))
{
return i_osDoTryLockByByte(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 osLockByByte(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 osUnlockByByte(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 osTryLockByByte(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_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;
}
#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>