ctr_firmware/trunk/bootrom/build/libraries/mi/common/mi_exclusive.c
nakasima 7700918ac6 排他アクセス関数を追加。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@296 b871894f-2f95-9b40-918c-086798483c85
2009-02-16 08:02:40 +00:00

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>