Skip to content

Commit 653e81c

Browse files
committed
Minor stuff
1 parent 0dc0783 commit 653e81c

File tree

8 files changed

+40
-31
lines changed

8 files changed

+40
-31
lines changed

exceptions/arm11/linker.ld

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ ENTRY(_start)
55
SECTIONS
66
{
77
. = 0;
8+
89
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
910
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
1011
.data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }

exceptions/arm9/linker.ld

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ ENTRY(_start)
55
SECTIONS
66
{
77
. = 0x01FF7FE0;
8+
89
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
910
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
1011
.data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }

haxloader/linker.ld

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
2+
OUTPUT_ARCH(arm)
3+
14
ENTRY(_start)
25
SECTIONS
36
{
47
. = 0x23F00000;
5-
.text.start : { *(.text.start) }
6-
.text : { *(.text) }
7-
.data : { *(.data) }
8-
.bss : { *(.bss COMMON) }
9-
.rodata : { *(.rodata) }
8+
9+
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
10+
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
11+
.data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }
12+
1013
. = ALIGN(4);
1114
}

injector/patches/romfsredir.s

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ _start:
5454
stmfd sp!, {r0-r12, lr}
5555
ldrb r12, [r1]
5656
cmp r12, #0x72 ; 'r', should include "rom:" and "rom2:"
57-
bne endRedir
57+
cmpne r12, #0x70 ; 'p', should include "patch:"
58+
bne endRedir
5859
sub sp, sp, #0x400
5960
pathRedir:
6061
stmfd sp!, {r0-r3}

injector/source/patcher.c

+26-23
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ static u32 findFunctionStart(u8* code, u32 pos)
289289
return 0xFFFFFFFF;
290290
}
291291

292-
static bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *fsRegisterArchive, u32 *fsTryOpenFile, u32 *fsOpenFileDirectly)
292+
static inline bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *fsRegisterArchive, u32 *fsTryOpenFile, u32 *fsOpenFileDirectly)
293293
{
294294
for(u32 addr = 0; addr <= size - 4; addr += 4)
295295
{
@@ -324,17 +324,19 @@ static bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *f
324324
return false;
325325
}
326326

327-
static bool findLayeredFsPayloadOffset(u8* code, u32 text_size, u32* payload_offset) {
328-
// First check for sufficient padding at the end of the .text segment
329-
if (((text_size + 4095) & 0xfffff000) - text_size >= romfsredir_bin_size) {
330-
*payload_offset = text_size;
327+
static inline bool findLayeredFsPayloadOffset(u8* code, u32 textSize, u32 *payloadOffset)
328+
{
329+
//First check for sufficient padding at the end of the .text segment
330+
if(((textSize + 4095) & 0xfffff000) - textSize >= romfsredir_bin_size)
331+
{
332+
*payloadOffset = textSize;
331333
return true;
332334
}
333335

334-
// If there isn't enough padding look for the "throwFatalError" function to replace
336+
//If there isn't enough padding look for the "throwFatalError" function to replace
335337
u32 svcConnectToPort = 0xFFFFFFFF;
336338

337-
for(u32 addr = 4; svcConnectToPort == 0xFFFFFFFF && addr <= text_size - 4; addr += 4)
339+
for(u32 addr = 4; svcConnectToPort == 0xFFFFFFFF && addr <= textSize - 4; addr += 4)
338340
{
339341
if(*(u32 *)(code + addr) == 0xEF00002D)
340342
svcConnectToPort = addr - 4;
@@ -344,18 +346,19 @@ static bool findLayeredFsPayloadOffset(u8* code, u32 text_size, u32* payload_off
344346
{
345347
u32 func = 0xFFFFFFFF;
346348

347-
for(u32 i = 4; func == 0xFFFFFFFF && i <= text_size - 4; i += 4)
349+
for(u32 i = 4; func == 0xFFFFFFFF && i <= textSize - 4; i += 4)
348350
{
349351
if(*(u32 *)(code + i) != MAKE_BRANCH_LINK(i, svcConnectToPort)) continue;
350352

351353
func = findFunctionStart(code, i);
352354

353-
for(u32 pos = func + 4; func != 0xFFFFFFFF && pos <= text_size - 4 && *(u16 *)(code + pos + 2) != 0xE92D; pos += 4)
355+
for(u32 pos = func + 4; func != 0xFFFFFFFF && pos <= textSize - 4 && *(u16 *)(code + pos + 2) != 0xE92D; pos += 4)
354356
if(*(u32 *)(code + pos) == 0xE200167E) func = 0xFFFFFFFF;
355357
}
356358

357-
if(func != 0xFFFFFFFF) {
358-
*payload_offset = func;
359+
if(func != 0xFFFFFFFF)
360+
{
361+
*payloadOffset = func;
359362
return true;
360363
}
361364
}
@@ -505,7 +508,7 @@ static inline bool loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageI
505508
return ret;
506509
}
507510

508-
static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 text_size)
511+
static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 textSize)
509512
{
510513
/* Here we look for "/luma/titles/[u64 titleID in hex, uppercase]/romfs"
511514
If it exists it should be a folder containing ROMFS files */
@@ -522,14 +525,14 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 text_size)
522525
u32 fsMountArchive = 0xFFFFFFFF,
523526
fsRegisterArchive = 0xFFFFFFFF,
524527
fsTryOpenFile = 0xFFFFFFFF,
525-
fsOpenFileDirectly = 0xFFFFFFFF;
528+
fsOpenFileDirectly = 0xFFFFFFFF,
529+
payloadOffset;
526530

527-
if(!findLayeredFsSymbols(code, size, &fsMountArchive, &fsRegisterArchive, &fsTryOpenFile, &fsOpenFileDirectly)) return false;
531+
if(!findLayeredFsSymbols(code, size, &fsMountArchive, &fsRegisterArchive, &fsTryOpenFile, &fsOpenFileDirectly) ||
532+
!findLayeredFsPayloadOffset(code, textSize, &payloadOffset)) return false;
528533

529534
//Setup the payload
530-
u32 payload_offset;
531-
if(!findLayeredFsPayloadOffset(code, text_size, &payload_offset)) return false;
532-
u8 *payload = code + payload_offset;
535+
u8 *payload = code + payloadOffset;
533536
memcpy(payload, romfsredir_bin, romfsredir_bin_size);
534537

535538
//Insert symbols in the payload
@@ -542,13 +545,13 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 text_size)
542545
payload32[i] = *(u32 *)(code + fsOpenFileDirectly);
543546
break;
544547
case 0xdead0001:
545-
payload32[i] = MAKE_BRANCH(payload_offset + i * 4, fsOpenFileDirectly + 4);
548+
payload32[i] = MAKE_BRANCH(payloadOffset + i * 4, fsOpenFileDirectly + 4);
546549
break;
547550
case 0xdead0002:
548551
payload32[i] = *(u32 *)(code + fsTryOpenFile);
549552
break;
550553
case 0xdead0003:
551-
payload32[i] = MAKE_BRANCH(payload_offset + i * 4, fsTryOpenFile + 4);
554+
payload32[i] = MAKE_BRANCH(payloadOffset + i * 4, fsTryOpenFile + 4);
552555
break;
553556
case 0xdead0004:
554557
memcpy(payload32 + i, mount, 5);
@@ -570,13 +573,13 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 text_size)
570573
}
571574

572575
//Place the hooks
573-
*(u32 *)(code + fsOpenFileDirectly) = MAKE_BRANCH(fsOpenFileDirectly, payload_offset);
574-
*(u32 *)(code + fsTryOpenFile) = MAKE_BRANCH(fsTryOpenFile, payload_offset + 12);
576+
*(u32 *)(code + fsOpenFileDirectly) = MAKE_BRANCH(fsOpenFileDirectly, payloadOffset);
577+
*(u32 *)(code + fsTryOpenFile) = MAKE_BRANCH(fsTryOpenFile, payloadOffset + 12);
575578

576579
return true;
577580
}
578581

579-
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 text_size)
582+
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize)
580583
{
581584
loadCFWInfo();
582585

@@ -838,7 +841,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 text_size)
838841
if(!loadTitleCodeSection(progId, code, size) ||
839842
!applyCodeIpsPatch(progId, code, size) ||
840843
!loadTitleLocaleConfig(progId, &regionId, &languageId) ||
841-
!patchLayeredFs(progId, code, size, text_size)) goto error;
844+
!patchLayeredFs(progId, code, size, textSize)) goto error;
842845

843846
if(regionId != 0xFF)
844847
{

injector/source/patcher.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,4 @@ enum flags
4444
ISSAFEMODE
4545
};
4646

47-
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 text_size);
47+
void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize);

linker.ld

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ SECTIONS
99
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
1010
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
1111
.data : ALIGN(4) { *(.data*); . = ALIGN(4); }
12-
1312
.bss : ALIGN(8) { __bss_start = .; *(.bss* COMMON); . = ALIGN(8); __bss_end = .; }
1413

1514
. = ALIGN(4);

loader/linker.ld

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ ENTRY(_start)
55
SECTIONS
66
{
77
. = 0x24FFFE00;
8+
89
.text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); }
910
.rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); }
1011
.data : ALIGN(4) { *(.data*); . = ALIGN(8); *(.bss* COMMON); . = ALIGN(8); }

0 commit comments

Comments
 (0)