diff --git a/fusee/fusee-primary/src/panic.c b/fusee/fusee-primary/src/panic.c index e11e998b3..e7b206f33 100644 --- a/fusee/fusee-primary/src/panic.c +++ b/fusee/fusee-primary/src/panic.c @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + #include #include "panic.h" #include "di.h" @@ -51,8 +51,10 @@ static const char *get_error_desc_str(uint32_t error_desc) { static void _check_and_display_atmosphere_fatal_error(void) { /* Check for valid magic. */ - if (ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC && - ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0) { + if (ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC && + ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_1 && + ATMOSPHERE_FATAL_ERROR_CONTEXT->magic != ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0) + { return; } @@ -69,10 +71,10 @@ static void _check_and_display_atmosphere_fatal_error(void) { /* Turn on the backlight after initializing the lfb */ /* to avoid flickering. */ display_backlight(true); - + /* Override the global logging level. */ log_set_log_level(SCREEN_LOG_LEVEL_ERROR); - + /* Copy fatal error context to the stack. */ atmosphere_fatal_error_ctx ctx = *(ATMOSPHERE_FATAL_ERROR_CONTEXT); @@ -103,7 +105,7 @@ static void _check_and_display_atmosphere_fatal_error(void) { void check_and_display_panic(void) { /* Handle a panic sent via a stratosphere module. */ _check_and_display_atmosphere_fatal_error(); - + /* We also handle our own panics. */ bool has_panic = ((APBDEV_PMC_RST_STATUS_0 != 0) || (g_panic_code != 0)); uint32_t code = (g_panic_code == 0) ? APBDEV_PMC_SCRATCH200_0 : g_panic_code; @@ -152,10 +154,10 @@ void check_and_display_panic(void) { /* Initialize the display. */ display_init(); - + /* Fill the screen. */ display_color_screen(color); - + /* Wait for button and reboot. */ wait_for_button_and_reboot(); } else { diff --git a/fusee/fusee-primary/src/panic.h b/fusee/fusee-primary/src/panic.h index 94149fc27..86bf0d73f 100644 --- a/fusee/fusee-primary/src/panic.h +++ b/fusee/fusee-primary/src/panic.h @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + #ifndef FUSEE_PANIC_H #define FUSEE_PANIC_H @@ -30,6 +30,7 @@ #define AMS_FATAL_ERROR_MAX_STACKTRACE 0x20 #define AMS_FATAL_ERROR_MAX_STACKDUMP 0x100 +#define AMS_FATAL_ERROR_TLS_SIZE 0x100 /* Atmosphere reboot-to-fatal-error. */ typedef struct { @@ -57,10 +58,13 @@ typedef struct { uint64_t stack_dump_size; uint64_t stack_trace[AMS_FATAL_ERROR_MAX_STACKTRACE]; uint8_t stack_dump[AMS_FATAL_ERROR_MAX_STACKDUMP]; + uint8_t tls[AMS_FATAL_ERROR_TLS_SIZE]; } atmosphere_fatal_error_ctx; +/* "AFE2" */ +#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC 0x32454641 /* "AFE1" */ -#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC 0x31454641 +#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_1 0x31454641 /* "AFE0" */ #define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0 0x30454641 diff --git a/libraries/libstratosphere/include/stratosphere/ams/ams_types.hpp b/libraries/libstratosphere/include/stratosphere/ams/ams_types.hpp index 71e38724a..59f2b1ec1 100644 --- a/libraries/libstratosphere/include/stratosphere/ams/ams_types.hpp +++ b/libraries/libstratosphere/include/stratosphere/ams/ams_types.hpp @@ -83,12 +83,13 @@ namespace ams { struct FatalErrorContext : sf::LargeData, sf::PrefersMapAliasTransferMode { static constexpr size_t MaxStackTrace = 0x20; static constexpr size_t MaxStackDumpSize = 0x100; + static constexpr size_t ThreadLocalSize = 0x100; static constexpr size_t NumGprs = 29; static constexpr uintptr_t StdAbortMagicAddress = 0x8; static constexpr u64 StdAbortMagicValue = 0xA55AF00DDEADCAFEul; static constexpr u32 StdAbortErrorDesc = 0xFFE; static constexpr u32 DataAbortErrorDesc = 0x101; - static constexpr u32 Magic = util::FourCC<'A', 'F', 'E', '1'>::Code; + static constexpr u32 Magic = util::FourCC<'A', 'F', 'E', '2'>::Code; u32 magic; u32 error_desc; @@ -113,10 +114,11 @@ namespace ams { u64 stack_trace_size; u64 stack_dump_size; u64 stack_trace[MaxStackTrace]; - u8 stack_dump[MaxStackDumpSize]; + u8 stack_dump[MaxStackDumpSize]; + u8 tls[ThreadLocalSize]; }; - static_assert(sizeof(FatalErrorContext) == 0x350, "sizeof(FatalErrorContext)"); + static_assert(sizeof(FatalErrorContext) == 0x450, "sizeof(FatalErrorContext)"); static_assert(std::is_pod::value, "FatalErrorContext"); #ifdef ATMOSPHERE_GIT_BRANCH diff --git a/libraries/libstratosphere/source/ams/ams_environment.cpp b/libraries/libstratosphere/source/ams/ams_environment.cpp index fd7fc062c..0af5dc5b1 100644 --- a/libraries/libstratosphere/source/ams/ams_environment.cpp +++ b/libraries/libstratosphere/source/ams/ams_environment.cpp @@ -119,6 +119,9 @@ namespace ams { ams_ctx.stack_dump_size = 0; } } + + /* Grab 0x100 of tls. */ + std::memcpy(ams_ctx.tls, armGetTls(), sizeof(ams_ctx.tls)); } /* Just call the user exception handler. */