2012-11-15 00:39:56 +01:00
|
|
|
#include "stdafx.h"
|
2014-06-02 19:27:24 +02:00
|
|
|
#include "Emu/Memory/Memory.h"
|
|
|
|
|
#include "Emu/System.h"
|
2015-03-06 23:58:42 +01:00
|
|
|
#include "Emu/IdManager.h"
|
2012-11-15 00:39:56 +01:00
|
|
|
#include "Emu/SysCalls/SysCalls.h"
|
2014-08-23 16:51:51 +02:00
|
|
|
|
2015-03-06 23:58:42 +01:00
|
|
|
#include "Emu/FS/VFS.h"
|
2015-02-28 15:41:15 +01:00
|
|
|
#include "Emu/FS/vfsFile.h"
|
|
|
|
|
#include "Loader/PSF.h"
|
2014-09-17 15:15:17 +02:00
|
|
|
#include "sys_memory.h"
|
2014-06-25 00:38:34 +02:00
|
|
|
#include "sys_process.h"
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2014-08-23 16:51:51 +02:00
|
|
|
SysCallBase sys_process("sys_process");
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2014-08-09 18:04:53 +02:00
|
|
|
s32 process_getpid()
|
|
|
|
|
{
|
|
|
|
|
// TODO: get current process id
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_process_getpid()
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Log("sys_process_getpid() -> 1");
|
2014-08-09 18:04:53 +02:00
|
|
|
return process_getpid();
|
2012-11-15 00:39:56 +01:00
|
|
|
}
|
|
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_process_getppid()
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Todo("sys_process_getppid() -> 0");
|
2013-11-09 02:05:58 +01:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-04 18:00:02 +02:00
|
|
|
s32 sys_process_exit(s32 status)
|
2013-06-30 10:46:29 +02:00
|
|
|
{
|
2015-04-04 18:00:02 +02:00
|
|
|
sys_process.Warning("sys_process_exit(status=0x%x)", status);
|
|
|
|
|
|
|
|
|
|
LV2_LOCK;
|
|
|
|
|
|
|
|
|
|
if (!Emu.IsStopped())
|
2014-03-01 19:11:58 +01:00
|
|
|
{
|
2015-04-04 18:00:02 +02:00
|
|
|
sys_process.Success("Process finished");
|
|
|
|
|
|
|
|
|
|
CallAfter([]()
|
|
|
|
|
{
|
|
|
|
|
Emu.Stop();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
while (!Emu.IsStopped())
|
|
|
|
|
{
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-30 10:46:29 +02:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-22 00:27:58 +02:00
|
|
|
void sys_game_process_exitspawn(vm::cptr<char> path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags)
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2014-12-14 18:14:26 +01:00
|
|
|
std::string _path = path.get_ptr();
|
|
|
|
|
const std::string& from = "//";
|
|
|
|
|
const std::string& to = "/";
|
|
|
|
|
|
|
|
|
|
size_t start_pos = 0;
|
|
|
|
|
while ((start_pos = _path.find(from, start_pos)) != std::string::npos) {
|
|
|
|
|
_path.replace(start_pos, from.length(), to);
|
|
|
|
|
start_pos += to.length();
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Todo("sys_game_process_exitspawn()");
|
2014-12-14 18:14:26 +01:00
|
|
|
sys_process.Warning("path: %s", _path.c_str());
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Warning("argv: 0x%x", argv_addr);
|
|
|
|
|
sys_process.Warning("envp: 0x%x", envp_addr);
|
|
|
|
|
sys_process.Warning("data: 0x%x", data_addr);
|
|
|
|
|
sys_process.Warning("data_size: 0x%x", data_size);
|
|
|
|
|
sys_process.Warning("prio: %d", prio);
|
|
|
|
|
sys_process.Warning("flags: %d", flags);
|
2014-02-12 19:33:25 +01:00
|
|
|
|
2014-04-01 02:33:55 +02:00
|
|
|
std::vector<std::string> argv;
|
|
|
|
|
std::vector<std::string> env;
|
2014-02-12 19:33:25 +01:00
|
|
|
|
2014-12-14 18:14:26 +01:00
|
|
|
if (argv_addr)
|
2014-02-12 19:33:25 +01:00
|
|
|
{
|
2015-06-22 00:27:58 +02:00
|
|
|
auto argvp = vm::cpptr<char>::make(argv_addr);
|
2014-12-14 18:14:26 +01:00
|
|
|
while (argvp && *argvp)
|
|
|
|
|
{
|
|
|
|
|
argv.push_back(argvp[0].get_ptr());
|
|
|
|
|
argvp++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (auto &arg : argv) {
|
|
|
|
|
sys_process.Log("argument: %s", arg.c_str());
|
|
|
|
|
}
|
2014-02-12 19:33:25 +01:00
|
|
|
}
|
|
|
|
|
|
2014-12-14 18:14:26 +01:00
|
|
|
if (envp_addr)
|
|
|
|
|
{
|
2015-06-22 00:27:58 +02:00
|
|
|
auto envp = vm::cpptr<char>::make(envp_addr);
|
2014-12-14 18:14:26 +01:00
|
|
|
while (envp && *envp)
|
|
|
|
|
{
|
|
|
|
|
env.push_back(envp[0].get_ptr());
|
|
|
|
|
envp++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (auto &en : env) {
|
|
|
|
|
sys_process.Log("env_argument: %s", en.c_str());
|
|
|
|
|
}
|
2014-02-12 19:33:25 +01:00
|
|
|
}
|
2014-11-29 18:01:04 +01:00
|
|
|
|
2014-02-12 19:33:25 +01:00
|
|
|
//TODO: execute the file in <path> with the args in argv
|
|
|
|
|
//and the environment parameters in envp and copy the data
|
|
|
|
|
//from data_addr into the adress space of the new process
|
|
|
|
|
//then kill the current process
|
2014-11-29 18:01:04 +01:00
|
|
|
|
|
|
|
|
Emu.Pause();
|
|
|
|
|
sys_process.Success("Process finished");
|
|
|
|
|
|
|
|
|
|
CallAfter([]()
|
|
|
|
|
{
|
|
|
|
|
Emu.Stop();
|
|
|
|
|
});
|
|
|
|
|
|
2014-12-26 17:16:57 +01:00
|
|
|
std::string real_path;
|
2014-12-14 18:14:26 +01:00
|
|
|
|
2014-12-26 17:16:57 +01:00
|
|
|
Emu.GetVFS().GetDevice(_path.c_str(), real_path);
|
2014-12-14 18:14:26 +01:00
|
|
|
|
2014-12-26 17:16:57 +01:00
|
|
|
Emu.BootGame(real_path, true);
|
2014-12-14 18:14:26 +01:00
|
|
|
|
2014-02-12 19:33:25 +01:00
|
|
|
return;
|
2012-11-15 00:39:56 +01:00
|
|
|
}
|
2013-11-09 02:05:58 +01:00
|
|
|
|
2015-06-22 00:27:58 +02:00
|
|
|
void sys_game_process_exitspawn2(vm::cptr<char> path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags)
|
2014-02-12 19:33:25 +01:00
|
|
|
{
|
2014-12-14 18:14:26 +01:00
|
|
|
std::string _path = path.get_ptr();
|
|
|
|
|
const std::string& from = "//";
|
|
|
|
|
const std::string& to = "/";
|
|
|
|
|
|
|
|
|
|
size_t start_pos = 0;
|
|
|
|
|
while ((start_pos = _path.find(from, start_pos)) != std::string::npos) {
|
|
|
|
|
_path.replace(start_pos, from.length(), to);
|
|
|
|
|
start_pos += to.length();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sys_process.Warning("sys_game_process_exitspawn2()");
|
|
|
|
|
sys_process.Warning("path: %s", _path.c_str());
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Warning("argv: 0x%x", argv_addr);
|
|
|
|
|
sys_process.Warning("envp: 0x%x", envp_addr);
|
|
|
|
|
sys_process.Warning("data: 0x%x", data_addr);
|
|
|
|
|
sys_process.Warning("data_size: 0x%x", data_size);
|
|
|
|
|
sys_process.Warning("prio: %d", prio);
|
|
|
|
|
sys_process.Warning("flags: %d", flags);
|
2014-02-12 19:33:25 +01:00
|
|
|
|
2014-04-01 02:33:55 +02:00
|
|
|
std::vector<std::string> argv;
|
|
|
|
|
std::vector<std::string> env;
|
2014-02-12 19:33:25 +01:00
|
|
|
|
2014-12-14 18:14:26 +01:00
|
|
|
if (argv_addr)
|
2014-02-12 19:33:25 +01:00
|
|
|
{
|
2015-06-22 00:27:58 +02:00
|
|
|
auto argvp = vm::cpptr<char>::make(argv_addr);
|
2014-12-14 18:14:26 +01:00
|
|
|
while (argvp && *argvp)
|
|
|
|
|
{
|
|
|
|
|
argv.push_back(argvp[0].get_ptr());
|
|
|
|
|
argvp++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (auto &arg : argv)
|
|
|
|
|
{
|
|
|
|
|
sys_process.Log("argument: %s", arg.c_str());
|
|
|
|
|
}
|
2014-02-12 19:33:25 +01:00
|
|
|
}
|
2014-11-29 18:01:04 +01:00
|
|
|
|
2014-12-14 18:14:26 +01:00
|
|
|
if (envp_addr)
|
|
|
|
|
{
|
2015-06-22 00:27:58 +02:00
|
|
|
auto envp = vm::cpptr<char>::make(envp_addr);
|
2014-12-14 18:14:26 +01:00
|
|
|
while (envp && *envp)
|
|
|
|
|
{
|
|
|
|
|
env.push_back(envp[0].get_ptr());
|
|
|
|
|
envp++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (auto &en : env)
|
|
|
|
|
{
|
|
|
|
|
sys_process.Log("env_argument: %s", en.c_str());
|
|
|
|
|
}
|
2014-02-12 19:33:25 +01:00
|
|
|
}
|
2014-11-29 18:01:04 +01:00
|
|
|
|
2014-02-12 19:33:25 +01:00
|
|
|
//TODO: execute the file in <path> with the args in argv
|
|
|
|
|
//and the environment parameters in envp and copy the data
|
|
|
|
|
//from data_addr into the adress space of the new process
|
|
|
|
|
//then kill the current process
|
2014-11-29 18:01:04 +01:00
|
|
|
|
|
|
|
|
Emu.Pause();
|
|
|
|
|
sys_process.Success("Process finished");
|
|
|
|
|
|
|
|
|
|
CallAfter([]()
|
|
|
|
|
{
|
|
|
|
|
Emu.Stop();
|
|
|
|
|
});
|
2014-12-14 18:14:26 +01:00
|
|
|
|
2014-12-26 17:16:57 +01:00
|
|
|
std::string real_path;
|
2014-12-14 18:14:26 +01:00
|
|
|
|
2014-12-26 17:16:57 +01:00
|
|
|
Emu.GetVFS().GetDevice(_path.c_str(), real_path);
|
2014-12-14 18:14:26 +01:00
|
|
|
|
2014-12-26 17:16:57 +01:00
|
|
|
Emu.BootGame(real_path, true);
|
2014-11-29 18:01:04 +01:00
|
|
|
|
2014-02-12 19:33:25 +01:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-11 19:20:01 +02:00
|
|
|
s32 sys_process_get_number_of_object(u32 object, vm::ptr<u32> nump)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2015-05-27 05:11:59 +02:00
|
|
|
sys_process.Error("sys_process_get_number_of_object(object=0x%x, nump=*0x%x)", object, nump);
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2013-11-09 02:05:58 +01:00
|
|
|
switch(object)
|
|
|
|
|
{
|
2015-05-27 05:11:59 +02:00
|
|
|
case SYS_MEM_OBJECT:
|
|
|
|
|
case SYS_MUTEX_OBJECT:
|
|
|
|
|
case SYS_COND_OBJECT:
|
|
|
|
|
case SYS_RWLOCK_OBJECT:
|
|
|
|
|
case SYS_INTR_TAG_OBJECT:
|
|
|
|
|
case SYS_INTR_SERVICE_HANDLE_OBJECT:
|
|
|
|
|
case SYS_EVENT_QUEUE_OBJECT:
|
|
|
|
|
case SYS_EVENT_PORT_OBJECT:
|
|
|
|
|
case SYS_TRACE_OBJECT:
|
|
|
|
|
case SYS_SPUIMAGE_OBJECT:
|
|
|
|
|
case SYS_PRX_OBJECT:
|
|
|
|
|
case SYS_SPUPORT_OBJECT:
|
|
|
|
|
case SYS_LWMUTEX_OBJECT:
|
|
|
|
|
case SYS_TIMER_OBJECT:
|
|
|
|
|
case SYS_SEMAPHORE_OBJECT:
|
2014-12-24 17:09:32 +01:00
|
|
|
case SYS_FS_FD_OBJECT:
|
2015-05-27 05:11:59 +02:00
|
|
|
case SYS_LWCOND_OBJECT:
|
|
|
|
|
case SYS_EVENT_FLAG_OBJECT:
|
|
|
|
|
{
|
|
|
|
|
*nump = Emu.GetIdManager().get_count_by_type(object);
|
|
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
2013-11-09 02:05:58 +01:00
|
|
|
}
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2015-05-27 05:11:59 +02:00
|
|
|
return CELL_EINVAL;
|
2013-11-09 02:05:58 +01:00
|
|
|
}
|
|
|
|
|
|
2014-10-11 19:20:01 +02:00
|
|
|
s32 sys_process_get_id(u32 object, vm::ptr<u32> buffer, u32 size, vm::ptr<u32> set_size)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2015-05-27 05:11:59 +02:00
|
|
|
sys_process.Error("sys_process_get_id(object=0x%x, buffer=*0x%x, size=%d, set_size=*0x%x)", object, buffer, size, set_size);
|
2013-11-09 02:05:58 +01:00
|
|
|
|
2015-05-27 05:11:59 +02:00
|
|
|
switch (object)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2015-05-27 05:11:59 +02:00
|
|
|
case SYS_MEM_OBJECT:
|
|
|
|
|
case SYS_MUTEX_OBJECT:
|
|
|
|
|
case SYS_COND_OBJECT:
|
|
|
|
|
case SYS_RWLOCK_OBJECT:
|
|
|
|
|
case SYS_INTR_TAG_OBJECT:
|
|
|
|
|
case SYS_INTR_SERVICE_HANDLE_OBJECT:
|
|
|
|
|
case SYS_EVENT_QUEUE_OBJECT:
|
|
|
|
|
case SYS_EVENT_PORT_OBJECT:
|
|
|
|
|
case SYS_TRACE_OBJECT:
|
|
|
|
|
case SYS_SPUIMAGE_OBJECT:
|
|
|
|
|
case SYS_PRX_OBJECT:
|
|
|
|
|
case SYS_SPUPORT_OBJECT:
|
|
|
|
|
case SYS_LWMUTEX_OBJECT:
|
|
|
|
|
case SYS_TIMER_OBJECT:
|
|
|
|
|
case SYS_SEMAPHORE_OBJECT:
|
|
|
|
|
case SYS_FS_FD_OBJECT:
|
|
|
|
|
case SYS_LWCOND_OBJECT:
|
|
|
|
|
case SYS_EVENT_FLAG_OBJECT:
|
|
|
|
|
{
|
|
|
|
|
const auto objects = Emu.GetIdManager().get_IDs_by_type(object);
|
2013-11-09 02:05:58 +01:00
|
|
|
|
2015-05-27 05:11:59 +02:00
|
|
|
u32 i = 0;
|
2013-11-09 02:05:58 +01:00
|
|
|
|
2015-05-27 05:11:59 +02:00
|
|
|
for (auto id = objects.begin(); i < size && id != objects.end(); id++, i++)
|
|
|
|
|
{
|
|
|
|
|
buffer[i] = *id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*set_size = i;
|
|
|
|
|
|
|
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
2013-11-09 02:05:58 +01:00
|
|
|
}
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2015-05-27 05:11:59 +02:00
|
|
|
return CELL_EINVAL;
|
2013-11-09 02:05:58 +01:00
|
|
|
}
|
|
|
|
|
|
2014-09-17 15:15:17 +02:00
|
|
|
s32 process_is_spu_lock_line_reservation_address(u32 addr, u64 flags)
|
|
|
|
|
{
|
|
|
|
|
if (!flags || flags & ~(SYS_MEMORY_ACCESS_RIGHT_SPU_THR | SYS_MEMORY_ACCESS_RIGHT_RAW_SPU))
|
|
|
|
|
{
|
|
|
|
|
return CELL_EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s32 sys_process_is_spu_lock_line_reservation_address(u32 addr, u64 flags)
|
|
|
|
|
{
|
|
|
|
|
sys_process.Warning("sys_process_is_spu_lock_line_reservation_address(addr=0x%x, flags=0x%llx)", addr, flags);
|
|
|
|
|
|
|
|
|
|
return process_is_spu_lock_line_reservation_address(addr, flags);
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-28 17:38:48 +01:00
|
|
|
s32 _sys_process_get_paramsfo(vm::ptr<char> buffer)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2015-02-28 15:41:15 +01:00
|
|
|
sys_process.Warning("_sys_process_get_paramsfo(buffer=0x%x)", buffer);
|
2013-11-09 02:05:58 +01:00
|
|
|
|
2015-02-28 16:00:38 +01:00
|
|
|
if (!Emu.GetTitleID().length())
|
|
|
|
|
{
|
|
|
|
|
return CELL_ENOENT;
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-28 15:41:15 +01:00
|
|
|
memset(buffer.get_ptr(), 0, 0x40);
|
2015-02-28 17:38:48 +01:00
|
|
|
memcpy(buffer.get_ptr() + 1, Emu.GetTitleID().c_str(), std::min<size_t>(Emu.GetTitleID().length(), 9));
|
2013-11-09 02:05:58 +01:00
|
|
|
|
2015-02-28 16:00:38 +01:00
|
|
|
return CELL_OK;
|
2013-11-09 02:05:58 +01:00
|
|
|
}
|
|
|
|
|
|
2014-08-09 18:04:53 +02:00
|
|
|
s32 process_get_sdk_version(u32 pid, s32& ver)
|
|
|
|
|
{
|
2015-02-28 15:41:15 +01:00
|
|
|
// get correct SDK version for selected pid
|
|
|
|
|
ver = Emu.GetSDKVersion();
|
2014-08-09 18:04:53 +02:00
|
|
|
|
|
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-11 19:20:01 +02:00
|
|
|
s32 sys_process_get_sdk_version(u32 pid, vm::ptr<s32> version)
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2015-04-14 04:00:31 +02:00
|
|
|
sys_process.Warning("sys_process_get_sdk_version(pid=0x%x, version_addr=0x%x)", pid, version.addr());
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2014-08-09 18:04:53 +02:00
|
|
|
s32 sdk_ver;
|
|
|
|
|
s32 ret = process_get_sdk_version(pid, sdk_ver);
|
|
|
|
|
if (ret != CELL_OK)
|
|
|
|
|
{
|
|
|
|
|
return ret; // error code
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2014-09-01 02:51:48 +02:00
|
|
|
*version = sdk_ver;
|
2014-08-09 18:04:53 +02:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
2012-11-15 00:39:56 +01:00
|
|
|
}
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_process_kill(u32 pid)
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2015-04-14 04:00:31 +02:00
|
|
|
sys_process.Todo("sys_process_kill(pid=0x%x)", pid);
|
2012-11-15 00:39:56 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2014-10-11 19:20:01 +02:00
|
|
|
s32 sys_process_wait_for_child(u32 pid, vm::ptr<u32> status, u64 unk)
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2015-04-14 04:00:31 +02:00
|
|
|
sys_process.Todo("sys_process_wait_for_child(pid=0x%x, status_addr=0x%x, unk=0x%llx",
|
2014-09-01 02:51:48 +02:00
|
|
|
pid, status.addr(), unk);
|
2012-11-15 00:39:56 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_process_wait_for_child2(u64 unk1, u64 unk2, u64 unk3, u64 unk4, u64 unk5, u64 unk6)
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Todo("sys_process_wait_for_child2(unk1=0x%llx, unk2=0x%llx, unk3=0x%llx, unk4=0x%llx, unk5=0x%llx, unk6=0x%llx)",
|
2014-06-07 08:34:36 +02:00
|
|
|
unk1, unk2, unk3, unk4, unk5, unk6);
|
2012-11-15 00:39:56 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_process_get_status(u64 unk)
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Todo("sys_process_get_status(unk=0x%llx)", unk);
|
2014-09-06 15:33:01 +02:00
|
|
|
//vm::write32(CPU.GPR[4], GetPPUThreadStatus(CPU));
|
2012-11-15 00:39:56 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
2014-06-07 08:34:36 +02:00
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_process_detach_child(u64 unk)
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2014-08-23 16:51:51 +02:00
|
|
|
sys_process.Todo("sys_process_detach_child(unk=0x%llx)", unk);
|
2012-11-15 00:39:56 +01:00
|
|
|
return CELL_OK;
|
2013-11-03 20:23:16 +01:00
|
|
|
}
|