diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/prepo/prepo.cpp | 66 |
3 files changed, 70 insertions, 24 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 83decf6cf..a419f9602 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -338,6 +338,28 @@ std::size_t HLERequestContext::GetWriteBufferSize(std::size_t buffer_index) cons | |||
| 338 | return 0; | 338 | return 0; |
| 339 | } | 339 | } |
| 340 | 340 | ||
| 341 | bool HLERequestContext::CanReadBuffer(std::size_t buffer_index) const { | ||
| 342 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && | ||
| 343 | BufferDescriptorA()[buffer_index].Size()}; | ||
| 344 | |||
| 345 | if (is_buffer_a) { | ||
| 346 | return BufferDescriptorA().size() > buffer_index; | ||
| 347 | } else { | ||
| 348 | return BufferDescriptorX().size() > buffer_index; | ||
| 349 | } | ||
| 350 | } | ||
| 351 | |||
| 352 | bool HLERequestContext::CanWriteBuffer(std::size_t buffer_index) const { | ||
| 353 | const bool is_buffer_b{BufferDescriptorB().size() > buffer_index && | ||
| 354 | BufferDescriptorB()[buffer_index].Size()}; | ||
| 355 | |||
| 356 | if (is_buffer_b) { | ||
| 357 | return BufferDescriptorB().size() > buffer_index; | ||
| 358 | } else { | ||
| 359 | return BufferDescriptorC().size() > buffer_index; | ||
| 360 | } | ||
| 361 | } | ||
| 362 | |||
| 341 | std::string HLERequestContext::Description() const { | 363 | std::string HLERequestContext::Description() const { |
| 342 | if (!command_header) { | 364 | if (!command_header) { |
| 343 | return "No command header available"; | 365 | return "No command header available"; |
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index b112e1ebd..698f607e6 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -207,6 +207,12 @@ public: | |||
| 207 | /// Helper function to get the size of the output buffer | 207 | /// Helper function to get the size of the output buffer |
| 208 | std::size_t GetWriteBufferSize(std::size_t buffer_index = 0) const; | 208 | std::size_t GetWriteBufferSize(std::size_t buffer_index = 0) const; |
| 209 | 209 | ||
| 210 | /// Helper function to test whether the input buffer at buffer_index can be read | ||
| 211 | bool CanReadBuffer(std::size_t buffer_index = 0) const; | ||
| 212 | |||
| 213 | /// Helper function to test whether the output buffer at buffer_index can be written | ||
| 214 | bool CanWriteBuffer(std::size_t buffer_index = 0) const; | ||
| 215 | |||
| 210 | template <typename T> | 216 | template <typename T> |
| 211 | std::shared_ptr<T> GetCopyObject(std::size_t index) { | 217 | std::shared_ptr<T> GetCopyObject(std::size_t index) { |
| 212 | return DynamicObjectCast<T>(copy_objects.at(index)); | 218 | return DynamicObjectCast<T>(copy_objects.at(index)); |
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index b417624c9..6edd45455 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp | |||
| @@ -23,8 +23,8 @@ public: | |||
| 23 | {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"}, | 23 | {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"}, |
| 24 | {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"}, | 24 | {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"}, |
| 25 | {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"}, | 25 | {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"}, |
| 26 | {10104, nullptr, "SaveReport"}, | 26 | {10104, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"}, |
| 27 | {10105, nullptr, "SaveReportWithUser"}, | 27 | {10105, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"}, |
| 28 | {10200, nullptr, "RequestImmediateTransmission"}, | 28 | {10200, nullptr, "RequestImmediateTransmission"}, |
| 29 | {10300, nullptr, "GetTransmissionStatus"}, | 29 | {10300, nullptr, "GetTransmissionStatus"}, |
| 30 | {10400, nullptr, "GetSystemSessionId"}, | 30 | {10400, nullptr, "GetSystemSessionId"}, |
| @@ -59,16 +59,22 @@ private: | |||
| 59 | IPC::RequestParser rp{ctx}; | 59 | IPC::RequestParser rp{ctx}; |
| 60 | const auto process_id = rp.PopRaw<u64>(); | 60 | const auto process_id = rp.PopRaw<u64>(); |
| 61 | 61 | ||
| 62 | std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)}; | 62 | const auto data1 = ctx.ReadBuffer(0); |
| 63 | if constexpr (Type == Core::Reporter::PlayReportType::Old2) { | 63 | const auto data2 = [ctx] { |
| 64 | data.emplace_back(ctx.ReadBuffer(1)); | 64 | if (ctx.CanReadBuffer(1)) { |
| 65 | } | 65 | return ctx.ReadBuffer(1); |
| 66 | } | ||
| 67 | |||
| 68 | return std::vector<u8>{}; | ||
| 69 | }(); | ||
| 66 | 70 | ||
| 67 | LOG_DEBUG(Service_PREPO, "called, type={:02X}, process_id={:016X}, data1_size={:016X}", | 71 | LOG_DEBUG(Service_PREPO, |
| 68 | Type, process_id, data[0].size()); | 72 | "called, type={:02X}, process_id={:016X}, data1_size={:016X}, data2_size={:016X}", |
| 73 | Type, process_id, data1.size(), data2.size()); | ||
| 69 | 74 | ||
| 70 | const auto& reporter{system.GetReporter()}; | 75 | const auto& reporter{system.GetReporter()}; |
| 71 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id); | 76 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2}, |
| 77 | process_id); | ||
| 72 | 78 | ||
| 73 | IPC::ResponseBuilder rb{ctx, 2}; | 79 | IPC::ResponseBuilder rb{ctx, 2}; |
| 74 | rb.Push(RESULT_SUCCESS); | 80 | rb.Push(RESULT_SUCCESS); |
| @@ -79,24 +85,24 @@ private: | |||
| 79 | IPC::RequestParser rp{ctx}; | 85 | IPC::RequestParser rp{ctx}; |
| 80 | const auto user_id = rp.PopRaw<u128>(); | 86 | const auto user_id = rp.PopRaw<u128>(); |
| 81 | const auto process_id = rp.PopRaw<u64>(); | 87 | const auto process_id = rp.PopRaw<u64>(); |
| 82 | std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)}; | ||
| 83 | 88 | ||
| 84 | if constexpr (Type == Core::Reporter::PlayReportType::Old2) { | 89 | const auto data1 = ctx.ReadBuffer(0); |
| 85 | const auto read_buffer_count = | 90 | const auto data2 = [ctx] { |
| 86 | ctx.BufferDescriptorX().size() + ctx.BufferDescriptorA().size(); | 91 | if (ctx.CanReadBuffer(1)) { |
| 87 | if (read_buffer_count > 1) { | 92 | return ctx.ReadBuffer(1); |
| 88 | data.emplace_back(ctx.ReadBuffer(1)); | ||
| 89 | } | 93 | } |
| 90 | } | ||
| 91 | 94 | ||
| 92 | LOG_DEBUG( | 95 | return std::vector<u8>{}; |
| 93 | Service_PREPO, | 96 | }(); |
| 94 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}", | 97 | |
| 95 | Type, user_id[1], user_id[0], process_id, data[0].size()); | 98 | LOG_DEBUG(Service_PREPO, |
| 99 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, " | ||
| 100 | "data1_size={:016X}, data2_size={:016X}", | ||
| 101 | Type, user_id[1], user_id[0], process_id, data1.size(), data2.size()); | ||
| 96 | 102 | ||
| 97 | const auto& reporter{system.GetReporter()}; | 103 | const auto& reporter{system.GetReporter()}; |
| 98 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id, | 104 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2}, |
| 99 | user_id); | 105 | process_id, user_id); |
| 100 | 106 | ||
| 101 | IPC::ResponseBuilder rb{ctx, 2}; | 107 | IPC::ResponseBuilder rb{ctx, 2}; |
| 102 | rb.Push(RESULT_SUCCESS); | 108 | rb.Push(RESULT_SUCCESS); |
| @@ -107,7 +113,13 @@ private: | |||
| 107 | const auto title_id = rp.PopRaw<u64>(); | 113 | const auto title_id = rp.PopRaw<u64>(); |
| 108 | 114 | ||
| 109 | const auto data1 = ctx.ReadBuffer(0); | 115 | const auto data1 = ctx.ReadBuffer(0); |
| 110 | const auto data2 = ctx.ReadBuffer(1); | 116 | const auto data2 = [ctx] { |
| 117 | if (ctx.CanReadBuffer(1)) { | ||
| 118 | return ctx.ReadBuffer(1); | ||
| 119 | } | ||
| 120 | |||
| 121 | return std::vector<u8>{}; | ||
| 122 | }(); | ||
| 111 | 123 | ||
| 112 | LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", | 124 | LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", |
| 113 | title_id, data1.size(), data2.size()); | 125 | title_id, data1.size(), data2.size()); |
| @@ -125,7 +137,13 @@ private: | |||
| 125 | const auto title_id = rp.PopRaw<u64>(); | 137 | const auto title_id = rp.PopRaw<u64>(); |
| 126 | 138 | ||
| 127 | const auto data1 = ctx.ReadBuffer(0); | 139 | const auto data1 = ctx.ReadBuffer(0); |
| 128 | const auto data2 = ctx.ReadBuffer(1); | 140 | const auto data2 = [ctx] { |
| 141 | if (ctx.CanReadBuffer(1)) { | ||
| 142 | return ctx.ReadBuffer(1); | ||
| 143 | } | ||
| 144 | |||
| 145 | return std::vector<u8>{}; | ||
| 146 | }(); | ||
| 129 | 147 | ||
| 130 | LOG_DEBUG(Service_PREPO, | 148 | LOG_DEBUG(Service_PREPO, |
| 131 | "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " | 149 | "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " |