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);
}
static inline bool IsSysmoduleId(u64 tid)
{
return (tid >> 32) == 0x00040130;
}
static Result loadCode(const ExHeader_Info *exhi, u64 programHandle, const prog_addrs_t *mapped)
{
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;
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.data = &programHandle;
@ -178,7 +196,20 @@ static Result GetProgramInfoImpl(ExHeader_Info *exheaderInfo, u64 programHandle)
else
{
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;
}

View File

@ -746,7 +746,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
0x00, 0x26
};
//Disable SecureInfo signature check
//Disable SecureInfo signature check (redundant)
if(!patchMemory(code, textSize,
pattern,
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
};
//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,
pattern,
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
{
// This patch is redundant
static const u8 pattern[] = {
0xE3, 0x10, 0x10, 0x80, 0xE2
},
@ -862,11 +863,19 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
}
if(CONFIG(PATCHGAMES))
{
bool isApp = ((progId >> 32) & ~0x12) == 0x00040000;
bool isApplet = (progId >> 32) == 0x00040030;
bool isSysmodule = (progId >> 32) == 0x00040130;
bool shouldPatchIps = !isSysmodule || (isSysmodule && CONFIG(LOADEXTFIRMSANDMODULES));
if (shouldPatchIps)
{
if(!patcherApplyCodeBpsPatch(progId, code, size)) goto error;
if(!applyCodeIpsPatch(progId, code, size)) goto error;
}
if((u32)((progId >> 0x20) & 0xFFFFFFEDULL) == 0x00040000 || isHomeMenu)
if(isApp || isApplet)
{
u8 mask,
regionId,