]> Chaos Git - corbenik/ctrulib.git/commitdiff
fixed SOC device madness
authorsmea <smealum@gmail.com>
Sun, 12 Jul 2015 22:19:36 +0000 (15:19 -0700)
committersmea <smealum@gmail.com>
Sun, 12 Jul 2015 22:19:36 +0000 (15:19 -0700)
libctru/source/services/soc/soc_init.c

index a1b081becb640b8debb1e0e30b347d487da83ac9..3b84b65c61d5f94f387f7d9f63e87a028a384d57 100644 (file)
@@ -67,29 +67,38 @@ Result SOC_Initialize(u32 *context_addr, u32 context_size)
        if(dev >= 0)
                return -1;
 
-       /* add the "soc" device */
-       dev = AddDevice(&soc_devoptab);
-       if(dev < 0)
-               return dev;
-
        ret = svcCreateMemoryBlock(&socMemhandle, (u32)context_addr, context_size, 0, 3);
-       if(ret != 0) {
-               RemoveDevice("soc");
-               return ret;
-       }
+       if(ret != 0) return ret;
 
        ret = srvGetServiceHandle(&SOCU_handle, "soc:U");
-       if(ret != 0) {
-               RemoveDevice("soc");
+       if(ret != 0)
+       {
+               svcCloseHandle(socMemhandle);
+               socMemhandle = 0;
                return ret;
        }
 
        ret = socu_cmd1(socMemhandle, context_size);
-       if(ret != 0) {
-               RemoveDevice("soc");
+       if(ret != 0)
+       {
+               svcCloseHandle(socMemhandle);
+               svcCloseHandle(SOCU_handle);
+               socMemhandle = 0;
+               SOCU_handle = 0;
                return ret;
        }
 
+       /* add the "soc" device */
+       dev = AddDevice(&soc_devoptab);
+       if(dev < 0)
+       {
+               svcCloseHandle(socMemhandle);
+               svcCloseHandle(SOCU_handle);
+               socMemhandle = 0;
+               SOCU_handle = 0;
+               return dev;
+       }
+
        return 0;
 }
 
@@ -100,22 +109,21 @@ Result SOC_Shutdown(void)
        int dev;
        
        svcCloseHandle(socMemhandle);
+       socMemhandle = 0;
 
        cmdbuf[0] = 0x00190000;
 
        ret = svcSendSyncRequest(SOCU_handle);
-       if(ret != 0) {
-               errno = SYNC_ERROR;
-               return ret;
-       }
 
        svcCloseHandle(SOCU_handle);
+       SOCU_handle = 0;
 
        dev = FindDevice("soc:");
        if(dev >= 0)
-               RemoveDevice("soc");
+               RemoveDevice("soc:");
 
-       return cmdbuf[1];
+       if(ret)return ret;
+       else return cmdbuf[1];
 }
 
 static int