From 6e84dee135da7eb9da75a7d410a3fdcde3b9bc2b Mon Sep 17 00:00:00 2001 From: plutoo Date: Sun, 24 Sep 2017 18:49:27 +0200 Subject: [PATCH] Introducing fatal --- nx/include/switch.h | 1 + nx/include/switch/result.h | 3 +++ nx/include/switch/services/fatal.h | 1 + nx/include/switch/services/sm.h | 1 + nx/source/services/fatal.c | 39 ++++++++++++++++++++++++++++++ nx/source/services/sm.c | 4 +++ nx/source/system/dynamic.c | 4 +-- 7 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 nx/include/switch/services/fatal.h create mode 100644 nx/source/services/fatal.c diff --git a/nx/include/switch.h b/nx/include/switch.h index 30108008..fe0acdab 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -18,6 +18,7 @@ extern "C" { #include #include +#include #ifdef __cplusplus } diff --git a/nx/include/switch/result.h b/nx/include/switch/result.h index 54d2d90b..b9bd081a 100644 --- a/nx/include/switch/result.h +++ b/nx/include/switch/result.h @@ -17,3 +17,6 @@ /// Builds a result code from its constituent components. #define MAKERESULT(module,description) \ ((((module)&0x1FF)) | ((description)&0x1FFF)<<9) + +#define MODULE_LIBNX 345 +#define MODULE_BADRELOC 1 diff --git a/nx/include/switch/services/fatal.h b/nx/include/switch/services/fatal.h new file mode 100644 index 00000000..59ddb6c1 --- /dev/null +++ b/nx/include/switch/services/fatal.h @@ -0,0 +1 @@ +void fatalSimple(Result err); diff --git a/nx/include/switch/services/sm.h b/nx/include/switch/services/sm.h index a667e419..a3bab05d 100644 --- a/nx/include/switch/services/sm.h +++ b/nx/include/switch/services/sm.h @@ -1,2 +1,3 @@ +bool smHasInitialized(); Result smInitialize(); Result smGetService(Handle* handle_out, const char* name); diff --git a/nx/source/services/fatal.c b/nx/source/services/fatal.c new file mode 100644 index 00000000..d99e23ff --- /dev/null +++ b/nx/source/services/fatal.c @@ -0,0 +1,39 @@ +// Copyright 2017 plutoo +#include + +void fatalSimple(Result err) { + Result rc = 0; + + if (!smHasInitialized()) { + rc = smInitialize(); + } + + if (R_SUCCEEDED(rc)) { + Handle srv; + rc = smGetService(&srv, "fatal:u"); + + if (R_SUCCEEDED(rc)) { + IpcCommand c; + ipcInitialize(&c); + ipcSendPid(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 result; + u64 unknown; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 1; + raw->result = err; + raw->unknown = 0; + + ipcDispatch(srv); + } + } + + ((void(*)())0xBADC0DE)(); +} diff --git a/nx/source/services/sm.c b/nx/source/services/sm.c index b14d2567..01af93ad 100644 --- a/nx/source/services/sm.c +++ b/nx/source/services/sm.c @@ -3,6 +3,10 @@ static Handle g_smHandle = -1; +bool smHasInitialized() { + return g_smHandle != -1; +} + Result smInitialize() { Result rc = svcConnectToNamedPort(&g_smHandle, "sm:"); Handle tmp; diff --git a/nx/source/system/dynamic.c b/nx/source/system/dynamic.c index 78f51df4..e693cffa 100644 --- a/nx/source/system/dynamic.c +++ b/nx/source/system/dynamic.c @@ -1,4 +1,4 @@ -#include +#include #include void __nx_dynamic(uintptr_t base, const Elf64_Dyn* dyn) @@ -20,7 +20,7 @@ void __nx_dynamic(uintptr_t base, const Elf64_Dyn* dyn) } if (rela == NULL) - for (;;); // Panic + fatalSimple(MAKERESULT(MODULE_LIBNX, MODULE_BADRELOC)); for (; relasz--; rela++) {