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 \
|
||||
libacsign$(TWL_LIBSUFFIX).a \
|
||||
libboot$(TWL_LIBSUFFIX).a \
|
||||
libds$(TWL_LIBSUFFIX).a \
|
||||
|
||||
else # ($(CODEGEN_PROC),ARM7)
|
||||
|
||||
@ -78,6 +79,7 @@ SYSMENU_LIBS ?= \
|
||||
libsysmmcu_sp$(TWL_LIBSUFFIX).a \
|
||||
libmbloader_sp$(TWL_LIBSUFFIX).a \
|
||||
libboot_sp$(TWL_LIBSUFFIX).a \
|
||||
libds_sp$(TWL_LIBSUFFIX).a \
|
||||
libhotsw_sp$(TWL_LIBSUFFIX).a \
|
||||
|
||||
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/twl/fatfs/ARM7 \
|
||||
|
||||
SRCS = bootAPI.c
|
||||
SRCS = bootAPI.c \
|
||||
|
||||
TARGET_LIB = libboot_sp$(TWL_LIBSUFFIX).a
|
||||
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
#include <twl/mcu.h>
|
||||
#include <twl/cdc.h>
|
||||
#include <sysmenu.h>
|
||||
#include <sysmenu/ds.h>
|
||||
#include "reboot.h"
|
||||
|
||||
|
||||
@ -35,8 +36,6 @@
|
||||
#define COPY_NUM_MAX (4*3)
|
||||
#define POST_CLEAR_NUM_MAX (12 + 4*2)
|
||||
|
||||
#define SYSMi_ARM9_BOOT_CODE_BUF 0x023fee00
|
||||
|
||||
// extern data-------------------------------------------------------
|
||||
|
||||
// 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] =
|
||||
{
|
||||
HW_PARAM_RESERVED_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
||||
SYSM_OWN_ARM7_MMEM_ADDR_END, SYSMi_ARM9_BOOT_CODE_BUF,
|
||||
SYSMi_ARM9_BOOT_CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR,
|
||||
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
|
||||
OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR,
|
||||
SYSM_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED,
|
||||
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_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_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED,
|
||||
NULL,
|
||||
@ -81,14 +80,6 @@ BOOL BOOT_WaitStart( void )
|
||||
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
||||
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
|
||||
(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側のメモリ&レジスタクリア。
|
||||
reg_MI_MBK9 = 0; // 全WRAMのロック解除
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
#include <twl/camera.h>
|
||||
#include <twl/os/common/format_rom.h>
|
||||
#include <sysmenu.h>
|
||||
#include <sysmenu/ds.h>
|
||||
#include <firm/format/wram_regs.h>
|
||||
#include "reboot.h"
|
||||
|
||||
@ -147,6 +148,13 @@ void BOOT_Ready( void )
|
||||
}
|
||||
#endif // FIRM_USE_SDK_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
|
||||
|
||||
// USG以前のDSアプリには無線パッチを適用
|
||||
// (キャッシュ領域の排他制御簡略化のためARM9で行う)
|
||||
if ( ds )
|
||||
{
|
||||
DS_InsertWLPatch();
|
||||
}
|
||||
|
||||
// デバッガによるROMエミュレーション時はNTR-ROMヘッダバッファの
|
||||
// ゲームコマンドパラメータをスクランブルOFF設定に書き換える
|
||||
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 )SYSMi_SendPXICommand( SYSM_PXI_COMM_BL_BRIGHT, brightness );
|
||||
|
||||
LCFG_TSD_SetBacklightBrightness( brightness );
|
||||
|
||||
|
||||
@ -23,6 +23,7 @@ SUBDIRS = \
|
||||
# ../../../libraries_sysmenu/reloc_info \
|
||||
# ../../../libraries_sysmenu/boot \
|
||||
# ../../../libraries_sysmenu/mcu \
|
||||
# ../../../libraries_sysmenu/ds \
|
||||
# $(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側ライブラリでダイレクトに書き換わる側)
|
||||
OSLockWord lockCardRsc; // カードリソース排他制御用
|
||||
OSLockWord lockHotSW; // カードリソース排他制御用
|
||||
int cloneBootMode;
|
||||
u32 nCardID; // カードID
|
||||
u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする)
|
||||
u8 cloneBootMode;
|
||||
|
||||
LauncherParam launcherParam;
|
||||
ISD_RomEmuInfo romEmuInfo;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user