From 8566d4f8b4ef5b3a2c9fa2f175d48dc42724dc5c Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Mon, 6 Jul 2026 19:29:15 +0300 Subject: [PATCH] SPU: Fix ppu_check_patch_spu_images --- rpcs3/Emu/Cell/PPUModule.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 15ff9b1fa8..dc78ddcb83 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -1185,9 +1185,11 @@ static void ppu_check_patch_spu_images(const ppu_module& mod, const ppu ensure(data.size() <= pos && index <= data.size()); + const auto data_to_search = data.substr(index, pos - index); + for (std::string_view value : values) { - if (usz pos0 = data.substr(index, pos - index).find(value); pos0 != umax && pos0 + index < pos) + if (usz pos0 = data_to_search.find(value); pos0 != umax && pos0 + index < pos) { pos = static_cast(pos0 + index); } @@ -1211,12 +1213,22 @@ static void ppu_check_patch_spu_images(const ppu_module& mod, const ppu { const u32 old_prefix_addr = prefix_addr; - auto search_guid_pattern = [&](u32 index, std::string_view data_span, s32 advance_index, u32 lower_bound, u32 uppper_bound) -> u32 + auto search_guid_pattern = [&](u32 index, std::string_view data_span, s32 advance_index, u32 lower_bound, u32 upper_bound) -> u32 { - for (u32 search = index & -16, tries = 16 * 64; tries && search >= lower_bound && search < uppper_bound; tries = tries - 1, search = advance_index < 0 ? utils::sub_saturate(search, 0 - advance_index) : search + advance_index) + ensure(upper_bound <= data_span.size()); + ensure(lower_bound <= data_span.size()); + ensure(lower_bound <= upper_bound); + + for (u32 search = index & -16, tries = 16 * 64; tries && search >= lower_bound && search < (upper_bound & -16); tries = tries - 1, search = advance_index < 0 ? utils::sub_saturate(search, 0 - advance_index) : search + advance_index) { if (seg_view[search] != 0x42 && seg_view[search] != 0x43) { + if (search == 0 && advance_index <= 0) + { + // Fast early-out + break; + } + continue; } @@ -1260,7 +1272,7 @@ static void ppu_check_patch_spu_images(const ppu_module& mod, const ppu { const u32 instruction = std::min(search_guid_pattern(addr_last, ls_segment, +16, 0, ::size32(ls_segment)), find_first_of_multiple(ls_segment, prefixes, addr_last)); - if (instruction != umax && std::memcmp(ls_segment.data() + instruction, "\x24\0\x40\x80", 4) == 0) + if (instruction < ls_segment.size() && std::memcmp(ls_segment.data() + instruction, "\x24\0\x40\x80", 4) == 0) { if (instruction % 4 != prefix_addr % 4) {