From ae4f837f57e6b7983804eb5af5b53f722c83cdc1 Mon Sep 17 00:00:00 2001 From: Eladash Date: Wed, 15 Sep 2021 20:29:40 +0300 Subject: [PATCH] sys_prx: Implement sys_prx_get_module_id_by_address --- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 49cb617439..52f404ed87 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -857,8 +857,33 @@ error_code _sys_prx_get_module_id_by_address(ppu_thread& ppu, u32 addr) { ppu.state += cpu_flag::wait; - sys_prx.todo("_sys_prx_get_module_id_by_address(addr=0x%x)", addr); - return CELL_OK; + sys_prx.warning("_sys_prx_get_module_id_by_address(addr=0x%x)", addr); + + if (!vm::check_addr(addr)) + { + // Fast check for an invalid argument + return {CELL_PRX_ERROR_UNKNOWN_MODULE, addr}; + } + + const auto [prx, id] = idm::select([&](u32 id, lv2_prx& prx) -> u32 + { + for (const ppu_segment& seg : prx.segs) + { + if (seg.size && addr >= seg.addr && addr < seg.addr + seg.size) + { + return id; + } + } + + return 0; + }); + + if (!id) + { + return {CELL_PRX_ERROR_UNKNOWN_MODULE, addr}; + } + + return not_an_error(id); } error_code _sys_prx_start(ppu_thread& ppu)