APT && misc : better app exiting code, fixed APPLICATION and BASE mem leak

This commit is contained in:
smea 2014-02-03 18:06:58 +01:00
parent 7c28d9acce
commit 2a518a9ae3
11 changed files with 216 additions and 30 deletions

View 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)
{
if(status==APP_RUNNING)
{
u32 PAD=((u32*)0x10000000)[7];
u32 regData=PAD|0x01000000;
GSPGPU_WriteHWRegs(NULL, 0x202A04, (u8*)&regData, 4);
renderEffect();
swapBuffers();
copyBuffer();
u32 regData=PAD|0x01000000;
GSPGPU_WriteHWRegs(NULL, 0x202A04, (u8*)&regData, 4);
svc_sleepThread(1000000000);
}
svc_sleepThread(16666666);
}
hidExit();
gspGpuExit();
aptExit();
svc_exitProcess();
return 0;

View 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

View 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);

View 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);

View 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)
@ -14,9 +27,11 @@
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);

View 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()

View 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];
}

View 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;

View 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;

View 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:

View 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;