From 4a1619f7c702360869cc382b4ef8f2371d0d3d21 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Sun, 27 Apr 2014 21:28:48 -0400 Subject: [PATCH] Added svc_signalEvent, svc_getSystemTick, and svc_getProcessId. Enabled using SOC cmd8/cmda, and other minor changes. --- libctru/include/ctr/CSND.h | 1 + libctru/include/ctr/SOC.h | 2 +- libctru/include/ctr/svc.h | 3 ++ libctru/source/SOC.c | 72 +++++++++++++++++++------------------- libctru/source/svc.s | 21 +++++++++++ 5 files changed, 62 insertions(+), 37 deletions(-) diff --git a/libctru/include/ctr/CSND.h b/libctru/include/ctr/CSND.h index 36d3352..070f19e 100644 --- a/libctru/include/ctr/CSND.h +++ b/libctru/include/ctr/CSND.h @@ -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); diff --git a/libctru/include/ctr/SOC.h b/libctru/include/ctr/SOC.h index 2bb2e7c..3dc33ef 100644 --- a/libctru/include/ctr/SOC.h +++ b/libctru/include/ctr/SOC.h @@ -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(); diff --git a/libctru/include/ctr/svc.h b/libctru/include/ctr/svc.h index e28cade..d9cae4e 100644 --- a/libctru/include/ctr/svc.h +++ b/libctru/include/ctr/svc.h @@ -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 diff --git a/libctru/source/SOC.c b/libctru/source/SOC.c index 86ddc60..2ebddac 100644 --- a/libctru/source/SOC.c +++ b/libctru/source/SOC.c @@ -10,8 +10,8 @@ #include #include -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); } diff --git a/libctru/source/svc.s b/libctru/source/svc.s index 903ed31..7716f60 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -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