/** * @file errf.h * @brief Error Display API */ #pragma once #include <3ds/types.h> /// Types of errors that can be thrown by err:f. typedef enum { ERRF_ERRTYPE_GENERIC = 0, ///< For generic errors. Shows miscellaneous info. ERRF_ERRTYPE_MEM_CORRUPT = 1, ///< Same output as generic, but informs the user that "the System Memory has been damaged". ERRF_ERRTYPE_CARD_REMOVED = 2, ///< Displays the "The Game Card was removed." message. ERRF_ERRTYPE_EXCEPTION = 3, ///< For exceptions, or more specifically 'crashes'. union data should be exception_data. ERRF_ERRTYPE_FAILURE = 4, ///< For general failure. Shows a message. union data should have a string set in failure_mesg ERRF_ERRTYPE_LOGGED = 5, ///< Outputs logs to NAND in some cases. } ERRF_ErrType; /// Types of 'Exceptions' thrown for ERRF_ERRTYPE_EXCEPTION typedef enum { ERRF_EXCEPTION_PREFETCH_ABORT = 0, ///< Prefetch Abort ERRF_EXCEPTION_DATA_ABORT = 1, ///< Data abort ERRF_EXCEPTION_UNDEFINED = 2, ///< Undefined instruction ERRF_EXCEPTION_VFP = 3, ///< VFP (floating point) exception. } ERRF_ExceptionType; typedef struct { ERRF_ExceptionType type; ///< Type of the exception. One of the ERRF_EXCEPTION_* values. u8 reserved[3]; u32 reg1; ///< If type is prefetch, this should be ifsr, and on data abort dfsr u32 reg2; ///< If type is prefetch, this should be r15, and dfar on data abort u32 fpexc; u32 fpinst; u32 fpint2; } ERRF_ExceptionInfo; typedef struct { ERRF_ExceptionInfo excep; ///< Exception info struct CpuRegisters regs; ///< CPU register dump. u8 pad[4]; } ERRF_ExceptionData; typedef struct { ERRF_ErrType type; ///< Type, one of the ERRF_ERRTYPE_* enum u8 revHigh; ///< High revison ID u16 revLow; ///< Low revision ID u32 resCode; ///< Result code u32 pcAddr; ///< PC address at exception u32 procId; ///< Process ID. u64 titleId; ///< Title ID. u64 appTitleId; ///< Application Title ID. union { ERRF_ExceptionData exception_data; ///< Data for when type is ERRF_ERRTYPE_EXCEPTION char failure_mesg[60]; ///< String for when type is ERRF_ERRTYPE_FAILURE } data; ///< The different types of data for errors. } ERRF_FatalErrInfo; /// Initializes ERR:f. Unless you plan to call ERRF_Throw yourself, do not use this. Result errfInit(void); /// Exits ERR:f. Unless you plan to call ERRF_Throw yourself, do not use this. void errfExit(void); /** * @brief Gets the current err:f API session handle. * @return The current err:f API session handle. */ Handle *errfGetSessionHandle(void); /** * @brief Throws a system error and possibly results in ErrDisp triggering. * @param[in] error Error to throw. * * After performing this, the system may panic and need to be rebooted. Extra information will be displayed on the * top screen with a developer console or the proper patches in a CFW applied. * * The error may not be shown and execution aborted until errfExit(void) is called. * * You may wish to use ERRF_ThrowResult() or ERRF_ThrowResultWithMessage() instead of * constructing the ERRF_FatalErrInfo struct yourself. */ Result ERRF_Throw(const ERRF_FatalErrInfo* error); /** * @brief Throws a system error with the given Result code. * @param[in] failure Result code to throw. * * This calls ERRF_Throw() with error type ERRF_ERRTYPE_GENERIC and fills in the required data. * * This function \em does fill in the address where this function was called from. * * See https://3dbrew.org/wiki/ERR:Throw#Generic for expected top screen output * on development units/patched ErrDisp. */ Result ERRF_ThrowResult(Result failure); /** * @brief Throws a system error with the given Result code and message. * @param[in] failure Result code to throw. * @param[in] message The message to display. * * This calls ERRF_Throw() with error type ERRF_ERRTYPE_FAILURE and fills in the required data. * * This function does \em not fill in the address where this function was called from because it * would not be displayed. * * The message is only displayed on development units/patched ErrDisp. * * See https://3dbrew.org/wiki/ERR:Throw#Result_Failure for expected top screen output * on development units/patched ErrDisp. */ Result ERRF_ThrowResultWithMessage(Result failure, const char* message);