diff options
| author | 2019-04-05 23:36:46 -0400 | |
|---|---|---|
| committer | 2019-04-05 23:36:46 -0400 | |
| commit | d6cddffb78406bc9c43089a1d6608508382d0c18 (patch) | |
| tree | 7ca69c9768366e5bf61f2e3b6fa093bed59e7216 | |
| parent | Merge pull request #2327 from ReinUsesLisp/crash-safe-visit (diff) | |
| parent | service/fsp_srv: Don't pass SaveDataDescriptor instances by value. (diff) | |
| download | yuzu-d6cddffb78406bc9c43089a1d6608508382d0c18.tar.gz yuzu-d6cddffb78406bc9c43089a1d6608508382d0c18.tar.xz yuzu-d6cddffb78406bc9c43089a1d6608508382d0c18.zip | |
Merge pull request #2339 from lioncash/rank
service/fsp_srv: Update SaveDataInfo and SaveDataDescriptor structs
| -rw-r--r-- | src/core/file_sys/savedata_factory.cpp | 8 | ||||
| -rw-r--r-- | src/core/file_sys/savedata_factory.h | 11 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/filesystem.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/filesystem.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.cpp | 19 |
5 files changed, 29 insertions, 17 deletions
diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index 1913dc956..7974b031d 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp | |||
| @@ -16,8 +16,10 @@ namespace FileSys { | |||
| 16 | constexpr char SAVE_DATA_SIZE_FILENAME[] = ".yuzu_save_size"; | 16 | constexpr char SAVE_DATA_SIZE_FILENAME[] = ".yuzu_save_size"; |
| 17 | 17 | ||
| 18 | std::string SaveDataDescriptor::DebugInfo() const { | 18 | std::string SaveDataDescriptor::DebugInfo() const { |
| 19 | return fmt::format("[type={:02X}, title_id={:016X}, user_id={:016X}{:016X}, save_id={:016X}]", | 19 | return fmt::format("[type={:02X}, title_id={:016X}, user_id={:016X}{:016X}, save_id={:016X}, " |
| 20 | static_cast<u8>(type), title_id, user_id[1], user_id[0], save_id); | 20 | "rank={}, index={}]", |
| 21 | static_cast<u8>(type), title_id, user_id[1], user_id[0], save_id, | ||
| 22 | static_cast<u8>(rank), index); | ||
| 21 | } | 23 | } |
| 22 | 24 | ||
| 23 | SaveDataFactory::SaveDataFactory(VirtualDir save_directory) : dir(std::move(save_directory)) { | 25 | SaveDataFactory::SaveDataFactory(VirtualDir save_directory) : dir(std::move(save_directory)) { |
| @@ -28,7 +30,7 @@ SaveDataFactory::SaveDataFactory(VirtualDir save_directory) : dir(std::move(save | |||
| 28 | 30 | ||
| 29 | SaveDataFactory::~SaveDataFactory() = default; | 31 | SaveDataFactory::~SaveDataFactory() = default; |
| 30 | 32 | ||
| 31 | ResultVal<VirtualDir> SaveDataFactory::Open(SaveDataSpaceId space, SaveDataDescriptor meta) { | 33 | ResultVal<VirtualDir> SaveDataFactory::Open(SaveDataSpaceId space, const SaveDataDescriptor& meta) { |
| 32 | if (meta.type == SaveDataType::SystemSaveData || meta.type == SaveDataType::SaveData) { | 34 | if (meta.type == SaveDataType::SystemSaveData || meta.type == SaveDataType::SaveData) { |
| 33 | if (meta.zero_1 != 0) { | 35 | if (meta.zero_1 != 0) { |
| 34 | LOG_WARNING(Service_FS, | 36 | LOG_WARNING(Service_FS, |
diff --git a/src/core/file_sys/savedata_factory.h b/src/core/file_sys/savedata_factory.h index 3a1caf292..b73654571 100644 --- a/src/core/file_sys/savedata_factory.h +++ b/src/core/file_sys/savedata_factory.h | |||
| @@ -32,12 +32,19 @@ enum class SaveDataType : u8 { | |||
| 32 | CacheStorage = 5, | 32 | CacheStorage = 5, |
| 33 | }; | 33 | }; |
| 34 | 34 | ||
| 35 | enum class SaveDataRank : u8 { | ||
| 36 | Primary, | ||
| 37 | Secondary, | ||
| 38 | }; | ||
| 39 | |||
| 35 | struct SaveDataDescriptor { | 40 | struct SaveDataDescriptor { |
| 36 | u64_le title_id; | 41 | u64_le title_id; |
| 37 | u128 user_id; | 42 | u128 user_id; |
| 38 | u64_le save_id; | 43 | u64_le save_id; |
| 39 | SaveDataType type; | 44 | SaveDataType type; |
| 40 | INSERT_PADDING_BYTES(7); | 45 | SaveDataRank rank; |
| 46 | u16_le index; | ||
| 47 | INSERT_PADDING_BYTES(4); | ||
| 41 | u64_le zero_1; | 48 | u64_le zero_1; |
| 42 | u64_le zero_2; | 49 | u64_le zero_2; |
| 43 | u64_le zero_3; | 50 | u64_le zero_3; |
| @@ -57,7 +64,7 @@ public: | |||
| 57 | explicit SaveDataFactory(VirtualDir dir); | 64 | explicit SaveDataFactory(VirtualDir dir); |
| 58 | ~SaveDataFactory(); | 65 | ~SaveDataFactory(); |
| 59 | 66 | ||
| 60 | ResultVal<VirtualDir> Open(SaveDataSpaceId space, SaveDataDescriptor meta); | 67 | ResultVal<VirtualDir> Open(SaveDataSpaceId space, const SaveDataDescriptor& meta); |
| 61 | 68 | ||
| 62 | VirtualDir GetSaveDataSpaceDirectory(SaveDataSpaceId space) const; | 69 | VirtualDir GetSaveDataSpaceDirectory(SaveDataSpaceId space) const; |
| 63 | 70 | ||
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 1fbab2789..4c2b371c3 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp | |||
| @@ -322,15 +322,15 @@ ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId stora | |||
| 322 | } | 322 | } |
| 323 | 323 | ||
| 324 | ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, | 324 | ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, |
| 325 | FileSys::SaveDataDescriptor save_struct) { | 325 | const FileSys::SaveDataDescriptor& descriptor) { |
| 326 | LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", | 326 | LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", |
| 327 | static_cast<u8>(space), save_struct.DebugInfo()); | 327 | static_cast<u8>(space), descriptor.DebugInfo()); |
| 328 | 328 | ||
| 329 | if (save_data_factory == nullptr) { | 329 | if (save_data_factory == nullptr) { |
| 330 | return FileSys::ERROR_ENTITY_NOT_FOUND; | 330 | return FileSys::ERROR_ENTITY_NOT_FOUND; |
| 331 | } | 331 | } |
| 332 | 332 | ||
| 333 | return save_data_factory->Open(space, save_struct); | 333 | return save_data_factory->Open(space, descriptor); |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space) { | 336 | ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space) { |
diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h index 6fd5e7b23..7cfc0d902 100644 --- a/src/core/hle/service/filesystem/filesystem.h +++ b/src/core/hle/service/filesystem/filesystem.h | |||
| @@ -46,7 +46,7 @@ ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess(); | |||
| 46 | ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, | 46 | ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, |
| 47 | FileSys::ContentRecordType type); | 47 | FileSys::ContentRecordType type); |
| 48 | ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, | 48 | ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, |
| 49 | FileSys::SaveDataDescriptor save_struct); | 49 | const FileSys::SaveDataDescriptor& descriptor); |
| 50 | ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space); | 50 | ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space); |
| 51 | ResultVal<FileSys::VirtualDir> OpenSDMC(); | 51 | ResultVal<FileSys::VirtualDir> OpenSDMC(); |
| 52 | 52 | ||
diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp index 592dce31a..657baddb8 100644 --- a/src/core/hle/service/filesystem/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp_srv.cpp | |||
| @@ -604,7 +604,9 @@ private: | |||
| 604 | u64_le save_id; | 604 | u64_le save_id; |
| 605 | u64_le title_id; | 605 | u64_le title_id; |
| 606 | u64_le save_image_size; | 606 | u64_le save_image_size; |
| 607 | INSERT_PADDING_BYTES(0x28); | 607 | u16_le index; |
| 608 | FileSys::SaveDataRank rank; | ||
| 609 | INSERT_PADDING_BYTES(0x25); | ||
| 608 | }; | 610 | }; |
| 609 | static_assert(sizeof(SaveDataInfo) == 0x60, "SaveDataInfo has incorrect size."); | 611 | static_assert(sizeof(SaveDataInfo) == 0x60, "SaveDataInfo has incorrect size."); |
| 610 | 612 | ||
| @@ -767,16 +769,17 @@ void FSP_SRV::CreateSaveDataFileSystem(Kernel::HLERequestContext& ctx) { | |||
| 767 | } | 769 | } |
| 768 | 770 | ||
| 769 | void FSP_SRV::OpenSaveDataFileSystem(Kernel::HLERequestContext& ctx) { | 771 | void FSP_SRV::OpenSaveDataFileSystem(Kernel::HLERequestContext& ctx) { |
| 770 | IPC::RequestParser rp{ctx}; | 772 | LOG_INFO(Service_FS, "called."); |
| 771 | |||
| 772 | auto space_id = rp.PopRaw<FileSys::SaveDataSpaceId>(); | ||
| 773 | auto unk = rp.Pop<u32>(); | ||
| 774 | LOG_INFO(Service_FS, "called with unknown={:08X}", unk); | ||
| 775 | 773 | ||
| 776 | auto save_struct = rp.PopRaw<FileSys::SaveDataDescriptor>(); | 774 | struct Parameters { |
| 775 | FileSys::SaveDataSpaceId save_data_space_id; | ||
| 776 | FileSys::SaveDataDescriptor descriptor; | ||
| 777 | }; | ||
| 777 | 778 | ||
| 778 | auto dir = OpenSaveData(space_id, save_struct); | 779 | IPC::RequestParser rp{ctx}; |
| 780 | const auto parameters = rp.PopRaw<Parameters>(); | ||
| 779 | 781 | ||
| 782 | auto dir = OpenSaveData(parameters.save_data_space_id, parameters.descriptor); | ||
| 780 | if (dir.Failed()) { | 783 | if (dir.Failed()) { |
| 781 | IPC::ResponseBuilder rb{ctx, 2, 0, 0}; | 784 | IPC::ResponseBuilder rb{ctx, 2, 0, 0}; |
| 782 | rb.Push(FileSys::ERROR_ENTITY_NOT_FOUND); | 785 | rb.Push(FileSys::ERROR_ENTITY_NOT_FOUND); |