mirror of
https://github.com/WerWolv/ImHex-Patterns.git
synced 2026-03-28 07:47:02 -05:00
62 lines
1.5 KiB
Rust
62 lines
1.5 KiB
Rust
#pragma author WerWolv
|
|
#pragma description Nintendo Switch Atmosphère CFW Fatal Error log
|
|
|
|
#pragma endian little
|
|
|
|
import std.io;
|
|
import std.sys;
|
|
|
|
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC "AFE2"
|
|
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_1 "AFE1"
|
|
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0 "AFE0"
|
|
|
|
#define AMS_FATAL_ERROR_MAX_STACKTRACE 0x20
|
|
#define AMS_FATAL_ERROR_MAX_STACKDUMP 0x100
|
|
#define AMS_FATAL_ERROR_TLS_SIZE 0x100
|
|
|
|
struct gprs_named {
|
|
u64 gprs[29];
|
|
u64 fp;
|
|
u64 lr;
|
|
u64 sp;
|
|
};
|
|
|
|
union gprs {
|
|
u64 gprs[32];
|
|
gprs_named named;
|
|
};
|
|
|
|
struct atmosphere_fatal_error_ctx {
|
|
char magic[4];
|
|
u32 error_desc;
|
|
u64 program_id;
|
|
gprs gprs;
|
|
u64 pc;
|
|
u64 module_base;
|
|
u32 pstate;
|
|
u32 afsr0;
|
|
u32 afsr1;
|
|
u32 esr;
|
|
u64 far;
|
|
u64 report_identifier; /* Normally just system tick */
|
|
u64 stack_trace_size;
|
|
u64 stack_dump_size;
|
|
u64 stack_trace[AMS_FATAL_ERROR_MAX_STACKTRACE];
|
|
u8 stack_dump[AMS_FATAL_ERROR_MAX_STACKDUMP];
|
|
u8 tls[AMS_FATAL_ERROR_TLS_SIZE];
|
|
};
|
|
|
|
atmosphere_fatal_error_ctx ctx @ 0x00;
|
|
|
|
std::assert(ctx.magic == ATMOSPHERE_REBOOT_TO_FATAL_MAGIC ||
|
|
ctx.magic == ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_1 ||
|
|
ctx.magic == ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0,
|
|
"File is not a valid Atmosphere fatal error binary!");
|
|
|
|
std::assert_warn(ctx.magic == ATMOSPHERE_REBOOT_TO_FATAL_MAGIC,
|
|
"Atmosphere fatal error binary is for an older version!");
|
|
|
|
|
|
std::print("Error Description: 0x{:04X}", ctx.error_desc);
|
|
std::print("Program ID: {:016X}", ctx.program_id);
|