From 1ce6fff0648008b7510e9feb3cf6696a2c25dd5c Mon Sep 17 00:00:00 2001 From: bunnei Date: Tue, 13 Feb 2018 21:41:20 -0500 Subject: hle_ipc: Add helper functions for reading and writing buffers. --- src/core/hle/kernel/hle_ipc.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/core/hle/kernel/hle_ipc.cpp') diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index db104e8a2..a5a3d4fe4 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -12,6 +12,7 @@ #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/process.h" #include "core/hle/kernel/server_session.h" +#include "core/memory.h" namespace Kernel { @@ -210,4 +211,42 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P return RESULT_SUCCESS; } +std::vector HLERequestContext::ReadBuffer() const { + std::vector buffer; + const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[0].Size()}; + + if (is_buffer_a) { + buffer.resize(BufferDescriptorA()[0].Size()); + Memory::ReadBlock(BufferDescriptorA()[0].Address(), buffer.data(), buffer.size()); + } else { + buffer.resize(BufferDescriptorX()[0].Size()); + Memory::ReadBlock(BufferDescriptorX()[0].Address(), buffer.data(), buffer.size()); + } + + return buffer; +} + +size_t HLERequestContext::WriteBuffer(const void* buffer, const size_t size) const { + const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; + + if (is_buffer_b) { + const size_t size{std::min(BufferDescriptorB()[0].Size(), size)}; + Memory::WriteBlock(BufferDescriptorB()[0].Address(), buffer, size); + return size; + } else { + const size_t size{std::min(BufferDescriptorC()[0].Size(), size)}; + Memory::WriteBlock(BufferDescriptorC()[0].Address(), buffer, size); + return size; + } +} + +size_t HLERequestContext::WriteBuffer(const std::vector& buffer) const { + return WriteBuffer(buffer.data(), buffer.size()); +} + +size_t HLERequestContext::GetWriteBufferSize() const { + const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; + return is_buffer_b ? BufferDescriptorB()[0].Size() : BufferDescriptorC()[0].Size(); +} + } // namespace Kernel -- cgit v1.2.3