Skip to content

Commit

Permalink
Merge pull request #16673 from hrydgard/bluescreen-fix
Browse files Browse the repository at this point in the history
Show bluescreen properly on memory errors that we failed to ignore.
  • Loading branch information
hrydgard authored Dec 30, 2022
2 parents 5708dd9 + 97fadbc commit f0148e3
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 4 deletions.
5 changes: 3 additions & 2 deletions Core/Core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ void Core_MemoryException(u32 address, u32 pc, MemoryExceptionType type) {
}
}

void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std::string additionalInfo) {
void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std::string additionalInfo, bool forceReport) {
const char *desc = MemoryExceptionTypeAsString(type);
// In jit, we only flush PC when bIgnoreBadMemAccess is off.
if (g_Config.iCpuCore == (int)CPUCore::JIT && g_Config.bIgnoreBadMemAccess) {
Expand All @@ -464,7 +464,7 @@ void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std
WARN_LOG(MEMMAP, "%s: Invalid address %08x PC %08x LR %08x %s", desc, address, currentMIPS->pc, currentMIPS->r[MIPS_REG_RA], additionalInfo.c_str());
}

if (!g_Config.bIgnoreBadMemAccess) {
if (!g_Config.bIgnoreBadMemAccess || forceReport) {
ExceptionInfo &e = g_exceptionInfo;
e = {};
e.type = ExceptionType::MEMORY;
Expand All @@ -476,6 +476,7 @@ void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std
}
}

// Can't be ignored
void Core_ExecException(u32 address, u32 pc, ExecExceptionType type) {
const char *desc = ExecExceptionTypeAsString(type);
WARN_LOG(MEMMAP, "%s: Invalid destination %08x PC %08x LR %08x", desc, address, pc, currentMIPS->r[MIPS_REG_RA]);
Expand Down
2 changes: 1 addition & 1 deletion Core/Core.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ enum class ExecExceptionType {
// Separate one for without info, to avoid having to allocate a string
void Core_MemoryException(u32 address, u32 pc, MemoryExceptionType type);

void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std::string additionalInfo);
void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std::string additionalInfo, bool forceReport);

void Core_ExecException(u32 address, u32 pc, ExecExceptionType type);
void Core_Break(u32 pc);
Expand Down
3 changes: 2 additions & 1 deletion Core/MemFault.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,9 @@ bool HandleFault(uintptr_t hostAddress, void *ctx) {
}
} else {
// Either bIgnoreBadMemAccess is off, or we failed recovery analysis.
// We can't ignore this memory access.
uint32_t approximatePC = currentMIPS->pc;
Core_MemoryExceptionInfo(guestAddress, approximatePC, type, infoString);
Core_MemoryExceptionInfo(guestAddress, approximatePC, type, infoString, true);

// There's a small chance we can resume from this type of crash.
g_lastCrashAddress = codePtr;
Expand Down
7 changes: 7 additions & 0 deletions UI/EmuScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1199,6 +1199,9 @@ static void DrawCrashDump(UIContext *ctx) {

ctx->PushScissor(Bounds(x, y, columnWidth, height));


INFO_LOG(SYSTEM, "DrawCrashDump (%d %d %d %d)", x, y, columnWidth, height);

snprintf(statbuf, sizeof(statbuf), R"(%s
%s (%s)
%s (%s)
Expand Down Expand Up @@ -1565,6 +1568,10 @@ void EmuScreen::renderUI() {
const ExceptionInfo &info = Core_GetExceptionInfo();
if (info.type != ExceptionType::NONE) {
DrawCrashDump(ctx);
} else {
// We're somehow in ERROR or STEPPING without a crash dump. This case is what lead
// to the bare "Resume" and "Reset" buttons without a crash dump before, in cases
// where we were unable to ignore memory errors.
}
}

Expand Down

0 comments on commit f0148e3

Please sign in to comment.