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@298 b871894f-2f95-9b40-918c-086798483c85
73 lines
2.3 KiB
C
73 lines
2.3 KiB
C
/*---------------------------------------------------------------------------*
|
|
Project: TwlBrom - exclusive
|
|
File: main.c
|
|
|
|
Copyright 2009 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 BromMain( void )
|
|
{
|
|
osInitException();
|
|
osInitBROM();
|
|
|
|
osPrintf( "ARM11: start\n" );
|
|
|
|
osInitThread();
|
|
while ( 1 )
|
|
{
|
|
u8 cpuID = i_osGetCpuID();
|
|
u8 locked;
|
|
u8 *exBuf = (u8 *)HW_MAIN_MEM + HW_MAIN_MEM_SIZE/2;
|
|
u8 *ownerBuf = exBuf + 1;
|
|
|
|
osSleep(1000 - 100 * cpuID);
|
|
if ( osTryLockByte(1, (OSLockByte *)HW_CARD_LOCK_BUF, NULL) == OS_LOCK_SUCCESS )
|
|
{
|
|
osTPrintf( "[Core%d] SpinLock is succeed.\n", cpuID );
|
|
osSleep(1000 - 100 * cpuID);
|
|
osUnlockByte(1, (OSLockByte *)HW_CARD_LOCK_BUF, NULL);
|
|
}
|
|
else
|
|
{
|
|
osTPrintf( "[Core%d] SpinLock is failed.\n", cpuID );
|
|
}
|
|
#ifndef SDK_MG20EMU
|
|
locked = miLoadExclusiveByte( exBuf );
|
|
if ( locked )
|
|
{
|
|
osTPrintf( "[Core%d] LdrExclusive is locked with %x.\n", cpuID, locked );
|
|
}
|
|
else
|
|
{
|
|
osSleep(500 - 100 * cpuID);
|
|
if ( miStoreExclusiveByte(cpuID + 1, exBuf) == MI_STREX_SUCCESS )
|
|
{
|
|
*ownerBuf = cpuID + 1;
|
|
osTPrintf( "[Core%d] StrExclusive is succeed. %x -> %x.\n", cpuID, locked, *exBuf );
|
|
*ownerBuf = 0;
|
|
// clear exclusive flag
|
|
miLoadExclusiveByte( exBuf );
|
|
osSleep(500 - 100 * cpuID);
|
|
miStoreExclusiveByte( 0, exBuf );
|
|
}
|
|
else
|
|
{
|
|
osTPrintf( "[Core%d] StrExclusive is failed. %x -> %x.\n", cpuID, locked, *exBuf );
|
|
}
|
|
}
|
|
#endif // SDK_MG20EMU
|
|
}
|
|
}
|
|
|