More base-derived fixes
This commit is contained in:
parent
996aba39fe
commit
9525d81344
5
TODO
5
TODO
|
@ -7,6 +7,11 @@
|
||||||
☐ Review base class serialization everywhere
|
☐ Review base class serialization everywhere
|
||||||
Make sure that all base/derived relationships are registered
|
Make sure that all base/derived relationships are registered
|
||||||
☐ Serialize codeset with an apploader reference instead
|
☐ Serialize codeset with an apploader reference instead
|
||||||
|
☐ Additional stuff to serialize
|
||||||
|
☐ Self-NCCH archive
|
||||||
|
☐ File backends
|
||||||
|
☐ Directory backends
|
||||||
|
☐ File/directory 'services'
|
||||||
✔ CPU @done(19-08-13 15:41)
|
✔ CPU @done(19-08-13 15:41)
|
||||||
✔ Memory @done(19-08-13 15:41)
|
✔ Memory @done(19-08-13 15:41)
|
||||||
✔ Page tables @done(20-01-05 16:33)
|
✔ Page tables @done(20-01-05 16:33)
|
||||||
|
|
|
@ -60,6 +60,7 @@ private:
|
||||||
ArchiveFactory_ExtSaveData() = default;
|
ArchiveFactory_ExtSaveData() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
ar& shared;
|
ar& shared;
|
||||||
ar& mount_point;
|
ar& mount_point;
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,9 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {}
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ private:
|
||||||
ArchiveFactory_OtherSaveDataPermitted() = default;
|
ArchiveFactory_OtherSaveDataPermitted() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
ar& sd_savedata_source;
|
ar& sd_savedata_source;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
@ -62,6 +63,7 @@ private:
|
||||||
ArchiveFactory_OtherSaveDataGeneral() = default;
|
ArchiveFactory_OtherSaveDataGeneral() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
ar& sd_savedata_source;
|
ar& sd_savedata_source;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -34,6 +34,7 @@ private:
|
||||||
ArchiveFactory_SaveData() = default;
|
ArchiveFactory_SaveData() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
ar& sd_savedata_source;
|
ar& sd_savedata_source;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -81,6 +81,7 @@ private:
|
||||||
ArchiveFactory_SDMC() = default;
|
ArchiveFactory_SDMC() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
ar& sdmc_directory;
|
ar& sdmc_directory;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -67,6 +67,7 @@ private:
|
||||||
ArchiveFactory_SDMCWriteOnly() = default;
|
ArchiveFactory_SDMCWriteOnly() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
ar& sdmc_directory;
|
ar& sdmc_directory;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -47,6 +47,12 @@ private:
|
||||||
/// Mapping of ProgramId -> NCCHData
|
/// Mapping of ProgramId -> NCCHData
|
||||||
std::unordered_map<u64, NCCHData>
|
std::unordered_map<u64, NCCHData>
|
||||||
ncch_data; // TODO: Remove this, or actually set the values here
|
ncch_data; // TODO: Remove this, or actually set the values here
|
||||||
|
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
|
}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
|
@ -37,6 +37,7 @@ private:
|
||||||
ArchiveFactory_SystemSaveData() = default;
|
ArchiveFactory_SystemSaveData() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveFactory>(*this);
|
||||||
ar& base_path;
|
ar& base_path;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -357,4 +357,5 @@ u64 SaveDataArchive::GetFreeBytes() const {
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
||||||
|
SERIALIZE_EXPORT_IMPL(FileSys::SaveDataArchive)
|
||||||
SERIALIZE_EXPORT_IMPL(FileSys::SaveDataDelayGenerator)
|
SERIALIZE_EXPORT_IMPL(FileSys::SaveDataDelayGenerator)
|
||||||
|
|
|
@ -38,10 +38,21 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::string mount_point;
|
std::string mount_point;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SaveDataArchive() = default;
|
||||||
|
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<ArchiveBackend>(*this);
|
||||||
|
ar& mount_point;
|
||||||
|
}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SaveDataDelayGenerator;
|
class SaveDataDelayGenerator;
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
||||||
|
BOOST_CLASS_EXPORT_KEY(FileSys::SaveDataArchive)
|
||||||
BOOST_CLASS_EXPORT_KEY(FileSys::SaveDataDelayGenerator)
|
BOOST_CLASS_EXPORT_KEY(FileSys::SaveDataDelayGenerator)
|
||||||
|
|
|
@ -70,6 +70,7 @@ private:
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int file_version) {
|
void serialize(Archive& ar, const unsigned int file_version) {
|
||||||
|
ar& boost::serialization::base_object<BackingMem>(*this);
|
||||||
ar& boost::serialization::make_binary_object(&config_mem, sizeof(config_mem));
|
ar& boost::serialization::make_binary_object(&config_mem, sizeof(config_mem));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,6 +50,7 @@ private:
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<Kernel::WakeupCallback>(*this);
|
||||||
ar& callback;
|
ar& callback;
|
||||||
ar& context;
|
ar& context;
|
||||||
}
|
}
|
||||||
|
|
|
@ -222,6 +222,11 @@ public:
|
||||||
virtual ~WakeupCallback() = default;
|
virtual ~WakeupCallback() = default;
|
||||||
virtual void WakeUp(std::shared_ptr<Thread> thread, HLERequestContext& context,
|
virtual void WakeUp(std::shared_ptr<Thread> thread, HLERequestContext& context,
|
||||||
ThreadWakeupReason reason) = 0;
|
ThreadWakeupReason reason) = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int) {}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -111,7 +111,7 @@ private:
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int file_version) {
|
void serialize(Archive& ar, const unsigned int file_version) {
|
||||||
ar& boost::serialization::base_object<Object>(*this);
|
ar& boost::serialization::base_object<WaitObject>(*this);
|
||||||
ar& name;
|
ar& name;
|
||||||
ar& parent;
|
ar& parent;
|
||||||
ar& hle_handler;
|
ar& hle_handler;
|
||||||
|
|
|
@ -109,6 +109,7 @@ private:
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int file_version) {
|
void serialize(Archive& ar, const unsigned int file_version) {
|
||||||
|
ar& boost::serialization::base_object<Object>(*this);
|
||||||
ar& linear_heap_phys_offset;
|
ar& linear_heap_phys_offset;
|
||||||
ar& backing_blocks;
|
ar& backing_blocks;
|
||||||
ar& size;
|
ar& size;
|
||||||
|
|
|
@ -117,6 +117,7 @@ private:
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<BackingMem>(*this);
|
||||||
ar& boost::serialization::make_binary_object(&shared_page, sizeof(shared_page));
|
ar& boost::serialization::make_binary_object(&shared_page, sizeof(shared_page));
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -434,6 +434,7 @@ private:
|
||||||
SVC_SyncCallback() = default;
|
SVC_SyncCallback() = default;
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<Kernel::WakeupCallback>(*this);
|
||||||
ar& do_output;
|
ar& do_output;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
@ -466,7 +467,9 @@ private:
|
||||||
SVC_IPCCallback() : system(Core::Global<Core::System>()) {}
|
SVC_IPCCallback() : system(Core::Global<Core::System>()) {}
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {}
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<Kernel::WakeupCallback>(*this);
|
||||||
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ namespace Kernel {
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void Thread::serialize(Archive& ar, const unsigned int file_version) {
|
void Thread::serialize(Archive& ar, const unsigned int file_version) {
|
||||||
|
ar& boost::serialization::base_object<Object>(*this);
|
||||||
ar&* context.get();
|
ar&* context.get();
|
||||||
ar& thread_id;
|
ar& thread_id;
|
||||||
ar& status;
|
ar& status;
|
||||||
|
|
|
@ -66,6 +66,11 @@ public:
|
||||||
virtual ~WakeupCallback() = default;
|
virtual ~WakeupCallback() = default;
|
||||||
virtual void WakeUp(ThreadWakeupReason reason, std::shared_ptr<Thread> thread,
|
virtual void WakeUp(ThreadWakeupReason reason, std::shared_ptr<Thread> thread,
|
||||||
std::shared_ptr<WaitObject> object) = 0;
|
std::shared_ptr<WaitObject> object) = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int) {}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ThreadManager {
|
class ThreadManager {
|
||||||
|
|
|
@ -1189,6 +1189,7 @@ private:
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<Kernel::HLERequestContext::WakeupCallback>(*this);
|
||||||
ar& command_id;
|
ar& command_id;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
#include <boost/serialization/shared_ptr.hpp>
|
||||||
|
#include <boost/serialization/string.hpp>
|
||||||
|
#include <boost/serialization/unordered_map.hpp>
|
||||||
#include "common/archives.h"
|
#include "common/archives.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
@ -21,8 +24,19 @@
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
#include "core/hle/service/sm/srv.h"
|
#include "core/hle/service/sm/srv.h"
|
||||||
|
|
||||||
|
SERVICE_CONSTRUCT_IMPL(Service::SM::SRV)
|
||||||
|
SERIALIZE_EXPORT_IMPL(Service::SM::SRV)
|
||||||
|
|
||||||
namespace Service::SM {
|
namespace Service::SM {
|
||||||
|
|
||||||
|
template <class Archive>
|
||||||
|
void SRV::serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this);
|
||||||
|
ar& notification_semaphore;
|
||||||
|
ar& get_service_handle_delayed_map;
|
||||||
|
}
|
||||||
|
SERIALIZE_IMPL(SRV)
|
||||||
|
|
||||||
constexpr int MAX_PENDING_NOTIFICATIONS = 16;
|
constexpr int MAX_PENDING_NOTIFICATIONS = 16;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -107,6 +121,7 @@ private:
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int) {
|
void serialize(Archive& ar, const unsigned int) {
|
||||||
|
ar& boost::serialization::base_object<Kernel::HLERequestContext::WakeupCallback>(*this);
|
||||||
ar& name;
|
ar& name;
|
||||||
}
|
}
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
|
@ -40,8 +40,14 @@ private:
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
std::shared_ptr<Kernel::Semaphore> notification_semaphore;
|
std::shared_ptr<Kernel::Semaphore> notification_semaphore;
|
||||||
std::unordered_map<std::string, std::shared_ptr<Kernel::Event>> get_service_handle_delayed_map;
|
std::unordered_map<std::string, std::shared_ptr<Kernel::Event>> get_service_handle_delayed_map;
|
||||||
|
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int);
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::SM
|
} // namespace Service::SM
|
||||||
|
|
||||||
|
SERVICE_CONSTRUCT(Service::SM::SRV)
|
||||||
|
BOOST_CLASS_EXPORT_KEY(Service::SM::SRV)
|
||||||
BOOST_CLASS_EXPORT_KEY(Service::SM::SRV::ThreadCallback)
|
BOOST_CLASS_EXPORT_KEY(Service::SM::SRV::ThreadCallback)
|
||||||
|
|
Reference in New Issue