loader: enable layeredfs+locale emu for all applets

Not tested (except for HM which is known to work).

And restrict code.bin and exheader.bin to when *both* "external firm
and modules" and "game patching" are enabled.
This commit is contained in:
TuxSH 2023-01-22 18:45:47 +00:00
parent ee9f283d4d
commit eb6d8523d1
2 changed files with 47 additions and 7 deletions

View File

@ -108,6 +108,11 @@ static Result allocateProgramMemoryWrapper(prog_addrs_t *mapped, const ExHeader_
return allocateProgramMemory(exhi, mapped->text_addr, mapped->total_size << 12); return allocateProgramMemory(exhi, mapped->text_addr, mapped->total_size << 12);
} }
static inline bool IsSysmoduleId(u64 tid)
{
return (tid >> 32) == 0x00040130;
}
static Result loadCode(const ExHeader_Info *exhi, u64 programHandle, const prog_addrs_t *mapped) static Result loadCode(const ExHeader_Info *exhi, u64 programHandle, const prog_addrs_t *mapped)
{ {
IFile file; IFile file;
@ -120,7 +125,20 @@ static Result loadCode(const ExHeader_Info *exhi, u64 programHandle, const prog_
const ExHeader_CodeSetInfo *csi = &exhi->sci.codeset_info; const ExHeader_CodeSetInfo *csi = &exhi->sci.codeset_info;
bool isCompressed = csi->flags.compress_exefs_code; bool isCompressed = csi->flags.compress_exefs_code;
if(!CONFIG(PATCHGAMES) || !loadTitleCodeSection(titleId, (u8 *)mapped->text_addr, (u64)mapped->total_size << 12)) bool codeLoadedExternally = false;
if (CONFIG(PATCHGAMES))
{
// Require both "load external FIRM & modules" and "patch games" for sysmodules
if (IsSysmoduleId(titleId))
codeLoadedExternally = CONFIG(LOADEXTFIRMSANDMODULES);
else
codeLoadedExternally = true;
}
if (codeLoadedExternally)
codeLoadedExternally = loadTitleCodeSection(titleId, (u8 *)mapped->text_addr, (u64)mapped->total_size << 12);
if(!codeLoadedExternally)
{ {
archivePath.type = PATH_BINARY; archivePath.type = PATH_BINARY;
archivePath.data = &programHandle; archivePath.data = &programHandle;
@ -178,7 +196,20 @@ static Result GetProgramInfoImpl(ExHeader_Info *exheaderInfo, u64 programHandle)
else else
{ {
u64 originalTitleId = exheaderInfo->aci.local_caps.title_id; u64 originalTitleId = exheaderInfo->aci.local_caps.title_id;
if(CONFIG(PATCHGAMES) && loadTitleExheaderInfo(exheaderInfo->aci.local_caps.title_id, exheaderInfo)) bool exhLoadedExternally = false;
if (CONFIG(PATCHGAMES))
{
// Require both "load external FIRM & modules" and "patch games" for sysmodules
if (IsSysmoduleId(originalTitleId))
exhLoadedExternally = CONFIG(LOADEXTFIRMSANDMODULES);
else
exhLoadedExternally = true;
}
if (exhLoadedExternally)
exhLoadedExternally = loadTitleExheaderInfo(originalTitleId, exheaderInfo);
if(exhLoadedExternally)
exheaderInfo->aci.local_caps.title_id = originalTitleId; exheaderInfo->aci.local_caps.title_id = originalTitleId;
} }

View File

@ -746,7 +746,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
0x00, 0x26 0x00, 0x26
}; };
//Disable SecureInfo signature check //Disable SecureInfo signature check (redundant)
if(!patchMemory(code, textSize, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), 0, sizeof(pattern), 0,
@ -784,7 +784,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
0x00, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1 //mov r0, #0; bx lr 0x00, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1 //mov r0, #0; bx lr
}; };
//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 (redundant) and CRO0/CRR0 SHA256 hash checks (section hashes, and hash table)
if(!patchMemory(code, textSize, if(!patchMemory(code, textSize,
pattern, pattern,
sizeof(pattern), -9, sizeof(pattern), -9,
@ -845,6 +845,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
else if((progId & ~0xF0000001ULL) == 0x0004013000001A02LL) //DSP, SAFE_FIRM DSP else if((progId & ~0xF0000001ULL) == 0x0004013000001A02LL) //DSP, SAFE_FIRM DSP
{ {
// This patch is redundant
static const u8 pattern[] = { static const u8 pattern[] = {
0xE3, 0x10, 0x10, 0x80, 0xE2 0xE3, 0x10, 0x10, 0x80, 0xE2
}, },
@ -863,10 +864,18 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
if(CONFIG(PATCHGAMES)) if(CONFIG(PATCHGAMES))
{ {
if(!patcherApplyCodeBpsPatch(progId, code, size)) goto error; bool isApp = ((progId >> 32) & ~0x12) == 0x00040000;
if(!applyCodeIpsPatch(progId, code, size)) goto error; bool isApplet = (progId >> 32) == 0x00040030;
bool isSysmodule = (progId >> 32) == 0x00040130;
if((u32)((progId >> 0x20) & 0xFFFFFFEDULL) == 0x00040000 || isHomeMenu) bool shouldPatchIps = !isSysmodule || (isSysmodule && CONFIG(LOADEXTFIRMSANDMODULES));
if (shouldPatchIps)
{
if(!patcherApplyCodeBpsPatch(progId, code, size)) goto error;
if(!applyCodeIpsPatch(progId, code, size)) goto error;
}
if(isApp || isApplet)
{ {
u8 mask, u8 mask,
regionId, regionId,