git subrepo pull --force emummc
subrepo: subdir: "emummc" merged: "2fc47cbb8" upstream: origin: "https://github.com/lulle2007200/emuMMC.git" branch: "develop" commit: "2fc47cbb8" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "30db3b8"
This commit is contained in:
47
emummc/source/utils/fatal.c
vendored
47
emummc/source/utils/fatal.c
vendored
@@ -16,7 +16,13 @@
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <switch/sf/service.h>
|
||||
#include "fatal.h"
|
||||
#include "../utils/util.h"
|
||||
|
||||
#if EMUMMC_HAS_FATAL_PAYLOAD
|
||||
#include "fatal_handler_bin.h"
|
||||
#endif
|
||||
|
||||
void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason)
|
||||
{
|
||||
@@ -24,17 +30,44 @@ void __attribute__((noreturn)) fatal_abort(enum FatalReason abortReason)
|
||||
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.program_id = 0x0100000000000000; // FS
|
||||
error_ctx.error_desc = abortReason;
|
||||
|
||||
// Copy fatal context
|
||||
smcCopyToIram(ATMOSPHERE_FATAL_ERROR_ADDR, &error_ctx, sizeof(atmosphere_fatal_error_ctx));
|
||||
// Try using bpc:ams to show fatal error
|
||||
Handle h;
|
||||
Service s;
|
||||
Result rc = svcConnectToNamedPort(&h, "bpc:ams");
|
||||
u32 retry_cnt = 20;
|
||||
while (R_VALUE(rc) == KERNELRESULT(NotFound) && retry_cnt != 0) {
|
||||
svcSleepThread(50000000ul);
|
||||
rc = svcConnectToNamedPort(&h, "bpc:ams");
|
||||
retry_cnt--;
|
||||
}
|
||||
|
||||
// Reboot to RCM
|
||||
if (R_SUCCEEDED(rc)){
|
||||
serviceCreate(&s, h);
|
||||
serviceDispatch(&s, 65000,
|
||||
.buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcMapAlias | SfBufferAttr_FixedSize },
|
||||
.buffers = { { &error_ctx, 0x450 } }
|
||||
);
|
||||
}
|
||||
|
||||
// bpc:ams not available yet
|
||||
// Copy error context to iram and reboot to fatal payload
|
||||
|
||||
memcpy(&working_buf, &error_ctx, sizeof(error_ctx));
|
||||
smcCopyToIram(ATMOSPHERE_FATAL_ERROR_ADDR, &working_buf, sizeof(error_ctx));
|
||||
|
||||
#if EMUMMC_HAS_FATAL_PAYLOAD
|
||||
for (size_t ofs = 0; ofs < fatal_handler_bin_size; ofs += 4096) {
|
||||
memcpy(&working_buf, fatal_handler_bin + ofs, MIN(fatal_handler_bin_size - ofs, 4096));
|
||||
smcCopyToIram(ATMOSPHERE_IRAM_PAYLOAD_BASE + ofs, &working_buf, MIN(fatal_handler_bin_size - ofs, 4096));
|
||||
}
|
||||
smcRebootToIramPayload();
|
||||
#else
|
||||
smcRebootToRcm();
|
||||
#endif
|
||||
|
||||
while (true)
|
||||
; // Should never be reached
|
||||
while(true){}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user