|
|
|
@ -301,13 +301,28 @@ static ResultCode ArbitrateUnlock(VAddr mutex_addr) { |
|
|
|
return Mutex::Release(mutex_addr); |
|
|
|
} |
|
|
|
|
|
|
|
struct BreakReason { |
|
|
|
union { |
|
|
|
u64 raw; |
|
|
|
BitField<31, 1, u64> dont_kill_application; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
/// Break program execution
|
|
|
|
static void Break(u64 reason, u64 info1, u64 info2) { |
|
|
|
LOG_CRITICAL( |
|
|
|
Debug_Emulated, |
|
|
|
"Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", |
|
|
|
reason, info1, info2); |
|
|
|
ASSERT(false); |
|
|
|
BreakReason break_reason{reason}; |
|
|
|
if (break_reason.dont_kill_application) { |
|
|
|
LOG_ERROR( |
|
|
|
Debug_Emulated, |
|
|
|
"Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", |
|
|
|
reason, info1, info2); |
|
|
|
} else { |
|
|
|
LOG_CRITICAL( |
|
|
|
Debug_Emulated, |
|
|
|
"Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", |
|
|
|
reason, info1, info2); |
|
|
|
ASSERT(false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// Used to output a message on a debug hardware unit - does nothing on a retail unit
|
|
|
|
|