From 1bf824c6e5c7c271ea907c6a8ff2cb5526e70e45 Mon Sep 17 00:00:00 2001 From: InvoxiPlayGames Date: Fri, 17 Jan 2025 19:26:11 +0000 Subject: [PATCH] sys_prx: implement get_module_id_by_name, module_info_v2 --- rpcs3/Emu/Cell/Modules/sys_prx_.cpp | 2 +- rpcs3/Emu/Cell/PPUModule.cpp | 3 +++ rpcs3/Emu/Cell/lv2/sys_prx.cpp | 29 +++++++++++++++++++++++++---- rpcs3/Emu/Cell/lv2/sys_prx.h | 17 ++++++++++++++++- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sys_prx_.cpp b/rpcs3/Emu/Cell/Modules/sys_prx_.cpp index c3cb6e8df2..8529f408b0 100644 --- a/rpcs3/Emu/Cell/Modules/sys_prx_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_prx_.cpp @@ -221,7 +221,7 @@ error_code sys_prx_get_module_info(ppu_thread& ppu, u32 id, u64 flags, vm::ptrinfo = info; // Call the syscall - return _sys_prx_get_module_info(ppu, id, 0, opt); + return _sys_prx_get_module_info(ppu, id, flags, opt); } error_code sys_prx_get_module_id_by_name(ppu_thread& ppu, vm::cptr name, u64 flags, vm::ptr pOpt) diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 48b9837ca7..6a7ce4312b 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -1816,6 +1816,9 @@ shared_ptr ppu_load_prx(const ppu_prx_object& elf, bool virtual_load, c prx->module_info_version[1] = lib_info->version[1]; prx->module_info_attributes = lib_info->attributes; + prx->imports_start = lib_info->imports_start; + prx->imports_end = lib_info->imports_end; + prx->exports_start = lib_info->exports_start; prx->exports_end = lib_info->exports_end; diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index f918070a4e..6275ba8126 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -1034,7 +1034,7 @@ error_code _sys_prx_get_module_info(ppu_thread& ppu, u32 id, u64 flags, vm::ptr< return CELL_EFAULT; } - if (pOpt->info->size != pOpt->info.size()) + if (pOpt->info->size != pOpt->info.size() && pOpt->info_v2->size != pOpt->info_v2.size()) { return CELL_EINVAL; } @@ -1072,6 +1072,14 @@ error_code _sys_prx_get_module_info(ppu_thread& ppu, u32 id, u64 flags, vm::ptr< pOpt->info->segments_num = i; } + if (pOpt->info_v2->size == pOpt->info_v2.size()) + { + pOpt->info_v2->exports_addr = prx->exports_start; + pOpt->info_v2->exports_size = prx->exports_end - prx->exports_start; + pOpt->info_v2->imports_addr = prx->imports_start; + pOpt->info_v2->imports_size = prx->imports_end - prx->imports_start; + } + return CELL_OK; } @@ -1079,11 +1087,24 @@ error_code _sys_prx_get_module_id_by_name(ppu_thread& ppu, vm::cptr name, { ppu.state += cpu_flag::wait; - sys_prx.todo("_sys_prx_get_module_id_by_name(name=%s, flags=%d, pOpt=*0x%x)", name, flags, pOpt); + sys_prx.warning("_sys_prx_get_module_id_by_name(name=%s, flags=%d, pOpt=*0x%x)", name, flags, pOpt); - //if (realName == "?") ... + const auto [prx, id] = idm::select([&](u32 id, lv2_prx& prx) -> u32 + { + if (strncmp(name.get_ptr(), prx.module_info_name, sizeof(prx.module_info_name)) == 0) + { + return id; + } - return not_an_error(CELL_PRX_ERROR_UNKNOWN_MODULE); + return 0; + }); + + if (!id) + { + return CELL_PRX_ERROR_UNKNOWN_MODULE; + } + + return not_an_error(id); } error_code _sys_prx_get_module_id_by_address(ppu_thread& ppu, u32 addr) diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.h b/rpcs3/Emu/Cell/lv2/sys_prx.h index af0539ecc0..610ed68145 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.h +++ b/rpcs3/Emu/Cell/lv2/sys_prx.h @@ -76,10 +76,22 @@ struct sys_prx_module_info_t be_t segments_num; // 0x44 }; +struct sys_prx_module_info_v2_t : sys_prx_module_info_t +{ + be_t exports_addr; // 0x48 + be_t exports_size; // 0x4C + be_t imports_addr; // 0x50 + be_t imports_size; // 0x54 +}; + struct sys_prx_module_info_option_t { be_t size; // 0x10 - vm::bptr info; + union + { + vm::bptr info; + vm::bptr info_v2; + }; }; struct sys_prx_start_module_option_t @@ -192,6 +204,9 @@ struct lv2_prx final : ppu_module u8 module_info_version[2]{}; be_t module_info_attributes{}; + u32 imports_start = umax; + u32 imports_end = 0; + u32 exports_start = umax; u32 exports_end = 0;