diff --git a/TODO b/TODO index 6397b4ba9..f3e1ea943 100644 --- a/TODO +++ b/TODO @@ -2,7 +2,8 @@ ✔ CPU @done(19-08-13 15:41) ✔ Memory @done(19-08-13 15:41) ✔ DSP @done(19-08-13 15:41) -☐ Service manager +✔ Service manager @started(19-12-23 00:36) @done(19-12-23 11:38) @lasted(11h2m3s) + ☐ Fix or ignore inverse map ☐ App loader ☐ Archive manager ☐ Custom texture cache @@ -30,8 +31,8 @@ ✔ Config mem @done(19-08-13 16:40) ✔ Event @done(19-12-22 18:44) ✔ Handle table @done(19-08-13 16:42) - ☐ HLE IPC - ☐ IPC + ✔ HLE IPC @done(19-12-23 00:36) + ✔ IPC @done(19-12-23 00:36) ✔ Memory @started(19-08-13 16:43) @done(19-12-22 18:34) ✔ Mutex @done(19-08-13 16:43) ✔ Object @done(19-08-13 15:41) @@ -42,6 +43,8 @@ ✔ Semaphore @done(19-08-13 16:44) ✔ Server port @done(19-08-13 16:44) ✔ Server session @done(19-08-13 16:44) + ☐ Mapped buffer context + This may not be needed! ✔ Session @done(19-08-13 16:44) ☐ Shared memory @started(19-12-22 21:20) Need to figure out backing memory (a u8*) diff --git a/src/core/core.cpp b/src/core/core.cpp index 9aecf84c9..8ca3a2ab5 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -235,7 +235,7 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, u32 system_mo rpc_server = std::make_unique(); - service_manager = std::make_shared(*this); + service_manager = std::make_unique(*this); archive_manager = std::make_unique(*this); HW::Init(*memory); @@ -399,7 +399,7 @@ template void System::serialize(Archive & ar, const unsigned int file_version) { ar & *cpu_core.get(); - //ar & *service_manager.get(); + ar & *service_manager.get(); ar & GPU::g_regs; ar & LCD::g_regs; ar & dsp_core->GetDspMemory(); diff --git a/src/core/core.h b/src/core/core.h index b811badba..8bf04d365 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -305,7 +305,7 @@ private: std::unique_ptr telemetry_session; /// Service manager - std::shared_ptr service_manager; + std::unique_ptr service_manager; /// Frontend applets std::shared_ptr registered_mii_selector; diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 26942fe6b..be3a20e79 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h @@ -11,12 +11,19 @@ #include #include #include +#include +#include +#include +#include #include "common/common_types.h" #include "common/swap.h" #include "core/hle/ipc.h" #include "core/hle/kernel/object.h" #include "core/hle/kernel/server_session.h" +BOOST_SERIALIZATION_ASSUME_ABSTRACT(Kernel::SessionRequestHandler) +BOOST_SERIALIZATION_ASSUME_ABSTRACT(Kernel::SessionRequestHandler::SessionDataBase) + namespace Service { class ServiceFrameworkBase; } @@ -90,12 +97,31 @@ protected: std::shared_ptr session; std::unique_ptr data; + + private: + template + void serialize(Archive& ar, const unsigned int file_version) + { + ar & session; + ar & data; + } + friend class boost::serialization::access; }; /// List of sessions that are connected to this handler. A ServerSession whose server endpoint /// is an HLE implementation is kept alive by this list for the duration of the connection. std::vector connected_sessions; + +private: + template + void serialize(Archive& ar, const unsigned int file_version) + { + ar & connected_sessions; + } + friend class boost::serialization::access; }; +// NOTE: The below classes are ephemeral and don't need serialization + class MappedBuffer { public: MappedBuffer(Memory::MemorySystem& memory, const Process& process, u32 descriptor, diff --git a/src/core/hle/kernel/ipc.h b/src/core/hle/kernel/ipc.h index b06079958..46d86a528 100644 --- a/src/core/hle/kernel/ipc.h +++ b/src/core/hle/kernel/ipc.h @@ -6,6 +6,7 @@ #include #include +#include #include "common/common_types.h" #include "core/hle/ipc.h" #include "core/hle/kernel/thread.h" @@ -26,6 +27,20 @@ struct MappedBufferContext { std::unique_ptr buffer; std::unique_ptr reserve_buffer; + +private: + template + void serialize(Archive& ar, const unsigned int file_version) + { + ar & permissions; + ar & size; + ar & source_address; + ar & target_address; + // TODO: Check whether we need these. If we do, add a field for the size and/or change to a 'vector' + //ar & buffer; + //ar & reserve_buffer; + } + friend class boost::serialization::access; }; /// Performs IPC command buffer translation from one process to another. diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp index 191b43ea8..0aeb86a78 100644 --- a/src/core/hle/kernel/server_port.cpp +++ b/src/core/hle/kernel/server_port.cpp @@ -11,6 +11,7 @@ #include "core/hle/kernel/server_port.h" #include "core/hle/kernel/server_session.h" #include "core/hle/kernel/thread.h" +#include "core/hle/kernel/hle_ipc.h" SERIALIZE_EXPORT_IMPL(Kernel::ServerPort) @@ -50,4 +51,14 @@ KernelSystem::PortPair KernelSystem::CreatePortPair(u32 max_sessions, std::strin return std::make_pair(std::move(server_port), std::move(client_port)); } +template +void ServerPort::serialize(Archive& ar, const unsigned int file_version) +{ + ar & boost::serialization::base_object(*this); + ar & name; + ar & pending_sessions; + ar & hle_handler; +} +SERIALIZE_IMPL(ServerPort) + } // namespace Kernel diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h index e0014ee7c..f055cd267 100644 --- a/src/core/hle/kernel/server_port.h +++ b/src/core/hle/kernel/server_port.h @@ -67,13 +67,7 @@ public: private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int file_version) - { - ar & boost::serialization::base_object(*this); - ar & name; - ar & pending_sessions; - //ar & hle_handler; - } + void serialize(Archive& ar, const unsigned int file_version); }; } // namespace Kernel diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h index 6112eefac..05b469c38 100644 --- a/src/core/hle/kernel/server_session.h +++ b/src/core/hle/kernel/server_session.h @@ -115,10 +115,10 @@ private: ar & boost::serialization::base_object(*this); ar & name; ar & parent; - //ar & hle_handler; + ar & hle_handler; ar & pending_requesting_threads; ar & currently_handling; - //ar & mapped_buffer_context; + ar & mapped_buffer_context; } }; diff --git a/src/core/hle/kernel/session.cpp b/src/core/hle/kernel/session.cpp index f264c49bd..a2a1f90f9 100644 --- a/src/core/hle/kernel/session.cpp +++ b/src/core/hle/kernel/session.cpp @@ -8,6 +8,7 @@ #include "core/hle/kernel/client_session.h" #include "core/hle/kernel/server_session.h" #include "core/hle/kernel/client_port.h" +#include "core/hle/kernel/hle_ipc.h" SERIALIZE_IMPL(Kernel::Session) diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index 42d783513..8aaf3df1f 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h @@ -117,7 +117,7 @@ private: ar & owner_process; ar & base_address; ar & name; - ar & *(reinterpret_cast(&holding_memory));; + ar & *(reinterpret_cast(&holding_memory)); } friend class boost::serialization::access; }; diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index 6e47fd152..9cdaff72d 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -8,6 +8,9 @@ #include #include #include +#include +#include +#include #include "core/hle/kernel/client_port.h" #include "core/hle/kernel/object.h" #include "core/hle/kernel/server_port.h" @@ -80,6 +83,14 @@ private: // For IPC Recorder /// client port Object id -> service name std::unordered_map registered_services_inverse; + + template + void serialize(Archive& ar, const unsigned int file_version) + { + ar & registered_services; + ar & registered_services_inverse; // TODO: Instead, compute this from registered_services + } + friend class boost::serialization::access; }; } // namespace Service::SM