mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
LoadBufferの資産管理を厳密にした
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@575 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
a249ffcc10
commit
25122dfea4
@ -124,8 +124,10 @@ BOOL FS_LoadBuffer( int fd, u32 offset, u32 size )
|
||||
u8* dest = aesFlag ? aesBuffer :
|
||||
(u8*)HW_FIRM_LOAD_BUFFER_BASE + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||
u32 unit = size < HW_FIRM_LOAD_BUFFER_UNIT_SIZE ? size : HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||
while ( MI_GetWramBankMaster_B( count ) != MI_WRAM_ARM7 ) // wait to be ready
|
||||
PXI_AcquireLoadBufferSemaphore(); // wait to be ready
|
||||
if ( MI_GetWramBankMaster_B( count ) != MI_WRAM_ARM7 )
|
||||
{
|
||||
OS_TPanic("PROGRAM ERROR!");
|
||||
}
|
||||
#ifdef WORKAROUND_NAND_2KB_BUG
|
||||
{
|
||||
@ -152,7 +154,7 @@ BOOL FS_LoadBuffer( int fd, u32 offset, u32 size )
|
||||
{
|
||||
CopyWithAes( dest, (u8*)HW_FIRM_LOAD_BUFFER_BASE + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE, unit );
|
||||
}
|
||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_PIRIOD );
|
||||
PXI_ReleaseLoadBufferSemaphore();
|
||||
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||
size -= unit;
|
||||
}
|
||||
|
||||
@ -179,10 +179,7 @@ BOOL FS_LoadBuffer( u8* dest, u32 size, SVCSHA1Context *ctx )
|
||||
{
|
||||
u8* src = (u8*)HW_FIRM_LOAD_BUFFER_BASE + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||
u32 unit = size < HW_FIRM_LOAD_BUFFER_UNIT_SIZE ? size : HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||
if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_PIRIOD )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
PXI_AcquireLoadBufferSemaphore(); // wait to be ready
|
||||
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM9 );
|
||||
if (ctx)
|
||||
{
|
||||
@ -204,6 +201,7 @@ BOOL FS_LoadBuffer( u8* dest, u32 size, SVCSHA1Context *ctx )
|
||||
size -= unit;
|
||||
dest += unit;
|
||||
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM7 );
|
||||
PXI_ReleaseLoadBufferSemaphore();
|
||||
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
@ -24,8 +24,11 @@ typedef struct
|
||||
{
|
||||
u32 wp;
|
||||
u32 rp;
|
||||
|
||||
u8 id[PXI_FIRM_ID_MAX];
|
||||
|
||||
u32 semaphore; // for fs_loader.c
|
||||
|
||||
u32 length;
|
||||
u32 current;
|
||||
u8 data[PXI_FIRM_STREAM_MAX];
|
||||
@ -66,6 +69,18 @@ static void PxiFirmIDCallback( PXIFifoTag tag, u32 data, BOOL err )
|
||||
u32 next_wp = ( work.wp + 1 ) % PXI_FIRM_ID_MAX;
|
||||
(void)tag;
|
||||
(void)err;
|
||||
|
||||
// special ID
|
||||
if ( data == FIRM_PXI_ID_LOAD_BUFFER_SEMAPHORE )
|
||||
{
|
||||
work.semaphore++;
|
||||
if ( work.semaphore > HW_FIRM_LOAD_BUFFER_UNIT_NUMS )
|
||||
{
|
||||
OS_TPanic("PROGRAM ERROR: Semaphore counter was overlow.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if ( next_wp != work.rp )
|
||||
{
|
||||
work.wp = next_wp;
|
||||
@ -93,6 +108,7 @@ void PXI_InitFIRM(void)
|
||||
while (!PXI_IsCallbackReady(PXI_FIFO_TAG_USER_0, PXI_PROC_ARM7))
|
||||
{
|
||||
}
|
||||
work.semaphore = 0;
|
||||
#endif
|
||||
work.rp = work.wp = work.length = 0;
|
||||
PXI_SetFifoRecvCallback( PXI_FIFO_TAG_USER_0, PxiFirmStreamCallback );
|
||||
@ -101,6 +117,7 @@ void PXI_InitFIRM(void)
|
||||
while (!PXI_IsCallbackReady(PXI_FIFO_TAG_USER_1, PXI_PROC_ARM9))
|
||||
{
|
||||
}
|
||||
work.semaphore = HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -220,6 +237,44 @@ FIRMPxiID PXI_RecvID( void )
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: PXI_ReleaseLoadBufferSemaphore
|
||||
|
||||
Description: Release semaphore for *_LoadBuffer
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void PXI_ReleaseLoadBufferSemaphore( void )
|
||||
{
|
||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_BUFFER_SEMAPHORE );
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: PXI_AcquireLoadBufferSemaphore
|
||||
|
||||
Description: Acquire semaphore for *_LoadBuffer
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void PXI_AcquireLoadBufferSemaphore( void )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
OSIntrMode enabled = OS_DisableInterrupts();
|
||||
if ( work.semaphore > 0 )
|
||||
{
|
||||
work.semaphore--;
|
||||
OS_RestoreInterrupts( enabled );
|
||||
return;
|
||||
}
|
||||
OS_RestoreInterrupts( enabled );
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: PXIi_SendIDByIntf
|
||||
|
||||
|
||||
@ -36,7 +36,7 @@ typedef enum
|
||||
FIRM_PXI_ID_LOAD_HEADER = 6, // FATFS_LoadHeader
|
||||
FIRM_PXI_ID_LOAD_STATIC = 5, // FATFS_LoadStatic
|
||||
|
||||
FIRM_PXI_ID_LOAD_PIRIOD = 1, // *_LoadBuffer
|
||||
FIRM_PXI_ID_LOAD_BUFFER_SEMAPHORE = 1, // *_LoadBuffer
|
||||
|
||||
// from ARM9
|
||||
FIRM_PXI_ID_INIT_MMEM = 3, // _start
|
||||
@ -114,6 +114,28 @@ void PXI_NotifyID( FIRMPxiID id );
|
||||
*---------------------------------------------------------------------------*/
|
||||
FIRMPxiID PXI_RecvID( void );
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: PXI_ReleaseLoadBufferSemaphore
|
||||
|
||||
Description: Release semaphore for *_LoadBuffer
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void PXI_ReleaseLoadBufferSemaphore( void );
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: PXI_AcquireLoadBufferSemaphore
|
||||
|
||||
Description: Acquire semaphore for *_LoadBuffer
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void PXI_AcquireLoadBufferSemaphore( void );
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: PXIi_SendIDByIntf
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user