|
|
@@ -23,6 +23,17 @@
|
|
|
#include "core/hle/service/ipc_helpers.h"
|
|
|
#include "core/memory.h"
|
|
|
|
|
|
+namespace {
|
|
|
+static thread_local std::array read_buffer_data_a{
|
|
|
+ Common::ScratchBuffer<u8>(),
|
|
|
+ Common::ScratchBuffer<u8>(),
|
|
|
+};
|
|
|
+static thread_local std::array read_buffer_data_x{
|
|
|
+ Common::ScratchBuffer<u8>(),
|
|
|
+ Common::ScratchBuffer<u8>(),
|
|
|
+};
|
|
|
+} // Anonymous namespace
|
|
|
+
|
|
|
namespace Service {
|
|
|
|
|
|
SessionRequestHandler::SessionRequestHandler(Kernel::KernelCore& kernel_, const char* service_name_)
|
|
|
@@ -328,26 +339,57 @@ std::vector<u8> HLERequestContext::ReadBufferCopy(std::size_t buffer_index) cons
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-std::span<const u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const {
|
|
|
+std::span<const u8> HLERequestContext::ReadBufferA(std::size_t buffer_index) const {
|
|
|
static thread_local std::array read_buffer_a{
|
|
|
Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
};
|
|
|
- static thread_local std::array read_buffer_data_a{
|
|
|
- Common::ScratchBuffer<u8>(),
|
|
|
- Common::ScratchBuffer<u8>(),
|
|
|
- };
|
|
|
+
|
|
|
+ ASSERT_OR_EXECUTE_MSG(
|
|
|
+ BufferDescriptorA().size() > buffer_index, { return {}; },
|
|
|
+ "BufferDescriptorA invalid buffer_index {}", buffer_index);
|
|
|
+ auto& read_buffer = read_buffer_a[buffer_index];
|
|
|
+ return read_buffer.Read(BufferDescriptorA()[buffer_index].Address(),
|
|
|
+ BufferDescriptorA()[buffer_index].Size(),
|
|
|
+ &read_buffer_data_a[buffer_index]);
|
|
|
+}
|
|
|
+
|
|
|
+std::span<const u8> HLERequestContext::ReadBufferX(std::size_t buffer_index) const {
|
|
|
static thread_local std::array read_buffer_x{
|
|
|
Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
};
|
|
|
- static thread_local std::array read_buffer_data_x{
|
|
|
- Common::ScratchBuffer<u8>(),
|
|
|
- Common::ScratchBuffer<u8>(),
|
|
|
+
|
|
|
+ ASSERT_OR_EXECUTE_MSG(
|
|
|
+ BufferDescriptorX().size() > buffer_index, { return {}; },
|
|
|
+ "BufferDescriptorX invalid buffer_index {}", buffer_index);
|
|
|
+ auto& read_buffer = read_buffer_x[buffer_index];
|
|
|
+ return read_buffer.Read(BufferDescriptorX()[buffer_index].Address(),
|
|
|
+ BufferDescriptorX()[buffer_index].Size(),
|
|
|
+ &read_buffer_data_x[buffer_index]);
|
|
|
+}
|
|
|
+
|
|
|
+std::span<const u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const {
|
|
|
+ static thread_local std::array read_buffer_a{
|
|
|
+ Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
+ Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
+ };
|
|
|
+ static thread_local std::array read_buffer_x{
|
|
|
+ Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
+ Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0),
|
|
|
};
|
|
|
|
|
|
const bool is_buffer_a{BufferDescriptorA().size() > buffer_index &&
|
|
|
BufferDescriptorA()[buffer_index].Size()};
|
|
|
+ const bool is_buffer_x{BufferDescriptorX().size() > buffer_index &&
|
|
|
+ BufferDescriptorX()[buffer_index].Size()};
|
|
|
+
|
|
|
+ if (is_buffer_a && is_buffer_x) {
|
|
|
+ LOG_WARNING(Input, "Both buffer descriptors are available a.size={}, x.size={}",
|
|
|
+ BufferDescriptorA()[buffer_index].Size(),
|
|
|
+ BufferDescriptorX()[buffer_index].Size());
|
|
|
+ }
|
|
|
+
|
|
|
if (is_buffer_a) {
|
|
|
ASSERT_OR_EXECUTE_MSG(
|
|
|
BufferDescriptorA().size() > buffer_index, { return {}; },
|