diff options
| author | 2024-02-11 20:28:51 -0500 | |
|---|---|---|
| committer | 2024-02-12 09:17:25 -0500 | |
| commit | 2e614ce08f56f4c49d8070e69ecdb44e2cb9f1c1 (patch) | |
| tree | 8ac4d5e8dae2f976b7bcfb5c9fe866024b2d7ae2 /src/core/hle/service/am | |
| parent | am: rewrite ISelfController (diff) | |
| download | yuzu-2e614ce08f56f4c49d8070e69ecdb44e2cb9f1c1.tar.gz yuzu-2e614ce08f56f4c49d8070e69ecdb44e2cb9f1c1.tar.xz yuzu-2e614ce08f56f4c49d8070e69ecdb44e2cb9f1c1.zip | |
am: rewrite IStorageAccessor, ITransferStorageAccessor
Diffstat (limited to 'src/core/hle/service/am')
| -rw-r--r-- | src/core/hle/service/am/service/storage_accessor.cpp | 68 | ||||
| -rw-r--r-- | src/core/hle/service/am/service/storage_accessor.h (renamed from src/core/hle/service/am/storage_accessor.h) | 21 | ||||
| -rw-r--r-- | src/core/hle/service/am/storage.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/am/storage_accessor.cpp | 90 |
4 files changed, 80 insertions, 101 deletions
diff --git a/src/core/hle/service/am/service/storage_accessor.cpp b/src/core/hle/service/am/service/storage_accessor.cpp new file mode 100644 index 000000000..84577fee4 --- /dev/null +++ b/src/core/hle/service/am/service/storage_accessor.cpp | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "core/hle/kernel/k_transfer_memory.h" | ||
| 5 | #include "core/hle/service/am/library_applet_storage.h" | ||
| 6 | #include "core/hle/service/am/service/storage_accessor.h" | ||
| 7 | #include "core/hle/service/cmif_serialization.h" | ||
| 8 | |||
| 9 | namespace Service::AM { | ||
| 10 | |||
| 11 | IStorageAccessor::IStorageAccessor(Core::System& system_, | ||
| 12 | std::shared_ptr<LibraryAppletStorage> impl) | ||
| 13 | : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} { | ||
| 14 | static const FunctionInfo functions[] = { | ||
| 15 | {0, D<&IStorageAccessor::GetSize>, "GetSize"}, | ||
| 16 | {10, D<&IStorageAccessor::Write>, "Write"}, | ||
| 17 | {11, D<&IStorageAccessor::Read>, "Read"}, | ||
| 18 | }; | ||
| 19 | |||
| 20 | RegisterHandlers(functions); | ||
| 21 | } | ||
| 22 | |||
| 23 | IStorageAccessor::~IStorageAccessor() = default; | ||
| 24 | |||
| 25 | Result IStorageAccessor::GetSize(Out<s64> out_size) { | ||
| 26 | LOG_DEBUG(Service_AM, "called"); | ||
| 27 | *out_size = m_impl->GetSize(); | ||
| 28 | R_SUCCEED(); | ||
| 29 | } | ||
| 30 | |||
| 31 | Result IStorageAccessor::Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset) { | ||
| 32 | LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size()); | ||
| 33 | R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size())); | ||
| 34 | } | ||
| 35 | |||
| 36 | Result IStorageAccessor::Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset) { | ||
| 37 | LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size()); | ||
| 38 | R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size())); | ||
| 39 | } | ||
| 40 | |||
| 41 | ITransferStorageAccessor::ITransferStorageAccessor(Core::System& system_, | ||
| 42 | std::shared_ptr<LibraryAppletStorage> impl) | ||
| 43 | : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} { | ||
| 44 | static const FunctionInfo functions[] = { | ||
| 45 | {0, D<&ITransferStorageAccessor::GetSize>, "GetSize"}, | ||
| 46 | {1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"}, | ||
| 47 | }; | ||
| 48 | |||
| 49 | RegisterHandlers(functions); | ||
| 50 | } | ||
| 51 | |||
| 52 | ITransferStorageAccessor::~ITransferStorageAccessor() = default; | ||
| 53 | |||
| 54 | Result ITransferStorageAccessor::GetSize(Out<s64> out_size) { | ||
| 55 | LOG_DEBUG(Service_AM, "called"); | ||
| 56 | *out_size = m_impl->GetSize(); | ||
| 57 | R_SUCCEED(); | ||
| 58 | } | ||
| 59 | |||
| 60 | Result ITransferStorageAccessor::GetHandle(Out<s64> out_size, | ||
| 61 | OutCopyHandle<Kernel::KTransferMemory> out_handle) { | ||
| 62 | LOG_INFO(Service_AM, "called"); | ||
| 63 | *out_size = m_impl->GetSize(); | ||
| 64 | *out_handle = m_impl->GetHandle(); | ||
| 65 | R_SUCCEED(); | ||
| 66 | } | ||
| 67 | |||
| 68 | } // namespace Service::AM | ||
diff --git a/src/core/hle/service/am/storage_accessor.h b/src/core/hle/service/am/service/storage_accessor.h index b9aa85a66..1a01730e0 100644 --- a/src/core/hle/service/am/storage_accessor.h +++ b/src/core/hle/service/am/service/storage_accessor.h | |||
| @@ -3,35 +3,36 @@ | |||
| 3 | 3 | ||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include "core/hle/service/am/storage.h" | 6 | #include "core/hle/service/am/library_applet_storage.h" |
| 7 | #include "core/hle/service/cmif_types.h" | ||
| 7 | #include "core/hle/service/service.h" | 8 | #include "core/hle/service/service.h" |
| 8 | 9 | ||
| 9 | namespace Service::AM { | 10 | namespace Service::AM { |
| 10 | 11 | ||
| 11 | class IStorageAccessor final : public ServiceFramework<IStorageAccessor> { | 12 | class IStorageAccessor final : public ServiceFramework<IStorageAccessor> { |
| 12 | public: | 13 | public: |
| 13 | explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl_); | 14 | explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl); |
| 14 | ~IStorageAccessor() override; | 15 | ~IStorageAccessor() override; |
| 15 | 16 | ||
| 16 | private: | 17 | private: |
| 17 | void GetSize(HLERequestContext& ctx); | 18 | Result GetSize(Out<s64> out_size); |
| 18 | void Write(HLERequestContext& ctx); | 19 | Result Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset); |
| 19 | void Read(HLERequestContext& ctx); | 20 | Result Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset); |
| 20 | 21 | ||
| 21 | const std::shared_ptr<LibraryAppletStorage> impl; | 22 | const std::shared_ptr<LibraryAppletStorage> m_impl; |
| 22 | }; | 23 | }; |
| 23 | 24 | ||
| 24 | class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> { | 25 | class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> { |
| 25 | public: | 26 | public: |
| 26 | explicit ITransferStorageAccessor(Core::System& system_, | 27 | explicit ITransferStorageAccessor(Core::System& system_, |
| 27 | std::shared_ptr<LibraryAppletStorage> impl_); | 28 | std::shared_ptr<LibraryAppletStorage> impl); |
| 28 | ~ITransferStorageAccessor() override; | 29 | ~ITransferStorageAccessor() override; |
| 29 | 30 | ||
| 30 | private: | 31 | private: |
| 31 | void GetSize(HLERequestContext& ctx); | 32 | Result GetSize(Out<s64> out_size); |
| 32 | void GetHandle(HLERequestContext& ctx); | 33 | Result GetHandle(Out<s64> out_size, OutCopyHandle<Kernel::KTransferMemory> out_handle); |
| 33 | 34 | ||
| 34 | const std::shared_ptr<LibraryAppletStorage> impl; | 35 | const std::shared_ptr<LibraryAppletStorage> m_impl; |
| 35 | }; | 36 | }; |
| 36 | 37 | ||
| 37 | } // namespace Service::AM | 38 | } // namespace Service::AM |
diff --git a/src/core/hle/service/am/storage.cpp b/src/core/hle/service/am/storage.cpp index 4e82afd1c..12d95eebd 100644 --- a/src/core/hle/service/am/storage.cpp +++ b/src/core/hle/service/am/storage.cpp | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | 3 | ||
| 4 | #include "core/hle/service/am/am_results.h" | 4 | #include "core/hle/service/am/am_results.h" |
| 5 | #include "core/hle/service/am/library_applet_storage.h" | 5 | #include "core/hle/service/am/library_applet_storage.h" |
| 6 | #include "core/hle/service/am/service/storage_accessor.h" | ||
| 6 | #include "core/hle/service/am/storage.h" | 7 | #include "core/hle/service/am/storage.h" |
| 7 | #include "core/hle/service/am/storage_accessor.h" | ||
| 8 | #include "core/hle/service/ipc_helpers.h" | 8 | #include "core/hle/service/ipc_helpers.h" |
| 9 | 9 | ||
| 10 | namespace Service::AM { | 10 | namespace Service::AM { |
diff --git a/src/core/hle/service/am/storage_accessor.cpp b/src/core/hle/service/am/storage_accessor.cpp deleted file mode 100644 index a1184b065..000000000 --- a/src/core/hle/service/am/storage_accessor.cpp +++ /dev/null | |||
| @@ -1,90 +0,0 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "core/hle/kernel/k_transfer_memory.h" | ||
| 5 | #include "core/hle/service/am/am_results.h" | ||
| 6 | #include "core/hle/service/am/library_applet_storage.h" | ||
| 7 | #include "core/hle/service/am/storage_accessor.h" | ||
| 8 | #include "core/hle/service/ipc_helpers.h" | ||
| 9 | |||
| 10 | namespace Service::AM { | ||
| 11 | |||
| 12 | IStorageAccessor::IStorageAccessor(Core::System& system_, | ||
| 13 | std::shared_ptr<LibraryAppletStorage> impl_) | ||
| 14 | : ServiceFramework{system_, "IStorageAccessor"}, impl{std::move(impl_)} { | ||
| 15 | static const FunctionInfo functions[] = { | ||
| 16 | {0, &IStorageAccessor::GetSize, "GetSize"}, | ||
| 17 | {10, &IStorageAccessor::Write, "Write"}, | ||
| 18 | {11, &IStorageAccessor::Read, "Read"}, | ||
| 19 | }; | ||
| 20 | |||
| 21 | RegisterHandlers(functions); | ||
| 22 | } | ||
| 23 | |||
| 24 | IStorageAccessor::~IStorageAccessor() = default; | ||
| 25 | |||
| 26 | void IStorageAccessor::GetSize(HLERequestContext& ctx) { | ||
| 27 | LOG_DEBUG(Service_AM, "called"); | ||
| 28 | |||
| 29 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 30 | |||
| 31 | rb.Push(ResultSuccess); | ||
| 32 | rb.Push(impl->GetSize()); | ||
| 33 | } | ||
| 34 | |||
| 35 | void IStorageAccessor::Write(HLERequestContext& ctx) { | ||
| 36 | IPC::RequestParser rp{ctx}; | ||
| 37 | |||
| 38 | const s64 offset{rp.Pop<s64>()}; | ||
| 39 | const auto data{ctx.ReadBuffer()}; | ||
| 40 | LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, data.size()); | ||
| 41 | |||
| 42 | const auto res{impl->Write(offset, data.data(), data.size())}; | ||
| 43 | |||
| 44 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 45 | rb.Push(res); | ||
| 46 | } | ||
| 47 | |||
| 48 | void IStorageAccessor::Read(HLERequestContext& ctx) { | ||
| 49 | IPC::RequestParser rp{ctx}; | ||
| 50 | |||
| 51 | const s64 offset{rp.Pop<s64>()}; | ||
| 52 | std::vector<u8> data(ctx.GetWriteBufferSize()); | ||
| 53 | |||
| 54 | LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, data.size()); | ||
| 55 | |||
| 56 | const auto res{impl->Read(offset, data.data(), data.size())}; | ||
| 57 | |||
| 58 | ctx.WriteBuffer(data); | ||
| 59 | |||
| 60 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 61 | rb.Push(res); | ||
| 62 | } | ||
| 63 | |||
| 64 | ITransferStorageAccessor::ITransferStorageAccessor(Core::System& system_, | ||
| 65 | std::shared_ptr<LibraryAppletStorage> impl_) | ||
| 66 | : ServiceFramework{system_, "ITransferStorageAccessor"}, impl{std::move(impl_)} { | ||
| 67 | static const FunctionInfo functions[] = { | ||
| 68 | {0, &ITransferStorageAccessor::GetSize, "GetSize"}, | ||
| 69 | {1, &ITransferStorageAccessor::GetHandle, "GetHandle"}, | ||
| 70 | }; | ||
| 71 | |||
| 72 | RegisterHandlers(functions); | ||
| 73 | } | ||
| 74 | |||
| 75 | ITransferStorageAccessor::~ITransferStorageAccessor() = default; | ||
| 76 | |||
| 77 | void ITransferStorageAccessor::GetSize(HLERequestContext& ctx) { | ||
| 78 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 79 | rb.Push(ResultSuccess); | ||
| 80 | rb.Push(impl->GetSize()); | ||
| 81 | } | ||
| 82 | |||
| 83 | void ITransferStorageAccessor::GetHandle(HLERequestContext& ctx) { | ||
| 84 | IPC::ResponseBuilder rb{ctx, 4, 1}; | ||
| 85 | rb.Push(ResultSuccess); | ||
| 86 | rb.Push(impl->GetSize()); | ||
| 87 | rb.PushCopyObjects(impl->GetHandle()); | ||
| 88 | } | ||
| 89 | |||
| 90 | } // namespace Service::AM | ||