rpcsx/rpcs3/Emu/Cell/lv2/sys_prx.cpp

233 lines
5.1 KiB
C++
Raw Normal View History

2014-06-23 19:40:40 +02:00
#include "stdafx.h"
#include "Emu/Memory/Memory.h"
#include "Emu/System.h"
2015-03-06 23:58:42 +01:00
#include "Emu/IdManager.h"
2014-08-19 12:14:26 +02:00
#include "Crypto/unself.h"
2016-04-14 00:23:53 +02:00
#include "Loader/ELF.h"
2014-06-23 19:40:40 +02:00
2016-04-14 00:23:53 +02:00
#include "Emu/Cell/ErrorCodes.h"
#include "sys_prx.h"
2014-06-23 19:40:40 +02:00
2016-08-19 23:14:10 +02:00
namespace vm { using namespace ps3; }
extern std::shared_ptr<lv2_prx> ppu_load_prx(const ppu_prx_object&);
2016-05-13 15:55:34 +02:00
logs::channel sys_prx("sys_prx", logs::level::notice);
2015-07-01 19:09:26 +02:00
s32 prx_load_module(std::string path, u64 flags, vm::ptr<sys_prx_load_module_option_t> pOpt)
2014-06-23 19:40:40 +02:00
{
sys_prx.warning("prx_load_module(path='%s', flags=0x%llx, pOpt=*0x%x)", path.c_str(), flags, pOpt);
2014-06-23 19:40:40 +02:00
const ppu_prx_object obj = decrypt_self(fs::file(vfs::get(path)));
if (obj != elf_error::ok)
2015-08-01 09:52:44 +02:00
{
return CELL_PRX_ERROR_ILLEGAL_LIBRARY;
2015-08-01 09:52:44 +02:00
}
const auto prx = ppu_load_prx(obj);
2016-04-14 00:23:53 +02:00
if (!prx)
{
2016-04-14 00:23:53 +02:00
return CELL_PRX_ERROR_ILLEGAL_LIBRARY;
}
2014-06-23 19:40:40 +02:00
2017-02-04 16:09:02 +01:00
return idm::last_id();
2014-06-23 19:40:40 +02:00
}
s32 sys_prx_load_module(vm::cptr<char> path, u64 flags, vm::ptr<sys_prx_load_module_option_t> pOpt)
{
2016-08-11 01:29:59 +02:00
sys_prx.warning("sys_prx_load_module(path=%s, flags=0x%llx, pOpt=*0x%x)", path, flags, pOpt);
return prx_load_module(path.get_ptr(), flags, pOpt);
}
s32 sys_prx_load_module_list(s32 count, vm::cpptr<char> path_list, u64 flags, vm::ptr<sys_prx_load_module_option_t> pOpt, vm::ptr<u32> id_list)
{
sys_prx.warning("sys_prx_load_module_list(count=%d, path_list=*0x%x, flags=0x%llx, pOpt=*0x%x, id_list=*0x%x)", count, path_list, flags, pOpt, id_list);
for (s32 i = 0; i < count; ++i)
{
auto path = path_list[i];
std::string name = path.get_ptr();
s32 result = prx_load_module(name, flags, pOpt);
if (result < 0)
return result;
id_list[i] = result;
}
return CELL_OK;
}
2014-06-23 19:40:40 +02:00
s32 sys_prx_load_module_on_memcontainer()
{
sys_prx.todo("sys_prx_load_module_on_memcontainer()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_load_module_by_fd()
{
sys_prx.todo("sys_prx_load_module_by_fd()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_load_module_on_memcontainer_by_fd()
{
sys_prx.todo("sys_prx_load_module_on_memcontainer_by_fd()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_start_module(s32 id, u64 flags, vm::ptr<sys_prx_start_module_option_t> pOpt)
2014-06-23 19:40:40 +02:00
{
sys_prx.warning("sys_prx_start_module(id=0x%x, flags=0x%llx, pOpt=*0x%x)", id, flags, pOpt);
2014-06-23 19:40:40 +02:00
const auto prx = idm::get<lv2_obj, lv2_prx>(id);
2015-04-14 04:00:31 +02:00
if (!prx)
{
2014-06-23 19:40:40 +02:00
return CELL_ESRCH;
2015-04-14 04:00:31 +02:00
}
2014-06-23 19:40:40 +02:00
//if (prx->is_started)
// return CELL_PRX_ERROR_ALREADY_STARTED;
//prx->is_started = true;
pOpt->entry_point.set(prx->start ? prx->start.addr() : ~0ull);
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_stop_module(s32 id, u64 flags, vm::ptr<sys_prx_stop_module_option_t> pOpt)
2014-06-23 19:40:40 +02:00
{
sys_prx.warning("sys_prx_stop_module(id=0x%x, flags=0x%llx, pOpt=*0x%x)", id, flags, pOpt);
2014-06-23 19:40:40 +02:00
const auto prx = idm::get<lv2_obj, lv2_prx>(id);
2015-04-14 04:00:31 +02:00
if (!prx)
{
2014-06-23 19:40:40 +02:00
return CELL_ESRCH;
2015-04-14 04:00:31 +02:00
}
2014-06-23 19:40:40 +02:00
//if (!prx->is_started)
// return CELL_PRX_ERROR_ALREADY_STOPPED;
//prx->is_started = false;
pOpt->entry_point.set(prx->stop ? prx->stop.addr() : -1);
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
2014-09-02 03:05:13 +02:00
s32 sys_prx_unload_module(s32 id, u64 flags, vm::ptr<sys_prx_unload_module_option_t> pOpt)
2014-06-23 19:40:40 +02:00
{
sys_prx.warning("sys_prx_unload_module(id=0x%x, flags=0x%llx, pOpt=*0x%x)", id, flags, pOpt);
2014-06-23 19:40:40 +02:00
// Get the PRX, free the used memory and delete the object and its ID
2017-02-04 16:09:02 +01:00
const auto prx = idm::withdraw<lv2_obj, lv2_prx>(id);
2015-04-14 04:00:31 +02:00
if (!prx)
{
2014-06-23 19:40:40 +02:00
return CELL_ESRCH;
2015-04-14 04:00:31 +02:00
}
//Memory.Free(prx->address);
//s32 result = prx->exit ? prx->exit() : CELL_OK;
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
2015-08-01 09:52:44 +02:00
s32 sys_prx_get_module_list(u64 flags, vm::ptr<sys_prx_get_module_list_t> pInfo)
2014-06-23 19:40:40 +02:00
{
sys_prx.todo("sys_prx_get_module_list(flags=%d, pInfo=*0x%x)", flags, pInfo);
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_get_my_module_id()
{
sys_prx.todo("sys_prx_get_my_module_id()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_get_module_id_by_address()
{
sys_prx.todo("sys_prx_get_module_id_by_address()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_get_module_id_by_name(vm::cptr<char> name, u64 flags, vm::ptr<sys_prx_get_module_id_by_name_option_t> pOpt)
2014-06-23 19:40:40 +02:00
{
2016-08-11 01:29:59 +02:00
sys_prx.todo("sys_prx_get_module_id_by_name(name=%s, flags=%d, pOpt=*0x%x)", name, flags, pOpt);
//if (realName == "?") ...
2015-02-19 12:18:28 +01:00
return CELL_PRX_ERROR_UNKNOWN_MODULE;
2014-06-23 19:40:40 +02:00
}
2015-08-01 09:52:44 +02:00
s32 sys_prx_get_module_info(s32 id, u64 flags, vm::ptr<sys_prx_module_info_t> info)
2014-06-23 19:40:40 +02:00
{
sys_prx.todo("sys_prx_get_module_info(id=%d, flags=%d, info=*0x%x)", id, flags, info);
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_register_library(vm::ptr<void> library)
2014-06-23 19:40:40 +02:00
{
sys_prx.todo("sys_prx_register_library(library=*0x%x)", library);
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_unregister_library(vm::ptr<void> library)
2014-06-23 19:40:40 +02:00
{
sys_prx.todo("sys_prx_unregister_library(library=*0x%x)", library);
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_get_ppu_guid()
{
sys_prx.todo("sys_prx_get_ppu_guid()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_register_module()
{
sys_prx.todo("sys_prx_register_module()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_query_module()
{
sys_prx.todo("sys_prx_query_module()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_link_library()
{
sys_prx.todo("sys_prx_link_library()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_unlink_library()
{
sys_prx.todo("sys_prx_unlink_library()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_query_library()
{
sys_prx.todo("sys_prx_query_library()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_start()
{
sys_prx.todo("sys_prx_start()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}
s32 sys_prx_stop()
{
sys_prx.todo("sys_prx_stop()");
2014-06-23 19:40:40 +02:00
return CELL_OK;
}