inline void hleFinishSyscall(const HLEFunction &info) { if ((hleAfterSyscall & HLE_AFTER_SKIP_DEADBEEF) == 0) SetDeadbeefRegs(); if ((hleAfterSyscall & HLE_AFTER_CURRENT_CALLBACKS) != 0 && (hleAfterSyscall & HLE_AFTER_RESCHED_CALLBACKS) == 0) __KernelForceCallbacks(); if ((hleAfterSyscall & HLE_AFTER_RUN_INTERRUPTS) != 0) __RunOnePendingInterrupt(); if ((hleAfterSyscall & HLE_AFTER_RESCHED_CALLBACKS) != 0) __KernelReSchedule(true, hleAfterSyscallReschedReason); else if ((hleAfterSyscall & HLE_AFTER_RESCHED) != 0) __KernelReSchedule(hleAfterSyscallReschedReason); if ((hleAfterSyscall & HLE_AFTER_DEBUG_BREAK) != 0) { if (!hleExecuteDebugBreak(info)) { // We'll do it next syscall. hleAfterSyscall = HLE_AFTER_DEBUG_BREAK; hleAfterSyscallReschedReason = 0; return; } } hleAfterSyscall = HLE_AFTER_NOTHING; hleAfterSyscallReschedReason = 0; }
inline void CallSyscallWithFlags(const HLEFunction *info) { latestSyscall = info; const u32 flags = info->flags; if (flags & HLE_CLEAR_STACK_BYTES) { u32 stackStart = __KernelGetCurThreadStackStart(); if (currentMIPS->r[MIPS_REG_SP] - info->stackBytesToClear >= stackStart) { Memory::Memset(currentMIPS->r[MIPS_REG_SP] - info->stackBytesToClear, 0, info->stackBytesToClear); } } if ((flags & HLE_NOT_DISPATCH_SUSPENDED) && !__KernelIsDispatchEnabled()) { RETURN(hleLogDebug(HLE, SCE_KERNEL_ERROR_CAN_NOT_WAIT, "dispatch suspended")); } else if ((flags & HLE_NOT_IN_INTERRUPT) && __IsInInterrupt()) { RETURN(hleLogDebug(HLE, SCE_KERNEL_ERROR_ILLEGAL_CONTEXT, "in interrupt")); } else { info->func(); } if (hleAfterSyscall != HLE_AFTER_NOTHING) hleFinishSyscall(*info); else SetDeadbeefRegs(); }
inline void CallSyscallWithoutFlags(const HLEFunction *info) { info->func(); if (hleAfterSyscall != HLE_AFTER_NOTHING) hleFinishSyscall(*info); else SetDeadbeefRegs(); }
inline void CallSyscallWithFlags(const HLEFunction *info) { const u32 flags = info->flags; if ((flags & HLE_NOT_DISPATCH_SUSPENDED) && !__KernelIsDispatchEnabled()) { DEBUG_LOG(HLE, "%s: dispatch suspended", info->name); RETURN(SCE_KERNEL_ERROR_CAN_NOT_WAIT); } else if ((flags & HLE_NOT_IN_INTERRUPT) && __IsInInterrupt()) { DEBUG_LOG(HLE, "%s: in interrupt", info->name); RETURN(SCE_KERNEL_ERROR_ILLEGAL_CONTEXT); } else info->func(); if (hleAfterSyscall != HLE_AFTER_NOTHING) hleFinishSyscall(*info); else SetDeadbeefRegs(); }