見つけ出したいコードが数種類あった場合の対応

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20101202_Majikon_Patch@2983 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2010-12-27 07:08:51 +00:00
parent b28cf8db86
commit 0391ae6145
3 changed files with 189 additions and 131 deletions

View File

@ -29,7 +29,8 @@ override TWL_CODEGEN = ALL
SRCDIR = ./src
INCDIR = ../common/include \
INCDIR = ./include \
../common/include \
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include \
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include/twl/fatfs/ARM7 \

View File

@ -0,0 +1,117 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - HOTSW - include
File: romSpec.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 __BOOT_TARGET_CODE_H__
#define __BOOT_TARGET_CODE_H__
#include <twl.h>
#define MAJIKON_APP_ARM7_STATIC_BUFFER 0x02380000
#define MAJIKON_APP_ARM7_STATIC_BUFFER_SIZE 0x40000
#define MAJIKON_PATCH_ADDR 0x02fff800
#define MAJIKON_APP_TARGET_COMMAND 0xE12FFF1E // [bx lr] –½—ß
#define TARGET_CODE_NUM 4
#define TARGET_CODE_MAX_SIZE 0x100
#ifdef __cplusplus
extern "C" {
#endif
u32 target_code_list[TARGET_CODE_NUM][TARGET_CODE_MAX_SIZE] =
{
{
0xE92D40F8, 0xE59F00E4, 0xE5900004, 0xE3500000,
0x1A000034, 0xEBFFD80C, 0xE3500001, 0x1A000031,
0xE59F10CC, 0xE3E00000, 0xE5913004, 0xE1530000,
0x059F00C0, 0x05900000, 0x0280000A, 0x05810004,
0x0A000028, 0xE59F20AC, 0xE5920000, 0xE1500003,
0x3A000024, 0xE5920000, 0xE280000A, 0xE5810004,
0xEBFFFFA6, 0xE3500000, 0x0A00000A, 0xE59F007C,
0xE3A01001, 0xE5801004, 0xEBFFFBBE, 0xE590000C,
0xE3500000, 0x1A000003, 0xE59F0064, 0xE5900000,
0xE3500000, 0x1A000013, 0xE59F0050, 0xE59F1050,
0xE5900004, 0xE3A02000, 0xE5812000, 0xE3500000,
0x0A00000C, 0xE3A07064, 0xE3A0600E, 0xE3A05011,
0xE1A04002, 0xEA000001, 0xE1A00007, 0xEBFFCB91,
0xE1A00006, 0xE1A01005, 0xE1A02004, 0xEBFFDAA2,
0xE3500000, 0x1AFFFFF7, 0xE8BD40F8, 0x00000001,
},
{
0xE92D40F8, 0xE59F00E4, 0xE5900004, 0xE3500000,
0x1A000034, 0xEBFFD80C, 0xE3500001, 0x1A000031,
0xE59F10CC, 0xE3E00000, 0xE5913004, 0xE1530000,
0x059F00C0, 0x05900000, 0x0280000A, 0x05810004,
0x0A000028, 0xE59F20AC, 0xE5920000, 0xE1500003,
0x3A000024, 0xE5920000, 0xE280000A, 0xE5810004,
0xEBFFFFA6, 0xE3500000, 0x0A00000A, 0xE59F007C,
0xE3A01001, 0xE5801004, 0xEBFFFBBE, 0xE590000C,
0xE3500000, 0x1A000003, 0xE59F0064, 0xE5900000,
0xE3500000, 0x1A000013, 0xE59F0050, 0xE59F1050,
0xE5900004, 0xE3A02000, 0xE5812000, 0xE3500000,
0x0A00000C, 0xE3A07064, 0xE3A0600E, 0xE3A05011,
0xE1A04002, 0xEA000001, 0xE1A00007, 0xEBFFCB91,
0xE1A00006, 0xE1A01005, 0xE1A02004, 0xEBFFDAA2,
0xE3500000, /*0x1AFFFFF7,*/ 0xE8BD40F8, 0xE12FFF1E,
0x00000001,
},
{
0xE92D40F8, 0xE59F00E4, 0xE5900004, 0xE3500000,
0x1A000034, 0xEBFFD80C, 0xE3500001, 0x1A000031,
0xE59F10CC, 0xE3E00000, 0xE5913004, 0xE1530000,
0x059F00C0, 0x05900000, 0x0280000A, 0x05810004,
0x0A000028, 0xE59F20AC, 0xE5920000, 0xE1500003,
0x3A000024, 0xE5920000, 0xE280000A, 0xE5810004,
0xEBFFFFA6, 0xE3500000, 0x0A00000A, 0xE59F007C,
0xE3A01001, 0xE5801004, 0xEBFFFBBE, 0xE590000C,
0xE3500000, 0x1A000003, 0xE59F0064, 0xE5900000,
0xE3500000, 0x1A000013, 0xE59F0050, 0xE59F1050,
0xE5900004, 0xE3A02000, 0xE5812000, 0xE3500000,
0x0A00000C, 0xE3A07064, 0xE3A0600E, 0xE3A05011,
0xE1A04002, 0xEA000001, 0xE1A00007, 0xEBFFCB91,
0xE1A00006, 0xE1A01005, 0xE1A02004, 0xEBFFDAA2,
0xE3500000, 0x1AFFFFF7, 0xE8BD40F8, 0xE12FFF1E,
0x03803F60, 0x037E9D34,
},
{
0xE92D40F8, 0xE59F00E4, 0xE5900004, 0xE3500000,
0x1A000034, 0xEBFFD80C, 0xE3500001, 0x1A000031,
0xE59F10CC, 0xE3E00000, 0xE5913004, 0xE1530000,
0x059F00C0, 0x05900000, 0x0280000A, 0x05810004,
0x0A000028, 0xE59F20AC, 0xE5920000, 0xE1500003,
0x3A000024, 0xE5920000, 0xE280000A, 0xE5810004,
0xEBFFFFA6, 0xE3500000, 0x0A00000A, 0xE59F007C,
0xE3A01001, 0xE5801004, 0xEBFFFBBE, 0xE590000C,
0xE3500000, 0x1A000003, 0xE59F0064, 0xE5900000,
0xE3500000, 0x1A000013, 0xE59F0050, 0xE59F1050,
0xE5900004, 0xE3A02000, 0xE5812000, 0xE3500000,
0x0A00000C, 0xE3A07064, 0xE3A0600E, 0xE3A05011,
0xE1A04002, 0xEA000001, 0xE1A00007, 0xEBFFCB91,
0xE1A00006, 0xE1A01005, 0xE1A02004, 0xEBFFDAA2,
0xE3500000, 0x1AFFFFF7, 0xE8BD40F8, 0xE12FFF1E,
0x03803F60, 0x00000001,
},
};
#ifdef __cplusplus
} /* extern "C" */
#endif
/* __BOOT_TARGET_CODE_H__ */
#endif

View File

@ -31,6 +31,7 @@
#include "reboot.h"
#include "internal_api.h"
#include "../../../hotsw/ARM7/include/hotswTypes.h"
#include "targetCode.h"
#include <twl/mcu/ARM7/control.h>
@ -131,152 +132,91 @@ void BOOT_Init( void )
// reg_PXI_MAINPINTF = 0x0000;
}
#define MAJIKON_PATCH_ADDR 0x02fff800
/*
void MYFUNC_MajikonPatche(void)
{
int r, i;
// OSIntrMode itrm = OS_DisableInterrupts(); // asm
for (r = 0; r < 8; r++)
{
// I2Ci_SendStart( id )
{
while (reg_OS_I2C_CNT & REG_OS_I2C_CNT_E_MASK){};
reg_OS_I2C_DAT = 0x4a;
reg_OS_I2C_CNT = 0xc2;
while (reg_OS_I2C_CNT & REG_OS_I2C_CNT_E_MASK){};
if (!(BOOL)((reg_OS_I2C_CNT & REG_OS_I2C_CNT_ACK_MASK) >> REG_OS_I2C_CNT_ACK_SHIFT))
{
continue;
}
}
// I2Ci_SendMiddle( reg )
{
while (reg_OS_I2C_CNT & REG_OS_I2C_CNT_E_MASK){};
i = 0;
while( i++ < 0x150 )
{
u32 dummy = reg_OS_I2C_CNT;
}
reg_OS_I2C_DAT = MCU_REG_CAMERA_ADDR; // MCU_REG_LED_TEST_ADDR = 0x63; // “dŒ¹<C592>Ôƒ‰ƒ“ƒv
reg_OS_I2C_CNT = 0xc0;
while (reg_OS_I2C_CNT & REG_OS_I2C_CNT_E_MASK){};
if (!(BOOL)((reg_OS_I2C_CNT & REG_OS_I2C_CNT_ACK_MASK) >> REG_OS_I2C_CNT_ACK_SHIFT))
{
continue;
}
}
// I2Ci_SendLast( data )
{
while (reg_OS_I2C_CNT & REG_OS_I2C_CNT_E_MASK){};
i = 0;
while( i++ < 0x150 )
{
u32 dummy = reg_OS_I2C_CNT;
}
reg_OS_I2C_DAT = 0x01;
reg_OS_I2C_CNT = 0xc0;
while (reg_OS_I2C_CNT & REG_OS_I2C_CNT_E_MASK){};
i = 0;
while( i++ < 0x150 )
{
u32 dummy = reg_OS_I2C_CNT;
}
reg_OS_I2C_CNT = 0xc5;
while (reg_OS_I2C_CNT & REG_OS_I2C_CNT_E_MASK){};
if (!(BOOL)((reg_OS_I2C_CNT & REG_OS_I2C_CNT_ACK_MASK) >> REG_OS_I2C_CNT_ACK_SHIFT))
{
continue;
}
else
{
break;
}
}
reg_OS_I2C_CNT = 0xc5;
}
// (void)OS_RestoreInterrupts(itrm); // asm
}
*/
#define MAJIKON_APP_ARM7_STATIC_BUFFER 0x02380000
#define MAJIKON_APP_ARM7_STATIC_BUFFER_SIZE 0x40000
static u32 target_code[] =
{
0xE3A0C301, 0xE58CC208, 0xEB000069, 0xE59F3144,
0xE2432040, 0xE59F1140, 0xE1520003, 0xB4910004,
0xB4820004, 0xBAFFFFFB, 0xE59F1130, 0xE59F2130,
0xE2823028, 0xE4910004, 0xE4820004, 0xE1520003,
0xBAFFFFFB, 0xE59F011C, 0xE59F111C, 0xE59F2110,
0xE1A0E00F, 0xE12FFF12, 0xE3A00013, 0xE121F000,
0xE59FD108, 0xE3A00012, 0xE121F000, 0xE59FD100,
0xE59F1100, 0xE04D1001, 0xE24DD004, 0xE3A0001F,
0xE12FF000, 0xE241D004, 0xE59F00EC, 0xE0411000,
0xE59F20DC, 0xE3A00000, 0xE1510002, 0xB4810004,
0xBAFFFFFC, 0xE59F00D4, 0xE5901000, 0xE3510000,
0x059F10CC, 0x05801000, 0xEB000075, 0xE3A01000,
0xE59F30C0, 0xE593000C, 0xE5932010, 0xE0522000,
0xCB0000A8, 0xEB000043, 0xE59F10AC, 0xE3A00000,
0xE3800C03, 0xE1C100B0, 0xE3A00000, 0xE3800C03,
0xE1C100B2, 0xE59F1094, 0xE59F0094, 0xE5810000,
0xE59F1090, 0xE24D2028, 0xE1A0300D, 0xE1520003,
0xB4910004, 0xB4820004, 0xBAFFFFFB, 0xE59F0078,
0xE3C00003, 0xE59F1074, 0xE0411000, 0xE2811003,
0xE3C11003, 0xE3C114FF, 0xE3A02004, 0xE1A02C02,
0xE1811002, 0xE59F2058, 0xE59F3058, 0xE59FE058,
0xE24DC028
};
static u32 SearchBinary_Majikon( void )
{
u32 code_end_address = 0;
u32 search_size = MAJIKON_APP_ARM7_STATIC_BUFFER_SIZE;
u32 current = MAJIKON_APP_ARM7_STATIC_BUFFER;
u32 *codep = target_code;
u32 hit = 0;
u32 elem = sizeof(target_code)/sizeof(u32);
u32 target_command_address = 0;
u32 elem[TARGET_CODE_NUM];
u32 i;
OS_TPrintf("=====================================\n");
while( search_size >= sizeof(target_code) || hit )
for( i = 0; i < TARGET_CODE_NUM; i++ )
{
if( *(u32 *)current == *codep )
u32 count = 0;
while( target_code_list[i][count] != 0x0 )
{
codep++;
hit++;
if( hit == elem )
count++;
}
elem[i] = count * 4;
OS_TPrintf("code %d size is 0x%x (%d)\n", i, elem[i], elem[i]);
}
for( i = 0; i < TARGET_CODE_NUM; i++ )
{
u32 search_size = MAJIKON_APP_ARM7_STATIC_BUFFER_SIZE;
u32 current = MAJIKON_APP_ARM7_STATIC_BUFFER;
u32 *codep = target_code_list[i];
u32 hit = 0;
BOOL isFinish = FALSE;
OS_TPrintf("\n-----\n");
OS_TPrintf("search code %d start\n", i);
while( search_size >= elem[i] || hit )
{
if( *(u32 *)current != *codep )
{
OS_TPrintf("\n*** Target Code Find!!\n");
code_end_address = current;
current += sizeof(u32);
search_size -= sizeof(u32);
continue;
}
while( *(u32 *)current == *codep )
{
hit += 4;
if( *(u32 *)current == MAJIKON_APP_TARGET_COMMAND )
{
OS_TPrintf("*** Target Command Find!!\n");
target_command_address = current;
}
if( hit == elem[i] )
{
isFinish = TRUE;
break;
}
codep++;
current += sizeof(u32);
search_size -= sizeof(u32);
}
if( isFinish )
{
OS_TPrintf("*** Target Code Find!!\n");
break;
}
target_command_address = 0;
hit = 0;
codep = target_code_list[i];
}
if( isFinish )
{
OS_TPrintf("Match!!\n");
break;
}
else
{
hit = 0;
codep = target_code;
OS_TPrintf("No Match...\n");
}
current += sizeof(u32);;
search_size -= sizeof(u32);
}
OS_TPrintf("\ntarget address : 0x%08x\n", code_end_address);
OS_TPrintf("\ntarget address : 0x%08x\n", target_command_address);
OS_TPrintf("=====================================\n");
return code_end_address;
return (target_command_address - sizeof(u32)); // 埋め込むコードは2命令あるので、1つ前のアドレスを返す
}