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"
// 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;
}
}

View File

@ -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 <sysmenu/memorymap.h>
@ -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

View File

@ -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;