]> Chaos Git - corbenik/corbenik.git/commitdiff
Switch to using a modified ctrulib.
authorchaoskagami <chaos.kagami@gmail.com>
Fri, 14 Oct 2016 11:18:50 +0000 (07:18 -0400)
committerchaoskagami <chaos.kagami@gmail.com>
Fri, 14 Oct 2016 11:18:50 +0000 (07:18 -0400)
Far too much functionality is workarounds because ctrulib is not implemented in a system-module friendly manner.

Therefore, I am done. Whether or not use of this fork catches on doesn't matter - it's a far cleaner solution, with far less duplicated code.

.gitmodules
external/ctrulib [new submodule]
external/libctr9
external/loader/source/pxipm.c
external/loader/source/srvsys.c [deleted file]
external/loader/source/srvsys.h [deleted file]
external/loader/source/statics.c

index a6d17eaf4efbc3fc3b2f16e0488d331029745b7a..861f8af517d8a06c2c4bd3a9f1527970e5029f41 100644 (file)
@@ -10,3 +10,4 @@
 [submodule "external/ctrulib"]
        path = external/ctrulib
        url = https://github.com/chaoskagami/ctrulib
+       branch = system
diff --git a/external/ctrulib b/external/ctrulib
new file mode 160000 (submodule)
index 0000000..361f8d4
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 361f8d402eb16c09a49d184f3fa58844fce0e48a
index 218c4251cd463bc916c424bb9605aaeed59c1179..33297fb74a6a22be810c15039f1f16050360ebf6 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 218c4251cd463bc916c424bb9605aaeed59c1179
+Subproject commit 33297fb74a6a22be810c15039f1f16050360ebf6
index b1cc6bdd6c6280f3bff7680c91403f94af019fca..10ec020211e00c767f907d4bc96c08ca513d69a0 100644 (file)
@@ -1,7 +1,6 @@
 #include <3ds.h>
 #include <string.h>
 #include "pxipm.h"
-#include "srvsys.h"
 
 static Handle pxipmHandle;
 static int pxipmRefCount;
@@ -14,7 +13,7 @@ pxipmInit(void)
     if (AtomicPostIncrement(&pxipmRefCount))
         return 0;
 
-    ret = srvSysGetServiceHandle(&pxipmHandle, "PxiPM");
+    ret = srvGetServiceHandle(&pxipmHandle, "PxiPM");
 
     if (R_FAILED(ret))
         AtomicDecrement(&pxipmRefCount);
diff --git a/external/loader/source/srvsys.c b/external/loader/source/srvsys.c
deleted file mode 100644 (file)
index bb23ead..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-#include <3ds.h>
-#include <string.h>
-#include "srvsys.h"
-
-static Handle srvHandle;
-static int srvRefCount;
-static RecursiveLock initLock;
-static int initLockinit = 0;
-
-Result
-srvSysInit()
-{
-    Result rc = 0;
-
-    if (!initLockinit) {
-        RecursiveLock_Init(&initLock);
-    }
-
-    RecursiveLock_Lock(&initLock);
-
-    if (srvRefCount > 0) {
-        RecursiveLock_Unlock(&initLock);
-        return MAKERESULT(RL_INFO, RS_NOP, 25, RD_ALREADY_INITIALIZED);
-    }
-
-    while (1) {
-        rc = svcConnectToPort(&srvHandle, "srv:");
-        if (R_LEVEL(rc) != RL_PERMANENT || R_SUMMARY(rc) != RS_NOTFOUND || R_DESCRIPTION(rc) != RD_NOT_FOUND)
-            break;
-        svcSleepThread(500000);
-    }
-    if (R_SUCCEEDED(rc)) {
-        rc = srvSysRegisterClient();
-        srvRefCount++;
-    }
-
-    RecursiveLock_Unlock(&initLock);
-    return rc;
-}
-
-Result
-srvSysRegisterClient(void)
-{
-    Result rc = 0;
-    u32 *cmdbuf = getThreadCommandBuffer();
-
-    cmdbuf[0] = IPC_MakeHeader(0x1, 0, 2); // 0x10002
-    cmdbuf[1] = IPC_Desc_CurProcessHandle();
-
-    if (R_FAILED(rc = svcSendSyncRequest(srvHandle)))
-        return rc;
-
-    return cmdbuf[1];
-}
-
-Result
-srvSysExit()
-{
-    Result rc;
-    RecursiveLock_Lock(&initLock);
-
-    if (srvRefCount > 1) {
-        srvRefCount--;
-        RecursiveLock_Unlock(&initLock);
-        return MAKERESULT(RL_INFO, RS_NOP, 25, RD_BUSY);
-    }
-
-    if (srvHandle != 0)
-        svcCloseHandle(srvHandle);
-    else
-        svcBreak(USERBREAK_ASSERT); // No logging available, sadly
-
-    srvHandle = 0;
-    srvRefCount--;
-    RecursiveLock_Unlock(&initLock);
-    return rc;
-}
-
-Result
-srvSysGetServiceHandle(Handle *out, const char *name)
-{
-    Result rc = 0;
-    u32 *cmdbuf = getThreadCommandBuffer();
-
-    cmdbuf[0] = IPC_MakeHeader(0x5, 4, 0); // 0x50100
-    strncpy((char *)&cmdbuf[1], name, 8);
-    cmdbuf[3] = strlen(name);
-    cmdbuf[4] = 0x0;
-
-    if (R_FAILED(rc = svcSendSyncRequest(srvHandle)))
-        return rc;
-
-    if (out)
-        *out = cmdbuf[3];
-
-    return cmdbuf[1];
-}
-
-Result
-srvSysEnableNotification(Handle *semaphoreOut)
-{
-    Result rc = 0;
-    u32 *cmdbuf = getThreadCommandBuffer();
-
-    cmdbuf[0] = IPC_MakeHeader(0x2, 0, 0);
-
-    if (R_FAILED(rc = svcSendSyncRequest(srvHandle)))
-        return rc;
-
-    if (semaphoreOut)
-        *semaphoreOut = cmdbuf[3];
-
-    return cmdbuf[1];
-}
-
-Result
-srvSysReceiveNotification(u32 *notificationIdOut)
-{
-    Result rc = 0;
-    u32 *cmdbuf = getThreadCommandBuffer();
-
-    cmdbuf[0] = IPC_MakeHeader(0xB, 0, 0); // 0xB0000
-
-    if (R_FAILED(rc = svcSendSyncRequest(srvHandle)))
-        return rc;
-
-    if (notificationIdOut)
-        *notificationIdOut = cmdbuf[2];
-
-    return cmdbuf[1];
-}
-
-Result
-srvSysRegisterService(Handle *out, const char *name, int maxSessions)
-{
-    Result rc = 0;
-    u32 *cmdbuf = getThreadCommandBuffer();
-
-    cmdbuf[0] = IPC_MakeHeader(0x3, 4, 0); // 0x30100
-    strncpy((char *)&cmdbuf[1], name, 8);
-    cmdbuf[3] = strlen(name);
-    cmdbuf[4] = maxSessions;
-
-    if (R_FAILED(rc = svcSendSyncRequest(srvHandle)))
-        return rc;
-
-    if (out)
-        *out = cmdbuf[3];
-
-    return cmdbuf[1];
-}
-
-Result
-srvSysUnregisterService(const char *name)
-{
-    Result rc = 0;
-    u32 *cmdbuf = getThreadCommandBuffer();
-
-    cmdbuf[0] = IPC_MakeHeader(0x4, 3, 0); // 0x400C0
-    strncpy((char *)&cmdbuf[1], name, 8);
-    cmdbuf[3] = strlen(name);
-
-    if (R_FAILED(rc = svcSendSyncRequest(srvHandle)))
-        return rc;
-
-    return cmdbuf[1];
-}
diff --git a/external/loader/source/srvsys.h b/external/loader/source/srvsys.h
deleted file mode 100644 (file)
index ca23b6e..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * @file srv.h
- * @brief Service API.
- */
-#ifndef __SRVSYS_H
-#define __SRVSYS_H
-
-/// Initializes the service API.
-Result srvSysInit(void);
-
-/// Exits the service API.
-Result srvSysExit(void);
-
-/**
- * @brief Retrieves a service handle, retrieving from the environment handle
- * list if possible.
- * @param out Pointer to write the handle to.
- * @param name Name of the service.
- */
-Result srvSysGetServiceHandle(Handle *out, const char *name);
-
-/// Registers the current process as a client to the service API.
-Result srvSysRegisterClient(void);
-
-/**
- * @brief Enables service notificatios, returning a notification semaphore.
- * @param semaphoreOut Pointer to output the notification semaphore to.
- */
-Result srvSysEnableNotification(Handle *semaphoreOut);
-
-/**
- * @brief Receives a notification.
- * @param notificationIdOut Pointer to output the ID of the received
- * notification to.
- */
-Result srvSysReceiveNotification(u32 *notificationIdOut);
-
-/**
- * @brief Registers the current process as a service.
- * @param out Pointer to write the service handle to.
- * @param name Name of the service.
- * @param maxSessions Maximum number of sessions the service can handle.
- */
-Result srvSysRegisterService(Handle *out, const char *name, int maxSessions);
-
-/**
- * @brief Unregisters the current process as a service.
- * @param name Name of the service.
- */
-Result srvSysUnregisterService(const char *name);
-
-#endif
index 2970ac81f4e2b0543510cec2883bcb2a6e05e156..2f5642bbd84a9ac2b09a58c0fa1771d147f59caa 100644 (file)
@@ -20,10 +20,17 @@ void __system_initSyscalls(void);
 void
 __appInit()
 {
-    srvInit();
-    fsregInit();
-    fsInitFromService("fs:LDR");
-    pxipmInit();
+    if (R_FAILED(srvSysInit()))
+        svcBreak(USERBREAK_PANIC);
+
+    if (R_FAILED(fsregInit()))
+        svcBreak(USERBREAK_PANIC);
+
+    if (R_FAILED(fsInitFromService("fs:LDR")))
+        svcBreak(USERBREAK_PANIC);
+
+    if (R_FAILED(pxipmInit()))
+        svcBreak(USERBREAK_PANIC);
 }
 
 // Post-main cleanup function.
@@ -33,7 +40,7 @@ __appExit()
     pxipmExit();
     fsExit();
     fsregExit();
-    srvExit();
+    srvSysExit();
 }
 
 void __system_allocateHeaps(void) {