From 98bb2fe9cd3b201d20cecdc6d3406fdd3a60b6b3 Mon Sep 17 00:00:00 2001 From: yutaka Date: Fri, 25 Jul 2008 04:38:01 +0000 Subject: [PATCH] =?UTF-8?q?CRYPTO=E7=94=A8=E3=83=92=E3=83=BC=E3=83=97?= =?UTF-8?q?=E3=81=AE=E7=A2=BA=E4=BF=9D(SVN=E3=83=92=E3=83=BC=E3=83=97?= =?UTF-8?q?=E3=81=A8=E5=85=B1=E6=9C=89)=20ARM9=E3=81=8CWRAM-B=E3=81=AE1?= =?UTF-8?q?=E3=82=B9=E3=83=AD=E3=83=83=E3=83=88=E3=82=92=E3=81=8C=E3=82=81?= =?UTF-8?q?=E3=82=8B=E6=A7=98=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1994 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/nandfirm/menu-launcher/ARM9/main.c | 32 +++++++++++++++--- .../menu-launcher/wram_regs/wram_regs.c | 9 ++++- docs/メモリマップ_NANDファーム.vsd | Bin 77824 -> 78336 bytes include/firm/hw/common/mmap_firm.h | 2 +- .../firm/specfiles/ARM9-TS-FIRM.lcf.template | 2 +- include/firm/specfiles/ARM9-TS-FIRM.lsf | 3 +- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/build/nandfirm/menu-launcher/ARM9/main.c b/build/nandfirm/menu-launcher/ARM9/main.c index c32fe40b..0364fc01 100644 --- a/build/nandfirm/menu-launcher/ARM9/main.c +++ b/build/nandfirm/menu-launcher/ARM9/main.c @@ -35,9 +35,13 @@ static const u8 rsa_key_launcher[128] = }; #endif -#define RSA_HEAP_SIZE (4*1024) // RSApq[vTCY (TCYKv) +#define RSA_HEAP_SIZE (4*1024) // RSApq[vTCY +#define CRYPTO_HEAP_SIZE (12*1024) // CRYPTOpq[vTCY + +#define HEAP_SIZE (RSA_HEAP_SIZE > CRYPTO_HEAP_SIZE ? RSA_HEAP_SIZE : CRYPTO_HEAP_SIZE) + +static u8 heap[HEAP_SIZE] ATTRIBUTE_ALIGN(32); -static u8 acHeap[RSA_HEAP_SIZE] __attribute__ ((aligned (32))); static SVCSignHeapContext acPool; #define MENU_TITLE_ID_HI 0x00030017ULL @@ -110,14 +114,12 @@ static void PreInit(void) ***************************************************************/ static void PostInit(void) { - // A[iݒ + // FSpA[iݒ { static u32 arena[ 0x400 / sizeof(u32) ]; OS_SetMainArenaLo( arena ); OS_SetMainArenaHi( &arena[ 0x400 / sizeof(u32) ] ); } - // RSApq[vݒ - SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) ); // FS/FATFS FS_InitFIRM(); } @@ -135,6 +137,18 @@ static BOOL TryResolveSrl(void) MENU_TITLE_ID }; int num; + + // CRYPTOpq[vݒ (ESCugȂ͂) + void* lo = OS_InitAlloc( OS_ARENA_MAIN, heap, heap + CRYPTO_HEAP_SIZE, 1); + void* hi = heap + CRYPTO_HEAP_SIZE; + OSHeapHandle hh = OS_CreateHeap( OS_ARENA_MAIN, lo, hi ); + if ( hh < 0 ) + { + OS_TPrintf("Failed to allocate heap.\n"); + return FALSE; + } + OS_SetCurrentHeap( OS_ARENA_MAIN, hh ); + if ( !LCFG_ReadHWSecureInfo() ) { OS_TPrintf("Failed to load HWSecureInfo.\n"); @@ -151,6 +165,9 @@ static BOOL TryResolveSrl(void) return FALSE; } OS_TPrintf("Launcher Title ID: 0x%016llx\n", titleIdList[num]); + + OS_DestroyHeap( OS_ARENA_MAIN, hh ); + return TRUE; } @@ -283,6 +300,11 @@ void TwlMain( void ) // 6: after PXI PUSH_PROFILE(); + /* ES (CRYPTO) Cu͂܂ */ + /* SVN_RSA ͂*/ + // RSApq[vݒ + SVC_InitSignHeap( &acPool, heap, RSA_HEAP_SIZE ); + if ( !FS_LoadHeader( &acPool, NULL, NULL, RSA_KEY_ADDR ) || !CheckHeader() ) { OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n"); diff --git a/build/nandfirm/menu-launcher/wram_regs/wram_regs.c b/build/nandfirm/menu-launcher/wram_regs/wram_regs.c index 2454b302..7e727571 100644 --- a/build/nandfirm/menu-launcher/wram_regs/wram_regs.c +++ b/build/nandfirm/menu-launcher/wram_regs/wram_regs.c @@ -34,7 +34,8 @@ MIHeader_WramRegs wram_regs_init = REG_MI_MBK_B4_FIELD( 1, MI_WRAM_BC_OFFSET_128KB, MI_WRAM_ARM7 ), REG_MI_MBK_B5_FIELD( 1, MI_WRAM_BC_OFFSET_160KB, MI_WRAM_ARM7 ), REG_MI_MBK_B6_FIELD( 1, MI_WRAM_BC_OFFSET_192KB, MI_WRAM_ARM7 ), - REG_MI_MBK_B7_FIELD( 1, MI_WRAM_BC_OFFSET_224KB, MI_WRAM_ARM7 ), +// REG_MI_MBK_B7_FIELD( 1, MI_WRAM_BC_OFFSET_224KB, MI_WRAM_ARM7 ), + REG_MI_MBK_B7_FIELD( 1, MI_WRAM_BC_OFFSET_224KB, MI_WRAM_ARM9 ), }, { REG_MI_MBK_C0_FIELD( 1, MI_WRAM_BC_OFFSET_0KB , MI_WRAM_ARM7 ), @@ -50,10 +51,16 @@ MIHeader_WramRegs wram_regs_init = MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 6, A, SADDR, HW_WRAM_AREA_HALF - HW_WRAM_A_SIZE ) ), +/* REG_MI_MBK7_FIELD( REG_WRAM_MAP_CONV_ADDR( 7, B, EADDR, HW_WRAM_AREA + HW_WRAM_B_SIZE ), MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 7, B, SADDR, HW_WRAM_AREA ) ), +*/ + REG_MI_MBK7_FIELD( REG_WRAM_MAP_CONV_ADDR( 7, B, EADDR, HW_WRAM_AREA_HALF - HW_WRAM_A_SIZE ), // joint to WRAM-A + MI_WRAM_IMAGE_256KB, + REG_WRAM_MAP_CONV_ADDR( 7, B, SADDR, HW_WRAM_AREA ) + ), REG_MI_MBK8_FIELD( REG_WRAM_MAP_CONV_ADDR( 8, C, EADDR, MI_WRAM_MAP_NULL ), MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 8, C, SADDR, MI_WRAM_MAP_NULL ) diff --git a/docs/メモリマップ_NANDファーム.vsd b/docs/メモリマップ_NANDファーム.vsd index cb0901b7d0cf0c307fdeb4fb4e3bafe9bfcc52a4..e70e9783da1648d7688cad751f0a81627b3529e6 100644 GIT binary patch delta 20972 zcmZ5|2Uyff_x@yAIvSRy6kV2%idnjP)hu0_p)KIG1QhJLfMVBx3U*fnQLpHtV)wdW z_v$sEpkj-tSgvBIimti~iWSIzR==O$cmK}=$;>-5CzE96%$)O{Y)&ITrYJX6fez|wTsRoDJ~a|G;p> ){(o#+qAt>98zYC>n+#bYXGG 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 delta 20251 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 UH+TW{!)zsmA(H_S|C10Ahhk~aUH||9 diff --git a/include/firm/hw/common/mmap_firm.h b/include/firm/hw/common/mmap_firm.h index a6f27035..37553ee0 100644 --- a/include/firm/hw/common/mmap_firm.h +++ b/include/firm/hw/common/mmap_firm.h @@ -29,7 +29,7 @@ extern "C" { //------------------------------------- *_LoadBuffer #define HW_FIRM_LOAD_BUFFER_BASE MI_GetWramMapStart_B() #define HW_FIRM_LOAD_BUFFER_UNIT_SIZE 0x8000 -#define HW_FIRM_LOAD_BUFFER_UNIT_NUMS 8 +#define HW_FIRM_LOAD_BUFFER_UNIT_NUMS 7 #define HW_FIRM_LOAD_BUFFER_SIZE (HW_FIRM_LOAD_BUFFER_UNIT_SIZE * HW_FIRM_LOAD_BUFFER_UNIT_NUMS) #define HW_FIRM_LOAD_BUFFER_END (HW_FIRM_LOAD_BUFFER_BASE + HW_FIRM_LOAD_BUFFER_SIZE) diff --git a/include/firm/specfiles/ARM9-TS-FIRM.lcf.template b/include/firm/specfiles/ARM9-TS-FIRM.lcf.template index 7390057e..10871507 100644 --- a/include/firm/specfiles/ARM9-TS-FIRM.lcf.template +++ b/include/firm/specfiles/ARM9-TS-FIRM.lcf.template @@ -38,7 +38,7 @@ MEMORY check.ITCM (RW) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check check.DTCM (RW) : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check - check.WORKRAM (RWX) : ORIGIN = 0x037c0000, LENGTH = 0x40000 > workram.check + check.WORKRAM (RWX) : ORIGIN = 0x037b8000, LENGTH = 0x48000 > workram.check binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > diff --git a/include/firm/specfiles/ARM9-TS-FIRM.lsf b/include/firm/specfiles/ARM9-TS-FIRM.lsf index c9fa3d5b..ace7c786 100644 --- a/include/firm/specfiles/ARM9-TS-FIRM.lsf +++ b/include/firm/specfiles/ARM9-TS-FIRM.lsf @@ -20,7 +20,8 @@ Static $(TARGET_NAME) { - Address 0x037c0000 +# Address 0x037c0000 + Address 0x037b8000 Object $(OBJS_STATIC) Library $(LLIBS) $(GLIBS) $(CW_LIBS) Object * (.itcm)