DH 2012-11-15 01:39:56 +02:00
parent de070bf485
commit a90b5cf37a
1998 changed files with 1034301 additions and 0 deletions

View file

@ -0,0 +1,126 @@
#include "stdafx.h"
#include "Emu/SysCalls/SysCalls.h"
#define PPU_THREAD_ID_INVALID 0xFFFFFFFFU
int SysCalls::lv2PPUThreadCreate(PPUThread& CPU)
{
ConLog.Write("lv2PPUThreadCreate:");
//ConLog.Write("**** id: %d", CPU.GPR[3]);
ConLog.Write("**** entry: 0x%x", CPU.GPR[4]);
ConLog.Write("**** arg: 0x%x", CPU.GPR[5]);
ConLog.Write("**** prio: 0x%x", CPU.GPR[6]);
ConLog.Write("**** stacksize: 0x%x", CPU.GPR[7]);
ConLog.Write("**** flags: 0x%x", CPU.GPR[8]);
ConLog.Write("**** threadname: \"%s\"[0x%x]", Memory.ReadString(CPU.GPR[9]), CPU.GPR[9]);
if(!Memory.IsGoodAddr(CPU.GPR[4])) return CELL_EFAULT;
PPCThread& new_thread = Emu.GetCPU().AddThread(true);
Memory.Write32(CPU.GPR[3], new_thread.GetId());
new_thread.SetPc(CPU.GPR[4]);
new_thread.SetArg(CPU.GPR[5]);
new_thread.SetPrio(CPU.GPR[6]);
new_thread.stack_size = CPU.GPR[7];
//new_thread.flags = CPU.GPR[8];
new_thread.SetName(Memory.ReadString(CPU.GPR[9]));
new_thread.Run();
return CELL_OK;
}
int SysCalls::lv2PPUThreadExit(PPUThread& CPU)
{
ConLog.Warning("PPU[%d] thread exit(%lld)", CPU.GetId(), CPU.GPR[3]);
Emu.GetCPU().RemoveThread(CPU.GetId());
return CELL_OK;
}
int SysCalls::lv2PPUThreadYield(PPUThread& CPU)
{
//ConLog.Warning("TODO: PPU[%d] thread yield!", CPU.GetId());
return CELL_OK;
}
int SysCalls::lv2PPUThreadJoin(PPUThread& CPU)
{
ConLog.Warning("TODO: PPU[%d] thread join!", CPU.GPR[3]);
return CELL_OK;
}
int SysCalls::lv2PPUThreadDetach(PPUThread& CPU)
{
ConLog.Warning("PPU[%d] thread detach", CPU.GPR[3]);
if(!Emu.GetIdManager().CheckID(CPU.GPR[3])) return CELL_ESRCH;
const ID& id = Emu.GetIdManager().GetIDData(CPU.GPR[3]);
if(!id.m_used) return CELL_ESRCH;
PPCThread& thread = *(PPCThread*)id.m_data;
if(thread.IsJoinable()) return CELL_EINVAL;
if(thread.IsJoining()) return CELL_EBUSY;
thread.SetJoinable(false);
if(!thread.IsRunned()) Emu.GetCPU().RemoveThread(thread.GetId());
return CELL_OK;
}
int SysCalls::lv2PPUThreadGetJoinState(PPUThread& CPU)
{
ConLog.Warning("PPU[%d] get join state", CPU.GetId());
Memory.Write32(CPU.GPR[3], CPU.IsJoinable() ? 1 : 0);
return CELL_OK;
}
int SysCalls::lv2PPUThreadSetPriority(PPUThread& CPU)
{
ConLog.Write("PPU[%d] thread set priority", CPU.GPR[3]);
if(!Emu.GetIdManager().CheckID(CPU.GPR[3])) return CELL_ESRCH;
const ID& id = Emu.GetIdManager().GetIDData(CPU.GPR[3]);
CPU.SetPrio(CPU.GPR[4]);
return CELL_OK;
}
int SysCalls::lv2PPUThreadGetPriority(PPUThread& CPU)
{
ConLog.Write("PPU[%d] thread get priority", CPU.GPR[3]);
if(!Emu.GetIdManager().CheckID(CPU.GPR[3])) return CELL_ESRCH;
const ID& id = Emu.GetIdManager().GetIDData(CPU.GPR[3]);
Memory.Write32(CPU.GPR[4], CPU.GetPrio());
return CELL_OK;
}
int SysCalls::lv2PPUThreadGetStackInformation(PPUThread& CPU)
{
ConLog.Write("PPU[%d] thread get stack information(0x%llx)", CPU.GetId(), CPU.GPR[3]);
Memory.Write32(CPU.GPR[3], CPU.GetStackAddr());
Memory.Write32(CPU.GPR[3]+4, CPU.GetStackSize());
return CELL_OK;
}
int SysCalls::lv2PPUThreadRename(PPUThread& CPU)
{
ConLog.Write("PPU[%d] thread rename(%s)", CPU.GPR[3], Memory.ReadString(CPU.GPR[4]));
return CELL_OK;
}
int SysCalls::lv2PPUThreadRecoverPageFault(PPUThread& CPU)
{
ConLog.Warning("TODO: PPU[%d] thread recover page fault!", CPU.GPR[3]);
return CELL_OK;
}
int SysCalls::lv2PPUThreadGetPageFaultContext(PPUThread& CPU)
{
ConLog.Warning("TODO: PPU[%d] thread get page fault context!", CPU.GPR[3]);
return CELL_OK;
}
int SysCalls::lv2PPUThreadGetId(PPUThread& CPU)
{
//ConLog.Write("PPU[%d] thread get id(0x%llx)", CPU.GetId(), CPU.GPR[3]);
Memory.Write64(CPU.GPR[3], CPU.GetId());
return CELL_OK;
}
int sys_spu_thread_once(u64 once_ctrl_addr, u64 init_addr)
{
return 0;
}