diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index dda8d526d3..4dfb0ded51 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -95,6 +95,7 @@ std::string SaveDataFactory::GetSaveDataSpaceIdPath(SaveDataSpaceId space) { case SaveDataSpaceId::System: return "/system/"; case SaveDataSpaceId::User: + case SaveDataSpaceId::SdUser: return "/user/"; case SaveDataSpaceId::Temporary: return "/temp/"; diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index 14e8df63a0..5a81a050a0 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp @@ -27,8 +27,10 @@ public: {10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"}, {10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"}, {10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"}, - {20100, &PlayReport::SaveSystemReport, "SaveSystemReport"}, - {20101, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"}, + {20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"}, +{20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"}, +{20102, &PlayReport::SaveSystemReport, "SaveSystemReport"}, +{20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"}, {20200, nullptr, "SetOperationMode"}, {30100, nullptr, "ClearStorage"}, {30200, nullptr, "ClearStatistics"}, @@ -121,24 +123,21 @@ private: rb.Push(system_session_id); } - void SaveSystemReport(HLERequestContext& ctx) { + void SaveSystemReportOld(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const auto title_id = rp.PopRaw(); const auto data1 = ctx.ReadBufferA(0); const auto data2 = ctx.ReadBufferX(0); - LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", + LOG_ERROR(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", title_id, data1.size(), data2.size()); - const auto& reporter{system.GetReporter()}; - reporter.SavePlayReport(Core::Reporter::PlayReportType::System, title_id, {data1, data2}); - IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - void SaveSystemReportWithUser(HLERequestContext& ctx) { + void SaveSystemReportWithUserOld(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const auto user_id = rp.PopRaw(); const auto title_id = rp.PopRaw(); @@ -146,7 +145,7 @@ private: const auto data1 = ctx.ReadBufferA(0); const auto data2 = ctx.ReadBufferX(0); - LOG_DEBUG(Service_PREPO, + LOG_ERROR(Service_PREPO, "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " "data2_size={:016X}", user_id[1], user_id[0], title_id, data1.size(), data2.size()); @@ -158,6 +157,49 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } + + // (21.0.0+) buffers: [0x9 (X), 0x5 (A)], inbytes: 0x10 + void SaveSystemReport(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto field0 = rp.PopRaw(); + const auto title_id = rp.PopRaw(); + + const auto data_x = ctx.ReadBufferX(0); + const auto data_a = ctx.ReadBufferA(0); + + LOG_ERROR(Service_PREPO, + "called, field0={}, title_id={:016X}, data_a_size={}, data_x_size={}", + field0, title_id, data_a.size(), data_x.size()); + + const auto& reporter{system.GetReporter()}; + reporter.SavePlayReport(Core::Reporter::PlayReportType::System, title_id, {data_a, data_x}); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } + + // (21.0.0+) buffers: [0x9 (X), 0x5 (A)], inbytes: 0x20 + void SaveSystemReportWithUser(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + + const auto user_id = rp.PopRaw(); + const auto title_id = rp.PopRaw(); + const auto reserved = rp.PopRaw(); + + const auto data_x = ctx.ReadBufferX(0); + const auto data_a = ctx.ReadBufferA(0); + + LOG_ERROR(Service_PREPO, + "called, user_id={:016X}{:016X}, title_id={:016X}, reserved={}, data_a_size={}, data_x_size={}", + user_id[1], user_id[0], title_id, reserved, data_a.size(), data_x.size()); + + const auto& reporter{system.GetReporter()}; + reporter.SavePlayReport(Core::Reporter::PlayReportType::System, title_id, {data_a, data_x}, + std::nullopt, user_id); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } }; void LoopProcess(Core::System& system) {