diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.h b/rpcs3/Emu/ARMv7/ARMv7Thread.h index d80d5c9669..a7a12fb98b 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.h +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.h @@ -123,6 +123,7 @@ public: virtual void InitRegs(); virtual void InitStack(); u32 GetStackArg(u32 pos); + virtual void DoRun(); public: virtual std::string RegsToString(); @@ -131,7 +132,6 @@ public: protected: virtual void DoReset(); - virtual void DoRun(); virtual void DoPause(); virtual void DoResume(); virtual void DoStop(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp index 529a0bdc42..18a29f85eb 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp @@ -1,10 +1,14 @@ #include "stdafx.h" #include "Emu/System.h" #include "Emu/Memory/Memory.h" +#include "Emu/CPU/CPUThreadManager.h" +#include "Emu/ARMv7/ARMv7Thread.h" #include "Emu/ARMv7/PSVFuncList.h" extern psv_log_base sceLibKernel; +#define RETURN_ERROR(code) { Emu.Pause(); sceLibKernel.Error("%s() failed: %s", __FUNCTION__, #code); return code; } + #pragma pack(push, 4) typedef s32(*SceKernelThreadEntry)(u32 argSize, vm::psv::ptr pArgBlock); @@ -80,7 +84,7 @@ struct SceKernelSystemInfo } cpuInfo[4]; }; -#pragma pack(pop, 4) +#pragma pack(pop) s32 sceKernelCreateThread( vm::psv::ptr pName, @@ -91,16 +95,48 @@ s32 sceKernelCreateThread( s32 cpuAffinityMask, vm::psv::ptr pOptParam) { - sceLibKernel.Todo("sceKernelCreateThread(pName_addr=0x%x ('%s'), entry_addr=0x%x, initPriority=%d, stackSize=0x%x, attr=0x%x, cpuAffinityMask=0x%x, pOptParam_addr=0x%x)", + sceLibKernel.Error("sceKernelCreateThread(pName_addr=0x%x ('%s'), entry_addr=0x%x, initPriority=%d, stackSize=0x%x, attr=0x%x, cpuAffinityMask=0x%x, pOptParam_addr=0x%x)", pName.addr(), pName.get_ptr(), entry.addr(), initPriority, stackSize, attr, cpuAffinityMask, pOptParam.addr()); - return SCE_OK; + std::string name = pName.get_ptr(); + + ARMv7Thread& new_thread = *(ARMv7Thread*)&Emu.GetCPU().AddThread(CPU_THREAD_ARMv7); + + u32 id = new_thread.GetId(); + new_thread.SetEntry(entry.addr() ^ 1); + new_thread.SetPrio(initPriority); + new_thread.SetStackSize(stackSize); + new_thread.SetName(name); + + sceLibKernel.Error("*** New ARMv7 Thread [%s] (entry=0x%x): id = %d", name.c_str(), entry, id); + + new_thread.Run(); + + Emu.Pause(); + + return id; } s32 sceKernelStartThread(s32 threadId, u32 argSize, vm::psv::ptr pArgBlock) { - sceLibKernel.Todo("sceKernelStartThread(threadId=%d, argSize=%d, pArgBlock_addr=0x%x)", threadId, argSize, pArgBlock.addr()); + sceLibKernel.Error("sceKernelStartThread(threadId=%d, argSize=%d, pArgBlock_addr=0x%x)", threadId, argSize, pArgBlock.addr()); + CPUThread* t = Emu.GetCPU().GetThread(threadId); + + if (!t || t->GetType() != CPU_THREAD_ARMv7) + { + RETURN_ERROR(SCE_KERNEL_ERROR_INVALID_UID); + } + + // push arg block onto the stack + u32 pos = (static_cast(t)->SP -= argSize); + memcpy(vm::get_ptr(pos), pArgBlock.get_ptr(), argSize); + + // set SceKernelThreadEntry function arguments + static_cast(t)->write_gpr(0, argSize); + static_cast(t)->write_gpr(1, pos); + + t->Exec(); return SCE_OK; } diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index 7a956f9e4d..38988ce35a 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -1,6 +1,6 @@ #pragma once -class PPUThread; +class CPUThread; namespace vm { @@ -321,9 +321,9 @@ namespace vm public: typedef RT(*type)(T...); - RT call(PPUThread& CPU, T... args) const; // call using specified PPU thread context, defined in Callback.h (CB_FUNC.h) + RT call(CPUThread& CPU, T... args) const; // call using specified CPU thread context, defined in CB_FUNC.h - RT operator()(T... args) const; // call using current PPU thread context, defined in Callback.h (CB_FUNC.h) + RT operator()(T... args) const; // call using current CPU thread context, defined in CB_FUNC.h AT addr() const { diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 7bfc5daa6c..9d5c60a3df 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -7,6 +7,7 @@ #include "RSXThread.h" #include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/SysCalls/lv2/sys_time.h" #define ARGS(x) (x >= count ? OutOfArgsCount(x, cmd, count, args.addr()) : args[x].ToLE()) diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 2ad4dfe254..d38b45fec1 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -3,7 +3,6 @@ #include "RSXTexture.h" #include "RSXVertexProgram.h" #include "RSXFragmentProgram.h" -#include "Emu/SysCalls/Callback.h" #include #include "Utilities/SSemaphore.h" diff --git a/rpcs3/Emu/SysCalls/CB_FUNC.h b/rpcs3/Emu/SysCalls/CB_FUNC.h index 6d3ab37f40..35588da48a 100644 --- a/rpcs3/Emu/SysCalls/CB_FUNC.h +++ b/rpcs3/Emu/SysCalls/CB_FUNC.h @@ -165,12 +165,12 @@ namespace cb_detail namespace vm { template - __forceinline RT _ptr_base::call(PPUThread& CPU, T... args) const + __forceinline RT _ptr_base::call(CPUThread& CPU, T... args) const { const u32 pc = vm::get_ref>(m_addr); const u32 rtoc = vm::get_ref>(m_addr + 4); - return cb_detail::_func_caller::call(CPU, pc, rtoc, args...); + return cb_detail::_func_caller::call(static_cast(CPU), pc, rtoc, args...); } template diff --git a/rpcs3/Emu/SysCalls/Callback.cpp b/rpcs3/Emu/SysCalls/Callback.cpp index 310316a6cd..71fa8ba830 100644 --- a/rpcs3/Emu/SysCalls/Callback.cpp +++ b/rpcs3/Emu/SysCalls/Callback.cpp @@ -1,10 +1,10 @@ #include "stdafx.h" #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" -#include "ErrorCodes.h" #include "Emu/System.h" #include "Emu/CPU/CPUThreadManager.h" #include "Emu/Cell/PPUThread.h" +#include "Emu/ARMv7/ARMv7Thread.h" #include "Callback.h" void CallbackManager::Register(const std::function& func) @@ -51,14 +51,28 @@ void CallbackManager::Init() { std::lock_guard lock(m_mutex); - m_cb_thread = (PPUThread*)&Emu.GetCPU().AddThread(CPU_THREAD_PPU); - m_cb_thread->SetName("Callback Thread"); - m_cb_thread->SetEntry(0); - m_cb_thread->SetPrio(1001); - m_cb_thread->SetStackSize(0x10000); - m_cb_thread->InitStack(); - m_cb_thread->InitRegs(); - m_cb_thread->DoRun(); + if (Memory.PSV.RAM.GetStartAddr()) + { + m_cb_thread = &Emu.GetCPU().AddThread(CPU_THREAD_ARMv7); + m_cb_thread->SetName("Callback Thread"); + m_cb_thread->SetEntry(0); + m_cb_thread->SetPrio(1001); + m_cb_thread->SetStackSize(0x10000); + m_cb_thread->InitStack(); + m_cb_thread->InitRegs(); + static_cast(m_cb_thread)->DoRun(); + } + else + { + m_cb_thread = &Emu.GetCPU().AddThread(CPU_THREAD_PPU); + m_cb_thread->SetName("Callback Thread"); + m_cb_thread->SetEntry(0); + m_cb_thread->SetPrio(1001); + m_cb_thread->SetStackSize(0x10000); + m_cb_thread->InitStack(); + m_cb_thread->InitRegs(); + static_cast(m_cb_thread)->DoRun(); + } thread cb_async_thread("CallbackManager::Async() thread", [this]() { diff --git a/rpcs3/Emu/SysCalls/Callback.h b/rpcs3/Emu/SysCalls/Callback.h index 7f5f00a3b7..ba16b38830 100644 --- a/rpcs3/Emu/SysCalls/Callback.h +++ b/rpcs3/Emu/SysCalls/Callback.h @@ -1,11 +1,12 @@ #pragma once -#include "CB_FUNC.h" + +class CPUThread; class CallbackManager { std::vector> m_cb_list; std::vector> m_async_list; - PPUThread* m_cb_thread; + CPUThread* m_cb_thread; std::mutex m_mutex; public: diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index e23461cda8..dd415ddb0a 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" extern std::mutex g_mutex_avcodec_open2; diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index 116169406e..3aa36b77c4 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/CPU/CPUThreadManager.h" #include "cellPamf.h" diff --git a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp index 2e320f6a49..07264be69a 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Utilities/rMsgBox.h" #include "Emu/FS/VFS.h" diff --git a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp index 9b61ce5ce3..1c47579895 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp @@ -2,6 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "sysPrxForUser.h" //#include "Emu/RSX/GCM.h" @@ -288,9 +289,11 @@ int cellGcmGetConfiguration(vm::ptr config) int cellGcmGetFlipStatus() { - cellGcmSys->Log("cellGcmGetFlipStatus()"); + int status = Emu.GetGSManager().GetRender().m_flip_status; - return Emu.GetGSManager().GetRender().m_flip_status; + cellGcmSys->Log("cellGcmGetFlipStatus() -> %d", status); + + return status; } u32 cellGcmGetTiledPitchSize(u32 size) @@ -498,10 +501,16 @@ s32 cellGcmSetPrepareFlip(vm::ptr ctxt, u32 id) GSLockCurrent gslock(GS_LOCK_WAIT_FLUSH); u32 current = ctxt->current; - u32 end = ctxt->end; - if(current + 8 >= end) + if (current + 8 == ctxt->begin) { + cellGcmSys->Error("cellGcmSetPrepareFlip : queue is full"); + return CELL_GCM_ERROR_FAILURE; + } + + if (current + 8 >= ctxt->end) + { + cellGcmSys->Error("Bad flip!"); if (s32 res = ctxt->callback(ctxt, 8 /* ??? */)) { cellGcmSys->Error("cellGcmSetPrepareFlip : callback failed (0x%08x)", res); diff --git a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp index 9ba08b4753..bbda084de9 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp @@ -3,6 +3,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Utilities/Log.h" #include "Utilities/rMsgBox.h" diff --git a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp index e5796c775a..de2d5307a3 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/FS/VFS.h" #include "Emu/FS/vfsFile.h" diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index 9a293f5476..a74cebba53 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/Cell/SPUThread.h" #include "Emu/SysCalls/lv2/sys_ppu_thread.h" @@ -953,7 +953,7 @@ s64 cellSpursAttributeEnableSystemWorkload(vm::ptr attr, vm: s64 cellSpursFinalize(vm::ptr spurs) { - cellSpurs->Warning("cellSpursFinalize(spurs_addr=0x%x)", spurs.addr()); + cellSpurs->Todo("cellSpursFinalize(spurs_addr=0x%x)", spurs.addr()); #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x8568, libsre_rtoc); #endif diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index e77004872a..6bc6afcca6 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/SysCalls/lv2/sys_process.h" #include "Emu/Event.h" diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index 2c4271e8ff..aa7458e940 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -4,6 +4,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/DbgCommand.h" #include "rpcs3/Ini.h" diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp index 55f4b9c2ec..12b28591c8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" std::mutex g_mutex_avcodec_open2; diff --git a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp index 76fae67e3f..bd7527c5cf 100644 --- a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp +++ b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/CPU/CPUThreadManager.h" #include "Emu/Audio/cellAudio.h" diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 375a830aa3..a145f5556b 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "rpcs3/Ini.h" #include "Utilities/rXml.h" diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp index 78c7054e82..3c3caf9b7f 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/FS/vfsFile.h" #include "Emu/SysCalls/lv2/sys_spu.h" diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index 8cbefa8055..46e255925d 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -3,6 +3,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/FS/VFS.h" #include "Emu/FS/vfsFileBase.h" diff --git a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp index fb7772db2e..0b08bb7055 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp @@ -2,7 +2,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -#include "Emu/SysCalls/Callback.h" +#include "Emu/SysCalls/CB_FUNC.h" #include "Emu/Memory/atomic_type.h" #include "Emu/CPU/CPUThreadManager.h" diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index e6c3ff9e3f..4d9e63baf0 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -15,6 +15,7 @@ #include "Emu/DbgCommand.h" #include "Emu/CPU/CPUThreadManager.h" +#include "Emu/SysCalls/Callback.h" #include "Emu/IdManager.h" #include "Emu/Io/Pad.h" #include "Emu/Io/Keyboard.h"