diff options
| -rw-r--r-- | src/core/hle/service/acc/acc.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/service/hle_ipc.cpp | 58 | ||||
| -rw-r--r-- | src/core/hle/service/hle_ipc.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/prepo/prepo.cpp | 40 |
4 files changed, 70 insertions, 46 deletions
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index b971401e6..3fe7e565c 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp | |||
| @@ -400,13 +400,13 @@ protected: | |||
| 400 | IPC::RequestParser rp{ctx}; | 400 | IPC::RequestParser rp{ctx}; |
| 401 | const auto base = rp.PopRaw<ProfileBase>(); | 401 | const auto base = rp.PopRaw<ProfileBase>(); |
| 402 | 402 | ||
| 403 | const auto user_data = ctx.ReadBuffer(); | 403 | const auto image_data = ctx.ReadBufferA(0); |
| 404 | const auto image_data = ctx.ReadBuffer(1); | 404 | const auto user_data = ctx.ReadBufferX(0); |
| 405 | 405 | ||
| 406 | LOG_DEBUG(Service_ACC, "called, username='{}', timestamp={:016X}, uuid=0x{}", | 406 | LOG_INFO(Service_ACC, "called, username='{}', timestamp={:016X}, uuid=0x{}", |
| 407 | Common::StringFromFixedZeroTerminatedBuffer( | 407 | Common::StringFromFixedZeroTerminatedBuffer( |
| 408 | reinterpret_cast<const char*>(base.username.data()), base.username.size()), | 408 | reinterpret_cast<const char*>(base.username.data()), base.username.size()), |
| 409 | base.timestamp, base.user_uuid.RawString()); | 409 | base.timestamp, base.user_uuid.RawString()); |
| 410 | 410 | ||
| 411 | if (user_data.size() < sizeof(UserData)) { | 411 | if (user_data.size() < sizeof(UserData)) { |
| 412 | LOG_ERROR(Service_ACC, "UserData buffer too small!"); | 412 | LOG_ERROR(Service_ACC, "UserData buffer too small!"); |
diff --git a/src/core/hle/service/hle_ipc.cpp b/src/core/hle/service/hle_ipc.cpp index f6a1e54f2..6f3ae3cc4 100644 --- a/src/core/hle/service/hle_ipc.cpp +++ b/src/core/hle/service/hle_ipc.cpp | |||
| @@ -23,6 +23,17 @@ | |||
| 23 | #include "core/hle/service/ipc_helpers.h" | 23 | #include "core/hle/service/ipc_helpers.h" |
| 24 | #include "core/memory.h" | 24 | #include "core/memory.h" |
| 25 | 25 | ||
| 26 | namespace { | ||
| 27 | static thread_local std::array read_buffer_data_a{ | ||
| 28 | Common::ScratchBuffer<u8>(), | ||
| 29 | Common::ScratchBuffer<u8>(), | ||
| 30 | }; | ||
| 31 | static thread_local std::array read_buffer_data_x{ | ||
| 32 | Common::ScratchBuffer<u8>(), | ||
| 33 | Common::ScratchBuffer<u8>(), | ||
| 34 | }; | ||
| 35 | } // Anonymous namespace | ||
| 36 | |||
| 26 | namespace Service { | 37 | namespace Service { |
| 27 | 38 | ||
| 28 | SessionRequestHandler::SessionRequestHandler(Kernel::KernelCore& kernel_, const char* service_name_) | 39 | SessionRequestHandler::SessionRequestHandler(Kernel::KernelCore& kernel_, const char* service_name_) |
| @@ -328,26 +339,57 @@ std::vector<u8> HLERequestContext::ReadBufferCopy(std::size_t buffer_index) cons | |||
| 328 | } | 339 | } |
| 329 | } | 340 | } |
| 330 | 341 | ||
| 331 | std::span<const u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const { | 342 | std::span<const u8> HLERequestContext::ReadBufferA(std::size_t buffer_index) const { |
| 332 | static thread_local std::array read_buffer_a{ | 343 | static thread_local std::array read_buffer_a{ |
| 333 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | 344 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), |
| 334 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | 345 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), |
| 335 | }; | 346 | }; |
| 336 | static thread_local std::array read_buffer_data_a{ | 347 | |
| 337 | Common::ScratchBuffer<u8>(), | 348 | ASSERT_OR_EXECUTE_MSG( |
| 338 | Common::ScratchBuffer<u8>(), | 349 | BufferDescriptorA().size() > buffer_index, { return {}; }, |
| 339 | }; | 350 | "BufferDescriptorA invalid buffer_index {}", buffer_index); |
| 351 | auto& read_buffer = read_buffer_a[buffer_index]; | ||
| 352 | return read_buffer.Read(BufferDescriptorA()[buffer_index].Address(), | ||
| 353 | BufferDescriptorA()[buffer_index].Size(), | ||
| 354 | &read_buffer_data_a[buffer_index]); | ||
| 355 | } | ||
| 356 | |||
| 357 | std::span<const u8> HLERequestContext::ReadBufferX(std::size_t buffer_index) const { | ||
| 340 | static thread_local std::array read_buffer_x{ | 358 | static thread_local std::array read_buffer_x{ |
| 341 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | 359 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), |
| 342 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | 360 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), |
| 343 | }; | 361 | }; |
| 344 | static thread_local std::array read_buffer_data_x{ | 362 | |
| 345 | Common::ScratchBuffer<u8>(), | 363 | ASSERT_OR_EXECUTE_MSG( |
| 346 | Common::ScratchBuffer<u8>(), | 364 | BufferDescriptorX().size() > buffer_index, { return {}; }, |
| 365 | "BufferDescriptorX invalid buffer_index {}", buffer_index); | ||
| 366 | auto& read_buffer = read_buffer_x[buffer_index]; | ||
| 367 | return read_buffer.Read(BufferDescriptorX()[buffer_index].Address(), | ||
| 368 | BufferDescriptorX()[buffer_index].Size(), | ||
| 369 | &read_buffer_data_x[buffer_index]); | ||
| 370 | } | ||
| 371 | |||
| 372 | std::span<const u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const { | ||
| 373 | static thread_local std::array read_buffer_a{ | ||
| 374 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | ||
| 375 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | ||
| 376 | }; | ||
| 377 | static thread_local std::array read_buffer_x{ | ||
| 378 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | ||
| 379 | Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::SafeRead>(memory, 0, 0), | ||
| 347 | }; | 380 | }; |
| 348 | 381 | ||
| 349 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && | 382 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && |
| 350 | BufferDescriptorA()[buffer_index].Size()}; | 383 | BufferDescriptorA()[buffer_index].Size()}; |
| 384 | const bool is_buffer_x{BufferDescriptorX().size() > buffer_index && | ||
| 385 | BufferDescriptorX()[buffer_index].Size()}; | ||
| 386 | |||
| 387 | if (is_buffer_a && is_buffer_x) { | ||
| 388 | LOG_WARNING(Input, "Both buffer descriptors are available a.size={}, x.size={}", | ||
| 389 | BufferDescriptorA()[buffer_index].Size(), | ||
| 390 | BufferDescriptorX()[buffer_index].Size()); | ||
| 391 | } | ||
| 392 | |||
| 351 | if (is_buffer_a) { | 393 | if (is_buffer_a) { |
| 352 | ASSERT_OR_EXECUTE_MSG( | 394 | ASSERT_OR_EXECUTE_MSG( |
| 353 | BufferDescriptorA().size() > buffer_index, { return {}; }, | 395 | BufferDescriptorA().size() > buffer_index, { return {}; }, |
diff --git a/src/core/hle/service/hle_ipc.h b/src/core/hle/service/hle_ipc.h index 4bd24c899..ad5259a5c 100644 --- a/src/core/hle/service/hle_ipc.h +++ b/src/core/hle/service/hle_ipc.h | |||
| @@ -253,6 +253,12 @@ public: | |||
| 253 | return domain_message_header.has_value(); | 253 | return domain_message_header.has_value(); |
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | /// Helper function to get a span of a buffer using the buffer descriptor A | ||
| 257 | [[nodiscard]] std::span<const u8> ReadBufferA(std::size_t buffer_index = 0) const; | ||
| 258 | |||
| 259 | /// Helper function to get a span of a buffer using the buffer descriptor X | ||
| 260 | [[nodiscard]] std::span<const u8> ReadBufferX(std::size_t buffer_index = 0) const; | ||
| 261 | |||
| 256 | /// Helper function to get a span of a buffer using the appropriate buffer descriptor | 262 | /// Helper function to get a span of a buffer using the appropriate buffer descriptor |
| 257 | [[nodiscard]] std::span<const u8> ReadBuffer(std::size_t buffer_index = 0) const; | 263 | [[nodiscard]] std::span<const u8> ReadBuffer(std::size_t buffer_index = 0) const; |
| 258 | 264 | ||
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index ec4a84989..14e8df63a 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp | |||
| @@ -58,14 +58,8 @@ private: | |||
| 58 | IPC::RequestParser rp{ctx}; | 58 | IPC::RequestParser rp{ctx}; |
| 59 | const auto process_id = rp.PopRaw<u64>(); | 59 | const auto process_id = rp.PopRaw<u64>(); |
| 60 | 60 | ||
| 61 | const auto data1 = ctx.ReadBuffer(0); | 61 | const auto data1 = ctx.ReadBufferA(0); |
| 62 | const auto data2 = [&ctx] { | 62 | const auto data2 = ctx.ReadBufferX(0); |
| 63 | if (ctx.CanReadBuffer(1)) { | ||
| 64 | return ctx.ReadBuffer(1); | ||
| 65 | } | ||
| 66 | |||
| 67 | return std::span<const u8>{}; | ||
| 68 | }(); | ||
| 69 | 63 | ||
| 70 | LOG_DEBUG(Service_PREPO, | 64 | LOG_DEBUG(Service_PREPO, |
| 71 | "called, type={:02X}, process_id={:016X}, data1_size={:016X}, data2_size={:016X}", | 65 | "called, type={:02X}, process_id={:016X}, data1_size={:016X}, data2_size={:016X}", |
| @@ -85,14 +79,8 @@ private: | |||
| 85 | const auto user_id = rp.PopRaw<u128>(); | 79 | const auto user_id = rp.PopRaw<u128>(); |
| 86 | const auto process_id = rp.PopRaw<u64>(); | 80 | const auto process_id = rp.PopRaw<u64>(); |
| 87 | 81 | ||
| 88 | const auto data1 = ctx.ReadBuffer(0); | 82 | const auto data1 = ctx.ReadBufferA(0); |
| 89 | const auto data2 = [&ctx] { | 83 | const auto data2 = ctx.ReadBufferX(0); |
| 90 | if (ctx.CanReadBuffer(1)) { | ||
| 91 | return ctx.ReadBuffer(1); | ||
| 92 | } | ||
| 93 | |||
| 94 | return std::span<const u8>{}; | ||
| 95 | }(); | ||
| 96 | 84 | ||
| 97 | LOG_DEBUG(Service_PREPO, | 85 | LOG_DEBUG(Service_PREPO, |
| 98 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, " | 86 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, " |
| @@ -137,14 +125,8 @@ private: | |||
| 137 | IPC::RequestParser rp{ctx}; | 125 | IPC::RequestParser rp{ctx}; |
| 138 | const auto title_id = rp.PopRaw<u64>(); | 126 | const auto title_id = rp.PopRaw<u64>(); |
| 139 | 127 | ||
| 140 | const auto data1 = ctx.ReadBuffer(0); | 128 | const auto data1 = ctx.ReadBufferA(0); |
| 141 | const auto data2 = [&ctx] { | 129 | const auto data2 = ctx.ReadBufferX(0); |
| 142 | if (ctx.CanReadBuffer(1)) { | ||
| 143 | return ctx.ReadBuffer(1); | ||
| 144 | } | ||
| 145 | |||
| 146 | return std::span<const u8>{}; | ||
| 147 | }(); | ||
| 148 | 130 | ||
| 149 | LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", | 131 | LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", |
| 150 | title_id, data1.size(), data2.size()); | 132 | title_id, data1.size(), data2.size()); |
| @@ -161,14 +143,8 @@ private: | |||
| 161 | const auto user_id = rp.PopRaw<u128>(); | 143 | const auto user_id = rp.PopRaw<u128>(); |
| 162 | const auto title_id = rp.PopRaw<u64>(); | 144 | const auto title_id = rp.PopRaw<u64>(); |
| 163 | 145 | ||
| 164 | const auto data1 = ctx.ReadBuffer(0); | 146 | const auto data1 = ctx.ReadBufferA(0); |
| 165 | const auto data2 = [&ctx] { | 147 | const auto data2 = ctx.ReadBufferX(0); |
| 166 | if (ctx.CanReadBuffer(1)) { | ||
| 167 | return ctx.ReadBuffer(1); | ||
| 168 | } | ||
| 169 | |||
| 170 | return std::span<const u8>{}; | ||
| 171 | }(); | ||
| 172 | 148 | ||
| 173 | LOG_DEBUG(Service_PREPO, | 149 | LOG_DEBUG(Service_PREPO, |
| 174 | "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " | 150 | "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " |