排他アクセス関数を追加。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@296 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
nakasima 2009-02-16 08:02:40 +00:00
parent 575fbfb58c
commit 7700918ac6
3 changed files with 204 additions and 7 deletions

View File

@ -37,7 +37,7 @@
Returns: swapped memory data
*---------------------------------------------------------------------------*/
asm u8 miSwapByte( register u32 setData, register vu8* destp )
asm u8 miSwapByte( u8 setData, u8* destp )
{
swpb r0, r0, [r1]
bx lr
@ -53,11 +53,162 @@ asm u8 miSwapByte( register u32 setData, register vu8* destp )
Returns: swapped memory data
*---------------------------------------------------------------------------*/
asm u32 miSwapWord( register u32 setData, register vu32* destp )
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>

View File

@ -56,7 +56,6 @@ void osInitInterrupt( void )
{
u32 num = OS_INTR_ID_NUM;
u32 conf = 0;
u32 ack;
int i;
for ( i=0; i<num; i++ )
@ -72,7 +71,7 @@ void osInitInterrupt( void )
{
reg_OS_IDR_CFG[i] = conf;
}
while ( (ack = (reg_OS_CPUI_ACK & REG_OS_CPUI_ACK_ID_MASK)) != REG_OS_CPUI_ACK_ID_MASK )
while ( (reg_OS_CPUI_ACK & REG_OS_CPUI_ACK_ID_MASK) != REG_OS_CPUI_ACK_ID_MASK )
{
}
// reg_OS_IDR_CLR_PNDではクリアできないビット

View File

@ -24,8 +24,15 @@
extern "C" {
#endif
typedef enum
{
MI_STREX_SUCCESS = 0, // 排他ストア成功
MI_STREX_ERROR = 1 // 排他ストアエラー
}
MIStrExErr;
/*---------------------------------------------------------------------------*
Name: miSwapWord / miSwapByte
Name: miSwap[Byte|Word]
Description: swap data and memory
@ -38,11 +45,51 @@ extern "C" {
Use miSwapByte() not miSwapWord() basically.
*---------------------------------------------------------------------------*/
//---- by byte
u8 miSwapByte(u32 setData, volatile u8 *destp);
u8 miSwapByte(u8 setData, u8 *destp);
//---- by word
u32 miSwapWord(u32 setData, volatile u32 *destp);
u32 miSwapWord(u32 setData, u32 *destp);
/*---------------------------------------------------------------------------*
Name: miLoadExclusive[Byte|HalfWord|Word|DoubleWord]
Description: load exclusive data and memory
Arguments: destp memory address to load exclusive
Returns: loaded memory data
*---------------------------------------------------------------------------*/
u8 miLoadExclusiveByte( u8* destp );
u16 miLoadExclusiveHalfWord( u16* destp );
u32 miLoadExclusiveWord( u32* destp );
u64 miLoadExclusiveDoubleWord( u64* destp );
/*---------------------------------------------------------------------------*
Name: miStoreExclusive[Byte|HalfWord|Word|DoubleWord]
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
*---------------------------------------------------------------------------*/
MIStrExErr miStoreExclusiveByte( u8 setData, u8* destp );
MIStrExErr miStoreExclusiveHalfWord( u16 setData, u16* destp );
MIStrExErr miStoreExclusiveWord( u32 setData, u32* destp );
MIStrExErr miStoreExclusiveDoubleWord( u64 setData, u64* destp );
/*---------------------------------------------------------------------------*
Name: miClearExclusiveAccess
Description: clear exclusive access
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
void miClearExclusiveAccess( void );
#ifdef __cplusplus
} /* extern "C" */