summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-12-06 20:29:36 -0500
committerGravatar Zach Hilman2018-12-27 00:18:00 -0500
commit2e6b67a079593e810dd7f27cd4388fef385b9c99 (patch)
tree2056356b919f7ae3dd3cc44d6a251ac70e4917d4 /src
parentsavedata_factory: Partially implement IVFC save sizes using files (diff)
downloadyuzu-2e6b67a079593e810dd7f27cd4388fef385b9c99.tar.gz
yuzu-2e6b67a079593e810dd7f27cd4388fef385b9c99.tar.xz
yuzu-2e6b67a079593e810dd7f27cd4388fef385b9c99.zip
filesystem: Populate save data sizes from control data
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/filesystem/filesystem.cpp47
-rw-r--r--src/core/hle/service/filesystem/filesystem.h6
2 files changed, 53 insertions, 0 deletions
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp
index b1490e6fa..c6da2df43 100644
--- a/src/core/hle/service/filesystem/filesystem.cpp
+++ b/src/core/hle/service/filesystem/filesystem.cpp
@@ -8,18 +8,23 @@
8#include "common/file_util.h" 8#include "common/file_util.h"
9#include "core/core.h" 9#include "core/core.h"
10#include "core/file_sys/bis_factory.h" 10#include "core/file_sys/bis_factory.h"
11#include "core/file_sys/control_metadata.h"
11#include "core/file_sys/errors.h" 12#include "core/file_sys/errors.h"
12#include "core/file_sys/mode.h" 13#include "core/file_sys/mode.h"
14#include "core/file_sys/partition_filesystem.h"
15#include "core/file_sys/patch_manager.h"
13#include "core/file_sys/registered_cache.h" 16#include "core/file_sys/registered_cache.h"
14#include "core/file_sys/romfs_factory.h" 17#include "core/file_sys/romfs_factory.h"
15#include "core/file_sys/savedata_factory.h" 18#include "core/file_sys/savedata_factory.h"
16#include "core/file_sys/sdmc_factory.h" 19#include "core/file_sys/sdmc_factory.h"
17#include "core/file_sys/vfs.h" 20#include "core/file_sys/vfs.h"
18#include "core/file_sys/vfs_offset.h" 21#include "core/file_sys/vfs_offset.h"
22#include "core/hle/kernel/process.h"
19#include "core/hle/service/filesystem/filesystem.h" 23#include "core/hle/service/filesystem/filesystem.h"
20#include "core/hle/service/filesystem/fsp_ldr.h" 24#include "core/hle/service/filesystem/fsp_ldr.h"
21#include "core/hle/service/filesystem/fsp_pr.h" 25#include "core/hle/service/filesystem/fsp_pr.h"
22#include "core/hle/service/filesystem/fsp_srv.h" 26#include "core/hle/service/filesystem/fsp_srv.h"
27#include "core/loader/loader.h"
23 28
24namespace Service::FileSystem { 29namespace Service::FileSystem {
25 30
@@ -28,6 +33,10 @@ namespace Service::FileSystem {
28// TODO(DarkLordZach): Eventually make this configurable in settings. 33// TODO(DarkLordZach): Eventually make this configurable in settings.
29constexpr u64 EMULATED_SD_REPORTED_SIZE = 32000000000; 34constexpr u64 EMULATED_SD_REPORTED_SIZE = 32000000000;
30 35
36// A default size for normal/journal save data size if application control metadata cannot be found.
37// This should be large enough to satisfy even the most extreme requirements (~4.2GB)
38constexpr u64 SUFFICIENT_SAVE_DATA_SIZE = 0xF0000000;
39
31static FileSys::VirtualDir GetDirectoryRelativeWrapped(FileSys::VirtualDir base, 40static FileSys::VirtualDir GetDirectoryRelativeWrapped(FileSys::VirtualDir base,
32 std::string_view dir_name_) { 41 std::string_view dir_name_) {
33 std::string dir_name(FileUtil::SanitizePath(dir_name_)); 42 std::string dir_name(FileUtil::SanitizePath(dir_name_));
@@ -341,6 +350,44 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() {
341 return sdmc_factory->Open(); 350 return sdmc_factory->Open();
342} 351}
343 352
353FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id) {
354 if (save_data_factory == nullptr) {
355 return {0, 0};
356 }
357
358 const auto value = save_data_factory->ReadSaveDataSize(type, title_id, user_id);
359
360 if (value.normal == 0 && value.journal == 0) {
361 FileSys::SaveDataSize new_size{SUFFICIENT_SAVE_DATA_SIZE, SUFFICIENT_SAVE_DATA_SIZE};
362
363 FileSys::NACP nacp;
364 const auto res = Core::System::GetInstance().GetAppLoader().ReadControlData(nacp);
365
366 if (res != Loader::ResultStatus::Success) {
367 FileSys::PatchManager pm{Core::CurrentProcess()->GetTitleID()};
368 auto [nacp_unique, discard] = pm.GetControlMetadata();
369
370 if (nacp_unique != nullptr) {
371 new_size = {nacp_unique->GetDefaultNormalSaveSize(),
372 nacp_unique->GetDefaultJournalSaveSize()};
373 }
374 } else {
375 new_size = {nacp.GetDefaultNormalSaveSize(), nacp.GetDefaultJournalSaveSize()};
376 }
377
378 WriteSaveDataSize(type, title_id, user_id, new_size);
379 return new_size;
380 }
381
382 return value;
383}
384
385void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id,
386 FileSys::SaveDataSize new_value) {
387 if (save_data_factory != nullptr)
388 save_data_factory->WriteSaveDataSize(type, title_id, user_id, new_value);
389}
390
344FileSys::RegisteredCacheUnion GetUnionContents() { 391FileSys::RegisteredCacheUnion GetUnionContents() {
345 return FileSys::RegisteredCacheUnion{ 392 return FileSys::RegisteredCacheUnion{
346 {GetSystemNANDContents(), GetUserNANDContents(), GetSDMCContents()}}; 393 {GetSystemNANDContents(), GetUserNANDContents(), GetSDMCContents()}};
diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h
index 965414be0..6fd5e7b23 100644
--- a/src/core/hle/service/filesystem/filesystem.h
+++ b/src/core/hle/service/filesystem/filesystem.h
@@ -21,9 +21,11 @@ class SDMCFactory;
21enum class ContentRecordType : u8; 21enum class ContentRecordType : u8;
22enum class Mode : u32; 22enum class Mode : u32;
23enum class SaveDataSpaceId : u8; 23enum class SaveDataSpaceId : u8;
24enum class SaveDataType : u8;
24enum class StorageId : u8; 25enum class StorageId : u8;
25 26
26struct SaveDataDescriptor; 27struct SaveDataDescriptor;
28struct SaveDataSize;
27} // namespace FileSys 29} // namespace FileSys
28 30
29namespace Service { 31namespace Service {
@@ -48,6 +50,10 @@ ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space,
48ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space); 50ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space);
49ResultVal<FileSys::VirtualDir> OpenSDMC(); 51ResultVal<FileSys::VirtualDir> OpenSDMC();
50 52
53FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id);
54void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id,
55 FileSys::SaveDataSize new_value);
56
51FileSys::RegisteredCacheUnion GetUnionContents(); 57FileSys::RegisteredCacheUnion GetUnionContents();
52 58
53FileSys::RegisteredCache* GetSystemNANDContents(); 59FileSys::RegisteredCache* GetSystemNANDContents();