diff options
author | Zach Hilman <zachhilman@gmail.com> | 2018-08-19 03:28:17 +0200 |
---|---|---|
committer | Zach Hilman <zachhilman@gmail.com> | 2018-08-19 03:28:23 +0200 |
commit | 27da7bc9daf951bce69970881bdbc8719378ca39 (patch) | |
tree | 67fb66ecb4ab97f2036712eb5b75216f75e730bf /src/core/hle | |
parent | Merge pull request #838 from FearlessTobi/port-3616 (diff) | |
download | yuzu-27da7bc9daf951bce69970881bdbc8719378ca39.tar yuzu-27da7bc9daf951bce69970881bdbc8719378ca39.tar.gz yuzu-27da7bc9daf951bce69970881bdbc8719378ca39.tar.bz2 yuzu-27da7bc9daf951bce69970881bdbc8719378ca39.tar.lz yuzu-27da7bc9daf951bce69970881bdbc8719378ca39.tar.xz yuzu-27da7bc9daf951bce69970881bdbc8719378ca39.tar.zst yuzu-27da7bc9daf951bce69970881bdbc8719378ca39.zip |
Diffstat (limited to 'src/core/hle')
-rw-r--r-- | src/core/hle/service/filesystem/filesystem.cpp | 19 | ||||
-rw-r--r-- | src/core/hle/service/filesystem/filesystem.h | 4 | ||||
-rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.cpp | 42 | ||||
-rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.h | 1 |
4 files changed, 50 insertions, 16 deletions
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index da658cbe6..f374111c1 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -256,15 +256,28 @@ ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory) { return RESULT_SUCCESS; } -ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id) { - LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}", title_id); +ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() { + LOG_TRACE(Service_FS, "Opening RomFS for current process"); if (romfs_factory == nullptr) { // TODO(bunnei): Find a better error code for this return ResultCode(-1); } - return romfs_factory->Open(title_id); + return romfs_factory->OpenCurrentProcess(); +} + +ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, + FileSys::ContentRecordType type) { + LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}, storage_id={:02X}, type={:02X}", + title_id, static_cast<u8>(storage_id), static_cast<u8>(type)); + + if (romfs_factory == nullptr) { + // TODO(bunnei): Find a better error code for this + return ResultCode(-1); + } + + return romfs_factory->Open(title_id, storage_id, type); } ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h index 1d6f922dd..37a2878b0 100644 --- a/src/core/hle/service/filesystem/filesystem.h +++ b/src/core/hle/service/filesystem/filesystem.h @@ -27,7 +27,9 @@ ResultCode RegisterSaveData(std::unique_ptr<FileSys::SaveDataFactory>&& factory) ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory); ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory); -ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id); +ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess(); +ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, + FileSys::ContentRecordType type); ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, FileSys::SaveDataDescriptor save_struct); ResultVal<FileSys::VirtualDir> OpenSDMC(); diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp index 1470f9017..2f8a7a3c1 100644 --- a/src/core/hle/service/filesystem/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp_srv.cpp @@ -23,15 +23,6 @@ namespace Service::FileSystem { -enum class StorageId : u8 { - None = 0, - Host = 1, - GameCard = 2, - NandSystem = 3, - NandUser = 4, - SdCard = 5, -}; - class IStorage final : public ServiceFramework<IStorage> { public: explicit IStorage(FileSys::VirtualFile backend_) @@ -467,7 +458,7 @@ FSP_SRV::FSP_SRV() : ServiceFramework("fsp-srv") { {110, nullptr, "OpenContentStorageFileSystem"}, {200, &FSP_SRV::OpenDataStorageByCurrentProcess, "OpenDataStorageByCurrentProcess"}, {201, nullptr, "OpenDataStorageByProgramId"}, - {202, nullptr, "OpenDataStorageByDataId"}, + {202, &FSP_SRV::OpenDataStorageByDataId, "OpenDataStorageByDataId"}, {203, &FSP_SRV::OpenRomStorage, "OpenRomStorage"}, {400, nullptr, "OpenDeviceOperator"}, {500, nullptr, "OpenSdCardDetectionEventNotifier"}, @@ -580,7 +571,7 @@ void FSP_SRV::GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx) { void FSP_SRV::OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "called"); - auto romfs = OpenRomFS(Core::System::GetInstance().CurrentProcess()->program_id); + auto romfs = OpenRomFSCurrentProcess(); if (romfs.Failed()) { // TODO (bunnei): Find the right error code to use here LOG_CRITICAL(Service_FS, "no file system interface available!"); @@ -596,10 +587,37 @@ void FSP_SRV::OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx) { rb.PushIpcInterface<IStorage>(std::move(storage)); } +void FSP_SRV::OpenDataStorageByDataId(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto storage_id = rp.PopRaw<FileSys::StorageId>(); + const auto unknown = rp.PopRaw<u32>(); + const auto title_id = rp.PopRaw<u64>(); + + LOG_DEBUG(Service_FS, "called with storage_id={:02X}, unknown={:08X}, title_id={:016X}", + static_cast<u8>(storage_id), unknown, title_id); + + auto data = OpenRomFS(title_id, storage_id, FileSys::ContentRecordType::Data); + if (data.Failed()) { + // TODO(DarkLordZach): Find the right error code to use here + LOG_ERROR(Service_FS, + "could not open data storage with title_id={:016X}, storage_id={:02X}", title_id, + static_cast<u8>(storage_id)); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultCode(-1)); + return; + } + + IStorage storage(std::move(data.Unwrap())); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushIpcInterface<IStorage>(std::move(storage)); +} + void FSP_SRV::OpenRomStorage(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; - auto storage_id = rp.PopRaw<StorageId>(); + auto storage_id = rp.PopRaw<FileSys::StorageId>(); auto title_id = rp.PopRaw<u64>(); LOG_DEBUG(Service_FS, "called with storage_id={:02X}, title_id={:016X}", diff --git a/src/core/hle/service/filesystem/fsp_srv.h b/src/core/hle/service/filesystem/fsp_srv.h index 07f99c93d..f073ac523 100644 --- a/src/core/hle/service/filesystem/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp_srv.h @@ -25,6 +25,7 @@ private: void MountSaveData(Kernel::HLERequestContext& ctx); void GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx); void OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx); + void OpenDataStorageByDataId(Kernel::HLERequestContext& ctx); void OpenRomStorage(Kernel::HLERequestContext& ctx); FileSys::VirtualFile romfs; |