From: chaoskagami Date: Fri, 14 Oct 2016 11:18:50 +0000 (-0400) Subject: Switch to using a modified ctrulib. X-Git-Tag: v0.3.1~66^2~6 X-Git-Url: https://chaos.moe/g/?a=commitdiff_plain;h=94790764329ceb1d59fb2d0b481e8cda4d349ecc;p=corbenik%2Fcorbenik.git Switch to using a modified ctrulib. 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. --- diff --git a/.gitmodules b/.gitmodules index a6d17ea..861f8af 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 index 0000000..361f8d4 --- /dev/null +++ b/external/ctrulib @@ -0,0 +1 @@ +Subproject commit 361f8d402eb16c09a49d184f3fa58844fce0e48a diff --git a/external/libctr9 b/external/libctr9 index 218c425..33297fb 160000 --- a/external/libctr9 +++ b/external/libctr9 @@ -1 +1 @@ -Subproject commit 218c4251cd463bc916c424bb9605aaeed59c1179 +Subproject commit 33297fb74a6a22be810c15039f1f16050360ebf6 diff --git a/external/loader/source/pxipm.c b/external/loader/source/pxipm.c index b1cc6bd..10ec020 100644 --- a/external/loader/source/pxipm.c +++ b/external/loader/source/pxipm.c @@ -1,7 +1,6 @@ #include <3ds.h> #include #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 index bb23ead..0000000 --- a/external/loader/source/srvsys.c +++ /dev/null @@ -1,167 +0,0 @@ -#include <3ds.h> -#include -#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 index ca23b6e..0000000 --- a/external/loader/source/srvsys.h +++ /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 diff --git a/external/loader/source/statics.c b/external/loader/source/statics.c index 2970ac8..2f5642b 100644 --- a/external/loader/source/statics.c +++ b/external/loader/source/statics.c @@ -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) {