]> Chaos Git - corbenik/ctrulib.git/commitdiff
APT && misc : better app exiting code, fixed APPLICATION and BASE mem leak
authorsmea <smealum@gmail.com>
Mon, 3 Feb 2014 17:06:58 +0000 (18:06 +0100)
committersmea <smealum@gmail.com>
Mon, 3 Feb 2014 17:06:58 +0000 (18:06 +0100)
arm11u/source/main.c
libctru/include/ctr/FS.h
libctru/include/ctr/GSP.h
libctru/include/ctr/srv.h
libctru/include/ctr/svc.h
libctru/source/APT.c
libctru/source/FS.c
libctru/source/GSP.c
libctru/source/srv.c
libctru/source/svc.s
sdmc/source/main.c

index 1cfed164d2aca9f6b0a75ea556c7a596a7b65dfb..74fe52064d6ffd138c9e6fc130bb22e24724d5bd 100644 (file)
@@ -15,6 +15,8 @@ u32* gxCmdBuf;
 u8 currentBuffer;
 u8* topLeftFramebuffers[2];
 
+Handle gspEvent, gspSharedMemHandle;
+
 void gspGpuInit()
 {
        gspInit();
@@ -35,7 +37,6 @@ void gspGpuInit()
 
        //setup our gsp shared mem section
        u8 threadID;
-       Handle gspEvent, gspSharedMemHandle;
        svc_createEvent(&gspEvent, 0x0);
        GSPGPU_RegisterInterruptRelayQueue(NULL, gspEvent, 0x1, &gspSharedMemHandle, &threadID);
        svc_mapMemoryBlock(gspSharedMemHandle, 0x10002000, 0x3, 0x10000000);
@@ -52,6 +53,21 @@ void gspGpuInit()
        currentBuffer=0;
 }
 
+void gspGpuExit()
+{
+       GSPGPU_UnregisterInterruptRelayQueue(NULL);
+
+       //unmap GSP shared mem
+       svc_unmapMemoryBlock(gspSharedMemHandle, 0x10002000);
+       svc_closeHandle(gspSharedMemHandle);
+       svc_closeHandle(gspEvent);
+       
+       gspExit();
+
+       //free GSP heap
+       svc_controlMemory((u32*)&gspHeap, (u32)gspHeap, 0x0, 0x2000000, MEMOP_FREE, 0x0);
+}
+
 void swapBuffers()
 {
        u32 regData;
@@ -83,6 +99,8 @@ s32 pcCos(u16 v)
        return costable[v&0x1FF];
 }
 
+u32 cnt;
+
 void renderEffect()
 {
        u8* bufAdr=&gspHeap[0x46500*currentBuffer];
@@ -93,11 +111,31 @@ void renderEffect()
                for(j=1;j<240;j++)
                {
                        u32 v=(j+i*240)*3;
-                       bufAdr[v]=(pcCos(i)+4096)/32;
-                       bufAdr[v+1]=0x00;
-                       bufAdr[v+2]=0xFF*currentBuffer;
+                       bufAdr[v]=(pcCos(i+cnt)+4096)/32;
+                       bufAdr[v+1]=(pcCos(j-256+cnt)+4096)/64;
+                       bufAdr[v+2]=(pcCos(i+128-cnt)+4096)/32;
                }
        }
+       cnt++;
+}
+
+Handle hidHandle;
+Handle hidMemHandle;
+
+void hidInit()
+{
+       srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
+       HIDUSER_GetInfo(hidHandle, &hidMemHandle);
+       svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
+
+       HIDUSER_Init(hidHandle);
+}
+
+void hidExit()
+{
+       svc_unmapMemoryBlock(hidMemHandle, 0x10000000);
+       svc_closeHandle(hidMemHandle);
+       svc_closeHandle(hidHandle);
 }
 
 int main()
@@ -108,27 +146,29 @@ int main()
 
        gspGpuInit();
 
-       Handle hidHandle;
-       Handle hidMemHandle;
-       srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
-       HIDUSER_GetInfo(hidHandle, &hidMemHandle);
-       svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
-
-       HIDUSER_Init(hidHandle);
+       hidInit();
 
        aptSetupEventHandler();
 
-       while(!aptGetStatus())
+       APP_STATUS status;
+       while((status=aptGetStatus())!=APP_EXITING)
        {
-               u32 PAD=((u32*)0x10000000)[7];
-               renderEffect();
-               swapBuffers();
-               copyBuffer();
-               u32 regData=PAD|0x01000000;
-               GSPGPU_WriteHWRegs(NULL, 0x202A04, (u8*)&regData, 4);
-               svc_sleepThread(1000000000);
+               if(status==APP_RUNNING)
+               {
+                       u32 PAD=((u32*)0x10000000)[7];
+                       
+                       u32 regData=PAD|0x01000000;
+                       GSPGPU_WriteHWRegs(NULL, 0x202A04, (u8*)&regData, 4);
+
+                       renderEffect();
+                       swapBuffers();
+                       copyBuffer();
+               }
+               svc_sleepThread(16666666);
        }
 
+       hidExit();
+       gspGpuExit();
        aptExit();
        svc_exitProcess();
        return 0;
index e84e830cf1c2a6e9106b38380203abfe7c9069da..cc9f65b09b9b4b8a5b3bbc9b4f095e0abdfc8b33 100644 (file)
@@ -41,6 +41,7 @@ Result FSUSER_OpenArchive(Handle handle, FS_archive* archive);
 Result FSUSER_OpenDirectory(Handle handle, Handle* out, FS_archive archive, FS_path dirLowPath);
 Result FSUSER_OpenFile(Handle handle, Handle* out, FS_archive archive, FS_path fileLowPath, u32 openflags, u32 attributes);
 Result FSUSER_OpenFileDirectly(Handle handle, Handle* out, FS_archive archive, FS_path fileLowPath, u32 openflags, u32 attributes);
+Result FSUSER_CloseArchive(Handle handle, FS_archive* archive);
 
 Result FSFILE_Close(Handle handle);
 Result FSFILE_Read(Handle handle, u32 *bytesRead, u64 offset, u32 *buffer, u32 size);
@@ -48,5 +49,6 @@ Result FSFILE_Write(Handle handle, u32 *bytesWritten, u64 offset, u32 *buffer, u
 Result FSFILE_GetSize(Handle handle, u64 *size);
 
 Result FSDIR_Read(Handle handle, u32 *entriesRead, u32 entrycount, u16 *buffer);
+Result FSDIR_Close(Handle handle);
 
 #endif
index 154e0468ab721871130f12b921b58d712db8f12b..3f95dfc162aa0a8eec82b385528720b378203cb5 100644 (file)
@@ -2,6 +2,7 @@
 #define GSP_H
 
 void gspInit();
+void gspExit();
 
 Result GSPGPU_AcquireRight(Handle *handle, u8 flags);
 Result GSPGPU_ReleaseRight(Handle *handle);
@@ -10,6 +11,7 @@ Result GSPGPU_FlushDataCache(Handle *handle, u8* adr, u32 size);
 Result GSPGPU_WriteHWRegs(Handle *handle, u32 regAddr, u8* data, u8 size);
 Result GSPGPU_ReadHWRegs(Handle *handle, u32 regAddr, u8* data, u8 size);
 Result GSPGPU_RegisterInterruptRelayQueue(Handle *handle, Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID);
+Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle);
 Result GSPGPU_TriggerCmdReqQueue(Handle *handle);
 Result GSPGPU_submitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x20], Handle* handle);
 
index 0796a142d30aa2a6ddd9778bf19913bb4189c142..2ff4aa7fc2124c2f663da3500d5ef1260a17c6a4 100644 (file)
@@ -2,6 +2,7 @@
 #define SRV_H
 
 Result initSrv();
+Result exitSrv();
 Result srv_Initialize(Handle* handleptr);
 Result srv_getServiceHandle(Handle* handleptr, Handle* out, char* server);
 
index e66fe786c6abc649838ad453e01a266763f3287f..e28cade6a727c6bd1d4183bbd1d21b6ad3c52203 100644 (file)
@@ -1,6 +1,19 @@
 #ifndef SVC_H
 #define SVC_H
 
+typedef enum{
+       MEMOP_FREE = 1,
+       MEMOP_RESERVE = 2,
+       MEMOP_COMMIT = 3,
+       MEMOP_MAP = 4,
+       MEMOP_UNMAP = 5,
+       MEMOP_PROTECT = 6,
+       MEMOP_REGION_APP = 0x100,
+       MEMOP_REGION_SYSTEM = 0x200,
+       MEMOP_REGION_BASE = 0x300,
+       MEMOP_LINEAR = 0x1000,
+}MEMORY_OPERATION;
+
        u32* getThreadCommandBuffer(void);
        
        Result svc_controlMemory(u32* outaddr, u32 addr0, u32 addr1, u32 size, u32 operation, u32 permissions); //(outaddr is usually the same as the input addr0)
        Result svc_clearEvent(Handle handle);
        Result svc_createMemoryBlock(Handle* memblock, u32 addr, u32 size, u32 mypermission, u32 otherpermission);
        Result svc_mapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission);
+       Result svc_unmapMemoryBlock(Handle memblock, u32 addr);
        Result svc_waitSynchronization1(Handle handle, s64 nanoseconds);
        Result svc_waitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds);
        Result svc_closeHandle(Handle handle);
+       Result svc_getSystemInfo(s64* out, u32 type, s32 param);
        Result svc_connectToPort(volatile Handle* out, const char* portName);
        Result svc_sendSyncRequest(Handle session);
 
index e533fce50f8070ce01ba399ae8860bfc5d02441a..e02a380b4e5bff5562aadb063ac01f5742e611c2 100644 (file)
@@ -86,7 +86,7 @@ void aptEventHandler(u32 arg)
                                        }
                                }
                                break;
-                       case 0x2: //event 2 means we should exit the thread
+                       case 0x2: //event 2 means we should exit the thread (event will be added later)
                                runThread=false;
                                break;
                }
@@ -118,6 +118,27 @@ void aptInit(NS_APPID appID)
 
 void aptExit()
 {
+       u8 buf1[4], buf2[4];
+
+       buf1[0]=0x02; buf1[1]=0x00; buf1[2]=0x00; buf1[3]=0x00;
+       aptOpenSession();
+       APT_AppletUtility(NULL, NULL, 0x7, 0x4, buf1, 0x1, buf2);
+       aptCloseSession();
+       aptOpenSession();
+       APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2);
+       aptCloseSession();
+
+       aptOpenSession();
+       APT_AppletUtility(NULL, NULL, 0x7, 0x4, buf1, 0x1, buf2);
+       aptCloseSession();
+       aptOpenSession();
+       APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2);
+       aptCloseSession();
+       aptOpenSession();
+       APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2);
+       aptCloseSession();
+
+
        aptOpenSession();
        APT_PrepareToCloseApplication(NULL, 0x1);
        aptCloseSession();
@@ -125,6 +146,9 @@ void aptExit()
        aptOpenSession();
        APT_CloseApplication(NULL, 0x0, 0x0, 0x0);
        aptCloseSession();
+
+       svc_closeHandle(aptStatusMutex);
+       // svc_closeHandle(aptLockHandle);
 }
 
 void aptSetupEventHandler()
index 1fcdd1fc8de41343470b18f125bcb9e6c910d11c..53697e8de4d463759af551967d65177e5de0366a 100644 (file)
@@ -107,6 +107,21 @@ Result FSUSER_OpenDirectory(Handle handle, Handle* out, FS_archive archive, FS_p
        return cmdbuf[1];
 }
 
+Result FSUSER_CloseArchive(Handle handle, FS_archive* archive)
+{
+       if(!archive)return -2;
+       u32* cmdbuf=getThreadCommandBuffer();
+
+       cmdbuf[0]=0x080E0080;
+       cmdbuf[1]=archive->handleLow;
+       cmdbuf[2]=archive->handleLow;
+       Result ret=0;
+       if((ret=svc_sendSyncRequest(handle)))return ret;
+       return cmdbuf[1];
+}
+
 Result FSFILE_Close(Handle handle)
 {
        u32* cmdbuf=getThreadCommandBuffer();
@@ -190,3 +205,15 @@ Result FSDIR_Read(Handle handle, u32 *entriesRead, u32 entrycount, u16 *buffer)
 
        return cmdbuf[1];
 }
+
+Result FSDIR_Close(Handle handle)
+{
+       u32* cmdbuf=getThreadCommandBuffer();
+
+       cmdbuf[0]=0x08020000;
+
+       Result ret=0;
+       if((ret=svc_sendSyncRequest(handle)))return ret;
+
+       return cmdbuf[1];
+}
index 9375b6faa446d3b332aae75764b0e998b0f67bee..b60bfb9b7fae9e5181c77d0b54b6c0d4d23de164 100644 (file)
@@ -5,7 +5,7 @@
 #include <ctr/GSP.h>
 #include <ctr/svc.h>
 
-Handle gspGpuHandle;
+Handle gspGpuHandle=0;
 
 void gspInit()
 {
@@ -13,6 +13,11 @@ void gspInit()
        srv_getServiceHandle(NULL, &gspGpuHandle, "gsp::Gpu");
 }
 
+void gspExit()
+{
+       if(gspGpuHandle)svc_closeHandle(gspGpuHandle);
+}
+
 Result GSPGPU_AcquireRight(Handle* handle, u8 flags)
 {
        if(!handle)handle=&gspGpuHandle;
@@ -130,6 +135,19 @@ Result GSPGPU_RegisterInterruptRelayQueue(Handle* handle, Handle eventHandle, u3
        return cmdbuf[1];
 }
 
+Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle)
+{
+       if(!handle)handle=&gspGpuHandle;
+       
+       u32* cmdbuf=getThreadCommandBuffer();
+       cmdbuf[0]=0x00140000; //request header code
+
+       Result ret=0;
+       if((ret=svc_sendSyncRequest(*handle)))return ret;
+       
+       return cmdbuf[1];
+}
+
 Result GSPGPU_TriggerCmdReqQueue(Handle* handle)
 {
        if(!handle)handle=&gspGpuHandle;
index aec7941c8d986678b0b2cecbddf7a6337039f343..cdc6af9b97e04235bb164f327cb276dbbfb3a4aa 100644 (file)
@@ -5,7 +5,7 @@
 #include <ctr/srv.h>
 #include <ctr/svc.h>
 
-Handle srvHandle;
+Handle srvHandle=0;
 
 Result initSrv()
 {
@@ -14,6 +14,11 @@ Result initSrv()
        return srv_Initialize(&srvHandle);
 }
 
+Result exitSrv()
+{
+       if(srvHandle)svc_closeHandle(srvHandle);
+}
+
 Result srv_Initialize(Handle* handleptr)
 {
        if(!handleptr)handleptr=&srvHandle;
index 15a667e9e756041b57eba84c60d9c374345e8c72..903ed31a17211ef2dc22460ce824ebf2453b14f5 100644 (file)
@@ -98,6 +98,12 @@ svc_mapMemoryBlock:
        svc 0x1F
        bx lr
 
+.global svc_unmapMemoryBlock
+.type svc_unmapMemoryBlock, %function
+svc_unmapMemoryBlock:
+       svc 0x20
+       bx lr
+
 .global svc_closeHandle
 .type svc_closeHandle, %function
 svc_closeHandle:
@@ -122,6 +128,18 @@ svc_waitSynchronizationN:
        ldr r5, [sp], #4
        bx lr
 
+.global svc_getSystemInfo
+.type svc_getSystemInfo, %function
+svc_getSystemInfo:
+       stmfd sp!, {r0, r4}
+       svc 0x2A
+       ldr r4, [sp], #4
+       str r1, [r4]
+       str r2, [r4, #4]
+       # str r3, [r4, #8] # ?
+       ldr r4, [sp], #4
+       bx lr
+
 .global svc_connectToPort
 .type svc_connectToPort, %function
 svc_connectToPort:
index f8426339f4bb4df5950e70aaaf9182a5c58bc302..4d8d95fcfa4ae6f2d41abd029fd3b405bade2373 100644 (file)
@@ -16,6 +16,8 @@ u32* gxCmdBuf;
 u8 currentBuffer;
 u8* topLeftFramebuffers[2];
 
+Handle gspEvent, gspSharedMemHandle;
+
 void gspGpuInit()
 {
        gspInit();
@@ -36,7 +38,6 @@ void gspGpuInit()
 
        //setup our gsp shared mem section
        u8 threadID;
-       Handle gspEvent, gspSharedMemHandle;
        svc_createEvent(&gspEvent, 0x0);
        GSPGPU_RegisterInterruptRelayQueue(NULL, gspEvent, 0x1, &gspSharedMemHandle, &threadID);
        svc_mapMemoryBlock(gspSharedMemHandle, 0x10002000, 0x3, 0x10000000);
@@ -53,6 +54,22 @@ void gspGpuInit()
        currentBuffer=0;
 }
 
+void gspGpuExit()
+{
+       GSPGPU_UnregisterInterruptRelayQueue(NULL);
+
+       //unmap GSP shared mem
+       svc_unmapMemoryBlock(gspSharedMemHandle, 0x10002000);
+       svc_closeHandle(gspSharedMemHandle);
+       svc_closeHandle(gspEvent);
+       
+       gspExit();
+
+       //free GSP heap
+       svc_controlMemory((u32*)&gspHeap, (u32)gspHeap, 0x0, 0x2000000, MEMOP_FREE, 0x0);
+}
+
+
 void swapBuffers()
 {
        u32 regData;
@@ -102,6 +119,25 @@ void renderEffect()
        }
 }
 
+Handle hidHandle;
+Handle hidMemHandle;
+
+void hidInit()
+{
+       srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
+       HIDUSER_GetInfo(hidHandle, &hidMemHandle);
+       svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
+
+       HIDUSER_Init(hidHandle);
+}
+
+void hidExit()
+{
+       svc_unmapMemoryBlock(hidMemHandle, 0x10000000);
+       svc_closeHandle(hidMemHandle);
+       svc_closeHandle(hidHandle);
+}
+
 int main()
 {
        initSrv();
@@ -110,13 +146,7 @@ int main()
 
        gspGpuInit();
 
-       Handle hidHandle;
-       Handle hidMemHandle;
-       srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
-       HIDUSER_GetInfo(hidHandle, &hidMemHandle);
-       svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
-
-       HIDUSER_Init(hidHandle);
+       hidInit();
 
        Handle fsuHandle;
        srv_getServiceHandle(NULL, &fsuHandle, "fs:USER");
@@ -128,6 +158,7 @@ int main()
        FS_path filePath=(FS_path){PATH_CHAR, 10, (u8*)"/test.bin"};
        FSUSER_OpenFileDirectly(fsuHandle, &fileHandle, sdmcArchive, filePath, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
        FSFILE_Read(fileHandle, &bytesRead, 0x0, (u32*)gspHeap, 0x46500);
+       FSFILE_Close(fileHandle);
 
        aptSetupEventHandler();
        
@@ -142,6 +173,9 @@ int main()
                svc_sleepThread(1000000000);
        }
 
+       svc_closeHandle(fsuHandle);
+       hidExit();
+       gspGpuInit();
        aptExit();
        svc_exitProcess();
        return 0;