Merge pull request #1551 from ogniK5377/improved-svcbreak

Added break types to svcBreak
This commit is contained in:
bunnei 2018-10-23 19:56:42 -04:00 committed by GitHub
commit a94e5d9e68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 51 additions and 5 deletions

View File

@ -375,9 +375,19 @@ static ResultCode ArbitrateUnlock(VAddr mutex_addr) {
return Mutex::Release(mutex_addr); return Mutex::Release(mutex_addr);
} }
enum class BreakType : u32 {
Panic = 0,
AssertionFailed = 1,
PreNROLoad = 3,
PostNROLoad = 4,
PreNROUnload = 5,
PostNROUnload = 6,
};
struct BreakReason { struct BreakReason {
union { union {
u32 raw; u32 raw;
BitField<0, 30, BreakType> break_type;
BitField<31, 1, u32> signal_debugger; BitField<31, 1, u32> signal_debugger;
}; };
}; };
@ -385,12 +395,48 @@ struct BreakReason {
/// Break program execution /// Break program execution
static void Break(u32 reason, u64 info1, u64 info2) { static void Break(u32 reason, u64 info1, u64 info2) {
BreakReason break_reason{reason}; BreakReason break_reason{reason};
if (break_reason.signal_debugger) {
LOG_ERROR( switch (break_reason.break_type) {
case BreakType::Panic:
LOG_CRITICAL(Debug_Emulated, "Signalling debugger, PANIC! info1=0x{:016X}, info2=0x{:016X}",
info1, info2);
break;
case BreakType::AssertionFailed:
LOG_CRITICAL(Debug_Emulated,
"Signalling debugger, Assertion failed! info1=0x{:016X}, info2=0x{:016X}",
info1, info2);
break;
case BreakType::PreNROLoad:
LOG_WARNING(
Debug_Emulated, Debug_Emulated,
"Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", "Signalling debugger, Attempting to load an NRO at 0x{:016X} with size 0x{:016X}",
reason, info1, info2); info1, info2);
} else { break;
case BreakType::PostNROLoad:
LOG_WARNING(Debug_Emulated,
"Signalling debugger, Loaded an NRO at 0x{:016X} with size 0x{:016X}", info1,
info2);
break;
case BreakType::PreNROUnload:
LOG_WARNING(
Debug_Emulated,
"Signalling debugger, Attempting to unload an NRO at 0x{:016X} with size 0x{:016X}",
info1, info2);
break;
case BreakType::PostNROUnload:
LOG_WARNING(Debug_Emulated,
"Signalling debugger, Unloaded an NRO at 0x{:016X} with size 0x{:016X}", info1,
info2);
break;
default:
LOG_WARNING(
Debug_Emulated,
"Signalling debugger, Unknown break reason {}, info1=0x{:016X}, info2=0x{:016X}",
static_cast<u32>(break_reason.break_type.Value()), info1, info2);
break;
}
if (!break_reason.signal_debugger) {
LOG_CRITICAL( LOG_CRITICAL(
Debug_Emulated, Debug_Emulated,
"Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", "Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}",