citra-emu
/
citra
Archived
1
0
Fork 0

Services/FS: Stubbed GetSdmcArchiveResource and GetNandArchiveResource.

Also rewritten how GetArchiveResource works so that they all use the same interface.
We should decide what to do with these at some point.

Related to #3131 and #3110
This commit is contained in:
Subv 2020-04-15 16:38:37 -05:00
parent 9ae37da292
commit 783e7af5b2
4 changed files with 98 additions and 8 deletions

View File

@ -288,6 +288,16 @@ ResultCode ArchiveManager::CreateSystemSaveData(u32 high, u32 low) {
return RESULT_SUCCESS;
}
ResultVal<ArchiveResource> ArchiveManager::GetArchiveResource(MediaType media_type) const {
// TODO(Subv): Implement querying the actual size information for these storages.
ArchiveResource resource{};
resource.sector_size_in_bytes = 512;
resource.cluster_size_in_bytes = 16384;
resource.partition_capacity_in_clusters = 0x80000; // 8GiB capacity
resource.free_space_in_clusters = 0x80000; // 8GiB free
return MakeResult(resource);
}
void ArchiveManager::RegisterArchiveTypes() {
// TODO(Subv): Add the other archive types (see here for the known types:
// http://3dbrew.org/wiki/FS:OpenArchive#Archive_idcodes).

View File

@ -49,6 +49,14 @@ enum class MediaType : u32 { NAND = 0, SDMC = 1, GameCard = 2 };
typedef u64 ArchiveHandle;
struct ArchiveResource {
u32 sector_size_in_bytes;
u32 cluster_size_in_bytes;
u32 partition_capacity_in_clusters;
u32 free_space_in_clusters;
};
static_assert(sizeof(ArchiveResource) == 0x10, "ArchiveResource has incorrect size");
using FileSys::ArchiveBackend;
using FileSys::ArchiveFactory;
@ -230,6 +238,13 @@ public:
*/
ResultCode CreateSystemSaveData(u32 high, u32 low);
/**
* Returns capacity and free space information about the given media type.
* @param media_type The media type to obtain the information about.
* @return The capacity information of the media type, or an error code if failed.
*/
ResultVal<ArchiveResource> GetArchiveResource(MediaType media_type) const;
/// Registers a new NCCH file with the SelfNCCH archive factory
void RegisterSelfNCCH(Loader::AppLoader& app_loader);

View File

@ -449,6 +449,41 @@ void FS_USER::GetFreeBytes(Kernel::HLERequestContext& ctx) {
}
}
void FS_USER::GetSdmcArchiveResource(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx, 0x814, 0, 0);
LOG_WARNING(Service_FS, "(STUBBED) called");
auto resource = archives.GetArchiveResource(MediaType::SDMC);
if (resource.Failed()) {
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(resource.Code());
return;
}
IPC::RequestBuilder rb = rp.MakeBuilder(5, 0);
rb.Push(RESULT_SUCCESS);
rb.PushRaw(*resource);
}
void FS_USER::GetNandArchiveResource(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx, 0x815, 0, 0);
LOG_WARNING(Service_FS, "(STUBBED) called");
auto resource = archives.GetArchiveResource(MediaType::NAND);
if (resource.Failed()) {
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(resource.Code());
return;
}
IPC::RequestBuilder rb = rp.MakeBuilder(5, 0);
rb.Push(RESULT_SUCCESS);
rb.PushRaw(*resource);
}
void FS_USER::CreateExtSaveData(Kernel::HLERequestContext& ctx) {
// TODO(Subv): Figure out the other parameters.
IPC::RequestParser rp(ctx, 0x0851, 9, 2);
@ -601,16 +636,20 @@ void FS_USER::GetPriority(Kernel::HLERequestContext& ctx) {
void FS_USER::GetArchiveResource(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx, 0x849, 1, 0);
u32 system_media_type = rp.Pop<u32>();
auto media_type = rp.PopEnum<MediaType>();
LOG_WARNING(Service_FS, "(STUBBED) called Media type=0x{:08X}", system_media_type);
LOG_WARNING(Service_FS, "(STUBBED) called Media type=0x{:08X}", static_cast<u32>(media_type));
auto resource = archives.GetArchiveResource(media_type);
if (resource.Failed()) {
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(resource.Code());
return;
}
IPC::RequestBuilder rb = rp.MakeBuilder(5, 0);
rb.Push(RESULT_SUCCESS);
rb.Push<u32>(512);
rb.Push<u32>(16384);
rb.Push<u32>(0x80000); // 8GiB capacity
rb.Push<u32>(0x80000); // 8GiB free
rb.PushRaw(*resource);
}
void FS_USER::GetFormatInfo(Kernel::HLERequestContext& ctx) {
@ -798,8 +837,8 @@ FS_USER::FS_USER(Core::System& system)
{0x08110040, nullptr, "DeleteSystemSaveData"},
{0x08120080, &FS_USER::GetFreeBytes, "GetFreeBytes"},
{0x08130000, nullptr, "GetCardType"},
{0x08140000, nullptr, "GetSdmcArchiveResource"},
{0x08150000, nullptr, "GetNandArchiveResource"},
{0x08140000, &FS_USER::GetSdmcArchiveResource, "GetSdmcArchiveResource"},
{0x08150000, &FS_USER::GetNandArchiveResource, "GetNandArchiveResource"},
{0x08160000, nullptr, "GetSdmcFatfsError"},
{0x08170000, &FS_USER::IsSdmcDetected, "IsSdmcDetected"},
{0x08180000, &FS_USER::IsSdmcWriteable, "IsSdmcWritable"},

View File

@ -291,6 +291,32 @@ private:
*/
void GetFreeBytes(Kernel::HLERequestContext& ctx);
/**
* FS_User::GetSdmcArchiveResource service function.
* Inputs:
* 0 : 0x08140000
* Outputs:
* 1 : Result of function, 0 on success, otherwise error code
* 2 : Sector byte-size
* 3 : Cluster byte-size
* 4 : Partition capacity in clusters
* 5 : Available free space in clusters
*/
void GetSdmcArchiveResource(Kernel::HLERequestContext& ctx);
/**
* FS_User::GetNandArchiveResource service function.
* Inputs:
* 0 : 0x08150000
* Outputs:
* 1 : Result of function, 0 on success, otherwise error code
* 2 : Sector byte-size
* 3 : Cluster byte-size
* 4 : Partition capacity in clusters
* 5 : Available free space in clusters
*/
void GetNandArchiveResource(Kernel::HLERequestContext& ctx);
/**
* FS_User::CreateExtSaveData service function
* Inputs: