diff --git a/Common/Action.h b/Common/Action.h index ae3524b923..18a8a115be 100644 --- a/Common/Action.h +++ b/Common/Action.h @@ -10,14 +10,14 @@ // Unlike CoreTiming events, these are not timed in any way and do not care about the time. // This code also doesn't depend on anything in PPSSPP so it can live in Common. - +struct MipsCall; // Pretty much a Runnable. Similar to Action from JPCSP. class Action { public: virtual ~Action() {} - virtual void run() = 0; + virtual void run(MipsCall &call) = 0; virtual void DoState(PointerWrap &p) = 0; int actionTypeID; }; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 3eb7c51608..bc4deae317 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -161,7 +161,7 @@ public: AfterModuleEntryCall() {} SceUID moduleID_; u32 retValAddr; - virtual void run(); + virtual void run(MipsCall &call); virtual void DoState(PointerWrap &p) { p.Do(moduleID_); p.Do(retValAddr); @@ -172,7 +172,7 @@ public: } }; -void AfterModuleEntryCall::run() { +void AfterModuleEntryCall::run(MipsCall &call) { Memory::Write_U32(retValAddr, currentMIPS->r[2]); } diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 3f012cbdc6..86e35062cc 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -251,7 +251,7 @@ private: class ActionAfterMipsCall : public Action { public: - virtual void run(); + virtual void run(MipsCall &call); static Action *Create() { @@ -298,7 +298,7 @@ class ActionAfterCallback : public Action { public: ActionAfterCallback() {} - virtual void run(); + virtual void run(MipsCall &call); static Action *Create() { @@ -1968,7 +1968,7 @@ void sceKernelReferCallbackStatus() } } -void ActionAfterMipsCall::run() { +void ActionAfterMipsCall::run(MipsCall &call) { u32 error; Thread *thread = kernelObjects.Get(threadID, error); if (thread) { @@ -1980,7 +1980,7 @@ void ActionAfterMipsCall::run() { } if (chainedAction) { - chainedAction->run(); + chainedAction->run(call); delete chainedAction; } } @@ -2271,7 +2271,7 @@ void __KernelReturnFromMipsCall() // Should also save/restore wait state here. if (call->doAfter) { - call->doAfter->run(); + call->doAfter->run(*call); delete call->doAfter; } @@ -2350,7 +2350,7 @@ void __KernelRunCallbackOnThread(SceUID cbId, Thread *thread, bool reschedAfter) __KernelCallAddress(thread, cb->nc.entrypoint, action, false, args, reschedAfter); } -void ActionAfterCallback::run() { +void ActionAfterCallback::run(MipsCall &call) { if (cbId != -1) { u32 error; Callback *cb = kernelObjects.Get(cbId, error); diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 3ba1bcb0eb..ec4c6585a9 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -262,7 +262,7 @@ public: void setRingAddr(u32 ringAddr) { ringAddr_ = ringAddr; } static Action *Create() { return new PostPutAction; } void DoState(PointerWrap &p) { p.Do(ringAddr_); p.DoMarker("PostPutAction"); } - void run(); + void run(MipsCall &call); private: u32 ringAddr_; }; @@ -783,7 +783,7 @@ int sceMpegRingbufferAvailableSize(u32 ringbufferAddr) -void PostPutAction::run() { +void PostPutAction::run(MipsCall &call) { SceMpegRingBuffer ringbuffer; Memory::ReadStruct(ringAddr_, &ringbuffer); @@ -803,6 +803,7 @@ void PostPutAction::run() { } Memory::WriteStruct(ringAddr_, &ringbuffer); + call.savedV0 = packetsAdded; }