citra-emu
/
citra
Archived
1
0
Fork 0

Fixed serialization runtime exceptions

This commit is contained in:
Hamish Milne 2020-01-11 16:33:48 +00:00 committed by zhupengfei
parent ca971ff31f
commit e4f05884c3
23 changed files with 140 additions and 24 deletions

19
TODO
View File

@ -3,14 +3,15 @@
☐ Multiple slots etc. ☐ Multiple slots etc.
☐ Custom texture cache ☐ Custom texture cache
☐ Review constructor/initialization code ☐ Review constructor/initialization code
☐ Review core timing events ☐ Core timing events
☐ Serialize codeset with an apploader reference instead
✔ Review base class serialization everywhere @done(20-01-10 23:47) ✔ Review base class serialization everywhere @done(20-01-10 23:47)
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 ✔ Additional stuff to serialize @done(20-01-11 16:32)
☐ Additional stuff to serialize ✔ Self-NCCH archive @done(20-01-11 16:32)
☐ Self-NCCH archive ✔ File backends @done(20-01-11 16:32)
☐ File backends ✘ Directory backends @cancelled(20-01-11 16:32)
☐ Directory backends Not needed for now
✔ File/directory 'services' @done(20-01-10 23:46) ✔ File/directory 'services' @done(20-01-10 23:46)
✔ 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)
@ -37,10 +38,8 @@
✔ SDMC @done(20-01-02 23:34) ✔ SDMC @done(20-01-02 23:34)
✔ Normal @done(20-01-02 23:34) ✔ Normal @done(20-01-02 23:34)
✔ Write-only @done(20-01-02 23:34) ✔ Write-only @done(20-01-02 23:34)
✘ IVFC @cancelled(20-01-03 13:22) ✔ IVFC @done(20-01-11 16:33)
Seems IVFCArchive is never used.. which is good because it has a file reference! ✔ File refs @done(20-01-11 16:33)
✘ File refs @cancelled(20-01-03 13:22)
Not needed as nothing serializes file buffers
✘ Replace delay generator with virtual fns @cancelled(20-01-03 13:16) ✘ Replace delay generator with virtual fns @cancelled(20-01-03 13:16)
While they have no state, the extra refactoring here is unneeded While they have no state, the extra refactoring here is unneeded
✘ MMIO @cancelled(20-01-01 01:06) ✘ MMIO @cancelled(20-01-01 01:06)

View File

@ -334,6 +334,7 @@ private:
} }
BOOST_SERIALIZATION_SPLIT_MEMBER() BOOST_SERIALIZATION_SPLIT_MEMBER()
friend class boost::serialization::access;
}; };
} // namespace FileUtil } // namespace FileUtil

View File

@ -30,6 +30,7 @@
// FileSys namespace // FileSys namespace
SERIALIZE_EXPORT_IMPL(FileSys::NCCHArchive) SERIALIZE_EXPORT_IMPL(FileSys::NCCHArchive)
SERIALIZE_EXPORT_IMPL(FileSys::NCCHFile)
SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_NCCH) SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_NCCH)
namespace FileSys { namespace FileSys {

View File

@ -95,9 +95,16 @@ public:
void Flush() const override {} void Flush() const override {}
private: private:
NCCHFile() = default; // NOTE: If the public ctor has behaviour, need to replace this with std::vector<u8> file_buffer;
// *_construct_data
std::vector<u8> file_buffer; // TODO: Replace with file ref for serialization NCCHFile() = default;
template <class Archive>
void serialize(Archive& ar, const unsigned int) {
ar& boost::serialization::base_object<FileBackend>(*this);
ar& file_buffer; // TODO: See about a more efficient way to do this
}
friend class boost::serialization::access;
}; };
/// File system interface to the NCCH archive /// File system interface to the NCCH archive
@ -125,4 +132,5 @@ private:
} // namespace FileSys } // namespace FileSys
BOOST_CLASS_EXPORT_KEY(FileSys::NCCHArchive) BOOST_CLASS_EXPORT_KEY(FileSys::NCCHArchive)
BOOST_CLASS_EXPORT_KEY(FileSys::NCCHFile)
BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_NCCH) BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_NCCH)

View File

@ -77,6 +77,15 @@ public:
private: private:
std::shared_ptr<std::vector<u8>> data; std::shared_ptr<std::vector<u8>> data;
ExeFSSectionFile() = default;
template <class Archive>
void serialize(Archive& ar, const unsigned int) {
ar& boost::serialization::base_object<FileBackend>(*this);
ar& data;
}
friend class boost::serialization::access;
}; };
// SelfNCCHArchive represents the running application itself. From this archive the application can // SelfNCCHArchive represents the running application itself. From this archive the application can
@ -234,6 +243,15 @@ private:
} }
NCCHData ncch_data; NCCHData ncch_data;
SelfNCCHArchive() = default;
template <class Archive>
void serialize(Archive& ar, const unsigned int) {
ar& boost::serialization::base_object<ArchiveBackend>(*this);
ar& ncch_data;
}
friend class boost::serialization::access;
}; };
void ArchiveFactory_SelfNCCH::Register(Loader::AppLoader& app_loader) { void ArchiveFactory_SelfNCCH::Register(Loader::AppLoader& app_loader) {
@ -300,3 +318,6 @@ ResultVal<ArchiveFormatInfo> ArchiveFactory_SelfNCCH::GetFormatInfo(const Path&,
} }
} // namespace FileSys } // namespace FileSys
SERIALIZE_EXPORT_IMPL(FileSys::ExeFSSectionFile)
SERIALIZE_EXPORT_IMPL(FileSys::SelfNCCHArchive)

View File

@ -9,6 +9,8 @@
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
#include <boost/serialization/export.hpp> #include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/vector.hpp>
#include "common/common_types.h" #include "common/common_types.h"
#include "core/file_sys/archive_backend.h" #include "core/file_sys/archive_backend.h"
#include "core/hle/result.h" #include "core/hle/result.h"
@ -25,6 +27,17 @@ struct NCCHData {
std::shared_ptr<std::vector<u8>> banner; std::shared_ptr<std::vector<u8>> banner;
std::shared_ptr<RomFSReader> romfs_file; std::shared_ptr<RomFSReader> romfs_file;
std::shared_ptr<RomFSReader> update_romfs_file; std::shared_ptr<RomFSReader> update_romfs_file;
private:
template <class Archive>
void serialize(Archive& ar, const unsigned int) {
ar& icon;
ar& logo;
ar& banner;
ar& romfs_file;
ar& update_romfs_file;
}
friend class boost::serialization::access;
}; };
/// File system interface to the SelfNCCH archive /// File system interface to the SelfNCCH archive
@ -55,6 +68,11 @@ private:
friend class boost::serialization::access; friend class boost::serialization::access;
}; };
class ExeFSSectionFile;
class SelfNCCHArchive;
} // namespace FileSys } // namespace FileSys
BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_SelfNCCH) BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_SelfNCCH)
BOOST_CLASS_EXPORT_KEY(FileSys::ExeFSSectionFile)
BOOST_CLASS_EXPORT_KEY(FileSys::SelfNCCHArchive)

View File

@ -5,6 +5,7 @@
#include <cstring> #include <cstring>
#include <memory> #include <memory>
#include <utility> #include <utility>
#include "common/archives.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/file_sys/ivfc_archive.h" #include "core/file_sys/ivfc_archive.h"
@ -12,6 +13,11 @@
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// FileSys namespace // FileSys namespace
SERIALIZE_EXPORT_IMPL(FileSys::IVFCFile)
SERIALIZE_EXPORT_IMPL(FileSys::IVFCDelayGenerator)
SERIALIZE_EXPORT_IMPL(FileSys::RomFSDelayGenerator)
SERIALIZE_EXPORT_IMPL(FileSys::ExeFSDelayGenerator)
namespace FileSys { namespace FileSys {
IVFCArchive::IVFCArchive(std::shared_ptr<RomFSReader> file, IVFCArchive::IVFCArchive(std::shared_ptr<RomFSReader> file,

View File

@ -8,6 +8,8 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
#include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include "common/common_types.h" #include "common/common_types.h"
#include "common/file_util.h" #include "common/file_util.h"
#include "core/file_sys/archive_backend.h" #include "core/file_sys/archive_backend.h"
@ -38,6 +40,8 @@ class IVFCDelayGenerator : public DelayGenerator {
static constexpr u64 IPCDelayNanoseconds(9438006); static constexpr u64 IPCDelayNanoseconds(9438006);
return IPCDelayNanoseconds; return IPCDelayNanoseconds;
} }
SERIALIZE_DELAY_GENERATOR
}; };
class RomFSDelayGenerator : public DelayGenerator { class RomFSDelayGenerator : public DelayGenerator {
@ -60,6 +64,8 @@ public:
static constexpr u64 IPCDelayNanoseconds(9438006); static constexpr u64 IPCDelayNanoseconds(9438006);
return IPCDelayNanoseconds; return IPCDelayNanoseconds;
} }
SERIALIZE_DELAY_GENERATOR
}; };
class ExeFSDelayGenerator : public DelayGenerator { class ExeFSDelayGenerator : public DelayGenerator {
@ -82,6 +88,8 @@ public:
static constexpr u64 IPCDelayNanoseconds(9438006); static constexpr u64 IPCDelayNanoseconds(9438006);
return IPCDelayNanoseconds; return IPCDelayNanoseconds;
} }
SERIALIZE_DELAY_GENERATOR
}; };
/** /**
@ -128,6 +136,15 @@ public:
private: private:
std::shared_ptr<RomFSReader> romfs_file; std::shared_ptr<RomFSReader> romfs_file;
IVFCFile() = default;
template <class Archive>
void serialize(Archive& ar, const unsigned int) {
ar& boost::serialization::base_object<FileBackend>(*this);
ar& romfs_file;
}
friend class boost::serialization::access;
}; };
class IVFCDirectory : public DirectoryBackend { class IVFCDirectory : public DirectoryBackend {
@ -162,3 +179,8 @@ private:
}; };
} // namespace FileSys } // namespace FileSys
BOOST_CLASS_EXPORT_KEY(FileSys::IVFCFile)
BOOST_CLASS_EXPORT_KEY(FileSys::IVFCDelayGenerator)
BOOST_CLASS_EXPORT_KEY(FileSys::RomFSDelayGenerator)
BOOST_CLASS_EXPORT_KEY(FileSys::ExeFSDelayGenerator)

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <array> #include <array>
#include <boost/serialization/array.hpp>
#include "common/common_types.h" #include "common/common_types.h"
#include "common/file_util.h" #include "common/file_util.h"
@ -29,9 +30,23 @@ private:
FileUtil::IOFile file; FileUtil::IOFile file;
std::array<u8, 16> key; std::array<u8, 16> key;
std::array<u8, 16> ctr; std::array<u8, 16> ctr;
std::size_t file_offset; u64 file_offset;
std::size_t crypto_offset; u64 crypto_offset;
std::size_t data_size; u64 data_size;
RomFSReader() = default;
template <class Archive>
void serialize(Archive& ar, const unsigned int) {
ar& is_encrypted;
ar& file;
ar& key;
ar& ctr;
ar& file_offset;
ar& crypto_offset;
ar& data_size;
}
friend class boost::serialization::access;
}; };
} // namespace FileSys } // namespace FileSys

View File

@ -3,10 +3,13 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include <cstring> #include <cstring>
#include "common/archives.h"
#include "core/hle/kernel/config_mem.h" #include "core/hle/kernel/config_mem.h"
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
SERIALIZE_EXPORT_IMPL(ConfigMem::Handler)
namespace ConfigMem { namespace ConfigMem {
Handler::Handler() { Handler::Handler() {

View File

@ -10,6 +10,7 @@
// putting this as a subset of HLE for now. // putting this as a subset of HLE for now.
#include <boost/serialization/binary_object.hpp> #include <boost/serialization/binary_object.hpp>
#include <boost/serialization/export.hpp>
#include "common/common_funcs.h" #include "common/common_funcs.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/memory_ref.h" #include "common/memory_ref.h"
@ -76,3 +77,5 @@ private:
}; };
} // namespace ConfigMem } // namespace ConfigMem
BOOST_CLASS_EXPORT_KEY(ConfigMem::Handler)

View File

@ -14,6 +14,8 @@
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
SERIALIZE_EXPORT_IMPL(SharedPage::Handler)
namespace boost::serialization { namespace boost::serialization {
template <class Archive> template <class Archive>

View File

@ -14,6 +14,7 @@
#include <ctime> #include <ctime>
#include <memory> #include <memory>
#include <boost/serialization/binary_object.hpp> #include <boost/serialization/binary_object.hpp>
#include <boost/serialization/export.hpp>
#include "common/bit_field.h" #include "common/bit_field.h"
#include "common/common_funcs.h" #include "common/common_funcs.h"
#include "common/common_types.h" #include "common/common_types.h"
@ -131,3 +132,5 @@ template <class Archive>
void load_construct_data(Archive& ar, SharedPage::Handler* t, const unsigned int); void load_construct_data(Archive& ar, SharedPage::Handler* t, const unsigned int);
} // namespace boost::serialization } // namespace boost::serialization
BOOST_CLASS_EXPORT_KEY(SharedPage::Handler)

View File

@ -12,6 +12,9 @@ class GSP_LCD final : public ServiceFramework<GSP_LCD> {
public: public:
GSP_LCD(); GSP_LCD();
~GSP_LCD() = default; ~GSP_LCD() = default;
private:
SERVICE_SERIALIZATION_SIMPLE
}; };
} // namespace Service::GSP } // namespace Service::GSP

View File

@ -29,7 +29,6 @@ void IR_RST::serialize(Archive& ar, const unsigned int) {
// update_callback_id and input devices are set separately // update_callback_id and input devices are set separately
ReloadInputDevices(); ReloadInputDevices();
} }
SERIALIZE_IMPL(IR_RST)
struct PadDataEntry { struct PadDataEntry {
PadState current_state; PadState current_state;

View File

@ -12,6 +12,9 @@ namespace Service::IR {
class IR_U final : public ServiceFramework<IR_U> { class IR_U final : public ServiceFramework<IR_U> {
public: public:
IR_U(); IR_U();
private:
SERVICE_SERIALIZATION_SIMPLE
}; };
} // namespace Service::IR } // namespace Service::IR

View File

@ -4,6 +4,8 @@
#include <memory> #include <memory>
#include <boost/crc.hpp> #include <boost/crc.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/unique_ptr.hpp>
#include "common/string_util.h" #include "common/string_util.h"
#include "common/swap.h" #include "common/swap.h"
#include "core/core.h" #include "core/core.h"
@ -13,6 +15,9 @@
#include "core/hle/service/ir/extra_hid.h" #include "core/hle/service/ir/extra_hid.h"
#include "core/hle/service/ir/ir_user.h" #include "core/hle/service/ir/ir_user.h"
SERIALIZE_EXPORT_IMPL(Service::IR::IR_USER)
SERVICE_CONSTRUCT_IMPL(Service::IR::IR_USER)
namespace Service::IR { namespace Service::IR {
template <class Archive> template <class Archive>
@ -23,10 +28,9 @@ void IR_USER::serialize(Archive& ar, const unsigned int) {
ar& receive_event; ar& receive_event;
ar& shared_memory; ar& shared_memory;
ar& connected_device; ar& connected_device;
ar&* receive_buffer.get(); ar& receive_buffer;
ar&* extra_hid.get(); ar&* extra_hid.get();
} }
SERIALIZE_IMPL(IR_USER)
// This is a header that will present in the ir:USER shared memory if it is initialized with // This is a header that will present in the ir:USER shared memory if it is initialized with
// InitializeIrNopShared service function. Otherwise the shared memory doesn't have this header if // InitializeIrNopShared service function. Otherwise the shared memory doesn't have this header if
@ -204,6 +208,8 @@ private:
u32 max_data_size; u32 max_data_size;
private: private:
BufferManager() = default;
template <class Archive> template <class Archive>
void serialize(Archive& ar, const unsigned int) { void serialize(Archive& ar, const unsigned int) {
ar& info; ar& info;
@ -449,6 +455,7 @@ IR_USER::IR_USER(Core::System& system) : ServiceFramework("ir:USER", 1) {
using namespace Kernel; using namespace Kernel;
connected_device = false;
conn_status_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:ConnectionStatusEvent"); conn_status_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:ConnectionStatusEvent");
send_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:SendEvent"); send_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:SendEvent");
receive_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:ReceiveEvent"); receive_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:ReceiveEvent");

View File

@ -7,7 +7,6 @@
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <boost/serialization/shared_ptr.hpp>
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Kernel { namespace Kernel {
@ -177,3 +176,6 @@ private:
}; };
} // namespace Service::IR } // namespace Service::IR
BOOST_CLASS_EXPORT_KEY(Service::IR::IR_USER)
SERVICE_CONSTRUCT(Service::IR::IR_USER)

View File

@ -28,7 +28,6 @@ void MIC_U::serialize(Archive& ar, const unsigned int) {
ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this); ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this);
ar&* impl.get(); ar&* impl.get();
} }
SERIALIZE_IMPL(MIC_U)
/// Microphone audio encodings. /// Microphone audio encodings.
enum class Encoding : u8 { enum class Encoding : u8 {

View File

@ -24,6 +24,9 @@
#include "core/hle/service/nwm/uds_data.h" #include "core/hle/service/nwm/uds_data.h"
#include "core/memory.h" #include "core/memory.h"
SERIALIZE_EXPORT_IMPL(Service::NWM::NWM_UDS)
SERVICE_CONSTRUCT_IMPL(Service::NWM::NWM_UDS)
namespace Service::NWM { namespace Service::NWM {
template <class Archive> template <class Archive>
@ -34,7 +37,6 @@ void NWM_UDS::serialize(Archive& ar, const unsigned int) {
ar& received_beacons; ar& received_beacons;
// wifi_packet_received set in constructor // wifi_packet_received set in constructor
} }
SERIALIZE_IMPL(NWM_UDS)
namespace ErrCodes { namespace ErrCodes {
enum { enum {

View File

@ -557,6 +557,7 @@ private:
template <class Archive> template <class Archive>
void serialize(Archive& ar, const unsigned int); void serialize(Archive& ar, const unsigned int);
friend class boost::serialization::access;
}; };
} // namespace Service::NWM } // namespace Service::NWM

View File

@ -35,7 +35,6 @@ void SRV::serialize(Archive& ar, const unsigned int) {
ar& notification_semaphore; ar& notification_semaphore;
ar& get_service_handle_delayed_map; ar& get_service_handle_delayed_map;
} }
SERIALIZE_IMPL(SRV)
constexpr int MAX_PENDING_NOTIFICATIONS = 16; constexpr int MAX_PENDING_NOTIFICATIONS = 16;

View File

@ -28,7 +28,6 @@ void Y2R_U::serialize(Archive& ar, const unsigned int) {
ar& transfer_end_interrupt_enabled; ar& transfer_end_interrupt_enabled;
ar& spacial_dithering_enabled; ar& spacial_dithering_enabled;
} }
SERIALIZE_IMPL(Y2R_U)
static const CoefficientSet standard_coefficients[4] = { static const CoefficientSet standard_coefficients[4] = {
{{0x100, 0x166, 0xB6, 0x58, 0x1C5, -0x166F, 0x10EE, -0x1C5B}}, // ITU_Rec601 {{0x100, 0x166, 0xB6, 0x58, 0x1C5, -0x166F, 0x10EE, -0x1C5B}}, // ITU_Rec601