mirror of https://github.com/RPCS3/rpcs3.git
Implement _sys_prx_get_module_info
This commit is contained in:
parent
9a1ee9e984
commit
e4105f46de
|
@ -50,6 +50,7 @@ struct ppu_segment
|
||||||
u32 size;
|
u32 size;
|
||||||
u32 type;
|
u32 type;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
|
u32 filesz;
|
||||||
};
|
};
|
||||||
|
|
||||||
// PPU Module Information
|
// PPU Module Information
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "Utilities/VirtualMemory.h"
|
#include "Utilities/VirtualMemory.h"
|
||||||
#include "Utilities/bin_patch.h"
|
#include "Utilities/bin_patch.h"
|
||||||
#include "Crypto/sha1.h"
|
#include "Crypto/sha1.h"
|
||||||
|
@ -732,6 +732,7 @@ std::shared_ptr<lv2_prx> ppu_load_prx(const ppu_prx_object& elf, const std::stri
|
||||||
ppu_segment _seg;
|
ppu_segment _seg;
|
||||||
_seg.addr = addr;
|
_seg.addr = addr;
|
||||||
_seg.size = mem_size;
|
_seg.size = mem_size;
|
||||||
|
_seg.filesz = file_size;
|
||||||
_seg.type = p_type;
|
_seg.type = p_type;
|
||||||
_seg.flags = prog.p_flags;
|
_seg.flags = prog.p_flags;
|
||||||
prx->segs.emplace_back(_seg);
|
prx->segs.emplace_back(_seg);
|
||||||
|
@ -766,6 +767,7 @@ std::shared_ptr<lv2_prx> ppu_load_prx(const ppu_prx_object& elf, const std::stri
|
||||||
_sec.size = size;
|
_sec.size = size;
|
||||||
_sec.type = s.sh_type;
|
_sec.type = s.sh_type;
|
||||||
_sec.flags = s.sh_flags & 7;
|
_sec.flags = s.sh_flags & 7;
|
||||||
|
_sec.filesz = 0;
|
||||||
prx->secs.emplace_back(_sec);
|
prx->secs.emplace_back(_sec);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -885,7 +887,7 @@ std::shared_ptr<lv2_prx> ppu_load_prx(const ppu_prx_object& elf, const std::stri
|
||||||
struct ppu_prx_library_info
|
struct ppu_prx_library_info
|
||||||
{
|
{
|
||||||
be_t<u16> attributes;
|
be_t<u16> attributes;
|
||||||
be_t<u16> version;
|
u8 version[2];
|
||||||
char name[28];
|
char name[28];
|
||||||
be_t<u32> toc;
|
be_t<u32> toc;
|
||||||
be_t<u32> exports_start;
|
be_t<u32> exports_start;
|
||||||
|
@ -898,6 +900,11 @@ std::shared_ptr<lv2_prx> ppu_load_prx(const ppu_prx_object& elf, const std::stri
|
||||||
const auto& lib_info = vm::cptr<ppu_prx_library_info>(vm::cast(prx->segs[0].addr + elf.progs[0].p_paddr - elf.progs[0].p_offset, HERE));
|
const auto& lib_info = vm::cptr<ppu_prx_library_info>(vm::cast(prx->segs[0].addr + elf.progs[0].p_paddr - elf.progs[0].p_offset, HERE));
|
||||||
const auto& lib_name = std::string(lib_info->name);
|
const auto& lib_name = std::string(lib_info->name);
|
||||||
|
|
||||||
|
std::memcpy(prx->module_info_name, lib_info->name, sizeof(prx->module_info_name));
|
||||||
|
prx->module_info_version[0] = lib_info->version[0];
|
||||||
|
prx->module_info_version[1] = lib_info->version[1];
|
||||||
|
prx->module_info_attributes = lib_info->attributes;
|
||||||
|
|
||||||
LOG_WARNING(LOADER, "Library %s (rtoc=0x%x):", lib_name, lib_info->toc);
|
LOG_WARNING(LOADER, "Library %s (rtoc=0x%x):", lib_name, lib_info->toc);
|
||||||
|
|
||||||
prx->specials = ppu_load_exports(link, lib_info->exports_start, lib_info->exports_end);
|
prx->specials = ppu_load_exports(link, lib_info->exports_start, lib_info->exports_end);
|
||||||
|
@ -979,6 +986,7 @@ void ppu_load_exec(const ppu_exec_object& elf)
|
||||||
const u32 size = _seg.size = ::narrow<u32>(prog.p_memsz, "p_memsz" HERE);
|
const u32 size = _seg.size = ::narrow<u32>(prog.p_memsz, "p_memsz" HERE);
|
||||||
const u32 type = _seg.type = prog.p_type;
|
const u32 type = _seg.type = prog.p_type;
|
||||||
const u32 flag = _seg.flags = prog.p_flags;
|
const u32 flag = _seg.flags = prog.p_flags;
|
||||||
|
_seg.filesz = ::narrow<u32>(prog.p_filesz, "p_filesz" HERE);
|
||||||
|
|
||||||
// Hash big-endian values
|
// Hash big-endian values
|
||||||
sha1_update(&sha, (uchar*)&prog.p_type, sizeof(prog.p_type));
|
sha1_update(&sha, (uchar*)&prog.p_type, sizeof(prog.p_type));
|
||||||
|
@ -1019,6 +1027,7 @@ void ppu_load_exec(const ppu_exec_object& elf)
|
||||||
const u32 size = _sec.size = vm::cast(s.sh_size);
|
const u32 size = _sec.size = vm::cast(s.sh_size);
|
||||||
const u32 type = _sec.type = s.sh_type;
|
const u32 type = _sec.type = s.sh_type;
|
||||||
const u32 flag = _sec.flags = s.sh_flags & 7;
|
const u32 flag = _sec.flags = s.sh_flags & 7;
|
||||||
|
_sec.filesz = 0;
|
||||||
|
|
||||||
if (s.sh_type == 1 && addr && size)
|
if (s.sh_type == 1 && addr && size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -306,7 +306,43 @@ error_code _sys_prx_get_module_list(u64 flags, vm::ptr<sys_prx_get_module_list_o
|
||||||
|
|
||||||
error_code _sys_prx_get_module_info(u32 id, u64 flags, vm::ptr<sys_prx_module_info_option_t> pOpt)
|
error_code _sys_prx_get_module_info(u32 id, u64 flags, vm::ptr<sys_prx_module_info_option_t> pOpt)
|
||||||
{
|
{
|
||||||
sys_prx.todo("_sys_prx_get_module_info(id=0x%x, flags=%d, pOpt=*0x%x)", id, flags, pOpt);
|
sys_prx.warning("_sys_prx_get_module_info(id=0x%x, flags=%d, pOpt=*0x%x)", id, flags, pOpt);
|
||||||
|
|
||||||
|
const auto prx = idm::get<lv2_obj, lv2_prx>(id);
|
||||||
|
|
||||||
|
if (!pOpt || !pOpt->info || !prx)
|
||||||
|
{
|
||||||
|
return CELL_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::memset(pOpt->info->name, 0, 30);
|
||||||
|
std::memcpy(pOpt->info->name, prx->module_info_name, 28);
|
||||||
|
pOpt->info->version[0] = prx->module_info_version[0];
|
||||||
|
pOpt->info->version[1] = prx->module_info_version[1];
|
||||||
|
pOpt->info->modattribute = prx->module_info_attributes;
|
||||||
|
pOpt->info->start_entry = prx->start.addr();
|
||||||
|
pOpt->info->stop_entry = prx->stop.addr();
|
||||||
|
pOpt->info->all_segments_num = prx->segs.size();
|
||||||
|
if (pOpt->info->filename)
|
||||||
|
{
|
||||||
|
std::strncpy(pOpt->info->filename.get_ptr(), prx->name.c_str(), pOpt->info->filename_size);
|
||||||
|
pOpt->info->filename[pOpt->info->filename_size - 1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pOpt->info->segments)
|
||||||
|
{
|
||||||
|
u32 i = 0;
|
||||||
|
for (; i < prx->segs.size() && i < pOpt->info->segments_num; i++)
|
||||||
|
{
|
||||||
|
pOpt->info->segments[i].index = i;
|
||||||
|
pOpt->info->segments[i].base = prx->segs[i].addr;
|
||||||
|
pOpt->info->segments[i].filesz = prx->segs[i].filesz;
|
||||||
|
pOpt->info->segments[i].memsz = prx->segs[i].size;
|
||||||
|
pOpt->info->segments[i].type = prx->segs[i].type;
|
||||||
|
}
|
||||||
|
pOpt->info->segments_num = i;
|
||||||
|
}
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,10 @@ struct lv2_prx final : lv2_obj, ppu_module
|
||||||
vm::ps3::ptr<s32(u64 callback, u64 argc, vm::ps3::ptr<void, u64> argv)> prologue = vm::null;
|
vm::ps3::ptr<s32(u64 callback, u64 argc, vm::ps3::ptr<void, u64> argv)> prologue = vm::null;
|
||||||
vm::ps3::ptr<s32(u64 callback, u64 argc, vm::ps3::ptr<void, u64> argv)> epilogue = vm::null;
|
vm::ps3::ptr<s32(u64 callback, u64 argc, vm::ps3::ptr<void, u64> argv)> epilogue = vm::null;
|
||||||
vm::ps3::ptr<s32()> exit = vm::null;
|
vm::ps3::ptr<s32()> exit = vm::null;
|
||||||
|
|
||||||
|
char module_info_name[28];
|
||||||
|
u8 module_info_version[2];
|
||||||
|
be_t<u16> module_info_attributes;
|
||||||
};
|
};
|
||||||
|
|
||||||
// SysCalls
|
// SysCalls
|
||||||
|
|
Loading…
Reference in New Issue