]> Chaos Git - corbenik/corbenik.git/commitdiff
Log before svcBreaks in loader
authorchaoskagami <chaos.kagami@gmail.com>
Sat, 1 Oct 2016 13:40:52 +0000 (09:40 -0400)
committerchaoskagami <chaos.kagami@gmail.com>
Sat, 1 Oct 2016 13:40:52 +0000 (09:40 -0400)
external/loader/source/fsldr.c
external/loader/source/loader.c
external/loader/source/logger.c
external/loader/source/srvsys.c

index 6414a3495d49067b197c7adc7d04756c8238af84..91ce6b787782995f9412a4cfdc46226a061727fd 100644 (file)
@@ -41,7 +41,7 @@ fsldrInit(void)
         ret = FSLDR_InitializeWithSdkVersion(fsldrHandle, SDK_VERSION);
         ret = FSLDR_SetPriority(0);
         if (R_FAILED(ret))
-            svcBreak(USERBREAK_ASSERT);
+            svcBreak(USERBREAK_ASSERT); // Can't properly panic here; no logger
     } else {
         AtomicDecrement(&fsldrRefCount);
     }
index 609aa9f4036e33211fadedb65f0422b403be545c..389994ed9dd0c613d88cb2feeaf930addf993546 100644 (file)
@@ -56,13 +56,13 @@ load_code(u64 progid, u16 progver, prog_addrs_t *shared, prog_addrs_t *original,
     path.size = sizeof(CODE_PATH);
 
     if (R_FAILED(FSLDR_OpenFileDirectly(&handle, ARCHIVE_SAVEDATA_AND_CONTENT2, archivePath, path, FS_OPEN_READ, 0))) {
-        svcBreak(USERBREAK_ASSERT);
+        panicstr("Failed to open program code path.\n");
     }
 
     // get file size
     if (R_FAILED(FSFILE_GetSize(handle, &size))) {
         FSFILE_Close(handle);
-        svcBreak(USERBREAK_ASSERT);
+        panicstr("Failed to get code size.\n");
     }
 
     // check size
@@ -75,7 +75,7 @@ load_code(u64 progid, u16 progver, prog_addrs_t *shared, prog_addrs_t *original,
     res = FSFILE_Read(handle, &total, 0, (void *)shared->text_addr, size);
     FSFILE_Close(handle); // done reading
     if (R_FAILED(res)) {
-        svcBreak(USERBREAK_ASSERT);
+        panicstr("Failed to read program code.\n");
     }
 
     // decompress in place
@@ -246,21 +246,27 @@ loader_RegisterProgram(u64 *prog_handle, FS_ProgramInfo *title, FS_ProgramInfo *
                     return 0;
                 }
             }
-            svcBreak(USERBREAK_ASSERT);
+            panicstr("Registration of program failed.\n");
         }
     }
 
-    if ((title->mediaType != update->mediaType) || (prog_id != update->programId)) {
-        svcBreak(USERBREAK_ASSERT);
+    if (title->mediaType != update->mediaType)
+        panicstr("Program and update are different mediaTypes, abort.\n");
     }
+
+    if (prog_id != update->programId) {
+        panicstr("Program and update have different titleIDs, abort.\n");
+    }
+
     res = FSREG_LoadProgram(prog_handle, title);
     if (R_SUCCEEDED(res)) {
         if (*prog_handle >> 32 == 0xFFFF0000) {
             return 0;
         }
+
         res = FSREG_CheckHostLoadId(*prog_handle);
         if (R_FAILED(res) || (R_SUCCEEDED(res) && R_LEVEL(res) != RL_SUCCESS)) {
-            svcBreak(USERBREAK_ASSERT);
+            panicstr("CheckHostLoadId failed.\n");
         }
     }
     return res;
@@ -437,11 +443,11 @@ main()
     notification_handle = &g_handles[0];
 
     if (R_FAILED(srvSysRegisterService(srv_handle, "Loader", MAX_SESSIONS))) {
-        svcBreak(USERBREAK_ASSERT);
+        panicstr("Failed to register loader service.\n");
     }
 
     if (R_FAILED(srvSysEnableNotification(notification_handle))) {
-        svcBreak(USERBREAK_ASSERT);
+        panicstr("Failed to enable notifcations to loader service.\n");
     }
 
     g_active_handles = 2;
@@ -473,7 +479,7 @@ main()
                 g_active_handles--;
                 reply_target = 0;
             } else {
-                svcBreak(USERBREAK_ASSERT);
+                panicstr("Unhandled response from svcReplyAndRecieve, abort.\n");
             }
         } else {
             // process responses
@@ -482,14 +488,14 @@ main()
                 case 0: // notification
                 {
                     if (R_FAILED(should_terminate(&term_request))) {
-                        svcBreak(USERBREAK_ASSERT);
+                        panicstr("Failed to check termination.\n");
                     }
                     break;
                 }
                 case 1: // new session
                 {
                     if (R_FAILED(svcAcceptSession(&handle, *srv_handle))) {
-                        svcBreak(USERBREAK_ASSERT);
+                        panicstr("Failed to accept and open session.\n");
                     }
                     if (g_active_handles < MAX_SESSIONS + 2) {
                         g_handles[g_active_handles] = handle;
index 41c41104e3ca5ebbb9e5216fec1a964462cdab98..3d62a8e5a14cba9b44f3668eefa484c8976e90a1 100644 (file)
@@ -36,6 +36,14 @@ openLogger()
     logger_is_initd = 1;
 }
 
+void
+breakstr(const char *str)
+{
+    logstr(str);
+    closeLogger();
+    svcBreak(USERBREAK_ASSERT);
+}
+
 void
 logstr(const char *str)
 {
index c5d716158dc449f85069475672b005e8a8ec1a45..9d183c8d46891368478423a6e3b78d976db8bfa2 100644 (file)
@@ -68,7 +68,8 @@ srvSysExit()
     if (srvHandle != 0)
         svcCloseHandle(srvHandle);
     else
-        svcBreak(USERBREAK_ASSERT);
+        svcBreak(USERBREAK_ASSERT); // No logging available, sadly
+
     rc = (Result)srvHandle; // yeah, I think this is a benign bug
     srvHandle = 0;
     srvRefCount--;