Compare commits

...

9 Commits
v7.0 ... v7.0.1

Author SHA1 Message Date
TuxSH
6d82649c3c Update config.c 2017-04-17 12:24:58 +02:00
Aurora Wright
81dea35754 Minor stuff 2017-04-17 03:59:45 +02:00
Aurora Wright
fdbe43421b Fix diffs offsets 2017-04-17 02:31:04 +02:00
Aurora Wright
0d71560785 Minor stuff (2) 2017-04-17 02:18:34 +02:00
Aurora Wright
108e8a0cd4 Make loader search for patterns in just the appropriate code.bin segment, tentatively fix compatibility with Daigasso updates 2017-04-17 02:14:17 +02:00
Aurora Wright
653e81c48e Minor stuff 2017-04-17 01:01:03 +02:00
Aurora Wright
0dc0783094 Update submodules 2017-04-17 00:48:54 +02:00
Aurora
13ef1bf6be Merge pull request #408 from svanheulen/master
Use .text segment padding for LayeredFS payload
2017-04-17 00:40:20 +02:00
Seth VanHeulen
7ea80353f6 Use .text segment padding for LayeredFS payload 2017-04-16 17:59:20 -04:00
17 changed files with 81 additions and 59 deletions

View File

@@ -5,6 +5,7 @@ ENTRY(_start)
SECTIONS SECTIONS
{ {
. = 0; . = 0;
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); } .text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); } .rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
.data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); } .data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }

View File

@@ -5,6 +5,7 @@ ENTRY(_start)
SECTIONS SECTIONS
{ {
. = 0x01FF7FE0; . = 0x01FF7FE0;
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); } .text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); } .rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
.data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); } .data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }

View File

@@ -103,7 +103,7 @@ diff -uNr a/source/brahma.c b/source/brahma.c
diff -uNr a/source/main.c b/source/main.c diff -uNr a/source/main.c b/source/main.c
--- a/source/main.c 2016-09-26 16:05:36.363067000 +0200 --- a/source/main.c 2016-09-26 16:05:36.363067000 +0200
+++ b/source/main.c 2016-09-26 21:40:35.202513018 +0200 +++ b/source/main.c 2016-09-26 21:40:35.202513018 +0200
@@ -10,7 +10,7 @@ @@ -38,7 +38,7 @@
int main (void) { int main (void) {
if (brahma_init()) { if (brahma_init()) {
@@ -112,7 +112,7 @@ diff -uNr a/source/main.c b/source/main.c
goto error; goto error;
firm_reboot(); firm_reboot();
brahma_exit(); brahma_exit();
@@ -22,7 +22,7 @@ @@ -50,7 +50,7 @@
error: error:
gfxInitDefault(); gfxInitDefault();
consoleInit(GFX_BOTTOM, NULL); consoleInit(GFX_BOTTOM, NULL);

View File

@@ -1,8 +1,8 @@
diff -uNr a/source/main.c b/source/main.c diff -uNr a/source/main.c b/source/main.c
--- a/source/main.c 2016-09-11 01:04:25.665231884 +0200 --- a/source/main.c 2016-09-11 01:04:25.665231884 +0200
+++ b/source/main.c 2016-09-14 12:36:28.601439550 +0200 +++ b/source/main.c 2016-09-14 12:36:28.601439550 +0200
@@ -9,6 +9,7 @@ @@ -37,6 +37,7 @@
#endif }
int main (void) { int main (void) {
+ svcSleepThread(2500 * 1000000ULL); + svcSleepThread(2500 * 1000000ULL);

View File

@@ -1,11 +1,14 @@
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start) ENTRY(_start)
SECTIONS SECTIONS
{ {
. = 0x23F00000; . = 0x23F00000;
.text.start : { *(.text.start) }
.text : { *(.text) } .text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
.data : { *(.data) } .rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
.bss : { *(.bss COMMON) } .data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }
.rodata : { *(.rodata) }
. = ALIGN(4); . = ALIGN(4);
} }

View File

@@ -54,6 +54,7 @@ _start:
stmfd sp!, {r0-r12, lr} stmfd sp!, {r0-r12, lr}
ldrb r12, [r1] ldrb r12, [r1]
cmp r12, #0x72 ; 'r', should include "rom:" and "rom2:" cmp r12, #0x72 ; 'r', should include "rom:" and "rom2:"
cmpne r12, #0x70 ; 'p', should include "patch:"
bne endRedir bne endRedir
sub sp, sp, #0x400 sub sp, sp, #0x400
pathRedir: pathRedir:

View File

@@ -158,7 +158,7 @@ static Result load_code(u64 progid, prog_addrs_t *shared, u64 prog_handle, int i
u16 progver = g_exheader.codesetinfo.flags.remasterversion[0] | (g_exheader.codesetinfo.flags.remasterversion[1] << 8); u16 progver = g_exheader.codesetinfo.flags.remasterversion[0] | (g_exheader.codesetinfo.flags.remasterversion[1] << 8);
// patch // patch
patchCode(progid, progver, (u8 *)shared->text_addr, shared->total_size << 12); patchCode(progid, progver, (u8 *)shared->text_addr, shared->total_size << 12, g_exheader.codesetinfo.text.codesize, g_exheader.codesetinfo.ro.codesize);
return 0; return 0;
} }

View File

@@ -289,12 +289,9 @@ static u32 findFunctionStart(u8* code, u32 pos)
return 0xFFFFFFFF; return 0xFFFFFFFF;
} }
static bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *fsRegisterArchive, u32 *fsTryOpenFile, u32 *fsOpenFileDirectly, u32 *throwFatalError) static inline bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *fsRegisterArchive, u32 *fsTryOpenFile, u32 *fsOpenFileDirectly)
{ {
bool found = false; for(u32 addr = 0; addr <= size - 4; addr += 4)
u32 svcConnectToPort = 0xFFFFFFFF;
for(u32 addr = 0; !found && addr <= size - 4; addr += 4)
{ {
if(*fsMountArchive == 0xFFFFFFFF) if(*fsMountArchive == 0xFFFFFFFF)
{ {
@@ -321,13 +318,31 @@ static bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *f
if(*fsOpenFileDirectly == 0xFFFFFFFF && *(u32 *)(code + addr) == 0x08030204) if(*fsOpenFileDirectly == 0xFFFFFFFF && *(u32 *)(code + addr) == 0x08030204)
*fsOpenFileDirectly = findFunctionStart(code, addr); *fsOpenFileDirectly = findFunctionStart(code, addr);
if(addr >= 4 && svcConnectToPort == 0xFFFFFFFF && *(u32 *)(code + addr) == 0xEF00002D) if(*fsMountArchive != 0xFFFFFFFF && *fsRegisterArchive != 0xFFFFFFFF && *fsTryOpenFile != 0xFFFFFFFF && *fsOpenFileDirectly != 0xFFFFFFFF) return true;
svcConnectToPort = addr - 4;
if(svcConnectToPort != 0xFFFFFFFF && *fsMountArchive != 0xFFFFFFFF && *fsRegisterArchive != 0xFFFFFFFF && *fsTryOpenFile != 0xFFFFFFFF && *fsOpenFileDirectly != 0xFFFFFFFF) found = true;
} }
if(found) return false;
}
static inline bool findLayeredFsPayloadOffset(u8* code, u32 size, u32 *payloadOffset)
{
//First check for sufficient padding at the end of the .text segment
if(((size + 4095) & 0xfffff000) - size >= romfsredir_bin_size)
{
*payloadOffset = size;
return true;
}
//If there isn't enough padding look for the "throwFatalError" function to replace
u32 svcConnectToPort = 0xFFFFFFFF;
for(u32 addr = 4; svcConnectToPort == 0xFFFFFFFF && addr <= size - 4; addr += 4)
{
if(*(u32 *)(code + addr) == 0xEF00002D)
svcConnectToPort = addr - 4;
}
if(svcConnectToPort != 0xFFFFFFFF)
{ {
u32 func = 0xFFFFFFFF; u32 func = 0xFFFFFFFF;
@@ -341,9 +356,11 @@ static bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *f
if(*(u32 *)(code + pos) == 0xE200167E) func = 0xFFFFFFFF; if(*(u32 *)(code + pos) == 0xE200167E) func = 0xFFFFFFFF;
} }
*throwFatalError = func; if(func != 0xFFFFFFFF)
{
if(func != 0xFFFFFFFF) return true; *payloadOffset = func;
return true;
}
} }
return false; return false;
@@ -509,12 +526,13 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size)
fsRegisterArchive = 0xFFFFFFFF, fsRegisterArchive = 0xFFFFFFFF,
fsTryOpenFile = 0xFFFFFFFF, fsTryOpenFile = 0xFFFFFFFF,
fsOpenFileDirectly = 0xFFFFFFFF, fsOpenFileDirectly = 0xFFFFFFFF,
throwFatalError; payloadOffset;
if(!findLayeredFsSymbols(code, size, &fsMountArchive, &fsRegisterArchive, &fsTryOpenFile, &fsOpenFileDirectly, &throwFatalError)) return false; if(!findLayeredFsSymbols(code, size, &fsMountArchive, &fsRegisterArchive, &fsTryOpenFile, &fsOpenFileDirectly) ||
!findLayeredFsPayloadOffset(code, size, &payloadOffset)) return false;
//Setup the payload //Setup the payload
u8 *payload = code + throwFatalError; u8 *payload = code + payloadOffset;
memcpy(payload, romfsredir_bin, romfsredir_bin_size); memcpy(payload, romfsredir_bin, romfsredir_bin_size);
//Insert symbols in the payload //Insert symbols in the payload
@@ -527,13 +545,13 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size)
payload32[i] = *(u32 *)(code + fsOpenFileDirectly); payload32[i] = *(u32 *)(code + fsOpenFileDirectly);
break; break;
case 0xdead0001: case 0xdead0001:
payload32[i] = MAKE_BRANCH(throwFatalError + i * 4, fsOpenFileDirectly + 4); payload32[i] = MAKE_BRANCH(payloadOffset + i * 4, fsOpenFileDirectly + 4);
break; break;
case 0xdead0002: case 0xdead0002:
payload32[i] = *(u32 *)(code + fsTryOpenFile); payload32[i] = *(u32 *)(code + fsTryOpenFile);
break; break;
case 0xdead0003: case 0xdead0003:
payload32[i] = MAKE_BRANCH(throwFatalError + i * 4, fsTryOpenFile + 4); payload32[i] = MAKE_BRANCH(payloadOffset + i * 4, fsTryOpenFile + 4);
break; break;
case 0xdead0004: case 0xdead0004:
memcpy(payload32 + i, mount, 5); memcpy(payload32 + i, mount, 5);
@@ -555,13 +573,13 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size)
} }
//Place the hooks //Place the hooks
*(u32 *)(code + fsOpenFileDirectly) = MAKE_BRANCH(fsOpenFileDirectly, throwFatalError); *(u32 *)(code + fsOpenFileDirectly) = MAKE_BRANCH(fsOpenFileDirectly, payloadOffset);
*(u32 *)(code + fsTryOpenFile) = MAKE_BRANCH(fsTryOpenFile, throwFatalError + 12); *(u32 *)(code + fsTryOpenFile) = MAKE_BRANCH(fsTryOpenFile, payloadOffset + 12);
return true; return true;
} }
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size) void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 roSize)
{ {
loadCFWInfo(); loadCFWInfo();
@@ -582,7 +600,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
}; };
//Patch SMDH region checks //Patch SMDH region checks
if(!patchMemory(code, size, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), -31, sizeof(pattern), -31,
patch, patch,
@@ -598,7 +616,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
u8 mostRecentFpdVer = 10; u8 mostRecentFpdVer = 10;
u8 *off = memsearch(code, pattern, size, sizeof(pattern)); u8 *off = memsearch(code, pattern, textSize, sizeof(pattern));
if(off == NULL) goto error; if(off == NULL) goto error;
@@ -649,7 +667,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
} }
//Patch Ver. string //Patch Ver. string
if(!patchMemory(code, size, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern) - 2, 0, sizeof(pattern) - 2, 0,
patch, patch,
@@ -669,7 +687,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
}; };
//Disable updates from foreign carts (makes carts region-free) //Disable updates from foreign carts (makes carts region-free)
u32 ret = patchMemory(code, size, u32 ret = patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), 0, sizeof(pattern), 0,
patch, patch,
@@ -689,7 +707,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
0x0C, 0x00, 0x94, 0x15 0x0C, 0x00, 0x94, 0x15
}; };
u32 *off = (u32 *)memsearch(code, pattern, size, sizeof(pattern)); u32 *off = (u32 *)memsearch(code, pattern, textSize, sizeof(pattern));
if(off == NULL) goto error; if(off == NULL) goto error;
@@ -712,7 +730,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
}; };
//Disable SecureInfo signature check //Disable SecureInfo signature check
if(!patchMemory(code, size, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), 0, sizeof(pattern), 0,
patch, patch,
@@ -725,7 +743,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
patch[] = u"C"; patch[] = u"C";
//Use SecureInfo_C //Use SecureInfo_C
if(patchMemory(code, size, if(patchMemory(code + textSize, roSize,
pattern, pattern,
sizeof(pattern) - 2, 22, sizeof(pattern) - 2, 22,
patch, patch,
@@ -750,19 +768,19 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
}; };
//Disable CRR0 signature (RSA2048 with SHA256) check and CRO0/CRR0 SHA256 hash checks (section hashes, and hash table) //Disable CRR0 signature (RSA2048 with SHA256) check and CRO0/CRR0 SHA256 hash checks (section hashes, and hash table)
if(!patchMemory(code, size, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), -9, sizeof(pattern), -9,
patch, patch,
sizeof(patch), 1 sizeof(patch), 1
) || ) ||
!patchMemory(code, size, !patchMemory(code, textSize,
pattern2, pattern2,
sizeof(pattern2), 1, sizeof(pattern2), 1,
patch, patch,
sizeof(patch), 1 sizeof(patch), 1
) || ) ||
!patchMemory(code, size, !patchMemory(code, textSize,
pattern3, pattern3,
sizeof(pattern3), -2, sizeof(pattern3), -2,
patch, patch,
@@ -783,13 +801,13 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
}; };
//Patch UNITINFO checks to make ErrDisp more verbose //Patch UNITINFO checks to make ErrDisp more verbose
if(!patchMemory(code, size, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), -1, sizeof(pattern), -1,
patch, patch,
sizeof(patch), 1 sizeof(patch), 1
) || ) ||
patchMemory(code, size, patchMemory(code, textSize,
pattern2, pattern2,
sizeof(pattern2), 0, sizeof(pattern2), 0,
patch, patch,
@@ -807,7 +825,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
}; };
//Patch DLP region checks //Patch DLP region checks
if(!patchMemory(code, size, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), 0, sizeof(pattern), 0,
patch, patch,
@@ -823,17 +841,17 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size)
if(!loadTitleCodeSection(progId, code, size) || if(!loadTitleCodeSection(progId, code, size) ||
!applyCodeIpsPatch(progId, code, size) || !applyCodeIpsPatch(progId, code, size) ||
!loadTitleLocaleConfig(progId, &regionId, &languageId) || !loadTitleLocaleConfig(progId, &regionId, &languageId) ||
!patchLayeredFs(progId, code, size)) goto error; !patchLayeredFs(progId, code, textSize)) goto error;
if(regionId != 0xFF) if(regionId != 0xFF)
{ {
u32 CFGUHandleOffset; u32 CFGUHandleOffset;
u8 *CFGU_GetConfigInfoBlk2_endPos = getCfgOffsets(code, size, &CFGUHandleOffset); u8 *CFGU_GetConfigInfoBlk2_endPos = getCfgOffsets(code, textSize, &CFGUHandleOffset);
if(CFGU_GetConfigInfoBlk2_endPos == NULL || if(CFGU_GetConfigInfoBlk2_endPos == NULL ||
!patchCfgGetLanguage(code, size, languageId, CFGU_GetConfigInfoBlk2_endPos)) goto error; !patchCfgGetLanguage(code, textSize, languageId, CFGU_GetConfigInfoBlk2_endPos)) goto error;
patchCfgGetRegion(code, size, regionId, CFGUHandleOffset); patchCfgGetRegion(code, textSize, regionId, CFGUHandleOffset);
} }
} }

View File

@@ -44,4 +44,4 @@ enum flags
ISSAFEMODE ISSAFEMODE
}; };
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size); void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 roSize);

View File

@@ -9,7 +9,6 @@ SECTIONS
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); } .text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); } .rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
.data : ALIGN(4) { *(.data*); . = ALIGN(4); } .data : ALIGN(4) { *(.data*); . = ALIGN(4); }
.bss : ALIGN(8) { __bss_start = .; *(.bss* COMMON); . = ALIGN(8); __bss_end = .; } .bss : ALIGN(8) { __bss_start = .; *(.bss* COMMON); . = ALIGN(8); __bss_end = .; }
. = ALIGN(4); . = ALIGN(4);

View File

@@ -5,6 +5,7 @@ ENTRY(_start)
SECTIONS SECTIONS
{ {
. = 0x24FFFE00; . = 0x24FFFE00;
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); } .text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); } .rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
.data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); } .data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }

View File

@@ -182,11 +182,11 @@ void configMenu(bool isSdMode, bool oldPinStatus, u32 oldPinMode)
"The service and archive patches\n" "The service and archive patches\n"
"don't work on New 3DS FIRMs between\n" "don't work on New 3DS FIRMs between\n"
"9.3 and 10.4.\n\n" "9.3 and 10.4.\n\n"
"Only change this if you know what you\n" "Only select this if you know what you\n"
"are doing!", "are doing!",
"Make the console be always detected\n" "Make the console be always detected\n"
"as a development unit\n" "as a development unit, and conversely.\n"
"(which breaks online features, amiibo\n" "(which breaks online features, amiibo\n"
"and retail CIAs, but allows installing\n" "and retail CIAs, but allows installing\n"
"and booting some developer software).\n\n" "and booting some developer software).\n\n"

View File

@@ -47,9 +47,6 @@ static const u32 brightness[4] = {0x5F, 0x4C, 0x39, 0x26};
void __attribute__((naked)) arm11Stub(void) void __attribute__((naked)) arm11Stub(void)
{ {
//Disable interrupts
__asm(".word 0xF10C01C0");
WAIT_FOR_ARM9(); WAIT_FOR_ARM9();
} }

View File

@@ -33,7 +33,7 @@
#define ARESCREENSINITIALIZED (PDN_GPU_CNT != 1) #define ARESCREENSINITIALIZED (PDN_GPU_CNT != 1)
#define ARM11_STUB_ADDRESS 0x1FFFFD00 #define ARM11_STUB_ADDRESS 0x1FFFFF00
#define WAIT_FOR_ARM9() *arm11Entry = 0; while(!*arm11Entry); ((void (*)())*arm11Entry)(); #define WAIT_FOR_ARM9() *arm11Entry = 0; while(!*arm11Entry); ((void (*)())*arm11Entry)();
#define SCREEN_TOP_WIDTH 400 #define SCREEN_TOP_WIDTH 400

View File

@@ -91,6 +91,7 @@ start:
mov r1, #0x340 mov r1, #0x340
str r1, [r0] str r1, [r0]
@ Clear BSS
ldr r0, =__bss_start ldr r0, =__bss_start
mov r1, #0 mov r1, #0
ldr r2, =__bss_end ldr r2, =__bss_end