PPU LLVM: Function table dependent resolver hashing

This commit is contained in:
Elad 2025-01-07 13:41:41 +02:00
commit d6e014b3a9
5 changed files with 23 additions and 5 deletions

View file

@ -1449,6 +1449,8 @@ static usz apply_modification(std::vector<u32>& applied, patch_engine::patch_inf
void patch_engine::apply(std::vector<u32>& applied_total, const std::string& name, std::function<u8*(u32, u32)> mem_translate, u32 filesz, u32 min_addr) void patch_engine::apply(std::vector<u32>& applied_total, const std::string& name, std::function<u8*(u32, u32)> mem_translate, u32 filesz, u32 min_addr)
{ {
applied_total.clear();
if (!m_map.contains(name)) if (!m_map.contains(name))
{ {
return; return;
@ -1597,6 +1599,9 @@ void patch_engine::apply(std::vector<u32>& applied_total, const std::string& nam
} }
} }
} }
// Ensure consistent order
std::stable_sort(applied_total.begin(), applied_total.end());
} }
void patch_engine::unload(const std::string& name) void patch_engine::unload(const std::string& name)

View file

@ -96,6 +96,7 @@ struct ppu_module : public Type
std::vector<ppu_segment> segs{}; std::vector<ppu_segment> segs{};
std::vector<ppu_segment> secs{}; std::vector<ppu_segment> secs{};
std::vector<ppu_function> funcs{}; std::vector<ppu_function> funcs{};
std::vector<u32> applied_patches;
std::deque<std::shared_ptr<void>> allocations; std::deque<std::shared_ptr<void>> allocations;
std::map<u32, u32> addr_to_seg_index; std::map<u32, u32> addr_to_seg_index;
@ -185,7 +186,6 @@ struct main_ppu_module : public ppu_module<T>
{ {
u32 elf_entry{}; u32 elf_entry{};
u32 seg0_code_end{}; u32 seg0_code_end{};
std::vector<u32> applied_patches;
// Disable inherited savestate ordering // Disable inherited savestate ordering
void save(utils::serial&) = delete; void save(utils::serial&) = delete;

View file

@ -1947,6 +1947,7 @@ shared_ptr<lv2_prx> ppu_load_prx(const ppu_prx_object& elf, bool virtual_load, c
ppu_check_patch_spu_images(*prx, seg); ppu_check_patch_spu_images(*prx, seg);
} }
prx->applied_patches = applied;
prx->analyse(toc, 0, end, applied, exported_funcs); prx->analyse(toc, 0, end, applied, exported_funcs);
if (!ar && !virtual_load) if (!ar && !virtual_load)

View file

@ -4898,6 +4898,22 @@ bool ppu_initialize(const ppu_module<lv2_obj>& info, bool check_only, u64 file_s
sha1_update(&ctx, ensure(info.get_ptr<const u8>(func.addr)), func.size); sha1_update(&ctx, ensure(info.get_ptr<const u8>(func.addr)), func.size);
} }
if (fpos >= info.funcs.size())
{
// Hash the entire function grouped addresses for the integrity of the symbol resolver function
// Potentially occuring during patches
std::vector<be_t<u32>> addrs(info.funcs.size());
usz addr_index = 0;
for (const ppu_function& func : info.funcs)
{
addrs[addr_index] = func.addr;
}
sha1_update(&ctx, addrs.data(), addrs.size() * sizeof(be_t<u32>));
}
if (false) if (false)
{ {
const be_t<u64> forced_upd = 3; const be_t<u64> forced_upd = 3;
@ -4920,7 +4936,6 @@ bool ppu_initialize(const ppu_module<lv2_obj>& info, bool check_only, u64 file_s
accurate_fpcc, accurate_fpcc,
accurate_vnan, accurate_vnan,
accurate_nj_mode, accurate_nj_mode,
contains_symbol_resolver,
__bitset_enum_max __bitset_enum_max
}; };
@ -4950,8 +4965,6 @@ bool ppu_initialize(const ppu_module<lv2_obj>& info, bool check_only, u64 file_s
settings += ppu_settings::accurate_vnan, settings -= ppu_settings::fixup_vnan, fmt::throw_exception("VNAN Not implemented"); settings += ppu_settings::accurate_vnan, settings -= ppu_settings::fixup_vnan, fmt::throw_exception("VNAN Not implemented");
if (g_cfg.core.ppu_use_nj_bit) if (g_cfg.core.ppu_use_nj_bit)
settings += ppu_settings::accurate_nj_mode, settings -= ppu_settings::fixup_nj_denormals, fmt::throw_exception("NJ Not implemented"); settings += ppu_settings::accurate_nj_mode, settings -= ppu_settings::fixup_nj_denormals, fmt::throw_exception("NJ Not implemented");
if (fpos >= info.funcs.size())
settings += ppu_settings::contains_symbol_resolver; // Avoid invalidating all modules for this purpose
// Write version, hash, CPU, settings // Write version, hash, CPU, settings
fmt::append(obj_name, "v6-kusa-%s-%s-%s.obj", fmt::base57(output, 16), fmt::base57(settings), jit_compiler::cpu(g_cfg.core.llvm_cpu)); fmt::append(obj_name, "v6-kusa-%s-%s-%s.obj", fmt::base57(output, 16), fmt::base57(settings), jit_compiler::cpu(g_cfg.core.llvm_cpu));

View file

@ -11,7 +11,6 @@ struct lv2_overlay final : ppu_module<lv2_obj>
u32 entry{}; u32 entry{};
u32 seg0_code_end{}; u32 seg0_code_end{};
std::vector<u32> applied_patches;
lv2_overlay() = default; lv2_overlay() = default;
lv2_overlay(utils::serial&){} lv2_overlay(utils::serial&){}