mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
DS無線パッチ暫定対応(クローンブートはHOTSWによる署名データロード待ち)。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@695 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
9b5f69cd66
commit
45ec74a6c4
@ -70,6 +70,7 @@ SYSMENU_LIBS ?= \
|
|||||||
libmbloader$(TWL_LIBSUFFIX).a \
|
libmbloader$(TWL_LIBSUFFIX).a \
|
||||||
libacsign$(TWL_LIBSUFFIX).a \
|
libacsign$(TWL_LIBSUFFIX).a \
|
||||||
libboot$(TWL_LIBSUFFIX).a \
|
libboot$(TWL_LIBSUFFIX).a \
|
||||||
|
libds$(TWL_LIBSUFFIX).a \
|
||||||
|
|
||||||
else # ($(CODEGEN_PROC),ARM7)
|
else # ($(CODEGEN_PROC),ARM7)
|
||||||
|
|
||||||
@ -78,6 +79,7 @@ SYSMENU_LIBS ?= \
|
|||||||
libsysmmcu_sp$(TWL_LIBSUFFIX).a \
|
libsysmmcu_sp$(TWL_LIBSUFFIX).a \
|
||||||
libmbloader_sp$(TWL_LIBSUFFIX).a \
|
libmbloader_sp$(TWL_LIBSUFFIX).a \
|
||||||
libboot_sp$(TWL_LIBSUFFIX).a \
|
libboot_sp$(TWL_LIBSUFFIX).a \
|
||||||
|
libds_sp$(TWL_LIBSUFFIX).a \
|
||||||
libhotsw_sp$(TWL_LIBSUFFIX).a \
|
libhotsw_sp$(TWL_LIBSUFFIX).a \
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@ -22,7 +22,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
|||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
SUBDIRS_P = reloc_info sysmenu mb_loader acsign boot hotsw namut mcu
|
SUBDIRS_P = reloc_info sysmenu mb_loader acsign boot hotsw namut mcu ds
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -32,7 +32,7 @@ INCDIR = ../common/include \
|
|||||||
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include \
|
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include \
|
||||||
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include/twl/fatfs/ARM7 \
|
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include/twl/fatfs/ARM7 \
|
||||||
|
|
||||||
SRCS = bootAPI.c
|
SRCS = bootAPI.c \
|
||||||
|
|
||||||
TARGET_LIB = libboot_sp$(TWL_LIBSUFFIX).a
|
TARGET_LIB = libboot_sp$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include <twl/mcu.h>
|
#include <twl/mcu.h>
|
||||||
#include <twl/cdc.h>
|
#include <twl/cdc.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
#include <sysmenu/ds.h>
|
||||||
#include "reboot.h"
|
#include "reboot.h"
|
||||||
|
|
||||||
|
|
||||||
@ -35,8 +36,6 @@
|
|||||||
#define COPY_NUM_MAX (4*3)
|
#define COPY_NUM_MAX (4*3)
|
||||||
#define POST_CLEAR_NUM_MAX (12 + 4*2)
|
#define POST_CLEAR_NUM_MAX (12 + 4*2)
|
||||||
|
|
||||||
#define SYSMi_ARM9_BOOT_CODE_BUF 0x023fee00
|
|
||||||
|
|
||||||
// extern data-------------------------------------------------------
|
// extern data-------------------------------------------------------
|
||||||
|
|
||||||
// function's prototype----------------------------------------------
|
// function's prototype----------------------------------------------
|
||||||
@ -51,8 +50,8 @@ static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end );
|
|||||||
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||||
{
|
{
|
||||||
HW_PARAM_RESERVED_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
HW_PARAM_RESERVED_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
||||||
SYSM_OWN_ARM7_MMEM_ADDR_END, SYSMi_ARM9_BOOT_CODE_BUF,
|
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
|
||||||
SYSMi_ARM9_BOOT_CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR,
|
OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR,
|
||||||
SYSM_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED,
|
SYSM_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
@ -61,7 +60,7 @@ static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
|||||||
{
|
{
|
||||||
HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_END,
|
HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_END,
|
||||||
HW_PARAM_RESERVED_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
HW_PARAM_RESERVED_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
||||||
SYSM_OWN_ARM7_MMEM_ADDR_END, SYSMi_ARM9_BOOT_CODE_BUF,
|
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
|
||||||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_DBG_NTR_SYSTEM_BUF,
|
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_DBG_NTR_SYSTEM_BUF,
|
||||||
SYSM_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED,
|
SYSM_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED,
|
||||||
NULL,
|
NULL,
|
||||||
@ -81,14 +80,6 @@ BOOL BOOT_WaitStart( void )
|
|||||||
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
||||||
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
|
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
|
||||||
(void)OS_SetIrqMaskEx(0);
|
(void)OS_SetIrqMaskEx(0);
|
||||||
/*
|
|
||||||
#ifdef ISDBG_MB_CHILD_
|
|
||||||
if( ( GetIpl2WorkAddr()->ipl2_type != 0xff ) && ( GetIpl2WorkAddr()->ipl2_type & 0x28 ) )
|
|
||||||
#endif // ISDBG_MB_CHILD_ // USG or NATなら無線パッチを当てる
|
|
||||||
{
|
|
||||||
InsertWLPatch();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
BOOTi_ClearREG_RAM(); // ARM7側のメモリ&レジスタクリア。
|
BOOTi_ClearREG_RAM(); // ARM7側のメモリ&レジスタクリア。
|
||||||
reg_MI_MBK9 = 0; // 全WRAMのロック解除
|
reg_MI_MBK9 = 0; // 全WRAMのロック解除
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include <twl/camera.h>
|
#include <twl/camera.h>
|
||||||
#include <twl/os/common/format_rom.h>
|
#include <twl/os/common/format_rom.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
#include <sysmenu/ds.h>
|
||||||
#include <firm/format/wram_regs.h>
|
#include <firm/format/wram_regs.h>
|
||||||
#include "reboot.h"
|
#include "reboot.h"
|
||||||
|
|
||||||
@ -147,6 +148,13 @@ void BOOT_Ready( void )
|
|||||||
}
|
}
|
||||||
#endif // FIRM_USE_SDK_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
|
#endif // FIRM_USE_SDK_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
|
||||||
|
|
||||||
|
// USG以前のDSアプリには無線パッチを適用
|
||||||
|
// (キャッシュ領域の排他制御簡略化のためARM9で行う)
|
||||||
|
if ( ds )
|
||||||
|
{
|
||||||
|
DS_InsertWLPatch();
|
||||||
|
}
|
||||||
|
|
||||||
// デバッガによるROMエミュレーション時はNTR-ROMヘッダバッファの
|
// デバッガによるROMエミュレーション時はNTR-ROMヘッダバッファの
|
||||||
// ゲームコマンドパラメータをスクランブルOFF設定に書き換える
|
// ゲームコマンドパラメータをスクランブルOFF設定に書き換える
|
||||||
dh->s.game_cmd_param = SYSMi_GetWork()->gameCommondParam;
|
dh->s.game_cmd_param = SYSMi_GetWork()->gameCommondParam;
|
||||||
|
|||||||
52
build/libraries_sysmenu/ds/ARM7/Makefile
Normal file
52
build/libraries_sysmenu/ds/ARM7/Makefile
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlIPL
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2008 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# $Date:: 2008-02-07#$
|
||||||
|
# $Rev: 612 $
|
||||||
|
# $Author: yutaka $
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
TARGET_FIRM = SYSTEMMENU
|
||||||
|
TARGET_PLATFORM = TWL
|
||||||
|
TWL_ARCHGEN = LIMITED
|
||||||
|
TWL_PROC = ARM7
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SRCDIR = ../common/src
|
||||||
|
|
||||||
|
INCDIR = ../common/include \
|
||||||
|
$(ROOT)/build/libraries/mb/common/include \
|
||||||
|
|
||||||
|
SRCS = ds_wlpatch.c \
|
||||||
|
|
||||||
|
TARGET_LIB = libds_sp$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
INSTALL_TARGETS = $(TARGETS)
|
||||||
|
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
|
|
||||||
52
build/libraries_sysmenu/ds/ARM9/Makefile
Normal file
52
build/libraries_sysmenu/ds/ARM9/Makefile
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlIPL
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2008 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# $Date:: 2008-02-07#$
|
||||||
|
# $Rev: 612 $
|
||||||
|
# $Author: yutaka $
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
TARGET_FIRM = SYSTEMMENU
|
||||||
|
TARGET_PLATFORM = TWL
|
||||||
|
TWL_ARCHGEN = LIMITED
|
||||||
|
TWL_PROC = ARM9
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SRCDIR = ../common/src
|
||||||
|
|
||||||
|
INCDIR = ../common/include \
|
||||||
|
$(ROOT)/build/libraries/mb/common/include \
|
||||||
|
|
||||||
|
SRCS = ds_wlpatch.c \
|
||||||
|
|
||||||
|
TARGET_LIB = libds$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
INSTALL_TARGETS = $(TARGETS)
|
||||||
|
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
|
|
||||||
358
build/libraries_sysmenu/ds/common/src/ds_wlpatch.c
Normal file
358
build/libraries_sysmenu/ds/common/src/ds_wlpatch.c
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlIPL
|
||||||
|
File: ds_wlpatch.c
|
||||||
|
|
||||||
|
Copyright 2008 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
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.
|
||||||
|
|
||||||
|
$Date:: #$
|
||||||
|
$Rev: $
|
||||||
|
$Author: $
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <twl.h>
|
||||||
|
#include <sysmenu.h>
|
||||||
|
#include <sysmenu/ds.h>
|
||||||
|
#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 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 );
|
||||||
|
|
||||||
|
// extern data----------------------------------------------------------
|
||||||
|
|
||||||
|
// const data-----------------------------------------------------------
|
||||||
|
|
||||||
|
// SDKバージョン検出用マジックコード
|
||||||
|
static const u32 sdk_ver_magic_code[] = {
|
||||||
|
0xdec00621,
|
||||||
|
0x2106c0de,
|
||||||
|
};
|
||||||
|
|
||||||
|
// パッチ1対象コード
|
||||||
|
static const u32 patch1_org[] = {
|
||||||
|
0xe59f1028, 0xe59f2028, 0xe1d200b0, 0xe2100001,
|
||||||
|
0x1afffffc, 0xe1d100b0, 0xe3500006, 0x0afffff9,
|
||||||
|
0xe1d100b0, 0xe3500005, 0x0afffff6, 0xe12fff1e,
|
||||||
|
0x04808214, 0x0480819c,
|
||||||
|
};
|
||||||
|
|
||||||
|
// パッチ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コード
|
||||||
|
static const u32 patch1_code[] = {
|
||||||
|
0xe3500005,
|
||||||
|
0x312fff1e,
|
||||||
|
0xe1d100b0,
|
||||||
|
0xe3500008,
|
||||||
|
0x9afffff6,
|
||||||
|
};
|
||||||
|
|
||||||
|
// パッチ3コード
|
||||||
|
static const u32 patch3_code[] = {
|
||||||
|
0xE3500005,
|
||||||
|
0x3A000002,
|
||||||
|
0xE1D100B0,
|
||||||
|
0xE3500008,
|
||||||
|
0x9AFFFFF6,
|
||||||
|
};
|
||||||
|
|
||||||
|
// static variables-----------------------------------------------------
|
||||||
|
static u32 mbSignBuf[MB_AUTHCODE_SIZE / sizeof(u32)] __attribute__ ((aligned(32)));
|
||||||
|
|
||||||
|
// function's description-----------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// USG-CPU以降におけるARM7コード無線不具合へのパッチ処理
|
||||||
|
// ※ゲームのロードが完了した後に本関数をコールして下さい。
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// パッチコードの挿入
|
||||||
|
void DS_InsertWLPatch( void )
|
||||||
|
{
|
||||||
|
// SDKバージョンがパッチ対象?
|
||||||
|
if( DSi_IsPatchedSDKVersion() ) {
|
||||||
|
// patch1, patch3をサーチ
|
||||||
|
const u32 *patchp = patch1_code;
|
||||||
|
u32 patch_addr = DSi_SearchBinaryCore( patch1_org, sizeof( patch1_org ) / sizeof( u32 ), PATCH1_OFFSET_IN_PATTERN );
|
||||||
|
|
||||||
|
if( patch_addr == 0 ) {
|
||||||
|
patchp = patch3_code;
|
||||||
|
patch_addr = DSi_SearchBinaryCore( patch3_org, sizeof( patch3_org ) / sizeof( u32 ), PATCH3_OFFSET_IN_PATTERN );
|
||||||
|
}
|
||||||
|
// パッチ対象コードが見つかったら、パッチコードをセット。
|
||||||
|
if( patch_addr ) {
|
||||||
|
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
||||||
|
if( SYSMi_GetWork()->cloneBootMode == IPL2_CLONE_BOOT_MODE ) { // ※クローンブートかどうかは、ARM9側で事前に調査。
|
||||||
|
// クローンブートならば、直パッチ
|
||||||
|
SVC_CpuCopyFast( patchp, patch_addr, WL_PATCH_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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// パッチベースアドレスの取得
|
||||||
|
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) )
|
||||||
|
{
|
||||||
|
p = h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// パッチ対象のSDKバージョンかどうか判定
|
||||||
|
static BOOL DSi_IsPatchedSDKVersion( void )
|
||||||
|
{
|
||||||
|
u32 addr;
|
||||||
|
u32 sdk_ver;
|
||||||
|
|
||||||
|
// SDKバージョンのサーチ
|
||||||
|
addr = DSi_SearchBinaryCore( sdk_ver_magic_code, sizeof( sdk_ver_magic_code ) / sizeof( u32 ), SDKVER_OFFSET_IN_PATTERN );
|
||||||
|
if( addr == 0 ) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SDKバージョンの判定
|
||||||
|
sdk_ver = *(u32 *)addr;
|
||||||
|
|
||||||
|
if( sdk_ver >= SDK_VER_30 ) {
|
||||||
|
if( sdk_ver >= SDK_VER_30_RC3 ) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}else if( sdk_ver >= SDK_VER_22_RELEASE_PLUS_3 ) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// バイナリサーチ
|
||||||
|
static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset )
|
||||||
|
{
|
||||||
|
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
||||||
|
u32 *tgtp;
|
||||||
|
int tgt_word_size;
|
||||||
|
|
||||||
|
if( patp == sdk_ver_magic_code ) {
|
||||||
|
tgtp = dh->s.main_entry_address;
|
||||||
|
tgt_word_size = (int)( dh->s.main_size
|
||||||
|
- ( (int)dh->s.main_entry_address - (int)dh->s.main_ram_address ) ) >> 2;
|
||||||
|
}else {
|
||||||
|
tgtp = DSi_GetPatchBaseAddr();
|
||||||
|
tgt_word_size = (int)dh->s.sub_size >> 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( tgt_word_size-- ) {
|
||||||
|
if( *tgtp++ == *patp ) {
|
||||||
|
const u32 *srcp = patp + 1;
|
||||||
|
u32 *checkp = tgtp;
|
||||||
|
int i = pat_word_size - 1;
|
||||||
|
|
||||||
|
if( tgt_word_size < i ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( i-- ) {
|
||||||
|
#ifndef _PATCH3_SHORT_
|
||||||
|
if( ( *srcp & 0x0000ffff ) == 0x0000ffff ) {
|
||||||
|
*checkp |= 0x0000ffff;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if( *srcp++ != *checkp++ ) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( i < 0 ) {
|
||||||
|
return (u32)( (u32)( tgtp - 1 ) + patch_offset );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// パッチコードのセットおよびパッチ処理の実体
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// パッチコードをシステムの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;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < PATCH_WORD_NUM; i++ ) {
|
||||||
|
*dstp++ = *patchp++;
|
||||||
|
}
|
||||||
|
*dstp++ = patch_addr;
|
||||||
|
*dstp++ = (u32)dh->s.sub_entry_address;
|
||||||
|
|
||||||
|
for( i = 0; i < WL_PATCH_CORE_WORD_NUM; i++ ) {
|
||||||
|
*dstp++ = *srcp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#include <nitro/code32.h>
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define SWI_NO_CPU_SET_FAST (12<<16)
|
||||||
|
// 他プログラムへ組み込んでテストする時のダミーパッド
|
||||||
|
asm void WLPatch_Dummy( void )
|
||||||
|
{
|
||||||
|
nop // patch code (20bytes)
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop // target addr
|
||||||
|
nop // ARM7 entry addr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// WLへパッチを当てるコード実体
|
||||||
|
asm void DSi_WLPatchCore( void )
|
||||||
|
{
|
||||||
|
add r0, pc, #-0x24 // R0 <- patch1 code addr
|
||||||
|
ldr r1, [ pc, #-0x14 ] // R1 <- target addr
|
||||||
|
mov r2, #( 20 / 4 ) // R2 <- copy size / sizeof(u32)
|
||||||
|
swi SWI_NO_CPU_SET_FAST // SVC_CpuSetFast
|
||||||
|
ldr r12, [ pc, #-0x1c ] // ARM7 entry address
|
||||||
|
mov lr, r12
|
||||||
|
mov r0, #0
|
||||||
|
mov r1, r0
|
||||||
|
mov r2, r0
|
||||||
|
bx r12
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <nitro/codereset.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define DMA_SRC_INC 0x00000000 // 転送元 インクリメント 選択
|
||||||
|
#define SVC_CpuCopyFast(srcp, destp, size) \
|
||||||
|
\
|
||||||
|
SVC_CpuSetFast( (u8 *)(srcp), \
|
||||||
|
(u8 *)(destp), \
|
||||||
|
( DMA_SRC_INC | ( (size)/(32/8) & 0x1fffff ) ) )
|
||||||
|
*/
|
||||||
|
|
||||||
|
// クローンブート判定
|
||||||
|
void DS_CheckROMCloneBoot( void )
|
||||||
|
{
|
||||||
|
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
||||||
|
s32 lockCardID;
|
||||||
|
u8 *buffp = (u8 *)&mbSignBuf;
|
||||||
|
u32 auth_offset = dh->s.rom_valid_size ? dh->s.rom_valid_size : 0x01000000;
|
||||||
|
u32 page_offset = auth_offset & 0xFFFFFE00;
|
||||||
|
|
||||||
|
if( !DSi_ExistNitroCard() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((lockCardID = OS_GetLockID()) > 0) {
|
||||||
|
(void)OS_LockCard( (u16 )lockCardID );
|
||||||
|
// DC_FlushRange( buffp, sizeof(mbSignBuf) );
|
||||||
|
// IPL2_ReadCard( (void *)page_offset, buffp, sizeof(mbSignBuf) );
|
||||||
|
(void)OS_UnLockCard( (u16 )lockCardID );
|
||||||
|
OS_ReleaseLockID( (u16 )lockCardID );
|
||||||
|
}
|
||||||
|
|
||||||
|
buffp += auth_offset & 0x000001FF;
|
||||||
|
if( *buffp++ == 'a' && *buffp == 'c' ) {
|
||||||
|
SYSMi_GetWork()->cloneBootMode = CLONE_BOOT_MODE;
|
||||||
|
}else {
|
||||||
|
SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NITROカード存在チェック 「リターン 1:カード認識 0:カードなし」
|
||||||
|
static int DSi_ExistNitroCard(void)
|
||||||
|
{
|
||||||
|
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
||||||
|
if((dh->s.nintendo_logo_crc16 == 0xcf56)
|
||||||
|
&&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) {
|
||||||
|
return TRUE; // NITROカードあり(NintendoロゴCRC、カードヘッダCRCが正しい場合)
|
||||||
|
// ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。
|
||||||
|
}else {
|
||||||
|
return FALSE; // NITROカードなし
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -58,7 +58,6 @@ void SYSM_SetBackLightBrightness( u8 brightness )
|
|||||||
{
|
{
|
||||||
( void )SYSM_WriteMcuRegisterAsync( MCU_REG_BL_ADDR, brightness, NULL, NULL );
|
( void )SYSM_WriteMcuRegisterAsync( MCU_REG_BL_ADDR, brightness, NULL, NULL );
|
||||||
}
|
}
|
||||||
// ( void )SYSMi_SendPXICommand( SYSM_PXI_COMM_BL_BRIGHT, brightness );
|
|
||||||
|
|
||||||
LCFG_TSD_SetBacklightBrightness( brightness );
|
LCFG_TSD_SetBacklightBrightness( brightness );
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,7 @@ SUBDIRS = \
|
|||||||
# ../../../libraries_sysmenu/reloc_info \
|
# ../../../libraries_sysmenu/reloc_info \
|
||||||
# ../../../libraries_sysmenu/boot \
|
# ../../../libraries_sysmenu/boot \
|
||||||
# ../../../libraries_sysmenu/mcu \
|
# ../../../libraries_sysmenu/mcu \
|
||||||
|
# ../../../libraries_sysmenu/ds \
|
||||||
# $(TWLSDK_ROOT)/build/libraries/reboot \
|
# $(TWLSDK_ROOT)/build/libraries/reboot \
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|||||||
32
include/sysmenu/ds.h
Normal file
32
include/sysmenu/ds.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlIPL - DS
|
||||||
|
File: ds.h
|
||||||
|
|
||||||
|
Copyright 2008 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
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.
|
||||||
|
|
||||||
|
$Date:: #$
|
||||||
|
$Rev: $
|
||||||
|
$Author: $
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef SYSM_DS_H_
|
||||||
|
#define SYSM_DS_H_
|
||||||
|
|
||||||
|
#include <sysmenu/ds/common/ds.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* SYSM_DS_H_ */
|
||||||
|
#endif
|
||||||
43
include/sysmenu/ds/common/ds.h
Normal file
43
include/sysmenu/ds/common/ds.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlFirm - DS - include
|
||||||
|
File: dsemu.h
|
||||||
|
|
||||||
|
Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
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: $
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef FIRM_DS_COMMON_DS_H_
|
||||||
|
#define FIRM_DS_COMMON_DS_H_
|
||||||
|
|
||||||
|
#include <sysmenu/memorymap.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#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 );
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FIRM_DS_COMMON_DS_H_ */
|
||||||
|
#endif
|
||||||
@ -115,9 +115,9 @@ typedef struct SYSM_work {
|
|||||||
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側)
|
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側)
|
||||||
OSLockWord lockCardRsc; // カードリソース排他制御用
|
OSLockWord lockCardRsc; // カードリソース排他制御用
|
||||||
OSLockWord lockHotSW; // カードリソース排他制御用
|
OSLockWord lockHotSW; // カードリソース排他制御用
|
||||||
int cloneBootMode;
|
|
||||||
u32 nCardID; // カードID
|
u32 nCardID; // カードID
|
||||||
u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする)
|
u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする)
|
||||||
|
u8 cloneBootMode;
|
||||||
|
|
||||||
LauncherParam launcherParam;
|
LauncherParam launcherParam;
|
||||||
ISD_RomEmuInfo romEmuInfo;
|
ISD_RomEmuInfo romEmuInfo;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user