mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-14 00:56:35 +00:00
ams: improve fatal error context
This commit is contained in:
parent
3207c38a44
commit
7fef83885f
4 changed files with 22 additions and 9 deletions
|
@ -41,6 +41,8 @@ static const char *get_error_desc_str(uint32_t error_desc) {
|
||||||
return "SError";
|
return "SError";
|
||||||
case 0x301:
|
case 0x301:
|
||||||
return "Bad SVC";
|
return "Bad SVC";
|
||||||
|
case 0xFFE:
|
||||||
|
return "std::abort() called";
|
||||||
default:
|
default:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
@ -48,7 +50,8 @@ static const char *get_error_desc_str(uint32_t error_desc) {
|
||||||
|
|
||||||
static void _check_and_display_atmosphere_fatal_error(void) {
|
static void _check_and_display_atmosphere_fatal_error(void) {
|
||||||
/* Check for valid magic. */
|
/* Check for valid magic. */
|
||||||
if (ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC) {
|
if (ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC &&
|
||||||
|
ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,10 @@
|
||||||
|
|
||||||
#define PANIC_CODE_SAFEMODE 0x00000020
|
#define PANIC_CODE_SAFEMODE 0x00000020
|
||||||
|
|
||||||
|
|
||||||
|
#define AMS_FATAL_ERROR_MAX_STACKTRACE 0x20
|
||||||
|
#define AMS_FATAL_ERROR_MAX_STACKDUMP 0x100
|
||||||
|
|
||||||
/* Atmosphere reboot-to-fatal-error. */
|
/* Atmosphere reboot-to-fatal-error. */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t magic;
|
uint32_t magic;
|
||||||
|
@ -43,17 +47,23 @@ typedef struct {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
uint64_t pc;
|
uint64_t pc;
|
||||||
uint64_t padding;
|
uint64_t module_base;
|
||||||
uint32_t pstate;
|
uint32_t pstate;
|
||||||
uint32_t afsr0;
|
uint32_t afsr0;
|
||||||
uint32_t afsr1;
|
uint32_t afsr1;
|
||||||
uint32_t esr;
|
uint32_t esr;
|
||||||
uint64_t far;
|
uint64_t far;
|
||||||
uint64_t report_identifier; /* Normally just system tick. */
|
uint64_t report_identifier; /* Normally just system tick. */
|
||||||
|
uint64_t stack_trace_size;
|
||||||
|
uint64_t stack_dump_size;
|
||||||
|
uint64_t stack_trace[AMS_FATAL_ERROR_MAX_STACKTRACE];
|
||||||
|
uint8_t stack_dump[AMS_FATAL_ERROR_MAX_STACKDUMP];
|
||||||
} atmosphere_fatal_error_ctx;
|
} atmosphere_fatal_error_ctx;
|
||||||
|
|
||||||
|
/* "AFE1" */
|
||||||
|
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC 0x31454641
|
||||||
/* "AFE0" */
|
/* "AFE0" */
|
||||||
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC 0x30454641
|
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0 0x30454641
|
||||||
|
|
||||||
#define ATMOSPHERE_FATAL_ERROR_CONTEXT ((volatile atmosphere_fatal_error_ctx *)(0x4003E000))
|
#define ATMOSPHERE_FATAL_ERROR_CONTEXT ((volatile atmosphere_fatal_error_ctx *)(0x4003E000))
|
||||||
|
|
||||||
|
|
|
@ -101,11 +101,6 @@ Result BpcRebootManager::PerformReboot() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void BpcRebootManager::RebootForFatalError(AtmosphereFatalErrorContext *ctx) {
|
void BpcRebootManager::RebootForFatalError(AtmosphereFatalErrorContext *ctx) {
|
||||||
/* If we don't actually have a payload loaded, just go to RCM. */
|
|
||||||
if (!g_payload_loaded) {
|
|
||||||
RebootToRcm();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure clean IRAM state. */
|
/* Ensure clean IRAM state. */
|
||||||
ClearIram();
|
ClearIram();
|
||||||
|
|
||||||
|
@ -118,5 +113,10 @@ void BpcRebootManager::RebootForFatalError(AtmosphereFatalErrorContext *ctx) {
|
||||||
memcpy(g_work_page, ctx, sizeof(*ctx));
|
memcpy(g_work_page, ctx, sizeof(*ctx));
|
||||||
CopyToIram(IRAM_PAYLOAD_BASE + IRAM_PAYLOAD_MAX_SIZE, g_work_page, sizeof(g_work_page));
|
CopyToIram(IRAM_PAYLOAD_BASE + IRAM_PAYLOAD_MAX_SIZE, g_work_page, sizeof(g_work_page));
|
||||||
|
|
||||||
|
/* If we don't actually have a payload loaded, just go to RCM. */
|
||||||
|
if (!g_payload_loaded) {
|
||||||
|
RebootToRcm();
|
||||||
|
}
|
||||||
|
|
||||||
RebootToIramPayload();
|
RebootToIramPayload();
|
||||||
}
|
}
|
|
@ -1 +1 @@
|
||||||
Subproject commit 63fc847f8ae43b173a9031071eebb76a1961c41c
|
Subproject commit 9dfe7709d950ef440548b123e43ea69ce52684b4
|
Loading…
Reference in a new issue