diff --git a/Source/Core/Core/IOS/ES/ES.cpp b/Source/Core/Core/IOS/ES/ES.cpp index dce4799956..da09d5e036 100644 --- a/Source/Core/Core/IOS/ES/ES.cpp +++ b/Source/Core/Core/IOS/ES/ES.cpp @@ -122,6 +122,8 @@ void ESDevice::FinalizeEmulationState() void ESDevice::FinishInit() { + m_ios.InitIPC(); + if (s_title_to_launch != 0) { NOTICE_LOG_FMT(IOS, "Re-launching title after IOS reload."); diff --git a/Source/Core/Core/IOS/IOS.cpp b/Source/Core/Core/IOS/IOS.cpp index 82d02328fd..b3e6c3a863 100644 --- a/Source/Core/Core/IOS/IOS.cpp +++ b/Source/Core/Core/IOS/IOS.cpp @@ -64,7 +64,6 @@ namespace IOS::HLE static std::unique_ptr s_ios; constexpr u64 ENQUEUE_REQUEST_FLAG = 0x100000000ULL; -constexpr u64 ENQUEUE_ACKNOWLEDGEMENT_FLAG = 0x200000000ULL; static CoreTiming::EventType* s_event_enqueue; static CoreTiming::EventType* s_event_sdio_notify; static CoreTiming::EventType* s_event_finish_ppc_bootstrap; @@ -289,9 +288,6 @@ EmulationKernel::EmulationKernel(u64 title_id) : Kernel(title_id) return; } - // IOS re-inits IPC and sends a dummy ack during its boot process. - EnqueueIPCAcknowledgement(0); - AddCoreDevices(); AddStaticDevices(); } @@ -443,6 +439,15 @@ bool Kernel::BootIOS(const u64 ios_title_id, const std::string& boot_content_pat return true; } +void Kernel::InitIPC() +{ + if (s_ios == nullptr) + return; + + INFO_LOG_FMT(IOS, "IPC initialised."); + GenerateAck(0); +} + void Kernel::AddDevice(std::unique_ptr device) { ASSERT(device->GetDeviceType() == Device::DeviceType::Static); @@ -690,17 +695,9 @@ void Kernel::EnqueueIPCReply(const Request& request, const s32 return_value, s64 CoreTiming::ScheduleEvent(cycles_in_future, s_event_enqueue, request.address, from); } -void Kernel::EnqueueIPCAcknowledgement(u32 address, int cycles_in_future) -{ - CoreTiming::ScheduleEvent(cycles_in_future, s_event_enqueue, - address | ENQUEUE_ACKNOWLEDGEMENT_FLAG); -} - void Kernel::HandleIPCEvent(u64 userdata) { - if (userdata & ENQUEUE_ACKNOWLEDGEMENT_FLAG) - m_ack_queue.push_back(static_cast(userdata)); - else if (userdata & ENQUEUE_REQUEST_FLAG) + if (userdata & ENQUEUE_REQUEST_FLAG) m_request_queue.push_back(static_cast(userdata)); else m_reply_queue.push_back(static_cast(userdata)); @@ -730,14 +727,6 @@ void Kernel::UpdateIPC() m_reply_queue.pop_front(); return; } - - if (!m_ack_queue.empty()) - { - GenerateAck(m_ack_queue.front()); - WARN_LOG_FMT(IOS, "<<-- Double-ack to IPC Request @ {:#010x}", m_ack_queue.front()); - m_ack_queue.pop_front(); - return; - } } void Kernel::UpdateDevices() diff --git a/Source/Core/Core/IOS/IOS.h b/Source/Core/Core/IOS/IOS.h index a3a82bdb49..87d8d33b9a 100644 --- a/Source/Core/Core/IOS/IOS.h +++ b/Source/Core/Core/IOS/IOS.h @@ -133,6 +133,7 @@ public: bool BootstrapPPC(const std::string& boot_content_path); bool BootIOS(u64 ios_title_id, const std::string& boot_content_path = ""); + void InitIPC(); u32 GetVersion() const; IOSC& GetIOSC(); @@ -142,7 +143,6 @@ protected: void ExecuteIPCCommand(u32 address); std::optional HandleIPCCommand(const Request& request); - void EnqueueIPCAcknowledgement(u32 address, int cycles_in_future = 0); void AddDevice(std::unique_ptr device); void AddCoreDevices(); @@ -165,7 +165,6 @@ protected: using IPCMsgQueue = std::deque; IPCMsgQueue m_request_queue; // ppc -> arm IPCMsgQueue m_reply_queue; // arm -> ppc - IPCMsgQueue m_ack_queue; // arm -> ppc u64 m_last_reply_time = 0; IOSC m_iosc;