/*---------------------------------------------------------------------------* 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 // 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 /*---------------------------------------------------------------------------* 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