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@296 b871894f-2f95-9b40-918c-086798483c85
215 lines
6.7 KiB
C
215 lines
6.7 KiB
C
/*---------------------------------------------------------------------------*
|
|
Project: CtrBrom - MI
|
|
File: mi_exclusive.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/mi/exclusive.h>
|
|
|
|
|
|
// miSwap* will be used for control common resource exclusively among processers
|
|
// or modules. Beside, it's used for realization spin lock system.
|
|
//
|
|
// notice: you cannot access main memory by byte unless via cache.
|
|
// so, use miSwapByte generally for accessing main memory ,not miSwapWord.
|
|
|
|
|
|
//---- This code will be compiled in ARM-Mode
|
|
#include <brom/code32.h>
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miSwapByte
|
|
|
|
Description: swap data and memory
|
|
|
|
Arguments: setData data to swap
|
|
destp memory address to swap
|
|
|
|
Returns: swapped memory data
|
|
*---------------------------------------------------------------------------*/
|
|
asm u8 miSwapByte( u8 setData, u8* destp )
|
|
{
|
|
swpb r0, r0, [r1]
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miSwapWord
|
|
|
|
Description: swap data and memory
|
|
|
|
Arguments: setData data to swap
|
|
destp memory address to swap
|
|
|
|
Returns: swapped memory data
|
|
*---------------------------------------------------------------------------*/
|
|
asm u32 miSwapWord( u32 setData, u32* destp )
|
|
{
|
|
swp r0, r0, [r1]
|
|
bx lr
|
|
}
|
|
|
|
#ifdef SDK_ARM11
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miLoadExclusiveByte
|
|
|
|
Description: load exclusive data and memory
|
|
|
|
Arguments: destp memory address to load exclusive
|
|
|
|
Returns: loaded memory data
|
|
*---------------------------------------------------------------------------*/
|
|
asm u8 miLoadExclusiveByte( u8* destp )
|
|
{
|
|
ldrexb r0, [r0]
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miLoadExclusiveHalfWord
|
|
|
|
Description: load exclusive data and memory
|
|
|
|
Arguments: destp memory address to load exclusive
|
|
|
|
Returns: loaded memory data
|
|
*---------------------------------------------------------------------------*/
|
|
asm u16 miLoadExclusiveHalfWord( u16* destp )
|
|
{
|
|
ldrexh r0, [r0]
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miLoadExclusiveWord
|
|
|
|
Description: load exclusive data and memory
|
|
|
|
Arguments: destp memory address to load exclusive
|
|
|
|
Returns: loaded memory data
|
|
*---------------------------------------------------------------------------*/
|
|
asm u32 miLoadExclusiveWord( u32* destp )
|
|
{
|
|
ldrex r0, [r0]
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miLoadExclusiveDoubleWord
|
|
|
|
Description: load exclusive data and memory
|
|
|
|
Arguments: destp memory address to load exclusive
|
|
|
|
Returns: loaded memory data
|
|
*---------------------------------------------------------------------------*/
|
|
asm u64 miLoadExclusiveDoubleWord( u64* destp )
|
|
{
|
|
ldrexd r0, [r0]
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miStoreExclusiveByte
|
|
|
|
Description: store exclusive data and memory
|
|
|
|
Arguments: setData data to store exclusive
|
|
destp memory address to store exclusive
|
|
|
|
Returns: MI_STREX_SUCCESS success
|
|
MI_STREX_ERROR error of store exclusive
|
|
*---------------------------------------------------------------------------*/
|
|
asm MIStrExErr miStoreExclusiveByte( u8 setData, u8* destp )
|
|
{
|
|
strexb r2, r0, [r1]
|
|
mov r0, r2
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miStoreExclusiveHalfWord
|
|
|
|
Description: store exclusive data and memory
|
|
|
|
Arguments: setData data to store exclusive
|
|
destp memory address to store exclusive
|
|
|
|
Returns: MI_STREX_SUCCESS success
|
|
MI_STREX_ERROR error of store exclusive
|
|
*---------------------------------------------------------------------------*/
|
|
asm MIStrExErr miStoreExclusiveHalfWord( u16 setData, u16* destp )
|
|
{
|
|
strexh r2, r0, [r1]
|
|
mov r0, r2
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miStoreExclusiveWord
|
|
|
|
Description: store exclusive data and memory
|
|
|
|
Arguments: setData data to store exclusive
|
|
destp memory address to store exclusive
|
|
|
|
Returns: MI_STREX_SUCCESS success
|
|
MI_STREX_ERROR error of store exclusive
|
|
*---------------------------------------------------------------------------*/
|
|
asm MIStrExErr miStoreExclusiveWord( u32 setData, u32* destp )
|
|
{
|
|
strex r2, r0, [r1]
|
|
mov r0, r2
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miStoreExclusiveDoubleWord
|
|
|
|
Description: store exclusive data and memory
|
|
|
|
Arguments: setData data to store exclusive
|
|
destp memory address to store exclusive
|
|
|
|
Returns: MI_STREX_SUCCESS success
|
|
MI_STREX_ERROR error of store exclusive
|
|
*---------------------------------------------------------------------------*/
|
|
asm MIStrExErr miStoreExclusiveDoubleWord( u64 setData, u64* destp )
|
|
{
|
|
strexd r3, r0, [r2]
|
|
mov r0, r3
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: miClearExclusiveAccess
|
|
|
|
Description: clear exclusive access
|
|
|
|
Arguments: None.
|
|
|
|
Returns: None.
|
|
*---------------------------------------------------------------------------*/
|
|
asm void miClearExclusiveAccess( void )
|
|
{
|
|
clrex
|
|
bx lr
|
|
}
|
|
|
|
#endif // SDK_ARM11
|
|
|
|
//---- end limitation of ARM-Mode
|
|
#include <brom/codereset.h>
|