diff --git a/src/core/hle/result.h b/src/core/hle/result.h index 5e4f8968f..32c0eb426 100644 --- a/src/core/hle/result.h +++ b/src/core/hle/result.h @@ -53,6 +53,7 @@ enum class ErrorModule : u32 { TIPC = 35, ANIF = 37, Module38 = 38, // Unknown/Undefined module - stubbed for multiplayer compatibility + Module56 = 56, // Unknown/Undefined module - reported by some games CRT = 39, ETHC = 100, I2C = 101, diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index 317cd457c..cb3f43c01 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp @@ -69,7 +69,7 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F const auto module = static_cast(error_code.GetModule()); const auto description = static_cast(error_code.GetDescription()); - // Check if this is module 38 (undefined/unknown module) + // Check if this is an undefined/unknown module std::string module_note; if (module == 38) { module_note = fmt::format( @@ -78,6 +78,13 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F "Error code: 2038-{:04d} (0x{:08X})\n" "If you're experiencing multiplayer issues, this may be a stubbing issue.\n\n", description, error_code.raw); + } else if (module == 56) { + module_note = fmt::format( + "\n⚠️ WARNING: Error module 56 is undefined/unknown!\n" + "This error may be game-generated or from an unimplemented service.\n" + "Error code: 2056-{:04d} (0x{:08X})\n" + "This may be related to online services or network functionality.\n\n", + description, error_code.raw); } std::string crash_report = fmt::format( @@ -123,6 +130,7 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F static void ThrowFatalError(Core::System& system, Result error_code, FatalType fatal_type, const FatalInfo& info) { + const auto module = static_cast(error_code.GetModule()); LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", fatal_type, error_code.raw); @@ -131,6 +139,14 @@ static void ThrowFatalError(Core::System& system, Result error_code, FatalType f GenerateErrorReport(system, error_code, info); [[fallthrough]]; case FatalType::ErrorScreen: + // For Module 56 errors (unknown/game-generated), log and continue instead of crashing + // These are often related to online services being unavailable + if (module == 56) { + LOG_WARNING(Service_Fatal, + "Module 56 error detected - likely game-generated due to unavailable " + "online services. Continuing execution instead of crashing."); + break; + } // Since we have no fatal:u error screen. We should just kill execution instead ASSERT(false); break; diff --git a/src/core/hle/service/ldn/ldn_results.h b/src/core/hle/service/ldn/ldn_results.h index 6e29780b7..743a14580 100644 --- a/src/core/hle/service/ldn/ldn_results.h +++ b/src/core/hle/service/ldn/ldn_results.h @@ -34,4 +34,13 @@ constexpr Result ResultModule38NetworkError{ErrorModule::Module38, 100}; // Netw constexpr Result ResultModule38ConnectionFailed{ErrorModule::Module38, 200}; // Connection failure constexpr Result ResultModule38Timeout{ErrorModule::Module38, 300}; // Operation timeout +// Module 56 error codes - Unknown/undefined module +// Error code format: 2056-XXXX where XXXX is the description +// Error code 2056-2306 (0x00120438) has been reported by Minecraft +constexpr Result ResultModule56Generic{ErrorModule::Module56, 0}; // Generic module 56 error +constexpr Result ResultModule56Error2306{ErrorModule::Module56, 2306}; // Reported by Minecraft +constexpr Result ResultModule56NetworkError{ErrorModule::Module56, 100}; // Network-related +constexpr Result ResultModule56ConnectionFailed{ErrorModule::Module56, 200}; // Connection failure +constexpr Result ResultModule56Timeout{ErrorModule::Module56, 300}; // Operation timeout + } // namespace Service::LDN