diff --git a/nx/include/switch.h b/nx/include/switch.h index 36b0b2ce..7b59b881 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -11,6 +11,7 @@ extern "C" { #include #include #include +#include #ifdef __cplusplus } diff --git a/nx/include/switch/ipc.h b/nx/include/switch/ipc.h index 5fbafd3d..febec807 100644 --- a/nx/include/switch/ipc.h +++ b/nx/include/switch/ipc.h @@ -22,7 +22,8 @@ static inline void ipcInitialize(IpcCommand* cmd) { cmd->NumStaticRecv = 0; cmd->SendPid = false; - cmd->NumHandles = 0; + cmd->NumHandlesCopy = 0; + cmd->NumHandlesMove = 0; } typedef struct { // todo: Make sure sizeof isn't 16 bytes! @@ -36,7 +37,7 @@ typedef struct { u32 Addr; } IpcStaticSendDescriptor; -static inline void ipcAddSendBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 Flags) { +static inline void ipcAddSendBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 flags) { size_t off = cmd->NumSend; cmd->Buffers[off] = buffer; cmd->Sizes[off] = size; @@ -44,7 +45,7 @@ static inline void ipcAddSendBuffer(IpcCommand* cmd, void* buffer, size_t size, cmd->NumSend++; } -static inline void ipcAddRecvBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 Flags) { +static inline void ipcAddRecvBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 flags) { size_t off = cmd->NumSend + cmd->NumRecv; cmd->Buffers[off] = buffer; cmd->Sizes[off] = size; @@ -65,10 +66,9 @@ static inline void ipcSendHandleMove(IpcCommand* cmd, Handle h) { } static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) { - u32* buf = armGetTlsPtr(); + u32* buf = armGetTls(); *buf++ = 4 | (cmd->NumSend << 20) | (cmd->NumRecv << 24); - u32 flag = 0; if (cmd->SendPid || cmd->NumHandlesCopy > 0 || cmd->NumHandlesMove > 0) { *buf++ = (sizeof_raw/4) | 0x80000000; *buf++ = (!!cmd->SendPid) | (cmd->NumHandlesCopy << 1) | (cmd->NumHandlesMove << 1); @@ -81,16 +81,15 @@ static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) { for (i=0; i<(cmd->NumSend + cmd->NumRecv); i++, buf+=3) { IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf; desc->Size = cmd->Sizes[i]; - desc->Addr = cmd->Buffers[i]; - uintptr_t ptr = (uintptr_t) cmd->Buffers[i] + + uintptr_t ptr = (uintptr_t) cmd->Buffers[i]; + desc->Addr = ptr; desc->Packed = - (((ptr) >> 36) << 28) | - (((ptr >> 32) & 15) << 28) | - cmd->Flags[i]; + (((ptr) >> 36) << 28) | (((ptr >> 32) & 15) << 28) | cmd->Flags[i]; } // todo: More - return (void*) ((uintptr_t)buf + 15) &~ 15; + return (void*) ((((uintptr_t)buf) + 15) &~ 15); } static inline Result ipcDispatch(Handle session) { diff --git a/nx/include/switch/svc.h b/nx/include/switch/svc.h index 87571c58..1530ecf3 100644 --- a/nx/include/switch/svc.h +++ b/nx/include/switch/svc.h @@ -21,9 +21,9 @@ static inline void* armGetTls(void) { Result svcCloseHandle(Handle handle); Result svcWaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout); Result svcConnectToNamedPort(Handle* session, const char* name); +Result svcSendSyncRequest(Handle session); Result svcBreak(u32 BreakReason, u64 inval1, u64 inval2); Result svcAcceptSession(Handle *session_handle, Handle port_handle); Result svcReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); Result svcQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size); Result svcManageNamedPort(Handle* portServer, const char* name, s32 maxSessions); - diff --git a/nx/source/srv/sm.c b/nx/source/srv/sm.c new file mode 100644 index 00000000..d58d8b97 --- /dev/null +++ b/nx/source/srv/sm.c @@ -0,0 +1,27 @@ +#include + +static Handle g_smHandle; + +Result smInitialize() { + Result rc = svcConnectToNamedPort(&g_smHandle, "sm:"); + + if (R_SUCCEEDED(rc)) { + IpcCommand c; + ipcInitialize(&c); + ipcSendPid(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 0; + + rc = ipcDispatch(g_smHandle); + } + + return rc; +} diff --git a/nx/source/svc.s b/nx/source/svc.s index 372723df..1b97149f 100644 --- a/nx/source/svc.s +++ b/nx/source/svc.s @@ -32,6 +32,11 @@ SVC_BEGIN svcConnectToNamedPort ret SVC_END +SVC_BEGIN svcSendSyncRequest + svc 0x21 + ret +SVC_END + SVC_BEGIN svcBreak svc 0x26 ret