Allow to load liblv2.sprx with manual/both lib loading options (#6274)

This commit is contained in:
Eladash 2019-08-07 18:41:27 +03:00 committed by Ivan
parent 05813c7e90
commit 112ad9dda2

View file

@ -1294,10 +1294,18 @@ void ppu_load_exec(const ppu_exec_object& elf)
} }
if (g_cfg.core.lib_loading == lib_loading_type::automatic || g_cfg.core.lib_loading == lib_loading_type::both) if (g_cfg.core.lib_loading == lib_loading_type::automatic || g_cfg.core.lib_loading == lib_loading_type::both)
{
if (g_cfg.core.lib_loading == lib_loading_type::both && g_cfg.core.load_libraries.get_set().count("liblv2.sprx"))
{
// Will load libsysmodule.sprx internally
load_libs.emplace("liblv2.sprx");
}
else
{ {
// Load only libsysmodule.sprx // Load only libsysmodule.sprx
load_libs.emplace("libsysmodule.sprx"); load_libs.emplace("libsysmodule.sprx");
} }
}
else if (0) else if (0)
{ {
// Load recommended set of modules: Module name -> SPRX // Load recommended set of modules: Module name -> SPRX
@ -1422,6 +1430,9 @@ void ppu_load_exec(const ppu_exec_object& elf)
} }
} }
// Program entry
u32 entry = 0;
if (!load_libs.empty()) if (!load_libs.empty())
{ {
const std::string lle_dir = vfs::get("/dev_flash/sys/external/"); const std::string lle_dir = vfs::get("/dev_flash/sys/external/");
@ -1453,8 +1464,16 @@ void ppu_load_exec(const ppu_exec_object& elf)
prx->validate(prx->funcs[0].addr); prx->validate(prx->funcs[0].addr);
} }
if (name == "liblv2.sprx")
{
// Run liblv2.sprx entry point (TODO)
entry = prx->start.addr();
}
else
{
loaded_modules.emplace_back(std::move(prx)); loaded_modules.emplace_back(std::move(prx));
} }
}
else else
{ {
fmt::throw_exception("Failed to load /dev_flash/sys/external/%s: %s", name, obj.get_error()); fmt::throw_exception("Failed to load /dev_flash/sys/external/%s: %s", name, obj.get_error());
@ -1588,10 +1607,7 @@ void ppu_load_exec(const ppu_exec_object& elf)
ppu->cmd_push({ppu_cmd::initialize, 0}); ppu->cmd_push({ppu_cmd::initialize, 0});
// TODO: adjust for liblv2 loading option if (!entry)
u32 entry = static_cast<u32>(elf.header.e_entry);
if (g_cfg.core.lib_loading != lib_loading_type::liblv2only)
{ {
// Set TLS args, call sys_initialize_tls // Set TLS args, call sys_initialize_tls
ppu->cmd_list ppu->cmd_list
@ -1599,13 +1615,8 @@ void ppu_load_exec(const ppu_exec_object& elf)
{ ppu_cmd::set_args, 4 }, u64{ppu->id}, u64{tls_vaddr}, u64{tls_fsize}, u64{tls_vsize}, { ppu_cmd::set_args, 4 }, u64{ppu->id}, u64{tls_vaddr}, u64{tls_fsize}, u64{tls_vsize},
{ ppu_cmd::hle_call, FIND_FUNC(sys_initialize_tls) }, { ppu_cmd::hle_call, FIND_FUNC(sys_initialize_tls) },
}); });
}
else
{
// Run liblv2.sprx entry point (TODO)
entry = loaded_modules[0]->start.addr();
loaded_modules.clear(); entry = static_cast<u32>(elf.header.e_entry); // Run entry from elf
} }
// Run start functions // Run start functions