diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.c b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.c index 136abc67..3df0b2ee 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.c @@ -85,13 +85,18 @@ void InitializeBackup( void) { u16 lock_id; + // HOTSWライブラリのケア(終了処理待ちなど)は必要ない +#if 0 + // デバッグ用に表示するだけ if( HOTSW_isEnableHotSW()) { - HOTSW_InvalidHotSW(); - OS_TPrintf( "HOTSW is enable, so HOTSW_InvalidHotSW is done.\n"); +// HOTSW_InvalidHotSW(); + OS_TPrintf( "HOTSW is enable!\n"); + } + else + { + OS_TPrintf( "ok, HOTSW is not enable.\n"); } - OS_TPrintf( "ok, HOTSW is not enable.\n"); - if( !HOTSW_isFinalized()) { OS_TPrintf( "HOTSW is not Finalized!\n"); @@ -108,6 +113,7 @@ void InitializeBackup( void) { OS_TPrintf( "ok, HOTSW is is card load completed.\n"); } +#endif if( !CARD_IsAvailable()) { @@ -152,7 +158,7 @@ BOOL readEEPROM( u32 src, void *dst, u32 len) } CARD_UnlockBackup( lock_id); - DC_FlushRange( dst, len); +// DC_FlushRange( dst, len); return result; } @@ -162,7 +168,7 @@ BOOL writeEEPROM( u32 dst, const void *src, u32 len) BOOL result; u16 lock_id; - DC_FlushRange( src, len); +// DC_FlushRange( src, len); lock_id = (u16)OS_GetLockID(); CARD_LockBackup( lock_id); @@ -177,12 +183,51 @@ BOOL writeEEPROM( u32 dst, const void *src, u32 len) return result; } +#if 1 +BOOL writeAndVerifyEEPROM( u32 address, const void *buffer, void *reload_buffer, u32 len) +{ + BOOL w_result, r_result; + int m_result; + u16 lock_id; + u32 pos; + + // バッファ同士がオーバーラップしていたらエラー + pos = (u32)reload_buffer; + if( ((u32)buffer <= pos) && (((u32)buffer + len - 1) >= pos)) + { + return FALSE; + } + pos = (u32)reload_buffer + len - 1; + if( ((u32)buffer <= pos) && (((u32)buffer + len - 1) >= pos)) + { + return FALSE; + } + + lock_id = (u16)OS_GetLockID(); + CARD_LockBackup( lock_id); + /* CARD_WriteAndVerifyEeprom() は、 src上のデータをA9-CPUで一時バッファ(CARDi_backup_cache_page_buf)に + コピーした上で処理しているので、srcのメモリ空間はA7から見えなくても良い */ + w_result = CARD_WriteEeprom( address, buffer, len); + if( !w_result) + { + OS_TPrintf( "CARD_WriteEeprom failed! err:%d\n", (int)CARD_GetResultCode()); + } + r_result = CARD_ReadEeprom( address, reload_buffer, len); + if( !r_result) + { + OS_TPrintf( "CARD_ReadEeprom failed! err:%d\n", (int)CARD_GetResultCode()); + } + m_result = MI_CpuComp8( buffer, reload_buffer, len); + CARD_UnlockBackup( lock_id); + return (w_result && r_result && (m_result == 0)); +} +#else BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len) { BOOL result; u16 lock_id; - DC_FlushRange( src, len); +// DC_FlushRange( src, len); lock_id = (u16)OS_GetLockID(); CARD_LockBackup( lock_id); @@ -196,3 +241,4 @@ BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len) CARD_UnlockBackup( lock_id); return result; } +#endif diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.h b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.h index 7ec64ca0..c7763dea 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.h +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_SaveDataChecker.h @@ -25,7 +25,8 @@ void InitializeBackup( void); void FinalizeBackup( void); BOOL readEEPROM( u32 src, void *dst, u32 len); BOOL writeEEPROM( u32 dst, const void *src, u32 len); -BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len); +BOOL writeAndVerifyEEPROM( u32 address, const void *buffer, void *reload_buffer, u32 len); +//BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len); /* // cardnor_NspiIfApi.cpp diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCK.c b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCK.c index 6906f57c..b0c5e4ef 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCK.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCK.c @@ -30,6 +30,8 @@ //NN_COMPILER_ASSERT(VCK_BACKUP_READ_SIZE >= sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody)); //NN_COMPILER_ASSERT(VCK_BACKUP_READ_SIZE % 32 == 0); +// ヘッダのチェックサムをチェックサムに変換する +static u16 VCK_HeaderChecksumToChecksum( VCK_SlotHeader* header); // checksum を算出する static u16 getChecksum( void* data); // データが工場出荷状態か破壊されていれば TRUE を返す @@ -53,8 +55,8 @@ TitleID_num; BOOL checkVCK( TitleProperty* tp) { u32 i; - u16 tick; u32 *data; + u32 *verify_data; VCK_SlotHeader *header; VCK_ProfileSlotBody *body; u8 *body_u8; @@ -69,7 +71,9 @@ BOOL checkVCK( TitleProperty* tp) // EEPROM から読み出し data = (u32*)(MI_AllocWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9)); + verify_data = (u32*)((u32)data + VCK_BACKUP_READ_SIZE); OS_TPrintf("Buffer:0x%x\n", data); + OS_TPrintf("verifyBuffer:0x%x\n", verify_data); InitializeBackup(); readEEPROM( 0, (u32*)data, VCK_BACKUP_READ_SIZE);//sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody)が32Bytesの倍数でないため @@ -97,12 +101,9 @@ BOOL checkVCK( TitleProperty* tp) } // checksumがBになるようにランダムな1箇所へ書き込み - tick = OS_GetTickLo(); -#if 1 { MATH_CalcSHA1( calculatedSha1, (const void*)data, sizeof(VCK_ProfileSlotBody)); } -#endif rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1); MATH_InitRand16( &rc16, rseed); for( i=0; im_uniqueIdentifier) - (header->m_slotCheckSum)))) + ( B_checksum == VCK_HeaderChecksumToChecksum( header))) { B_checksum -= body_u8[sizeof(VCK_ProfileSlotBody) - 1]; body_u8[sizeof(VCK_ProfileSlotBody) - 1]++; @@ -120,22 +121,28 @@ BOOL checkVCK( TitleProperty* tp) } // Backup デバイスへ反映 - if( writeAndVerifyEEPROM( 0, data, VCK_BACKUP_READ_SIZE)) + if( writeAndVerifyEEPROM( 0, data, verify_data, VCK_BACKUP_READ_SIZE)) { OS_TPrintf("launch ok.\n"); - OS_TPrintf("ckecksum:0x%x, B_checksum:0x%x\n", getChecksum(body), B_checksum); + OS_TPrintf("S_checksum:0x%x, A_ckecksum:0x%x, B_checksum:0x%x\n", S_checksum, VCK_HeaderChecksumToChecksum(header), B_checksum); FinalizeBackup(); MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9); return TRUE; } OS_TPrintf("launch NG.\n"); - OS_TPrintf("S_checksum:0x%x, ckecksum:0x%x, B_checksum:0x%x\n", S_checksum, getChecksum(body), B_checksum); + OS_TPrintf("S_checksum:0x%x, A_ckecksum:0x%x, B_checksum:0x%x\n", S_checksum, VCK_HeaderChecksumToChecksum(header), B_checksum); FinalizeBackup(); MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9); return FALSE; } +// ヘッダのチェックサムをチェックサムに変換する +static u16 VCK_HeaderChecksumToChecksum( VCK_SlotHeader* header) +{ + return (u16)(0xFFFF - (header->m_uniqueIdentifier) - (header->m_slotCheckSum)); +} + // checksum を算出する static u16 getChecksum( void* data) { diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCW.c b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCW.c index 5fd5c50b..8e0483c4 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCW.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/SaveDataChecker/lgy_VCW.c @@ -50,17 +50,20 @@ BOOL checkVCW( TitleProperty* tp, u32 ggid) #pragma unused( tp) u32 i; u32 *data; + u32 *verify_data; u8 *buf; u16 B_checksum[2]; VCW vcw[2]; - OS_TPrintf("check VCW backup start.\n"); + OS_TPrintf("check VCW backup start. ggid = 0x%x\n", ggid); OS_TPrintf( "header size:0x%x, body size:0x%x\n", sizeof(VCW_SavegameHeader), sizeof(VCW_BodyForCheck)); // EEPROM から読み出し // base = MI_AllocWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9); data = (u32*)(MI_AllocWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9)); + verify_data = (u32*)((u32)data + VCW_BACKUP_READ_SIZE); OS_TPrintf("Buffer:0x%x\n", data); + OS_TPrintf("verifyBuffer:0x%x\n", verify_data); InitializeBackup(); readEEPROM( 0, (u32*)data, VCW_BACKUP_READ_SIZE); @@ -93,7 +96,7 @@ BOOL checkVCW( TitleProperty* tp, u32 ggid) if( VCW_IsModified( &vcw[0]) || VCW_IsModified( &vcw[1])) { OS_TPrintf( "backup write testing..\n"); - if( !writeAndVerifyEEPROM( 0, data, VCW_BACKUP_READ_SIZE)) + if( !writeAndVerifyEEPROM( 0, data, verify_data, VCW_BACKUP_READ_SIZE)) { OS_TPrintf("launch NG!\n"); VCW_Finalize( &vcw[0]); @@ -183,7 +186,6 @@ static u16 VCW_Modify( VCW* vcw) { u16 S_checksum_tmp; u32 i; - u16 tick; u8* body_u8 = (u8*)(vcw->body); u32 calculatedSha1[ MATH_SHA1_DIGEST_SIZE /sizeof(u32)]; MATHRandContext16 rc16; @@ -192,12 +194,9 @@ static u16 VCW_Modify( VCW* vcw) S_checksum_tmp = VCW_GetChecksum( vcw); // checksumがBになるようにランダムな1箇所へ書き込み - tick = OS_GetTickLo(); -#if 1 { MATH_CalcSHA1( calculatedSha1, (const void*)vcw->body, sizeof(VCW_BodyForCheck)); } -#endif rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1); MATH_InitRand16( &rc16, rseed); for( i=0; iB_checksum += body_u8[sizeof(VCW_BodyForCheck) - 1]; } - OS_TPrintf( "S_checksum:0x%x, A_checksum:0x%x, B_checksum;0x%x\n", + OS_TPrintf( "S_checksum:0x%x, A_checksum:0x%x, B_checksum:0x%x\n", S_checksum_tmp, VCW_HeaderChecksumToChecksum( vcw), vcw->B_checksum);