From 0fbb8b9a18ca974c7e83d64b9ef998d526db7640 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 14 Nov 2017 13:35:45 +0300 Subject: [PATCH] Implement _sys_prx_load_module_by_fd Implement _sys_prx_load_module_on_memcontainer_by_fd --- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 196c2a2456..60bdaf7a09 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -7,6 +7,7 @@ #include "Emu/Cell/ErrorCodes.h" #include "Crypto/unedat.h" +#include "sys_fs.h" #include "sys_prx.h" namespace vm { using namespace ps3; } @@ -82,7 +83,7 @@ static const std::unordered_map s_prx_ignore { "/dev_flash/sys/external/libvoice.sprx", 0 }, }; -error_code prx_load_module(const std::string& vpath, u64 flags, vm::ptr pOpt) +static error_code prx_load_module(const std::string& vpath, u64 flags, vm::ptr pOpt, fs::file src = {}) { std::string name = vpath.substr(vpath.find_last_of('/') + 1); std::string path = vfs::get(vpath); @@ -125,7 +126,12 @@ error_code prx_load_module(const std::string& vpath, u64 flags, vm::ptr()->devKlic.data()); + if (!src) + { + src.open(path); + } + + const ppu_prx_object obj = decrypt_self(std::move(src), fxm::get_always()->devKlic.data()); if (obj != elf_error::ok) { @@ -154,14 +160,23 @@ error_code sys_prx_get_ppu_guid() error_code _sys_prx_load_module_by_fd(s32 fd, u64 offset, u64 flags, vm::ptr pOpt) { - sys_prx.todo("_sys_prx_load_module_by_fd(fd=%d, offset=0x%x, flags=0x%x, pOpt=*0x%x)", fd, offset, flags, pOpt); - return CELL_OK; + sys_prx.warning("_sys_prx_load_module_by_fd(fd=%d, offset=0x%x, flags=0x%x, pOpt=*0x%x)", fd, offset, flags, pOpt); + + const auto file = idm::get(fd); + + if (!file) + { + return CELL_EBADF; + } + + return prx_load_module(fmt::format("%s_x%x", file->name.data(), offset), flags, pOpt, lv2_file::make_view(file, offset)); } error_code _sys_prx_load_module_on_memcontainer_by_fd(s32 fd, u64 offset, u32 mem_ct, u64 flags, vm::ptr pOpt) { - sys_prx.todo("_sys_prx_load_module_on_memcontainer_by_fd(fd=%d, offset=0x%x, mem_ct=0x%x, flags=0x%x, pOpt=*0x%x)", fd, offset, mem_ct, flags, pOpt); - return CELL_OK; + sys_prx.warning("_sys_prx_load_module_on_memcontainer_by_fd(fd=%d, offset=0x%x, mem_ct=0x%x, flags=0x%x, pOpt=*0x%x)", fd, offset, mem_ct, flags, pOpt); + + return _sys_prx_load_module_by_fd(fd, offset, flags, pOpt); } error_code _sys_prx_load_module_list(s32 count, vm::cpptr path_list, u64 flags, vm::ptr pOpt, vm::ptr id_list)