From 3d1a9325b4ffc5a1861b8602e71f92783000d67b Mon Sep 17 00:00:00 2001 From: nakasima Date: Tue, 19 Feb 2008 08:39:48 +0000 Subject: [PATCH] =?UTF-8?q?DS=E7=84=A1=E7=B7=9A=E3=83=91=E3=83=83=E3=83=81?= =?UTF-8?q?=E3=81=AE=E6=95=B4=E7=90=86=E3=80=82?= 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@698 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../ds/common/src/ds_wlpatch.c | 56 +++++-------------- include/sysmenu/ds/common/ds.h | 28 +++++----- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 18 +++--- 3 files changed, 37 insertions(+), 65 deletions(-) diff --git a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c index 9e538da9..c5b66993 100644 --- a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c +++ b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c @@ -21,32 +21,23 @@ #include "mb_fileinfo.h" // define data---------------------------------------------------------- -#define _PATCH3_SHORT_ // パッチ3のサーチパターン削減スイッチ - #define SWI_NO_CPU_SET_FAST ( 12 << 16 ) // SVC_CpuSetFast() -#define WL_PATCH_SIZE 20 -#define RED_RSV_PATCH_FUNC_ADDR ( HW_RED_RESERVED + 0x1c ) #define SDK_VER_30 0x03000000 #define SDK_VER_22_RELEASE_PLUS_3 0x02027533 #define SDK_VER_30_RC3 0x03004f4c -#define SDKVER_OFFSET_IN_PATTERN -4 +#define SDKVER_OFFSET_IN_PATTERN (-4) #define PATCH1_OFFSET_IN_PATTERN 0x18 -#ifdef _PATCH3_SHORT_ #define PATCH3_OFFSET_IN_PATTERN 0x04 -#else -#define PATCH3_OFFSET_IN_PATTERN 0x40 -#endif // function's prototype------------------------------------------------- -void DS_InsertWLPatch( void ); static int DSi_ExistNitroCard(void); static void* DSi_GetPatchBaseAddr( void ); static BOOL DSi_IsPatchedSDKVersion( void ); static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset ); static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp ); -void DSi_WLPatchCore( void ); +void DSi_CopyWLPatch( void ); // extern data---------------------------------------------------------- @@ -68,25 +59,11 @@ static const u32 patch1_org[] = { // パッチ3対象コード static const u32 patch3_org[] = { -#ifndef _PATCH3_SHORT_ - 0xE92D4000, 0xE24DD004, 0xE3A02000, 0xE59F10A8, - 0xE5910000, 0xE2800C03, 0xE1C0FFFF, 0xE5910000, - 0xE2800B01, 0xE1C0FFFF, 0xE59F1090, 0xE59F2090, - 0xE1D200B0, 0xE2100001, 0x1AFFFFFC, -#endif 0xE1D100B0, 0xE3500006, 0x0AFFFFF9, 0xE1D100B0, 0xE3500005, // patch target( top 20bytes ) 0x0AFFFFF6, 0xE3A01000, 0xE59F0068, 0xE1C010B0, 0xE59F0064, 0xE1C010B0, 0xE59F004C, 0xE5900000, 0xE2800C03, -#ifndef _PATCH3_SHORT_ - 0xE1D0FFFF, 0xE3500000, 0x0A00000B, - 0xEB00FFFF, 0xE59F0030, 0xE5900000, 0xE2800C03, - 0xE1D0FFFF, 0xE3A01020, 0xEB00FFFF, 0xE3A01000, - 0xE59F0014, 0xE5900000, 0xE2800C03, 0xE1C0FFFF, - 0xE28DD004, 0xE8BD4000, 0xE12FFF1E, 0x0380FFF4, - 0x04808214, 0x0480819C, 0x04808028, 0x0480802A, -#endif }; // パッチ1コード @@ -136,15 +113,15 @@ void DS_InsertWLPatch( void ) // パッチ対象コードが見つかったら、パッチコードをセット。 if( patch_addr ) { ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ - if( SYSMi_GetWork()->cloneBootMode == IPL2_CLONE_BOOT_MODE ) { // ※クローンブートかどうかは、ARM9側で事前に調査。 + if( SYSMi_GetWork()->cloneBootMode == SYSM_CLONE_BOOT_MODE ) { // ※クローンブートかどうかはDS_CheckROMCloneBoot()で事前に調査。 // クローンブートならば、直パッチ - SVC_CpuCopyFast( patchp, patch_addr, WL_PATCH_SIZE ); + SVC_CpuCopyFast( patchp, patch_addr, DS_WLPATCH_SIZE ); }else { // それ以外ならば、RED_RSVにパッチコードを挿入。 // ※パッチアドレスをIPL2の一時格納バッファアドレスから実際のARM7ロードアドレスに変換。 patch_addr = patch_addr + ((u32)dh->s.sub_entry_address - (u32)DSi_GetPatchBaseAddr()); DSi_SetPatchCodeToREDRsvArea( patch_addr, patchp ); - dh->s.sub_entry_address = (void *)RED_RSV_PATCH_FUNC_ADDR; + dh->s.sub_entry_address = (void *)DS_REDRSV_PATCH_FUNC_ADDR; } } } @@ -157,10 +134,11 @@ static void* DSi_GetPatchBaseAddr( void ) ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ void* p = (void*)SYSMi_GetWork()->romRelocateInfo[1].src; + // 再配置しない場合は if ( ! p ) { void* h = dh->s.sub_ram_address; - if ( h >= (void*)SYSM_NTR_ARM7_LOAD_MMEM && h < (void*)(SYSM_NTR_ARM7_LOAD_MMEM_END - WL_PATCH_SIZE) ) + if ( h >= (void*)SYSM_NTR_ARM7_LOAD_MMEM && h < (void*)(SYSM_NTR_ARM7_LOAD_MMEM_END - DS_WLPATCH_SIZE) ) { p = h; } @@ -223,11 +201,6 @@ static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_o } while( i-- ) { -#ifndef _PATCH3_SHORT_ - if( ( *srcp & 0x0000ffff ) == 0x0000ffff ) { - *checkp |= 0x0000ffff; - } -#endif if( *srcp++ != *checkp++ ) break; } @@ -249,21 +222,18 @@ static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_o // パッチコードをシステムのRED予約領域にセット static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp ) { -#define PATCH_WORD_NUM 5 -#define WL_PATCH_CORE_WORD_NUM 10 - ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ u32 *dstp = (u32 *)HW_RED_RESERVED; - u32 *srcp = (u32 *)&DSi_WLPatchCore; + u32 *srcp = (u32 *)&DSi_CopyWLPatch; int i; - for( i = 0; i < PATCH_WORD_NUM; i++ ) { + for( i = 0; i < DS_WLPATCH_SIZE/sizeof(u32); i++ ) { *dstp++ = *patchp++; } *dstp++ = patch_addr; *dstp++ = (u32)dh->s.sub_entry_address; - for( i = 0; i < WL_PATCH_CORE_WORD_NUM; i++ ) { + for( i = 0; i < DS_WLPATCH_COPYCODE_SIZE/sizeof(u32); i++ ) { *dstp++ = *srcp++; } } @@ -289,7 +259,7 @@ asm void WLPatch_Dummy( void ) // WLへパッチを当てるコード実体 -asm void DSi_WLPatchCore( void ) +asm void DSi_CopyWLPatch( void ) { add r0, pc, #-0x24 // R0 <- patch1 code addr ldr r1, [ pc, #-0x14 ] // R1 <- target addr @@ -337,9 +307,9 @@ void DS_CheckROMCloneBoot( void ) buffp += auth_offset & 0x000001FF; if( *buffp++ == 'a' && *buffp == 'c' ) { - SYSMi_GetWork()->cloneBootMode = CLONE_BOOT_MODE; + SYSMi_GetWork()->cloneBootMode = SYSM_CLONE_BOOT_MODE; }else { - SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE; + SYSMi_GetWork()->cloneBootMode = SYSM_OTHER_BOOT_MODE; } } diff --git a/include/sysmenu/ds/common/ds.h b/include/sysmenu/ds/common/ds.h index 7947932f..e5419e9b 100644 --- a/include/sysmenu/ds/common/ds.h +++ b/include/sysmenu/ds/common/ds.h @@ -1,8 +1,8 @@ /*---------------------------------------------------------------------------* - Project: TwlFirm - DS - include - File: dsemu.h + Project: TwlIPL + File: ds.h - Copyright 2007 Nintendo. All rights reserved. + Copyright 2008 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo @@ -10,12 +10,13 @@ not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. - $Log: $ - $NoKeywords: $ + $Date:: #$ + $Rev: $ + $Author: $ *---------------------------------------------------------------------------*/ -#ifndef FIRM_DS_COMMON_DS_H_ -#define FIRM_DS_COMMON_DS_H_ +#ifndef SYSM_DS_COMMON_DS_H_ +#define SYSM_DS_COMMON_DS_H_ #include @@ -23,15 +24,12 @@ extern "C" { #endif +#define DS_REDRSV_PATCH_FUNC_ADDR ( HW_RED_RESERVED + 0x1c ) +#define DS_WLPATCH_SIZE (5*4) +#define DS_WLPATCH_COPYCODE_SIZE (10*4) -#define IPL2_CLONE_BOOT_MODE 1 -#define IPL2_OTHER_BOOT_MODE 2 - - -void DS_CheckROMCloneBoot( void ); void DS_InsertWLPatch( void ); -void DSi_SetEntry( void* entry ); -void DSi_SetComponentSize( size_t size ); +void DS_CheckROMCloneBoot( void ); #ifdef __cplusplus @@ -39,5 +37,5 @@ void DSi_SetComponentSize( size_t size ); #endif -/* FIRM_DS_COMMON_DS_H_ */ +/* SYSM_DS_COMMON_DS_H_ */ #endif diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 8d329361..43e2fbee 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -30,9 +30,12 @@ extern "C" { // define data ------------------------------------ #define TITLE_ID_LAUNCHER ( 0x000300074c4e4352LLU ) -#define CLONE_BOOT_MODE 1 -#define OTHER_BOOT_MODE 2 +typedef enum SYSMCloneBootMode { + SYSM_CLONE_BOOT_MODE = 1, + SYSM_OTHER_BOOT_MODE = 2 +} +SYSMCloneBootMode; // NAMTitleIDをHiLoに分割してアクセスする場合に使用 typedef struct TitleID_HiLo { @@ -44,11 +47,11 @@ typedef struct TitleID_HiLo { //---------------------------------------------------------------------- // ROMエミュレーション情報 //---------------------------------------------------------------------- -#define ISD_ROM_EMULATION_INFO_SIZE 0x20 // ROMエミュレーションデータサイズ -#define ISD_ROM_EMULATION_INFO_MAGIC_CODE 0x444c5754 // "TWLD"の文字列 +#define SYSM_ROMEMU_INFO_SIZE 0x20 // ROMエミュレーションデータサイズ +#define SYSM_ROMEMU_INFO_MAGIC_CODE 0x444c5754 // "TWLD"の文字列 // ISデバッガROMエミュレーション情報 -typedef struct ISD_RomEmuInfo { +typedef struct SYSMRomEmuInfo { // マジックコード(ISD_ROM_EMULATION_INFO_MAGIC_CODEの固定値) u32 magic_code; // フラグ類 @@ -65,7 +68,8 @@ typedef struct ISD_RomEmuInfo { u64 titleID; // 予約 u8 rsv[ 0x10 ]; -}ISD_RomEmuInfo; +} +SYSMRomEmuInfo; //---------------------------------------------------------------------- @@ -120,7 +124,7 @@ typedef struct SYSM_work { u8 cloneBootMode; LauncherParam launcherParam; - ISD_RomEmuInfo romEmuInfo; + SYSMRomEmuInfo romEmuInfo; // NTR-IPL2のレガシー 最終的には消すと思う BOOL enableCardNormalOnly;