mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
And more
This commit is contained in:
parent
26547e2629
commit
16dcb9ee8a
5 changed files with 28 additions and 13 deletions
|
@ -130,6 +130,7 @@ static void hleDelayResultFinish(u64 userdata, int cycleslate) {
|
|||
|
||||
void HLEInit() {
|
||||
RegisterAllModules();
|
||||
g_stackSize = 0;
|
||||
delayedResultEvent = CoreTiming::RegisterEvent("HLEDelayedResult", hleDelayResultFinish);
|
||||
idleOp = GetSyscallOp("FakeSysCalls", NID_IDLE);
|
||||
}
|
||||
|
@ -169,7 +170,6 @@ void HLEDoState(PointerWrap &p) {
|
|||
|
||||
void HLEShutdown() {
|
||||
hleAfterSyscall = HLE_AFTER_NOTHING;
|
||||
g_stackSize = 0;
|
||||
moduleDB.clear();
|
||||
enqueuedMipsCalls.clear();
|
||||
for (auto p : mipsCallActions) {
|
||||
|
|
|
@ -282,8 +282,8 @@ inline R hleCallImpl(std::string_view module, std::string_view funcName, F func,
|
|||
#define hleLogVerbose(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'x', ##__VA_ARGS__)
|
||||
|
||||
// If res is negative, log warn/error, otherwise log debug.
|
||||
#define hleLogSuccessOrWarn(t, res, ...) hleLogHelper(t, (int)res < 0 ? LogLevel::LWARNING : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
|
||||
#define hleLogSuccessOrError(t, res, ...) hleLogHelper(t, (int)res < 0 ? LogLevel::LERROR : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
|
||||
#define hleLogSuccessOrWarn(t, res, ...) hleLogHelper(t, ((int)res < 0 ? LogLevel::LWARNING : HLE_LOG_LDEBUG), res, 'x', ##__VA_ARGS__)
|
||||
#define hleLogSuccessOrError(t, res, ...) hleLogHelper(t, ((int)res < 0 ? LogLevel::LERROR : HLE_LOG_LDEBUG), res, 'x', ##__VA_ARGS__)
|
||||
|
||||
// NOTE: hleLogDebug is equivalent to hleLogSuccessI/X.
|
||||
#define hleLogDebug(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
|
||||
|
|
|
@ -2218,6 +2218,7 @@ int __KernelStartModule(SceUID moduleId, u32 argsize, u32 argAddr, u32 returnVal
|
|||
|
||||
SceUID threadID = __KernelCreateThread(module->nm.name, moduleId, entryAddr, priority, stacksize, attribute, 0, (module->nm.attribute & 0x1000) != 0);
|
||||
_dbg_assert_(threadID > 0);
|
||||
// TOOD: Check the return value and bail?
|
||||
__KernelStartThreadValidate(threadID, argsize, argAddr);
|
||||
__KernelSetThreadRA(threadID, NID_MODULERETURN);
|
||||
|
||||
|
@ -2314,6 +2315,7 @@ static u32 sceKernelStopModule(u32 moduleId, u32 argSize, u32 argAddr, u32 retur
|
|||
{
|
||||
SceUID threadID = __KernelCreateThread(module->nm.name, moduleId, stopFunc, priority, stacksize, attr, 0, (module->nm.attribute & 0x1000) != 0);
|
||||
_dbg_assert_(threadID > 0);
|
||||
// TOOD: Check the return value and bail?
|
||||
__KernelStartThreadValidate(threadID, argSize, argAddr);
|
||||
__KernelSetThreadRA(threadID, NID_MODULERETURN);
|
||||
__KernelWaitCurThread(WAITTYPE_MODULE, moduleId, 1, 0, false, "stopped module");
|
||||
|
@ -2397,6 +2399,7 @@ u32 __KernelStopUnloadSelfModuleWithOrWithoutStatus(u32 exitCode, u32 argSize, u
|
|||
if (Memory::IsValidAddress(stopFunc)) {
|
||||
SceUID threadID = __KernelCreateThread(module->nm.name, moduleID, stopFunc, priority, stacksize, attr, 0, (module->nm.attribute & 0x1000) != 0);
|
||||
_dbg_assert_(threadID > 0);
|
||||
// TOOD: Check the return value and bail?
|
||||
__KernelStartThreadValidate(threadID, argSize, argp);
|
||||
__KernelSetThreadRA(threadID, NID_MODULERETURN);
|
||||
__KernelWaitCurThread(WAITTYPE_MODULE, moduleID, 1, 0, false, "unloadstopped module");
|
||||
|
|
|
@ -2093,19 +2093,29 @@ int __KernelStartThread(SceUID threadToStartID, int argSize, u32 argBlockPtr, bo
|
|||
return 0;
|
||||
}
|
||||
|
||||
// This gets called from other places, so we don't use the hleLog* here.
|
||||
int __KernelStartThreadValidate(SceUID threadToStartID, int argSize, u32 argBlockPtr, bool forceArgs) {
|
||||
if (threadToStartID == 0)
|
||||
return hleLogError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_THID, "thread id is 0");
|
||||
if (argSize < 0 || argBlockPtr & 0x80000000)
|
||||
return hleReportError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_ADDR, "bad thread argument pointer/length %08x / %08x", argSize, argBlockPtr);
|
||||
if (threadToStartID == 0) {
|
||||
ERROR_LOG(Log::sceKernel, "thread id is 0");
|
||||
return SCE_KERNEL_ERROR_ILLEGAL_THID;
|
||||
}
|
||||
|
||||
if (argSize < 0 || argBlockPtr & 0x80000000) {
|
||||
ERROR_LOG(Log::sceKernel, "bad thread argument pointer/length %08x / %08x", argSize, argBlockPtr);
|
||||
return SCE_KERNEL_ERROR_ILLEGAL_ADDR;
|
||||
}
|
||||
|
||||
u32 error = 0;
|
||||
PSPThread *startThread = kernelObjects.Get<PSPThread>(threadToStartID, error);
|
||||
if (startThread == 0)
|
||||
return hleLogError(Log::sceKernel, error, "thread does not exist");
|
||||
if (startThread == 0) {
|
||||
ERROR_LOG(Log::sceKernel, "thread does not exist: %08x", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
if (startThread->nt.status != THREADSTATUS_DORMANT)
|
||||
return hleLogWarning(Log::sceKernel, SCE_KERNEL_ERROR_NOT_DORMANT, "thread already running");
|
||||
if (startThread->nt.status != THREADSTATUS_DORMANT) {
|
||||
WARN_LOG(Log::sceKernel, "thread already running");
|
||||
return SCE_KERNEL_ERROR_NOT_DORMANT;
|
||||
}
|
||||
|
||||
hleEatCycles(3400);
|
||||
return __KernelStartThread(threadToStartID, argSize, argBlockPtr, forceArgs);
|
||||
|
@ -2113,7 +2123,8 @@ int __KernelStartThreadValidate(SceUID threadToStartID, int argSize, u32 argBloc
|
|||
|
||||
// int sceKernelStartThread(SceUID threadToStartID, SceSize argSize, void *argBlock)
|
||||
int sceKernelStartThread(SceUID threadToStartID, int argSize, u32 argBlockPtr) {
|
||||
return hleLogSuccessInfoI(Log::sceKernel, __KernelStartThreadValidate(threadToStartID, argSize, argBlockPtr));
|
||||
int retval = __KernelStartThreadValidate(threadToStartID, argSize, argBlockPtr);
|
||||
return hleLogSuccessOrError(Log::sceKernel, retval);
|
||||
}
|
||||
|
||||
int sceKernelGetThreadStackFreeSize(SceUID threadID)
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "GPU/GPUCommon.h"
|
||||
#include "Core/FileSystems/MetaFileSystem.h"
|
||||
#include "Core/Util/PPGeDraw.h"
|
||||
#include "Core/HLE/HLE.h"
|
||||
#include "Core/HLE/sceKernel.h"
|
||||
#include "Core/HLE/sceKernelMemory.h"
|
||||
#include "Core/HLE/sceGe.h"
|
||||
|
@ -469,7 +470,7 @@ void PPGeEnd()
|
|||
// We actually drew something
|
||||
gpu->EnableInterrupts(false);
|
||||
NotifyMemInfo(MemBlockFlags::WRITE, dlPtr, dlWritePtr - dlPtr, "PPGe ListCmds");
|
||||
u32 list = sceGeListEnQueue(dlPtr, dlWritePtr, -1, listArgs.ptr);
|
||||
u32 list = hleCall(sceGe_user, u32, sceGeListEnQueue, dlPtr, dlWritePtr, -1, listArgs.ptr);
|
||||
DEBUG_LOG(Log::sceGe, "PPGe enqueued display list %i", list);
|
||||
gpu->EnableInterrupts(true);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue