|
|
|
@ -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::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),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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_data_a{
|
|
|
|
|
Common::ScratchBuffer<u8>(),
|
|
|
|
|
Common::ScratchBuffer<u8>(),
|
|
|
|
|
};
|
|
|
|
|
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>(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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 {}; },
|
|
|
|
|