mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Fixed serialization runtime exceptions
This commit is contained in:
		
							parent
							
								
									ca971ff31f
								
							
						
					
					
						commit
						e4f05884c3
					
				
					 23 changed files with 140 additions and 24 deletions
				
			
		|  | @ -334,6 +334,7 @@ private: | |||
|     } | ||||
| 
 | ||||
|     BOOST_SERIALIZATION_SPLIT_MEMBER() | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileUtil
 | ||||
|  |  | |||
|  | @ -30,6 +30,7 @@ | |||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::NCCHArchive) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::NCCHFile) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_NCCH) | ||||
| 
 | ||||
| namespace FileSys { | ||||
|  |  | |||
|  | @ -95,9 +95,16 @@ public: | |||
|     void Flush() const override {} | ||||
| 
 | ||||
| private: | ||||
|     NCCHFile() = default; // NOTE: If the public ctor has behaviour, need to replace this with
 | ||||
|                           // *_construct_data
 | ||||
|     std::vector<u8> file_buffer; // TODO: Replace with file ref for serialization
 | ||||
|     std::vector<u8> file_buffer; | ||||
| 
 | ||||
|     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
 | ||||
|  | @ -125,4 +132,5 @@ private: | |||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::NCCHArchive) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::NCCHFile) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_NCCH) | ||||
|  |  | |||
|  | @ -77,6 +77,15 @@ public: | |||
| 
 | ||||
| private: | ||||
|     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
 | ||||
|  | @ -234,6 +243,15 @@ private: | |||
|     } | ||||
| 
 | ||||
|     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) { | ||||
|  | @ -300,3 +318,6 @@ ResultVal<ArchiveFormatInfo> ArchiveFactory_SelfNCCH::GetFormatInfo(const Path&, | |||
| } | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ExeFSSectionFile) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::SelfNCCHArchive) | ||||
|  |  | |||
|  | @ -9,6 +9,8 @@ | |||
| #include <unordered_map> | ||||
| #include <vector> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/shared_ptr.hpp> | ||||
| #include <boost/serialization/vector.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "core/file_sys/archive_backend.h" | ||||
| #include "core/hle/result.h" | ||||
|  | @ -25,6 +27,17 @@ struct NCCHData { | |||
|     std::shared_ptr<std::vector<u8>> banner; | ||||
|     std::shared_ptr<RomFSReader> 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
 | ||||
|  | @ -55,6 +68,11 @@ private: | |||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| class ExeFSSectionFile; | ||||
| class SelfNCCHArchive; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_SelfNCCH) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ExeFSSectionFile) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::SelfNCCHArchive) | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| #include <cstring> | ||||
| #include <memory> | ||||
| #include <utility> | ||||
| #include "common/archives.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/file_sys/ivfc_archive.h" | ||||
|  | @ -12,6 +13,11 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::IVFCFile) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::IVFCDelayGenerator) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::RomFSDelayGenerator) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ExeFSDelayGenerator) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| IVFCArchive::IVFCArchive(std::shared_ptr<RomFSReader> file, | ||||
|  |  | |||
|  | @ -8,6 +8,8 @@ | |||
| #include <memory> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/shared_ptr.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| #include "core/file_sys/archive_backend.h" | ||||
|  | @ -38,6 +40,8 @@ class IVFCDelayGenerator : public DelayGenerator { | |||
|         static constexpr u64 IPCDelayNanoseconds(9438006); | ||||
|         return IPCDelayNanoseconds; | ||||
|     } | ||||
| 
 | ||||
|     SERIALIZE_DELAY_GENERATOR | ||||
| }; | ||||
| 
 | ||||
| class RomFSDelayGenerator : public DelayGenerator { | ||||
|  | @ -60,6 +64,8 @@ public: | |||
|         static constexpr u64 IPCDelayNanoseconds(9438006); | ||||
|         return IPCDelayNanoseconds; | ||||
|     } | ||||
| 
 | ||||
|     SERIALIZE_DELAY_GENERATOR | ||||
| }; | ||||
| 
 | ||||
| class ExeFSDelayGenerator : public DelayGenerator { | ||||
|  | @ -82,6 +88,8 @@ public: | |||
|         static constexpr u64 IPCDelayNanoseconds(9438006); | ||||
|         return IPCDelayNanoseconds; | ||||
|     } | ||||
| 
 | ||||
|     SERIALIZE_DELAY_GENERATOR | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -128,6 +136,15 @@ public: | |||
| 
 | ||||
| private: | ||||
|     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 { | ||||
|  | @ -162,3 +179,8 @@ private: | |||
| }; | ||||
| 
 | ||||
| } // 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) | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <array> | ||||
| #include <boost/serialization/array.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| 
 | ||||
|  | @ -29,9 +30,23 @@ private: | |||
|     FileUtil::IOFile file; | ||||
|     std::array<u8, 16> key; | ||||
|     std::array<u8, 16> ctr; | ||||
|     std::size_t file_offset; | ||||
|     std::size_t crypto_offset; | ||||
|     std::size_t data_size; | ||||
|     u64 file_offset; | ||||
|     u64 crypto_offset; | ||||
|     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
 | ||||
|  |  | |||
|  | @ -3,10 +3,13 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <cstring> | ||||
| #include "common/archives.h" | ||||
| #include "core/hle/kernel/config_mem.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(ConfigMem::Handler) | ||||
| 
 | ||||
| namespace ConfigMem { | ||||
| 
 | ||||
| Handler::Handler() { | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ | |||
| // putting this as a subset of HLE for now.
 | ||||
| 
 | ||||
| #include <boost/serialization/binary_object.hpp> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include "common/common_funcs.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/memory_ref.h" | ||||
|  | @ -76,3 +77,5 @@ private: | |||
| }; | ||||
| 
 | ||||
| } // namespace ConfigMem
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(ConfigMem::Handler) | ||||
|  |  | |||
|  | @ -14,6 +14,8 @@ | |||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(SharedPage::Handler) | ||||
| 
 | ||||
| namespace boost::serialization { | ||||
| 
 | ||||
| template <class Archive> | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ | |||
| #include <ctime> | ||||
| #include <memory> | ||||
| #include <boost/serialization/binary_object.hpp> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include "common/bit_field.h" | ||||
| #include "common/common_funcs.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); | ||||
| 
 | ||||
| } // namespace boost::serialization
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(SharedPage::Handler) | ||||
|  |  | |||
|  | @ -12,6 +12,9 @@ class GSP_LCD final : public ServiceFramework<GSP_LCD> { | |||
| public: | ||||
|     GSP_LCD(); | ||||
|     ~GSP_LCD() = default; | ||||
| 
 | ||||
| private: | ||||
|     SERVICE_SERIALIZATION_SIMPLE | ||||
| }; | ||||
| 
 | ||||
| } // namespace Service::GSP
 | ||||
|  |  | |||
|  | @ -29,7 +29,6 @@ void IR_RST::serialize(Archive& ar, const unsigned int) { | |||
|     // update_callback_id and input devices are set separately
 | ||||
|     ReloadInputDevices(); | ||||
| } | ||||
| SERIALIZE_IMPL(IR_RST) | ||||
| 
 | ||||
| struct PadDataEntry { | ||||
|     PadState current_state; | ||||
|  |  | |||
|  | @ -12,6 +12,9 @@ namespace Service::IR { | |||
| class IR_U final : public ServiceFramework<IR_U> { | ||||
| public: | ||||
|     IR_U(); | ||||
| 
 | ||||
| private: | ||||
|     SERVICE_SERIALIZATION_SIMPLE | ||||
| }; | ||||
| 
 | ||||
| } // namespace Service::IR
 | ||||
|  |  | |||
|  | @ -4,6 +4,8 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <boost/crc.hpp> | ||||
| #include <boost/serialization/shared_ptr.hpp> | ||||
| #include <boost/serialization/unique_ptr.hpp> | ||||
| #include "common/string_util.h" | ||||
| #include "common/swap.h" | ||||
| #include "core/core.h" | ||||
|  | @ -13,6 +15,9 @@ | |||
| #include "core/hle/service/ir/extra_hid.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 { | ||||
| 
 | ||||
| template <class Archive> | ||||
|  | @ -23,10 +28,9 @@ void IR_USER::serialize(Archive& ar, const unsigned int) { | |||
|     ar& receive_event; | ||||
|     ar& shared_memory; | ||||
|     ar& connected_device; | ||||
|     ar&* receive_buffer.get(); | ||||
|     ar& receive_buffer; | ||||
|     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
 | ||||
| // InitializeIrNopShared service function. Otherwise the shared memory doesn't have this header if
 | ||||
|  | @ -204,6 +208,8 @@ private: | |||
|     u32 max_data_size; | ||||
| 
 | ||||
| private: | ||||
|     BufferManager() = default; | ||||
| 
 | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& info; | ||||
|  | @ -449,6 +455,7 @@ IR_USER::IR_USER(Core::System& system) : ServiceFramework("ir:USER", 1) { | |||
| 
 | ||||
|     using namespace Kernel; | ||||
| 
 | ||||
|     connected_device = false; | ||||
|     conn_status_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:ConnectionStatusEvent"); | ||||
|     send_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:SendEvent"); | ||||
|     receive_event = system.Kernel().CreateEvent(ResetType::OneShot, "IR:ReceiveEvent"); | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ | |||
| #include <functional> | ||||
| #include <memory> | ||||
| #include <vector> | ||||
| #include <boost/serialization/shared_ptr.hpp> | ||||
| #include "core/hle/service/service.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  | @ -177,3 +176,6 @@ private: | |||
| }; | ||||
| 
 | ||||
| } // namespace Service::IR
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Service::IR::IR_USER) | ||||
| SERVICE_CONSTRUCT(Service::IR::IR_USER) | ||||
|  |  | |||
|  | @ -28,7 +28,6 @@ void MIC_U::serialize(Archive& ar, const unsigned int) { | |||
|     ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this); | ||||
|     ar&* impl.get(); | ||||
| } | ||||
| SERIALIZE_IMPL(MIC_U) | ||||
| 
 | ||||
| /// Microphone audio encodings.
 | ||||
| enum class Encoding : u8 { | ||||
|  |  | |||
|  | @ -24,6 +24,9 @@ | |||
| #include "core/hle/service/nwm/uds_data.h" | ||||
| #include "core/memory.h" | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(Service::NWM::NWM_UDS) | ||||
| SERVICE_CONSTRUCT_IMPL(Service::NWM::NWM_UDS) | ||||
| 
 | ||||
| namespace Service::NWM { | ||||
| 
 | ||||
| template <class Archive> | ||||
|  | @ -34,7 +37,6 @@ void NWM_UDS::serialize(Archive& ar, const unsigned int) { | |||
|     ar& received_beacons; | ||||
|     // wifi_packet_received set in constructor
 | ||||
| } | ||||
| SERIALIZE_IMPL(NWM_UDS) | ||||
| 
 | ||||
| namespace ErrCodes { | ||||
| enum { | ||||
|  |  | |||
|  | @ -557,6 +557,7 @@ private: | |||
| 
 | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int); | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace Service::NWM
 | ||||
|  |  | |||
|  | @ -35,7 +35,6 @@ void SRV::serialize(Archive& ar, const unsigned int) { | |||
|     ar& notification_semaphore; | ||||
|     ar& get_service_handle_delayed_map; | ||||
| } | ||||
| SERIALIZE_IMPL(SRV) | ||||
| 
 | ||||
| constexpr int MAX_PENDING_NOTIFICATIONS = 16; | ||||
| 
 | ||||
|  |  | |||
|  | @ -28,7 +28,6 @@ void Y2R_U::serialize(Archive& ar, const unsigned int) { | |||
|     ar& transfer_end_interrupt_enabled; | ||||
|     ar& spacial_dithering_enabled; | ||||
| } | ||||
| SERIALIZE_IMPL(Y2R_U) | ||||
| 
 | ||||
| static const CoefficientSet standard_coefficients[4] = { | ||||
|     {{0x100, 0x166, 0xB6, 0x58, 0x1C5, -0x166F, 0x10EE, -0x1C5B}}, // ITU_Rec601
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue