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* dest = aesFlag ? aesBuffer :
|
||||||
(u8*)HW_FIRM_LOAD_BUFFER_BASE + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
(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;
|
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
|
#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 );
|
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;
|
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||||
size -= unit;
|
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;
|
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;
|
u32 unit = size < HW_FIRM_LOAD_BUFFER_UNIT_SIZE ? size : HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||||
if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_PIRIOD )
|
PXI_AcquireLoadBufferSemaphore(); // wait to be ready
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM9 );
|
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM9 );
|
||||||
if (ctx)
|
if (ctx)
|
||||||
{
|
{
|
||||||
@ -204,6 +201,7 @@ BOOL FS_LoadBuffer( u8* dest, u32 size, SVCSHA1Context *ctx )
|
|||||||
size -= unit;
|
size -= unit;
|
||||||
dest += unit;
|
dest += unit;
|
||||||
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM7 );
|
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM7 );
|
||||||
|
PXI_ReleaseLoadBufferSemaphore();
|
||||||
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|||||||
@ -24,8 +24,11 @@ typedef struct
|
|||||||
{
|
{
|
||||||
u32 wp;
|
u32 wp;
|
||||||
u32 rp;
|
u32 rp;
|
||||||
|
|
||||||
u8 id[PXI_FIRM_ID_MAX];
|
u8 id[PXI_FIRM_ID_MAX];
|
||||||
|
|
||||||
|
u32 semaphore; // for fs_loader.c
|
||||||
|
|
||||||
u32 length;
|
u32 length;
|
||||||
u32 current;
|
u32 current;
|
||||||
u8 data[PXI_FIRM_STREAM_MAX];
|
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;
|
u32 next_wp = ( work.wp + 1 ) % PXI_FIRM_ID_MAX;
|
||||||
(void)tag;
|
(void)tag;
|
||||||
(void)err;
|
(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 )
|
if ( next_wp != work.rp )
|
||||||
{
|
{
|
||||||
work.wp = next_wp;
|
work.wp = next_wp;
|
||||||
@ -93,6 +108,7 @@ void PXI_InitFIRM(void)
|
|||||||
while (!PXI_IsCallbackReady(PXI_FIFO_TAG_USER_0, PXI_PROC_ARM7))
|
while (!PXI_IsCallbackReady(PXI_FIFO_TAG_USER_0, PXI_PROC_ARM7))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
work.semaphore = 0;
|
||||||
#endif
|
#endif
|
||||||
work.rp = work.wp = work.length = 0;
|
work.rp = work.wp = work.length = 0;
|
||||||
PXI_SetFifoRecvCallback( PXI_FIFO_TAG_USER_0, PxiFirmStreamCallback );
|
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))
|
while (!PXI_IsCallbackReady(PXI_FIFO_TAG_USER_1, PXI_PROC_ARM9))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
work.semaphore = HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||||
#endif
|
#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
|
Name: PXIi_SendIDByIntf
|
||||||
|
|
||||||
|
|||||||
@ -36,7 +36,7 @@ typedef enum
|
|||||||
FIRM_PXI_ID_LOAD_HEADER = 6, // FATFS_LoadHeader
|
FIRM_PXI_ID_LOAD_HEADER = 6, // FATFS_LoadHeader
|
||||||
FIRM_PXI_ID_LOAD_STATIC = 5, // FATFS_LoadStatic
|
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
|
// from ARM9
|
||||||
FIRM_PXI_ID_INIT_MMEM = 3, // _start
|
FIRM_PXI_ID_INIT_MMEM = 3, // _start
|
||||||
@ -114,6 +114,28 @@ void PXI_NotifyID( FIRMPxiID id );
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
FIRMPxiID PXI_RecvID( void );
|
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
|
Name: PXIi_SendIDByIntf
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user