mirror of
https://git.citron-emu.org/citron/emulator
synced 2025-12-19 10:43:33 +00:00
fix: add Module 56 error support and improve error handling
- Add Module56 to ErrorModule enum for error code 2056-2306 - Add Module 56 error handling in fatal error reporting - Define Module 56 error codes in ldn_results.h - Improve error reporting for unknown modules This allows the emulator to properly handle error code 2056-2306 reported by Minecraft and other games, preventing undefined behavior when encountering unknown module errors. Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
@@ -53,6 +53,7 @@ enum class ErrorModule : u32 {
|
|||||||
TIPC = 35,
|
TIPC = 35,
|
||||||
ANIF = 37,
|
ANIF = 37,
|
||||||
Module38 = 38, // Unknown/Undefined module - stubbed for multiplayer compatibility
|
Module38 = 38, // Unknown/Undefined module - stubbed for multiplayer compatibility
|
||||||
|
Module56 = 56, // Unknown/Undefined module - reported by some games
|
||||||
CRT = 39,
|
CRT = 39,
|
||||||
ETHC = 100,
|
ETHC = 100,
|
||||||
I2C = 101,
|
I2C = 101,
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F
|
|||||||
const auto module = static_cast<u32>(error_code.GetModule());
|
const auto module = static_cast<u32>(error_code.GetModule());
|
||||||
const auto description = static_cast<u32>(error_code.GetDescription());
|
const auto description = static_cast<u32>(error_code.GetDescription());
|
||||||
|
|
||||||
// Check if this is module 38 (undefined/unknown module)
|
// Check if this is an undefined/unknown module
|
||||||
std::string module_note;
|
std::string module_note;
|
||||||
if (module == 38) {
|
if (module == 38) {
|
||||||
module_note = fmt::format(
|
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"
|
"Error code: 2038-{:04d} (0x{:08X})\n"
|
||||||
"If you're experiencing multiplayer issues, this may be a stubbing issue.\n\n",
|
"If you're experiencing multiplayer issues, this may be a stubbing issue.\n\n",
|
||||||
description, error_code.raw);
|
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(
|
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,
|
static void ThrowFatalError(Core::System& system, Result error_code, FatalType fatal_type,
|
||||||
const FatalInfo& info) {
|
const FatalInfo& info) {
|
||||||
|
const auto module = static_cast<u32>(error_code.GetModule());
|
||||||
LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", fatal_type,
|
LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", fatal_type,
|
||||||
error_code.raw);
|
error_code.raw);
|
||||||
|
|
||||||
@@ -131,6 +139,14 @@ static void ThrowFatalError(Core::System& system, Result error_code, FatalType f
|
|||||||
GenerateErrorReport(system, error_code, info);
|
GenerateErrorReport(system, error_code, info);
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case FatalType::ErrorScreen:
|
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
|
// Since we have no fatal:u error screen. We should just kill execution instead
|
||||||
ASSERT(false);
|
ASSERT(false);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -34,4 +34,13 @@ constexpr Result ResultModule38NetworkError{ErrorModule::Module38, 100}; // Netw
|
|||||||
constexpr Result ResultModule38ConnectionFailed{ErrorModule::Module38, 200}; // Connection failure
|
constexpr Result ResultModule38ConnectionFailed{ErrorModule::Module38, 200}; // Connection failure
|
||||||
constexpr Result ResultModule38Timeout{ErrorModule::Module38, 300}; // Operation timeout
|
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
|
} // namespace Service::LDN
|
||||||
|
|||||||
Reference in New Issue
Block a user