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(); }