diff --git a/source/firm.c b/source/firm.c index b29da08..2c978c1 100755 --- a/source/firm.c +++ b/source/firm.c @@ -302,7 +302,7 @@ static inline void patchNativeFirm(u32 firmVersion, FirmwareSource nandType, u32 process9MemAddr; u8 *process9Offset = getProcess9(arm9Section + 0x15000, section[2].size - 0x15000, &process9Size, &process9MemAddr); - //Find Kernel11 SVC table and free space locations + //Find Kernel11 SVC table and handler, exceptions page and free space locations u8 *freeK11Space; u32 *arm11SvcHandler, *arm11ExceptionsPage, @@ -361,11 +361,7 @@ static inline void patchNativeFirm(u32 firmVersion, FirmwareSource nandType, u32 if(CONFIG(9)) { patchArm11SvcAccessChecks(arm11SvcHandler); - - //FIRMs between 9.3 and 10.4 don't have enough space on N3DS - if(!isN3DS || firmVersion <= 4 || firmVersion >= 0x21) - patchK11ModuleChecks(arm11Section1, section[1].size, &freeK11Space); - + patchK11ModuleChecks(arm11Section1, section[1].size, &freeK11Space); patchP9AccessChecks(process9Offset, process9Size); } } diff --git a/source/patches.c b/source/patches.c index ade6424..4cd4894 100644 --- a/source/patches.c +++ b/source/patches.c @@ -332,18 +332,22 @@ void patchK11ModuleChecks(u8 *pos, u32 size, u8 **freeK11Space) /* We have to detour a function in the ARM11 kernel because builtin modules are compressed in memory and are only decompressed at runtime */ - //Inject our code into the free space - memcpy(*freeK11Space, k11modules, k11modules_size); + //Check that we have enough free space + if(*(u32 *)(*freeK11Space + k11modules_size - 4) == 0xFFFFFFFF) + { + //Inject our code into the free space + memcpy(*freeK11Space, k11modules, k11modules_size); - //Look for the code that decompresses the .code section of the builtin modules - const u8 pattern[] = {0xE5, 0x48, 0x00, 0x9D}; + //Look for the code that decompresses the .code section of the builtin modules + const u8 pattern[] = {0xE5, 0x48, 0x00, 0x9D}; - u32 *off = (u32 *)(memsearch(pos, pattern, size, sizeof(pattern)) - 0xB); + u32 *off = (u32 *)(memsearch(pos, pattern, size, sizeof(pattern)) - 0xB); - //Inject a jump (BL) instruction to our code at the offset we found - *off = 0xEB000000 | (((((u32)*freeK11Space) - ((u32)off + 8)) >> 2) & 0xFFFFFF); + //Inject a jump (BL) instruction to our code at the offset we found + *off = 0xEB000000 | (((((u32)*freeK11Space) - ((u32)off + 8)) >> 2) & 0xFFFFFF); - (*freeK11Space) += k11modules_size; + *freeK11Space += k11modules_size; + } } void patchUnitInfoValueSet(u8 *pos, u32 size)