DS無線パッチの整理。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@698 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-02-19 08:39:48 +00:00
parent f1befafee6
commit 3d1a9325b4
3 changed files with 37 additions and 65 deletions

View File

@ -21,32 +21,23 @@
#include "mb_fileinfo.h" #include "mb_fileinfo.h"
// define data---------------------------------------------------------- // define data----------------------------------------------------------
#define _PATCH3_SHORT_ // パッチ3のサーチパターン削減スイッチ
#define SWI_NO_CPU_SET_FAST ( 12 << 16 ) // SVC_CpuSetFast() #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_30 0x03000000
#define SDK_VER_22_RELEASE_PLUS_3 0x02027533 #define SDK_VER_22_RELEASE_PLUS_3 0x02027533
#define SDK_VER_30_RC3 0x03004f4c #define SDK_VER_30_RC3 0x03004f4c
#define SDKVER_OFFSET_IN_PATTERN -4 #define SDKVER_OFFSET_IN_PATTERN (-4)
#define PATCH1_OFFSET_IN_PATTERN 0x18 #define PATCH1_OFFSET_IN_PATTERN 0x18
#ifdef _PATCH3_SHORT_
#define PATCH3_OFFSET_IN_PATTERN 0x04 #define PATCH3_OFFSET_IN_PATTERN 0x04
#else
#define PATCH3_OFFSET_IN_PATTERN 0x40
#endif
// function's prototype------------------------------------------------- // function's prototype-------------------------------------------------
void DS_InsertWLPatch( void );
static int DSi_ExistNitroCard(void); static int DSi_ExistNitroCard(void);
static void* DSi_GetPatchBaseAddr( void ); static void* DSi_GetPatchBaseAddr( void );
static BOOL DSi_IsPatchedSDKVersion( void ); static BOOL DSi_IsPatchedSDKVersion( void );
static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset ); static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset );
static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp ); static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp );
void DSi_WLPatchCore( void ); void DSi_CopyWLPatch( void );
// extern data---------------------------------------------------------- // extern data----------------------------------------------------------
@ -68,25 +59,11 @@ static const u32 patch1_org[] = {
// パッチ3対象コード // パッチ3対象コード
static const u32 patch3_org[] = { 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, 0xE1D100B0,
0xE3500006, 0x0AFFFFF9, 0xE1D100B0, 0xE3500005, // patch target( top 20bytes ) 0xE3500006, 0x0AFFFFF9, 0xE1D100B0, 0xE3500005, // patch target( top 20bytes )
0x0AFFFFF6, 0xE3A01000, 0xE59F0068, 0xE1C010B0, 0x0AFFFFF6, 0xE3A01000, 0xE59F0068, 0xE1C010B0,
0xE59F0064, 0xE1C010B0, 0xE59F004C, 0xE5900000, 0xE59F0064, 0xE1C010B0, 0xE59F004C, 0xE5900000,
0xE2800C03, 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コード // パッチ1コード
@ -136,15 +113,15 @@ void DS_InsertWLPatch( void )
// パッチ対象コードが見つかったら、パッチコードをセット。 // パッチ対象コードが見つかったら、パッチコードをセット。
if( patch_addr ) { if( patch_addr ) {
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ 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 { }else {
// それ以外ならば、RED_RSVにパッチコードを挿入。 // それ以外ならば、RED_RSVにパッチコードを挿入。
// ※パッチアドレスをIPL2の一時格納バッファアドレスから実際のARM7ロードアドレスに変換。 // ※パッチアドレスをIPL2の一時格納バッファアドレスから実際のARM7ロードアドレスに変換。
patch_addr = patch_addr + ((u32)dh->s.sub_entry_address - (u32)DSi_GetPatchBaseAddr()); patch_addr = patch_addr + ((u32)dh->s.sub_entry_address - (u32)DSi_GetPatchBaseAddr());
DSi_SetPatchCodeToREDRsvArea( patch_addr, patchp ); 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ヘッダ ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
void* p = (void*)SYSMi_GetWork()->romRelocateInfo[1].src; void* p = (void*)SYSMi_GetWork()->romRelocateInfo[1].src;
// 再配置しない場合は
if ( ! p ) if ( ! p )
{ {
void* h = dh->s.sub_ram_address; 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; p = h;
} }
@ -223,11 +201,6 @@ static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_o
} }
while( i-- ) { while( i-- ) {
#ifndef _PATCH3_SHORT_
if( ( *srcp & 0x0000ffff ) == 0x0000ffff ) {
*checkp |= 0x0000ffff;
}
#endif
if( *srcp++ != *checkp++ ) break; if( *srcp++ != *checkp++ ) break;
} }
@ -249,21 +222,18 @@ static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_o
// パッチコードをシステムのRED予約領域にセット // パッチコードをシステムのRED予約領域にセット
static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp ) 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ヘッダ ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
u32 *dstp = (u32 *)HW_RED_RESERVED; u32 *dstp = (u32 *)HW_RED_RESERVED;
u32 *srcp = (u32 *)&DSi_WLPatchCore; u32 *srcp = (u32 *)&DSi_CopyWLPatch;
int i; int i;
for( i = 0; i < PATCH_WORD_NUM; i++ ) { for( i = 0; i < DS_WLPATCH_SIZE/sizeof(u32); i++ ) {
*dstp++ = *patchp++; *dstp++ = *patchp++;
} }
*dstp++ = patch_addr; *dstp++ = patch_addr;
*dstp++ = (u32)dh->s.sub_entry_address; *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++; *dstp++ = *srcp++;
} }
} }
@ -289,7 +259,7 @@ asm void WLPatch_Dummy( void )
// WLへパッチを当てるコード実体 // WLへパッチを当てるコード実体
asm void DSi_WLPatchCore( void ) asm void DSi_CopyWLPatch( void )
{ {
add r0, pc, #-0x24 // R0 <- patch1 code addr add r0, pc, #-0x24 // R0 <- patch1 code addr
ldr r1, [ pc, #-0x14 ] // R1 <- target addr ldr r1, [ pc, #-0x14 ] // R1 <- target addr
@ -337,9 +307,9 @@ void DS_CheckROMCloneBoot( void )
buffp += auth_offset & 0x000001FF; buffp += auth_offset & 0x000001FF;
if( *buffp++ == 'a' && *buffp == 'c' ) { if( *buffp++ == 'a' && *buffp == 'c' ) {
SYSMi_GetWork()->cloneBootMode = CLONE_BOOT_MODE; SYSMi_GetWork()->cloneBootMode = SYSM_CLONE_BOOT_MODE;
}else { }else {
SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE; SYSMi_GetWork()->cloneBootMode = SYSM_OTHER_BOOT_MODE;
} }
} }

View File

@ -1,8 +1,8 @@
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Project: TwlFirm - DS - include Project: TwlIPL
File: dsemu.h File: ds.h
Copyright 2007 Nintendo. All rights reserved. Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo 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, 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. in whole or in part, without the prior written consent of Nintendo.
$Log: $ $Date:: #$
$NoKeywords: $ $Rev: $
$Author: $
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef FIRM_DS_COMMON_DS_H_ #ifndef SYSM_DS_COMMON_DS_H_
#define FIRM_DS_COMMON_DS_H_ #define SYSM_DS_COMMON_DS_H_
#include <sysmenu/memorymap.h> #include <sysmenu/memorymap.h>
@ -23,15 +24,12 @@
extern "C" { extern "C" {
#endif #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 DS_InsertWLPatch( void );
void DSi_SetEntry( void* entry ); void DS_CheckROMCloneBoot( void );
void DSi_SetComponentSize( size_t size );
#ifdef __cplusplus #ifdef __cplusplus
@ -39,5 +37,5 @@ void DSi_SetComponentSize( size_t size );
#endif #endif
/* FIRM_DS_COMMON_DS_H_ */ /* SYSM_DS_COMMON_DS_H_ */
#endif #endif

View File

@ -30,9 +30,12 @@ extern "C" {
// define data ------------------------------------ // define data ------------------------------------
#define TITLE_ID_LAUNCHER ( 0x000300074c4e4352LLU ) #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に分割してアクセスする場合に使用 // NAMTitleIDをHiLoに分割してアクセスする場合に使用
typedef struct TitleID_HiLo { typedef struct TitleID_HiLo {
@ -44,11 +47,11 @@ typedef struct TitleID_HiLo {
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// ROMエミュレーション情報 // ROMエミュレーション情報
//---------------------------------------------------------------------- //----------------------------------------------------------------------
#define ISD_ROM_EMULATION_INFO_SIZE 0x20 // ROMエミュレーションデータサイズ #define SYSM_ROMEMU_INFO_SIZE 0x20 // ROMエミュレーションデータサイズ
#define ISD_ROM_EMULATION_INFO_MAGIC_CODE 0x444c5754 // "TWLD"の文字列 #define SYSM_ROMEMU_INFO_MAGIC_CODE 0x444c5754 // "TWLD"の文字列
// ISデバッガROMエミュレーション情報 // ISデバッガROMエミュレーション情報
typedef struct ISD_RomEmuInfo { typedef struct SYSMRomEmuInfo {
// マジックコードISD_ROM_EMULATION_INFO_MAGIC_CODEの固定値 // マジックコードISD_ROM_EMULATION_INFO_MAGIC_CODEの固定値
u32 magic_code; u32 magic_code;
// フラグ類 // フラグ類
@ -65,7 +68,8 @@ typedef struct ISD_RomEmuInfo {
u64 titleID; u64 titleID;
// 予約 // 予約
u8 rsv[ 0x10 ]; u8 rsv[ 0x10 ];
}ISD_RomEmuInfo; }
SYSMRomEmuInfo;
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -120,7 +124,7 @@ typedef struct SYSM_work {
u8 cloneBootMode; u8 cloneBootMode;
LauncherParam launcherParam; LauncherParam launcherParam;
ISD_RomEmuInfo romEmuInfo; SYSMRomEmuInfo romEmuInfo;
// NTR-IPL2のレガシー 最終的には消すと思う // NTR-IPL2のレガシー 最終的には消すと思う
BOOL enableCardNormalOnly; BOOL enableCardNormalOnly;