hos: simplify emummc patch

This commit is contained in:
CTCaer 2024-03-27 10:26:12 +02:00
parent dca350bfe9
commit 547cfca0c9
2 changed files with 22 additions and 51 deletions

View File

@ -442,6 +442,8 @@ static int _kipm_inject(const char *kipm_path, char *target_name, pkg2_kip1_info
const char *pkg2_patch_kips(link_t *info, char *patch_names) const char *pkg2_patch_kips(link_t *info, char *patch_names)
{ {
bool emummc_patch_selected = false;
if (patch_names == NULL || patch_names[0] == 0) if (patch_names == NULL || patch_names[0] == 0)
return NULL; return NULL;
@ -500,7 +502,15 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
// Parse external patches if needed. // Parse external patches if needed.
for (u32 i = 0; i < patches_num; i++) for (u32 i = 0; i < patches_num; i++)
{ {
if (strcmp(patches[i], "emummc") && strcmp(patches[i], "nogc")) if (!strcmp(patches[i], "emummc"))
{
// emuMMC patch is managed on its own.
emummc_patch_selected = true;
patches_applied |= BIT(i);
continue;
}
if (strcmp(patches[i], "nogc"))
{ {
parse_external_kip_patches(); parse_external_kip_patches();
break; break;
@ -513,6 +523,8 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
// Reset hash so it can be calculated for the new kip. // Reset hash so it can be calculated for the new kip.
kip_hash[0] = 0; kip_hash[0] = 0;
bool emummc_patch_apply = emummc_patch_selected && !strcmp((char *)ki->kip1->name, "FS");
// Check all SHA256 ID sets. (IDs are grouped per KIP. IDs are still unique.) // Check all SHA256 ID sets. (IDs are grouped per KIP. IDs are still unique.)
for (u32 kip_id_idx = 0; kip_id_idx < _kip_id_sets_cnt; kip_id_idx++) for (u32 kip_id_idx = 0; kip_id_idx < _kip_id_sets_cnt; kip_id_idx++)
{ {
@ -538,7 +550,7 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
} }
// Don't bother hashing this KIP if no patches are enabled for it. // Don't bother hashing this KIP if no patches are enabled for it.
if (!patches_found) if (!patches_found && !emummc_patch_apply)
continue; continue;
// Check if current KIP not hashed and hash it. // Check if current KIP not hashed and hash it.
@ -562,9 +574,6 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
if (strcmp(patchset->name, patches[patch_idx])) if (strcmp(patchset->name, patches[patch_idx]))
continue; continue;
if (!strcmp(patchset->name, "emummc"))
sections_affected |= BIT(GET_KIP_PATCH_SECTION(patchset->patches->offset));
for (const kip1_patch_t *patch = patchset->patches; patch != NULL && (patch->length != 0); patch++) for (const kip1_patch_t *patch = patchset->patches; patch != NULL && (patch->length != 0); patch++)
sections_affected |= BIT(GET_KIP_PATCH_SECTION(patch->offset)); sections_affected |= BIT(GET_KIP_PATCH_SECTION(patch->offset));
} }
@ -572,13 +581,16 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
patchset++; patchset++;
} }
// If emuMMC is enabled, set its affected section.
if (emummc_patch_apply)
sections_affected |= BIT(KIP_TEXT);
// Got patches to apply to this kip, have to decompress it. // Got patches to apply to this kip, have to decompress it.
if (_decompress_kip(ki, sections_affected)) if (_decompress_kip(ki, sections_affected))
return (char *)ki->kip1->name; // Failed to decompress. return (char *)ki->kip1->name; // Failed to decompress.
// Apply all patches from matched ID. // Apply all patches for matched ID.
patchset = _kip_id_sets[kip_id_idx].patchset; patchset = _kip_id_sets[kip_id_idx].patchset;
bool emummc_patch_selected = false;
while (patchset != NULL && patchset->name != NULL) while (patchset != NULL && patchset->name != NULL)
{ {
for (u32 patch_idx = 0; patch_idx < patches_num; patch_idx++) for (u32 patch_idx = 0; patch_idx < patches_num; patch_idx++)
@ -589,14 +601,6 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
u32 applied_mask = BIT(patch_idx); u32 applied_mask = BIT(patch_idx);
if (!strcmp(patchset->name, "emummc"))
{
emummc_patch_selected = true;
patches_applied |= applied_mask;
continue; // Patching is done later.
}
// Check if patchset is empty. // Check if patchset is empty.
if (patchset->patches == NULL) if (patchset->patches == NULL)
{ {
@ -652,7 +656,8 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
patchset++; patchset++;
} }
if (emummc_patch_selected && !strcmp((char *)_kip_id_sets[kip_id_idx].name, "FS")) // emuMMC must be applied after all other patches, since it affects TEXT offset.
if (emummc_patch_apply)
{ {
// Encode ID. // Encode ID.
emu_cfg.fs_ver = kip_id_idx; emu_cfg.fs_ver = kip_id_idx;
@ -668,6 +673,7 @@ const char *pkg2_patch_kips(link_t *info, char *patch_names)
// Skip checking again. // Skip checking again.
emummc_patch_selected = false; emummc_patch_selected = false;
emummc_patch_apply = false;
} }
} }
} }

View File

@ -448,14 +448,8 @@ static const pkg2_kernel_id_t _pkg2_kernel_ids[] =
}; };
// All kip patch offsets are without the 0x100-sized header. // All kip patch offsets are without the 0x100-sized header.
static kip1_patch_t _fs_emummc[] = {
{ KPS(KIP_TEXT) | 1, 0, "", "" },
{ 0, 0, NULL, NULL }
};
static kip1_patchset_t _fs_patches_100[] = { static kip1_patchset_t _fs_patches_100[] = {
{ "nogc", NULL }, { "nogc", NULL },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -467,7 +461,6 @@ static kip1_patch_t _fs_nogc_40x[] = {
static kip1_patchset_t _fs_patches_40x[] = { static kip1_patchset_t _fs_patches_40x[] = {
{ "nogc", _fs_nogc_40x }, { "nogc", _fs_nogc_40x },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -479,7 +472,6 @@ static kip1_patch_t _fs_nogc_410[] = {
static kip1_patchset_t _fs_patches_410[] = { static kip1_patchset_t _fs_patches_410[] = {
{ "nogc", _fs_nogc_410 }, { "nogc", _fs_nogc_410 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -491,7 +483,6 @@ static kip1_patch_t _fs_nogc_50x[] = {
static kip1_patchset_t _fs_patches_50x[] = { static kip1_patchset_t _fs_patches_50x[] = {
{ "nogc", _fs_nogc_50x }, { "nogc", _fs_nogc_50x },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -503,7 +494,6 @@ static kip1_patch_t _fs_nogc_510[] = {
static kip1_patchset_t _fs_patches_510[] = { static kip1_patchset_t _fs_patches_510[] = {
{ "nogc", _fs_nogc_510 }, { "nogc", _fs_nogc_510 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -521,13 +511,11 @@ static kip1_patch_t _fs_nogc_600_exfat[] = {
static kip1_patchset_t _fs_patches_600[] = { static kip1_patchset_t _fs_patches_600[] = {
{ "nogc", _fs_nogc_600 }, { "nogc", _fs_nogc_600 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
static kip1_patchset_t _fs_patches_600_exfat[] = { static kip1_patchset_t _fs_patches_600_exfat[] = {
{ "nogc", _fs_nogc_600_exfat }, { "nogc", _fs_nogc_600_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -545,13 +533,11 @@ static kip1_patch_t _fs_nogc_700_exfat[] = {
static kip1_patchset_t _fs_patches_700[] = { static kip1_patchset_t _fs_patches_700[] = {
{ "nogc", _fs_nogc_700 }, { "nogc", _fs_nogc_700 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
static kip1_patchset_t _fs_patches_700_exfat[] = { static kip1_patchset_t _fs_patches_700_exfat[] = {
{ "nogc", _fs_nogc_700_exfat }, { "nogc", _fs_nogc_700_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -569,13 +555,11 @@ static kip1_patch_t _fs_nogc_800_exfat[] = {
static kip1_patchset_t _fs_patches_800[] = { static kip1_patchset_t _fs_patches_800[] = {
{ "nogc", _fs_nogc_800 }, { "nogc", _fs_nogc_800 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
static kip1_patchset_t _fs_patches_800_exfat[] = { static kip1_patchset_t _fs_patches_800_exfat[] = {
{ "nogc", _fs_nogc_800_exfat }, { "nogc", _fs_nogc_800_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -587,7 +571,6 @@ static kip1_patch_t _fs_nogc_900[] = {
static kip1_patchset_t _fs_patches_900[] = { static kip1_patchset_t _fs_patches_900[] = {
{ "nogc", _fs_nogc_900 }, { "nogc", _fs_nogc_900 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -599,7 +582,6 @@ static kip1_patch_t _fs_nogc_910[] = {
static kip1_patchset_t _fs_patches_910[] = { static kip1_patchset_t _fs_patches_910[] = {
{ "nogc", _fs_nogc_910 }, { "nogc", _fs_nogc_910 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -611,7 +593,6 @@ static kip1_patch_t _fs_nogc_1000[] = {
static kip1_patchset_t _fs_patches_1000[] = { static kip1_patchset_t _fs_patches_1000[] = {
{ "nogc", _fs_nogc_1000 }, { "nogc", _fs_nogc_1000 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -623,7 +604,6 @@ static kip1_patch_t _fs_nogc_1020[] = {
static kip1_patchset_t _fs_patches_1020[] = { static kip1_patchset_t _fs_patches_1020[] = {
{ "nogc", _fs_nogc_1020 }, { "nogc", _fs_nogc_1020 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -635,7 +615,6 @@ static kip1_patch_t _fs_nogc_1100[] = {
static kip1_patchset_t _fs_patches_1100[] = { static kip1_patchset_t _fs_patches_1100[] = {
{ "nogc", _fs_nogc_1100 }, { "nogc", _fs_nogc_1100 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -647,7 +626,6 @@ static kip1_patch_t _fs_nogc_1200[] = {
static kip1_patchset_t _fs_patches_1200[] = { static kip1_patchset_t _fs_patches_1200[] = {
{ "nogc", _fs_nogc_1200 }, { "nogc", _fs_nogc_1200 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -659,7 +637,6 @@ static kip1_patch_t _fs_nogc_1203[] = {
static kip1_patchset_t _fs_patches_1203[] = { static kip1_patchset_t _fs_patches_1203[] = {
{ "nogc", _fs_nogc_1203 }, { "nogc", _fs_nogc_1203 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -671,7 +648,6 @@ static kip1_patch_t _fs_nogc_1300[] = {
static kip1_patchset_t _fs_patches_1300[] = { static kip1_patchset_t _fs_patches_1300[] = {
{ "nogc", _fs_nogc_1300 }, { "nogc", _fs_nogc_1300 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -683,7 +659,6 @@ static kip1_patch_t _fs_nogc_1310[] = {
static kip1_patchset_t _fs_patches_1310[] = { static kip1_patchset_t _fs_patches_1310[] = {
{ "nogc", _fs_nogc_1310 }, { "nogc", _fs_nogc_1310 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -695,7 +670,6 @@ static kip1_patch_t _fs_nogc_1400[] = {
static kip1_patchset_t _fs_patches_1400[] = { static kip1_patchset_t _fs_patches_1400[] = {
{ "nogc", _fs_nogc_1400 }, { "nogc", _fs_nogc_1400 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -707,7 +681,6 @@ static kip1_patch_t _fs_nogc_1400_exfat[] = {
static kip1_patchset_t _fs_patches_1400_exfat[] = { static kip1_patchset_t _fs_patches_1400_exfat[] = {
{ "nogc", _fs_nogc_1400_exfat }, { "nogc", _fs_nogc_1400_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -719,7 +692,6 @@ static kip1_patch_t _fs_nogc_1500[] = {
static kip1_patchset_t _fs_patches_1500[] = { static kip1_patchset_t _fs_patches_1500[] = {
{ "nogc", _fs_nogc_1500 }, { "nogc", _fs_nogc_1500 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -731,7 +703,6 @@ static kip1_patch_t _fs_nogc_1500_exfat[] = {
static kip1_patchset_t _fs_patches_1500_exfat[] = { static kip1_patchset_t _fs_patches_1500_exfat[] = {
{ "nogc", _fs_nogc_1500_exfat }, { "nogc", _fs_nogc_1500_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -743,7 +714,6 @@ static kip1_patch_t _fs_nogc_1600[] = {
static kip1_patchset_t _fs_patches_1600[] = { static kip1_patchset_t _fs_patches_1600[] = {
{ "nogc", _fs_nogc_1600 }, { "nogc", _fs_nogc_1600 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -755,7 +725,6 @@ static kip1_patch_t _fs_nogc_1600_exfat[] = {
static kip1_patchset_t _fs_patches_1600_exfat[] = { static kip1_patchset_t _fs_patches_1600_exfat[] = {
{ "nogc", _fs_nogc_1600_exfat }, { "nogc", _fs_nogc_1600_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -767,7 +736,6 @@ static kip1_patch_t _fs_nogc_1603[] = {
static kip1_patchset_t _fs_patches_1603[] = { static kip1_patchset_t _fs_patches_1603[] = {
{ "nogc", _fs_nogc_1603 }, { "nogc", _fs_nogc_1603 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -779,7 +747,6 @@ static kip1_patch_t _fs_nogc_1603_exfat[] = {
static kip1_patchset_t _fs_patches_1603_exfat[] = { static kip1_patchset_t _fs_patches_1603_exfat[] = {
{ "nogc", _fs_nogc_1603_exfat }, { "nogc", _fs_nogc_1603_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -791,7 +758,6 @@ static kip1_patch_t _fs_nogc_1700[] = {
static kip1_patchset_t _fs_patches_1700[] = { static kip1_patchset_t _fs_patches_1700[] = {
{ "nogc", _fs_nogc_1700 }, { "nogc", _fs_nogc_1700 },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };
@ -803,7 +769,6 @@ static kip1_patch_t _fs_nogc_1700_exfat[] = {
static kip1_patchset_t _fs_patches_1700_exfat[] = { static kip1_patchset_t _fs_patches_1700_exfat[] = {
{ "nogc", _fs_nogc_1700_exfat }, { "nogc", _fs_nogc_1700_exfat },
{ "emummc", _fs_emummc },
{ NULL, NULL } { NULL, NULL }
}; };