mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-06 06:55:09 +00:00
Exitspawn support renewal
Implemented _sys_process_exit2 syscall Rewritten sys_game_process_exitspawn Rewritten sys_game_process_exitspawn2 Implemented _sys_process_atexitspawn Implemented _sys_process_at_Exitspawn And some other changes
This commit is contained in:
parent
18d472b7e1
commit
519f21db18
15 changed files with 285 additions and 198 deletions
|
|
@ -1360,7 +1360,7 @@ void ppu_load_exec(const ppu_exec_object& elf)
|
|||
|
||||
// Set path (TODO)
|
||||
_main->name = "";
|
||||
_main->path = vfs::get(Emu.GetPath());
|
||||
_main->path = vfs::get(Emu.argv[0]);
|
||||
|
||||
// Analyse executable (TODO)
|
||||
_main->analyse(0, static_cast<u32>(elf.header.e_entry));
|
||||
|
|
@ -1372,27 +1372,42 @@ void ppu_load_exec(const ppu_exec_object& elf)
|
|||
g_ps3_sdk_version = sdk_version;
|
||||
|
||||
// Initialize process arguments
|
||||
std::initializer_list<std::string> args = { Emu.GetPath()/*, "-emu"s*/ };
|
||||
auto args = vm::ptr<u64>::make(vm::alloc(SIZE_32(u64) * (::size32(Emu.argv) + ::size32(Emu.envp) + 2), vm::main));
|
||||
auto argv = args;
|
||||
|
||||
auto argv = vm::ptr<u64>::make(vm::alloc(SIZE_32(u64) * ::size32(args), vm::main));
|
||||
auto envp = vm::ptr<u64>::make(vm::alloc(::align(SIZE_32(u64), 0x10), vm::main));
|
||||
*envp = 0;
|
||||
|
||||
for (const auto& arg : args)
|
||||
for (const auto& arg : Emu.argv)
|
||||
{
|
||||
const u32 arg_size = ::align(::size32(arg) + 1, 0x10);
|
||||
const u32 arg_addr = vm::alloc(arg_size, vm::main);
|
||||
|
||||
std::memcpy(vm::base(arg_addr), arg.data(), arg_size);
|
||||
|
||||
*argv++ = arg_addr;
|
||||
*args++ = arg_addr;
|
||||
}
|
||||
|
||||
argv -= ::size32(args);
|
||||
*args++ = 0;
|
||||
auto envp = args;
|
||||
|
||||
for (const auto& arg : Emu.envp)
|
||||
{
|
||||
const u32 arg_size = ::align(::size32(arg) + 1, 0x10);
|
||||
const u32 arg_addr = vm::alloc(arg_size, vm::main);
|
||||
|
||||
std::memcpy(vm::base(arg_addr), arg.data(), arg_size);
|
||||
|
||||
*args++ = arg_addr;
|
||||
}
|
||||
|
||||
// Initialize main thread
|
||||
auto ppu = idm::make_ptr<ppu_thread>("main_thread", primary_prio, primary_stacksize);
|
||||
|
||||
// Write initial data (exitspawn)
|
||||
if (Emu.data.size())
|
||||
{
|
||||
std::memcpy(vm::base(ppu->stack_addr + ppu->stack_size - ::size32(Emu.data)), Emu.data.data(), Emu.data.size());
|
||||
ppu->gpr[1] -= Emu.data.size();
|
||||
}
|
||||
|
||||
ppu->cmd_push({ppu_cmd::initialize, 0});
|
||||
|
||||
// TODO: adjust for liblv2 loading option
|
||||
|
|
@ -1434,7 +1449,7 @@ void ppu_load_exec(const ppu_exec_object& elf)
|
|||
// Set command line arguments, run entry function
|
||||
ppu->cmd_list
|
||||
({
|
||||
{ ppu_cmd::set_args, 8 }, u64{args.size()}, u64{argv.addr()}, u64{envp.addr()}, u64{0}, u64{ppu->id}, u64{tls_vaddr}, u64{tls_fsize}, u64{tls_vsize},
|
||||
{ ppu_cmd::set_args, 8 }, u64{Emu.argv.size()}, u64{argv.addr()}, u64{envp.addr()}, u64{0}, u64{ppu->id}, u64{tls_vaddr}, u64{tls_fsize}, u64{tls_vsize},
|
||||
{ ppu_cmd::set_gpr, 11 }, u64{elf.header.e_entry},
|
||||
{ ppu_cmd::set_gpr, 12 }, u64{malloc_pagesize},
|
||||
{ ppu_cmd::lle_call, entry },
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue