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

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

View 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

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

View 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