From 96ceb69153deb38f2fa5702c25c465c6ac2bd994 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Fri, 9 May 2008 01:16:58 +0000 Subject: [PATCH] =?UTF-8?q?WRAM=E7=B5=8C=E7=94=B1=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=89=E5=AE=9F=E8=A3=85=EF=BC=88=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=83=BB=E4=B8=80=E5=BF=9C=E5=8B=95=E4=BD=9C?= =?UTF-8?q?=E7=A2=BA=E8=AA=8D=E6=B8=88=EF=BC=89=20=20=E3=83=BBLAUNCHER?= =?UTF-8?q?=E3=83=93=E3=83=AB=E3=83=89=E6=99=82=E3=81=ABLOAD=5FAPP=5FVIA?= =?UTF-8?q?=5FWRAM=3DTRUE=E3=81=A7WRAM=E7=B5=8C=E7=94=B1=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=AELAUNCHER=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1293 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/ARM9/src/title.c | 4 + .../sysmenu/common/src/decodeAES.c | 101 ++++++++++++------ 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 5c09dc25..df893f33 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -373,9 +373,11 @@ static void SYSMi_CalcHMACSHA1Callback(const void* addr, const void* orig_addr, { CalcHMACSHA1CallbackArg *cba = (CalcHMACSHA1CallbackArg *)arg; u32 calc_len = ( cba->hash_length < len ? cba->hash_length : len ); + OSIntrMode enabled = OS_DisableInterrupts();// WRAM切り替え途中で割り込み発生→別スレッドでWRAM切り替え→死亡の可能性があるので暫定対応 MI_SwitchWramSlot( wram, slot, MI_WRAM_SIZE_32KB, MI_WRAM_ARM9, MI_WRAM_ARM7 );// Wramを7にスイッチ SYSM_StartDecryptAESRegion_W( addr, orig_addr, len ); // AES領域デクリプト MI_SwitchWramSlot( wram, slot, MI_WRAM_SIZE_32KB, MI_WRAM_ARM7, MI_WRAM_ARM9 );// Wramが7にスイッチしてしまっているので戻す + OS_RestoreInterrupts(enabled);// 割り込み許可 if( calc_len == 0 ) return; cba->hash_length -= calc_len; SVC_HMACSHA1Update( &cba->ctx, addr, calc_len ); @@ -385,9 +387,11 @@ static void SYSMi_CalcSHA1Callback(const void* addr, const void* orig_addr, u32 { CalcSHA1CallbackArg *cba = (CalcSHA1CallbackArg *)arg; u32 calc_len = ( cba->hash_length < len ? cba->hash_length : len ); + OSIntrMode enabled = OS_DisableInterrupts();// WRAM切り替え途中で割り込み発生→別スレッドでWRAM切り替え→死亡の可能性があるので暫定対応 MI_SwitchWramSlot( wram, slot, MI_WRAM_SIZE_32KB, MI_WRAM_ARM9, MI_WRAM_ARM7 );// Wramを7にスイッチ SYSM_StartDecryptAESRegion_W( addr, orig_addr, len ); // AES領域デクリプト MI_SwitchWramSlot( wram, slot, MI_WRAM_SIZE_32KB, MI_WRAM_ARM7, MI_WRAM_ARM9 );// Wramが7にスイッチしてしまっているので戻す + OS_RestoreInterrupts(enabled);// 割り込み許可 if( calc_len == 0 ) return; cba->hash_length -= calc_len; SVC_SHA1Update( &cba->ctx, addr, calc_len ); diff --git a/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c b/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c index bd796f6c..484c5e59 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c +++ b/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c @@ -24,6 +24,7 @@ #define PXI_FIFO_DATA_DECRYPTAES_W_TARGET1 1 #define PXI_FIFO_DATA_DECRYPTAES_W_TARGET2 2 #define PXI_FIFO_DATA_DECRYPTAES_NORMAL 3 +#define SYSM_DECODE_AES_MESSAGE_ARRAY_MAX 8 // extern data----------------------------------------------------------------- // function's prototype------------------------------------------------------- // global variable------------------------------------------------------------- @@ -34,6 +35,11 @@ static void *s_Addr_AESregion[2]; static u32 s_Size_AESregion[2]; static BOOL s_initialized = FALSE; static u8 s_initCounterAES[2][AES_BLOCK_SIZE]; +static OSMessageQueue msgQ4arm9; +static OSMessage msgArray4arm9[SYSM_DECODE_AES_MESSAGE_ARRAY_MAX]; +#else +static OSMessageQueue msgQ4arm7; +static OSMessage msgArray4arm7[SYSM_DECODE_AES_MESSAGE_ARRAY_MAX]; #endif // const data------------------------------------------------------------------ @@ -156,10 +162,7 @@ BOOL SYSM_InitDecryptAESRegion_W( ROM_Header_Short *hs ) } // ARM7からの完了通知を受け取って完了 - while( !s_finished ) - { - OS_WaitAnyIrq(); - } + OS_ReceiveMessage(&msgQ4arm9, (OSMessage*)&s_finished, OS_MESSAGE_BLOCK); OS_TPrintf( "SYSM_InitDecryptAESRegion(arm9):Init finished.\n" ); s_initialized = TRUE; @@ -213,10 +216,7 @@ void SYSM_StartDecryptAESRegion_W( const void *wram_addr, const void *orig_addr, OS_TPrintf( "SYSM_StartDecryptAESRegion_W(arm9):ARM9 PXI send error.\n" ); } // ARM7からの完了通知を受け取って完了 - while( !s_finished ) - { - OS_WaitAnyIrq(); - } + OS_ReceiveMessage(&msgQ4arm9, (OSMessage*)&s_finished, OS_MESSAGE_BLOCK); } } @@ -330,10 +330,7 @@ void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ) } // ARM7からの完了通知を受け取って完了 - while( !s_finished ) - { - OS_WaitAnyIrq(); - } + OS_ReceiveMessage(&msgQ4arm9, (OSMessage*)&s_finished, OS_MESSAGE_BLOCK); OS_TPrintf( "SYSM_StartDecryptAESRegion(arm9):AES decryption finished.\n" ); } @@ -411,35 +408,69 @@ static void SYSMi_CallbackDecryptAESRegion(PXIFifoTag tag, u32 data, BOOL err) #pragma unused(err) #ifdef SDK_ARM9 - s_finished = TRUE; -#else //SDK_ARM7 - if(data == PXI_FIFO_DATA_DECRYPTAES_W_INIT) + if(!OS_SendMessage(&msgQ4arm9, (OSMessage)TRUE, OS_MESSAGE_NOBLOCK)) { - SYSMi_SetKeys(); - }else if(data == PXI_FIFO_DATA_DECRYPTAES_W_TARGET1 || data == PXI_FIFO_DATA_DECRYPTAES_W_TARGET2) - { - int target = (int)(data - PXI_FIFO_DATA_DECRYPTAES_W_TARGET1); - SYSMi_DecryptAESRegion_sub( target ); - }else if(data == PXI_FIFO_DATA_DECRYPTAES_NORMAL) - { - int l; - SYSMi_SetKeys(); - for( l=0; l<2; l++ ) - { - SYSMi_DecryptAESRegion_sub( l ); - } + OS_TPrintf( "SYSMi_CallbackDecryptAESRegion(arm9):Message send error.\n" ); + } +#else //SDK_ARM7 + if(!OS_SendMessage(&msgQ4arm7, (OSMessage)data, OS_MESSAGE_NOBLOCK)) + { + OS_TPrintf( "SYSMi_CallbackDecryptAESRegion(arm7):Message send error.\n" ); } - - // ARM9に完了通知 - while( PXI_SendWordByFifo(PXI_FIFO_TAG_DECRYPTAES, 0, FALSE) != PXI_FIFO_SUCCESS ) - { - OS_TPrintf( "SYSM_StartDecryptAESRegion(arm7):ARM7 PXI send error.\n" ); - } - #endif //ifdef SDK_ARM9 } +#ifdef SDK_ARM7 +#define SYSM_AES_THREAD_STACK_SIZE 512 +#define AES_THREAD_PRIORITY 5 +static OSThread aes_thread; +static u64 aes_thread_stack[SYSM_AES_THREAD_STACK_SIZE/sizeof(u64)]; + +static void SYSMi_DecryptAESThread(void* arg) +{ +#pragma unused(arg) + int aes_start; + while(1) + { + OS_ReceiveMessage(&msgQ4arm7, (OSMessage*)&aes_start, OS_MESSAGE_BLOCK); + + if(aes_start == PXI_FIFO_DATA_DECRYPTAES_W_INIT) + { + SYSMi_SetKeys(); + }else if(aes_start == PXI_FIFO_DATA_DECRYPTAES_W_TARGET1 || aes_start == PXI_FIFO_DATA_DECRYPTAES_W_TARGET2) + { + int target = (int)(aes_start - PXI_FIFO_DATA_DECRYPTAES_W_TARGET1); + SYSMi_DecryptAESRegion_sub( target ); + }else if(aes_start == PXI_FIFO_DATA_DECRYPTAES_NORMAL) + { + int l; + SYSMi_SetKeys(); + for( l=0; l<2; l++ ) + { + SYSMi_DecryptAESRegion_sub( l ); + } + } + + // ARM9に完了通知 + while( PXI_SendWordByFifo(PXI_FIFO_TAG_DECRYPTAES, 0, FALSE) != PXI_FIFO_SUCCESS ) + { + OS_TPrintf( "SYSM_StartDecryptAESRegion(arm7):ARM7 PXI send error.\n" ); + } + } +} +#endif + void SYSM_InitDecryptAESPXICallback( void ) { PXI_SetFifoRecvCallback(PXI_FIFO_TAG_DECRYPTAES, SYSMi_CallbackDecryptAESRegion); +#ifdef SDK_ARM9 + OS_InitMessageQueue(&msgQ4arm9, msgArray4arm9, SYSM_DECODE_AES_MESSAGE_ARRAY_MAX); +#else + OS_InitMessageQueue(&msgQ4arm7, msgArray4arm7, SYSM_DECODE_AES_MESSAGE_ARRAY_MAX); + // ARM7側の処理を行うためのスレッド開始 + OS_CreateThread(&aes_thread, SYSMi_DecryptAESThread, 0, + (void*)(aes_thread_stack + (SYSM_AES_THREAD_STACK_SIZE/sizeof(u64))), + SYSM_AES_THREAD_STACK_SIZE, AES_THREAD_PRIORITY); + OS_WakeupThreadDirect(&aes_thread); +#endif } \ No newline at end of file