Added svc_signalEvent, svc_getSystemTick, and svc_getProcessId. Enabled using SOC cmd8/cmda, and other minor changes.

This commit is contained in:
yellows8 2014-04-27 21:28:48 -04:00
parent c69bc04dff
commit 4a1619f7c7
5 changed files with 62 additions and 37 deletions

View 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); 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_setchannel_playbackstate(u32 channel, u32 value);
void CSND_sharedmemtype0_cmd0(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_sharedmemtype0_cmdupdatestate(int waitdone);
Result CSND_getchannelstate(u32 entryindex, u32 *out); Result CSND_getchannelstate(u32 entryindex, u32 *out);

View File

@ -1,7 +1,7 @@
#ifndef SOC_H #ifndef SOC_H
#define 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(); Result SOC_Shutdown();
int SOC_GetErrno(); int SOC_GetErrno();

View File

@ -24,6 +24,7 @@ typedef enum{
Result svc_createMutex(Handle* mutex, bool initialLocked); Result svc_createMutex(Handle* mutex, bool initialLocked);
Result svc_releaseMutex(Handle handle); Result svc_releaseMutex(Handle handle);
Result svc_createEvent(Handle* event, u8 resettype); Result svc_createEvent(Handle* event, u8 resettype);
Result svc_signalEvent(Handle handle);
Result svc_clearEvent(Handle handle); Result svc_clearEvent(Handle handle);
Result svc_createMemoryBlock(Handle* memblock, u32 addr, u32 size, u32 mypermission, u32 otherpermission); 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_mapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission);
@ -31,8 +32,10 @@ typedef enum{
Result svc_waitSynchronization1(Handle handle, s64 nanoseconds); Result svc_waitSynchronization1(Handle handle, s64 nanoseconds);
Result svc_waitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds); Result svc_waitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds);
Result svc_closeHandle(Handle handle); Result svc_closeHandle(Handle handle);
u64 svc_getSystemTick();
Result svc_getSystemInfo(s64* out, u32 type, s32 param); Result svc_getSystemInfo(s64* out, u32 type, s32 param);
Result svc_connectToPort(volatile Handle* out, const char* portName); Result svc_connectToPort(volatile Handle* out, const char* portName);
Result svc_sendSyncRequest(Handle session); Result svc_sendSyncRequest(Handle session);
Result svc_getProcessId(u32 *out, Handle handle);
#endif #endif

View File

@ -10,8 +10,8 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <netdb.h> #include <netdb.h>
static Handle socu_handle = 0; Handle SOCU_handle = 0;
static int soc_errno = 0; static int SOCU_errno = 0;
Result socu_cmd1(Handle memhandle, u32 memsize) Result socu_cmd1(Handle memhandle, u32 memsize)
{ {
@ -24,7 +24,7 @@ Result socu_cmd1(Handle memhandle, u32 memsize)
cmdbuf[4] = 0; cmdbuf[4] = 0;
cmdbuf[5] = memhandle; cmdbuf[5] = memhandle;
if((ret = svc_sendSyncRequest(socu_handle))!=0)return ret; if((ret = svc_sendSyncRequest(SOCU_handle))!=0)return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
@ -36,14 +36,14 @@ Result SOC_Shutdown()
cmdbuf[0] = 0x00190000; 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]; 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; Result ret=0;
Handle memhandle = 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); ret = svc_createMemoryBlock(&memhandle, (u32)context_addr, context_size, 0, 3);
if(ret!=0)return ret; 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); return socu_cmd1(memhandle, context_size);
} }
int SOC_GetErrno() int SOC_GetErrno()
{ {
return soc_errno; return SOCU_errno;
} }
int socket(int domain, int type, int protocol) int socket(int domain, int type, int protocol)
@ -72,10 +72,10 @@ int socket(int domain, int type, int protocol)
cmdbuf[3] = protocol; cmdbuf[3] = protocol;
cmdbuf[4] = 0x20; 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]; ret = (int)cmdbuf[1];
soc_errno = ret; SOCU_errno = ret;
if(ret!=0)return -1; if(ret!=0)return -1;
return (int)cmdbuf[2]; return (int)cmdbuf[2];
@ -90,11 +90,11 @@ int closesocket(int sockfd)
cmdbuf[1] = (u32)sockfd; cmdbuf[1] = (u32)sockfd;
cmdbuf[2] = 0x20; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
soc_errno = ret; SOCU_errno = ret;
if(ret!=0)return -1; if(ret!=0)return -1;
return 0; return 0;
@ -110,11 +110,11 @@ int shutdown(int sockfd, int shutdown_type)
cmdbuf[2] = (u32)shutdown_type; cmdbuf[2] = (u32)shutdown_type;
cmdbuf[3] = 0x20; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
soc_errno = ret; SOCU_errno = ret;
if(ret!=0)return -1; if(ret!=0)return -1;
return 0; return 0;
@ -130,11 +130,11 @@ int listen(int sockfd, int max_connections)
cmdbuf[2] = (u32)max_connections; cmdbuf[2] = (u32)max_connections;
cmdbuf[3] = 0x20; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
soc_errno = ret; SOCU_errno = ret;
if(ret!=0)return -1; if(ret!=0)return -1;
return 0; return 0;
@ -161,14 +161,14 @@ int accept(int sockfd, struct sockaddr *addr, int *addrlen)
cmdbuf[0x100>>2] = (tmp_addrlen<<14) | 2; cmdbuf[0x100>>2] = (tmp_addrlen<<14) | 2;
cmdbuf[0x104>>2] = (u32)tmpaddr; 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[0x100>>2] = saved_threadstorage[0];
cmdbuf[0x104>>2] = saved_threadstorage[1]; cmdbuf[0x104>>2] = saved_threadstorage[1];
ret = (int)cmdbuf[1]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
if(ret<0)soc_errno = ret; if(ret<0)SOCU_errno = ret;
if(ret>=0 && addr!=NULL) if(ret>=0 && addr!=NULL)
{ {
@ -186,8 +186,8 @@ int bind(int sockfd, const struct sockaddr *addr, int addrlen)
{ {
int ret=0; int ret=0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
//struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
u8 tmpaddr[8]; u8 tmpaddr[8];
struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
addrlen = 8; addrlen = 8;
tmpaddr[0] = 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[5] = (((u32)addrlen)<<14) | 2;
cmdbuf[6] = (u32)tmpaddr; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
soc_errno = ret; SOCU_errno = ret;
if(ret<0)return -1; if(ret<0)return -1;
return 0; return 0;
@ -215,8 +215,8 @@ int connect(int sockfd, const struct sockaddr *addr, int addrlen)
{ {
int ret=0; int ret=0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
//struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
u8 tmpaddr[8]; u8 tmpaddr[8];
struct sockaddr_in *inaddr = (struct sockaddr_in*)addr;
addrlen = 8; addrlen = 8;
tmpaddr[0] = 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[5] = (((u32)addrlen)<<14) | 2;
cmdbuf[6] = (u32)tmpaddr; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
soc_errno = ret; SOCU_errno = ret;
if(ret<0)return -1; if(ret<0)return -1;
return 0; 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[0x100>>2] = (tmp_addrlen<<14) | 2;
cmdbuf[0x104>>2] = (u32)tmpaddr; 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[0x100>>2] = saved_threadstorage[0];
cmdbuf[0x104>>2] = saved_threadstorage[1]; cmdbuf[0x104>>2] = saved_threadstorage[1];
ret = (int)cmdbuf[1]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
if(ret<0)soc_errno = ret; if(ret<0)SOCU_errno = ret;
if(ret<0)return -1; if(ret<0)return -1;
return ret; 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[0x108>>2] = (tmp_addrlen<<14) | 2;
cmdbuf[0x10c>>2] = (u32)tmpaddr; 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[0x100>>2] = saved_threadstorage[0];
cmdbuf[0x104>>2] = saved_threadstorage[1]; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
if(ret<0)soc_errno = ret; if(ret<0)SOCU_errno = ret;
if(ret<0)return -1; if(ret<0)return -1;
return ret; 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; int ret=0;
u32 *cmdbuf = getThreadCommandBuffer(); 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[9] = (((u32)len)<<4) | 10;
cmdbuf[10] = (u32)buf; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
if(ret<0)soc_errno = ret; if(ret<0)SOCU_errno = ret;
if(ret<0)return -1; if(ret<0)return -1;
return ret; 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; int ret=0;
u32 *cmdbuf = getThreadCommandBuffer(); 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[9] = (tmp_addrlen<<14) | 0x402;
cmdbuf[10] = (u32)tmpaddr; 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]; ret = (int)cmdbuf[1];
if(ret==0)ret = (int)cmdbuf[2]; if(ret==0)ret = (int)cmdbuf[2];
if(ret<0)soc_errno = ret; if(ret<0)SOCU_errno = ret;
if(ret<0)return -1; if(ret<0)return -1;
return ret; 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. 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); 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) 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); return socuipc_cmd9(sockfd, buf, len, flags, (struct sockaddr*)dest_addr, addrlen);
} }

View File

@ -76,6 +76,12 @@ svc_createEvent:
str r1, [r2] str r1, [r2]
bx lr bx lr
.global svc_signalEvent
.type svc_signalEvent, %function
svc_signalEvent:
svc 0x18
bx lr
.global svc_clearEvent .global svc_clearEvent
.type svc_clearEvent, %function .type svc_clearEvent, %function
svc_clearEvent: svc_clearEvent:
@ -128,6 +134,12 @@ svc_waitSynchronizationN:
ldr r5, [sp], #4 ldr r5, [sp], #4
bx lr bx lr
.global svc_getSystemTick
.type svc_getSystemTick, %function
svc_getSystemTick:
svc 0x28
bx lr
.global svc_getSystemInfo .global svc_getSystemInfo
.type svc_getSystemInfo, %function .type svc_getSystemInfo, %function
svc_getSystemInfo: svc_getSystemInfo:
@ -154,3 +166,12 @@ svc_connectToPort:
svc_sendSyncRequest: svc_sendSyncRequest:
svc 0x32 svc 0x32
bx lr 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