]> Chaos Git - corbenik/ctrulib.git/commitdiff
Added svc_signalEvent, svc_getSystemTick, and svc_getProcessId. Enabled using SOC...
authoryellows8 <yellowstar6@gmail.com>
Mon, 28 Apr 2014 01:28:48 +0000 (21:28 -0400)
committeryellows8 <yellowstar6@gmail.com>
Mon, 28 Apr 2014 01:28:48 +0000 (21:28 -0400)
libctru/include/ctr/CSND.h
libctru/include/ctr/SOC.h
libctru/include/ctr/svc.h
libctru/source/SOC.c
libctru/source/svc.s

index 36d335271d3d3806f9fc7a6cc5c564935b97acf3..070f19e47b9059e0b4b8eed7369aeae86b0fbcb9 100644 (file)
@@ -9,6 +9,7 @@ Result CSND_shutdown();
 Result CSND_playsound(u32 channel, u32 looping, u32 encoding, u32 samplerate, u32 *vaddr0, u32 *vaddr1, u32 totalbytesize, u32 unk0, u32 unk1);
 void CSND_setchannel_playbackstate(u32 channel, u32 value);
 void CSND_sharedmemtype0_cmd0(u32 channel, u32 value);
+void CSND_writesharedmem_cmdtype0(u16 cmdid, u8 *cmdparams);
 Result CSND_sharedmemtype0_cmdupdatestate(int waitdone);
 
 Result CSND_getchannelstate(u32 entryindex, u32 *out);
index 2bb2e7c017df800bfe78e334c5c6ab15eff3ff8c..3dc33efeaf0bc2030164a06a4c14296af6c0d331 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef SOC_H
 #define SOC_H
 
-Result SOC_Initialize(u32 *context_addr, u32 context_size);
+Result SOC_Initialize(u32 *context_addr, u32 context_size);//Example context_size: 0x48000. The specified context buffer can no longer be accessed by the process which called this function, since the userland permissions for this block are set to no-access.
 Result SOC_Shutdown();
 int SOC_GetErrno();
 
index e28cade6a727c6bd1d4183bbd1d21b6ad3c52203..d9cae4e768f33df564ae67281e229450926cd1b5 100644 (file)
@@ -24,6 +24,7 @@ typedef enum{
        Result svc_createMutex(Handle* mutex, bool initialLocked);
        Result svc_releaseMutex(Handle handle);
        Result svc_createEvent(Handle* event, u8 resettype);
+       Result svc_signalEvent(Handle handle);
        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);
@@ -31,8 +32,10 @@ typedef enum{
        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);
+       u64 svc_getSystemTick();
        Result svc_getSystemInfo(s64* out, u32 type, s32 param);
        Result svc_connectToPort(volatile Handle* out, const char* portName);
        Result svc_sendSyncRequest(Handle session);
+       Result svc_getProcessId(u32 *out, Handle handle);
 
 #endif
index 86ddc602be47de511c10c3dd1bd1082d0f79bf43..2ebddac221b8e1781779f885a7fd6d0f43c5ee0b 100644 (file)
@@ -10,8 +10,8 @@
 #include <netinet/in.h>
 #include <netdb.h>
 
-static Handle socu_handle = 0;
-static int soc_errno = 0;
+Handle SOCU_handle = 0;
+static int SOCU_errno = 0;
 
 Result socu_cmd1(Handle memhandle, u32 memsize)
 {
@@ -24,7 +24,7 @@ Result socu_cmd1(Handle memhandle, u32 memsize)
        cmdbuf[4] = 0;
        cmdbuf[5] = memhandle;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        return cmdbuf[1];
 }
@@ -36,14 +36,14 @@ Result SOC_Shutdown()
 
        cmdbuf[0] = 0x00190000;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
-       svc_closeHandle(socu_handle);
+       svc_closeHandle(SOCU_handle);
 
        return cmdbuf[1];
 }
 
-Result SOC_Initialize(u32 *context_addr, u32 context_size)//Example context_size: 0x48000. The specified context buffer can no longer be accessed by the process which called this function, since the userland permissions for this block are set to no-access.
+Result SOC_Initialize(u32 *context_addr, u32 context_size)
 {
        Result ret=0;
        Handle memhandle = 0;
@@ -51,14 +51,14 @@ Result SOC_Initialize(u32 *context_addr, u32 context_size)//Example context_size
        ret = svc_createMemoryBlock(&memhandle, (u32)context_addr, context_size, 0, 3);
        if(ret!=0)return ret;
 
-       if((ret = srv_getServiceHandle(NULL, &socu_handle, "soc:U"))!=0)return ret;
+       if((ret = srv_getServiceHandle(NULL, &SOCU_handle, "soc:U"))!=0)return ret;
 
        return socu_cmd1(memhandle, context_size);
 }
 
 int SOC_GetErrno()
 {
-       return soc_errno;
+       return SOCU_errno;
 }
 
 int socket(int domain, int type, int protocol)
@@ -72,10 +72,10 @@ int socket(int domain, int type, int protocol)
        cmdbuf[3] = protocol;
        cmdbuf[4] = 0x20;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
-       soc_errno = ret;
+       SOCU_errno = ret;
 
        if(ret!=0)return -1;
        return (int)cmdbuf[2];
@@ -90,11 +90,11 @@ int closesocket(int sockfd)
        cmdbuf[1] = (u32)sockfd;
        cmdbuf[2] = 0x20;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       soc_errno = ret;
+       SOCU_errno = ret;
 
        if(ret!=0)return -1;
        return 0;
@@ -110,11 +110,11 @@ int shutdown(int sockfd, int shutdown_type)
        cmdbuf[2] = (u32)shutdown_type;
        cmdbuf[3] = 0x20;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       soc_errno = ret;
+       SOCU_errno = ret;
 
        if(ret!=0)return -1;
        return 0;
@@ -130,11 +130,11 @@ int listen(int sockfd, int max_connections)
        cmdbuf[2] = (u32)max_connections;
        cmdbuf[3] = 0x20;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       soc_errno = ret;
+       SOCU_errno = ret;
 
        if(ret!=0)return -1;
        return 0;
@@ -161,14 +161,14 @@ int accept(int sockfd, struct sockaddr *addr, int *addrlen)
        cmdbuf[0x100>>2] = (tmp_addrlen<<14) | 2;
        cmdbuf[0x104>>2] = (u32)tmpaddr;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        cmdbuf[0x100>>2] = saved_threadstorage[0];
        cmdbuf[0x104>>2] = saved_threadstorage[1];
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       if(ret<0)soc_errno = ret;
+       if(ret<0)SOCU_errno = ret;
 
        if(ret>=0 && addr!=NULL)
        {
@@ -186,8 +186,8 @@ int bind(int sockfd, const struct sockaddr *addr, int addrlen)
 {
        int ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
+       //struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
        u8 tmpaddr[8];
-       struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
 
        addrlen = 8;
        tmpaddr[0] = 8;
@@ -201,11 +201,11 @@ int bind(int sockfd, const struct sockaddr *addr, int addrlen)
        cmdbuf[5] = (((u32)addrlen)<<14) | 2;
        cmdbuf[6] = (u32)tmpaddr;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       soc_errno = ret;
+       SOCU_errno = ret;
 
        if(ret<0)return -1;
        return 0;
@@ -215,8 +215,8 @@ int connect(int sockfd, const struct sockaddr *addr, int addrlen)
 {
        int ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
+       //struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
        u8 tmpaddr[8];
-       struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
 
        addrlen = 8;
        tmpaddr[0] = 8;
@@ -230,11 +230,11 @@ int connect(int sockfd, const struct sockaddr *addr, int addrlen)
        cmdbuf[5] = (((u32)addrlen)<<14) | 2;
        cmdbuf[6] = (u32)tmpaddr;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       soc_errno = ret;
+       SOCU_errno = ret;
 
        if(ret<0)return -1;
        return 0;
@@ -265,14 +265,14 @@ int socuipc_cmd7(int sockfd, void *buf, int len, int flags, struct sockaddr *src
        cmdbuf[0x100>>2] = (tmp_addrlen<<14) | 2;
        cmdbuf[0x104>>2] = (u32)tmpaddr;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        cmdbuf[0x100>>2] = saved_threadstorage[0];
        cmdbuf[0x104>>2] = saved_threadstorage[1];
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       if(ret<0)soc_errno = ret;
+       if(ret<0)SOCU_errno = ret;
 
        if(ret<0)return -1;
        return ret;
@@ -305,7 +305,7 @@ int socuipc_cmd8(int sockfd, void *buf, int len, int flags, struct sockaddr *src
        cmdbuf[0x108>>2] = (tmp_addrlen<<14) | 2;
        cmdbuf[0x10c>>2] = (u32)tmpaddr;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        cmdbuf[0x100>>2] = saved_threadstorage[0];
        cmdbuf[0x104>>2] = saved_threadstorage[1];
@@ -314,13 +314,13 @@ int socuipc_cmd8(int sockfd, void *buf, int len, int flags, struct sockaddr *src
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       if(ret<0)soc_errno = ret;
+       if(ret<0)SOCU_errno = ret;
 
        if(ret<0)return -1;
        return ret;
 }
 
-int socuipc_cmd9(int sockfd, const void *buf, int len, int flags, struct sockaddr *dest_addr, int addrlen)
+int socuipc_cmd9(int sockfd, const void *buf, int len, int flags, const struct sockaddr *dest_addr, int addrlen)
 {
        int ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
@@ -340,17 +340,17 @@ int socuipc_cmd9(int sockfd, const void *buf, int len, int flags, struct sockadd
        cmdbuf[9] = (((u32)len)<<4) | 10;
        cmdbuf[10] = (u32)buf;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       if(ret<0)soc_errno = ret;
+       if(ret<0)SOCU_errno = ret;
 
        if(ret<0)return -1;
        return ret;
 }
 
-int socuipc_cmda(int sockfd, const void *buf, int len, int flags, struct sockaddr *dest_addr, int addrlen)
+int socuipc_cmda(int sockfd, const void *buf, int len, int flags, const struct sockaddr *dest_addr, int addrlen)
 {
        int ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
@@ -370,11 +370,11 @@ int socuipc_cmda(int sockfd, const void *buf, int len, int flags, struct sockadd
        cmdbuf[9] = (tmp_addrlen<<14) | 0x402;
        cmdbuf[10] = (u32)tmpaddr;
 
-       if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret;
+       if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
 
        ret = (int)cmdbuf[1];
        if(ret==0)ret = (int)cmdbuf[2];
-       if(ret<0)soc_errno = ret;
+       if(ret<0)SOCU_errno = ret;
 
        if(ret<0)return -1;
        return ret;
@@ -382,13 +382,13 @@ int socuipc_cmda(int sockfd, const void *buf, int len, int flags, struct sockadd
 
 int recvfrom(int sockfd, void *buf, int len, int flags, struct sockaddr *src_addr, int *addrlen)//UDP is not supported for these since the input/output sockaddr is not used.
 {
-       //if(len<0x2000)return socuipc_cmd8(sockfd, buf, len, flags, src_addr, addrlen);
+       if(len<0x2000)return socuipc_cmd8(sockfd, buf, len, flags, src_addr, addrlen);
        return socuipc_cmd7(sockfd, buf, len, flags, src_addr, addrlen);
 }
 
 int sendto(int sockfd, const void *buf, int len, int flags, const struct sockaddr *dest_addr, int addrlen)
 {
-       //if(len<0x2000)return socuipc_cmda(sockfd, buf, len, flags, dest_addr, addrlen);
+       if(len<0x2000)return socuipc_cmda(sockfd, buf, len, flags, dest_addr, addrlen);
        return socuipc_cmd9(sockfd, buf, len, flags, (struct sockaddr*)dest_addr, addrlen);
 }
 
index 903ed31a17211ef2dc22460ce824ebf2453b14f5..7716f607becfc031ab2226f77be4f307f0984c8d 100644 (file)
@@ -76,6 +76,12 @@ svc_createEvent:
        str r1, [r2]
        bx lr
 
+.global svc_signalEvent
+.type svc_signalEvent, %function
+svc_signalEvent:
+       svc 0x18
+       bx lr
+
 .global svc_clearEvent
 .type svc_clearEvent, %function
 svc_clearEvent:
@@ -128,6 +134,12 @@ svc_waitSynchronizationN:
        ldr r5, [sp], #4
        bx lr
 
+.global svc_getSystemTick
+.type svc_getSystemTick, %function
+svc_getSystemTick:
+       svc 0x28
+       bx lr
+
 .global svc_getSystemInfo
 .type svc_getSystemInfo, %function
 svc_getSystemInfo:
@@ -154,3 +166,12 @@ svc_connectToPort:
 svc_sendSyncRequest:
        svc 0x32
        bx lr
+
+.global svc_getProcessId
+.type svc_getProcessId, %function
+svc_getProcessId:
+       str r0, [sp,#-0x4]!
+       svc 0x35
+       ldr r3, [sp], #4
+       str r1, [r3]
+       bx lr