Added svc_signalEvent, svc_getSystemTick, and svc_getProcessId. Enabled using SOC cmd8/cmda, and other minor changes.
This commit is contained in:
parent
c69bc04dff
commit
4a1619f7c7
@ -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);
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user