git subrepo pull emummc
subrepo: subdir: "emummc" merged: "5f5817e6" upstream: origin: "https://github.com/m4xw/emuMMC" branch: "develop" commit: "5f5817e6" git-subrepo: version: "0.4.0" origin: "https://github.com/ingydotnet/git-subrepo" commit: "5d6aba9"
This commit is contained in:
@@ -15,13 +15,26 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "fatal.h"
|
||||
|
||||
void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason)
|
||||
{
|
||||
atmosphere_fatal_error_ctx error_ctx;
|
||||
memset(&error_ctx, 0, sizeof(atmosphere_fatal_error_ctx));
|
||||
|
||||
// Basic error storage for Atmosphere
|
||||
// TODO: Maybe include a small reboot2payload stub?
|
||||
error_ctx.magic = ATMOSPHERE_REBOOT_TO_FATAL_MAGIC;
|
||||
error_ctx.title_id = 0x0100000000000000; // FS
|
||||
error_ctx.error_desc = abortReason;
|
||||
|
||||
// Copy fatal context
|
||||
smcCopyToIram(ATMOSPHERE_FATAL_ERROR_ADDR, &error_ctx, sizeof(atmosphere_fatal_error_ctx));
|
||||
|
||||
// Reboot to RCM
|
||||
smcRebootToRcm();
|
||||
|
||||
while(true)
|
||||
while (true)
|
||||
; // Should never be reached
|
||||
}
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
#pragma once
|
||||
#include "../nx/smc.h"
|
||||
|
||||
enum FatalReason {
|
||||
enum FatalReason
|
||||
{
|
||||
Fatal_InitMMC = 0,
|
||||
Fatal_InitSD,
|
||||
Fatal_InvalidAccessor,
|
||||
@@ -32,4 +33,45 @@ enum FatalReason {
|
||||
Fatal_Max
|
||||
};
|
||||
|
||||
#define AMS_FATAL_ERROR_MAX_STACKTRACE 0x20
|
||||
#define AMS_FATAL_ERROR_MAX_STACKDUMP 0x100
|
||||
|
||||
/* Atmosphere reboot-to-fatal-error. */
|
||||
typedef struct
|
||||
{
|
||||
uint32_t magic;
|
||||
uint32_t error_desc;
|
||||
uint64_t title_id;
|
||||
union {
|
||||
uint64_t gprs[32];
|
||||
struct
|
||||
{
|
||||
uint64_t _gprs[29];
|
||||
uint64_t fp;
|
||||
uint64_t lr;
|
||||
uint64_t sp;
|
||||
};
|
||||
};
|
||||
uint64_t pc;
|
||||
uint64_t module_base;
|
||||
uint32_t pstate;
|
||||
uint32_t afsr0;
|
||||
uint32_t afsr1;
|
||||
uint32_t esr;
|
||||
uint64_t far;
|
||||
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;
|
||||
|
||||
/* "AFE1" */
|
||||
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC 0x31454641
|
||||
/* "AFE0" */
|
||||
#define ATMOSPHERE_REBOOT_TO_FATAL_MAGIC_0 0x30454641
|
||||
|
||||
#define ATMOSPHERE_FATAL_ERROR_ADDR 0x4003E000
|
||||
#define ATMOSPHERE_FATAL_ERROR_CONTEXT ((volatile atmosphere_fatal_error_ctx *)(ATMOSPHERE_FATAL_ERROR_ADDR))
|
||||
|
||||
void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason);
|
||||
|
||||
Reference in New Issue
Block a user