Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d82649c3c | ||
|
|
81dea35754 | ||
|
|
fdbe43421b | ||
|
|
0d71560785 | ||
|
|
108e8a0cd4 | ||
|
|
653e81c48e | ||
|
|
0dc0783094 | ||
|
|
13ef1bf6be | ||
|
|
7ea80353f6 |
@@ -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); }
|
||||||
|
|||||||
@@ -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); }
|
||||||
|
|||||||
Submodule haxloader/CakeBrah updated: b8bc4413d3...1efda4e894
Submodule haxloader/CakeHax updated: f3d05ec3e1...329212a8e0
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,8 @@ _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:"
|
||||||
bne endRedir
|
cmpne r12, #0x70 ; 'p', should include "patch:"
|
||||||
|
bne endRedir
|
||||||
sub sp, sp, #0x400
|
sub sp, sp, #0x400
|
||||||
pathRedir:
|
pathRedir:
|
||||||
stmfd sp!, {r0-r3}
|
stmfd sp!, {r0-r3}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, ®ionId, &languageId) ||
|
!loadTitleLocaleConfig(progId, ®ionId, &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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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); }
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user