summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-05-17 21:46:17 -0400
committerGravatar Zach Hilman2019-05-25 16:09:20 -0400
commit186db894b9e7f322d5d339468f33feca4689d5e9 (patch)
tree6d38902f9e9b7588229fad7104b849deec202254 /src/core/hle/kernel/svc.cpp
parentcore: Add Reporter class to take/save reports (diff)
downloadyuzu-186db894b9e7f322d5d339468f33feca4689d5e9.tar.gz
yuzu-186db894b9e7f322d5d339468f33feca4689d5e9.tar.xz
yuzu-186db894b9e7f322d5d339468f33feca4689d5e9.zip
svc: Save report on call to svcBreak
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 5a5851f66..8b5216384 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -38,6 +38,7 @@
38#include "core/hle/result.h" 38#include "core/hle/result.h"
39#include "core/hle/service/service.h" 39#include "core/hle/service/service.h"
40#include "core/memory.h" 40#include "core/memory.h"
41#include "core/reporter.h"
41 42
42namespace Kernel { 43namespace Kernel {
43namespace { 44namespace {
@@ -594,6 +595,7 @@ struct BreakReason {
594static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) { 595static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
595 BreakReason break_reason{reason}; 596 BreakReason break_reason{reason};
596 bool has_dumped_buffer{}; 597 bool has_dumped_buffer{};
598 std::vector<u8> debug_buffer;
597 599
598 const auto handle_debug_buffer = [&](VAddr addr, u64 sz) { 600 const auto handle_debug_buffer = [&](VAddr addr, u64 sz) {
599 if (sz == 0 || addr == 0 || has_dumped_buffer) { 601 if (sz == 0 || addr == 0 || has_dumped_buffer) {
@@ -605,7 +607,7 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
605 LOG_CRITICAL(Debug_Emulated, "debug_buffer_err_code={:X}", Memory::Read32(addr)); 607 LOG_CRITICAL(Debug_Emulated, "debug_buffer_err_code={:X}", Memory::Read32(addr));
606 } else { 608 } else {
607 // We don't know what's in here so we'll hexdump it 609 // We don't know what's in here so we'll hexdump it
608 std::vector<u8> debug_buffer(sz); 610 debug_buffer.resize(sz);
609 Memory::ReadBlock(addr, debug_buffer.data(), sz); 611 Memory::ReadBlock(addr, debug_buffer.data(), sz);
610 std::string hexdump; 612 std::string hexdump;
611 for (std::size_t i = 0; i < debug_buffer.size(); i++) { 613 for (std::size_t i = 0; i < debug_buffer.size(); i++) {
@@ -664,6 +666,10 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
664 break; 666 break;
665 } 667 }
666 668
669 system.GetReporter().SaveSvcBreakReport(
670 static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger, info1,
671 info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt);
672
667 if (!break_reason.signal_debugger) { 673 if (!break_reason.signal_debugger) {
668 LOG_CRITICAL( 674 LOG_CRITICAL(
669 Debug_Emulated, 675 Debug_Emulated,