Merge branch 'master' of gitlab.com:yellows8/libnx

This commit is contained in:
yellows8 2017-09-09 12:10:49 -04:00
commit 1d20c999f1
5 changed files with 44 additions and 12 deletions

View File

@ -11,6 +11,7 @@ extern "C" {
#include <switch/types.h> #include <switch/types.h>
#include <switch/result.h> #include <switch/result.h>
#include <switch/svc.h> #include <switch/svc.h>
#include <switch/ipc.h>
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -22,7 +22,8 @@ static inline void ipcInitialize(IpcCommand* cmd) {
cmd->NumStaticRecv = 0; cmd->NumStaticRecv = 0;
cmd->SendPid = false; cmd->SendPid = false;
cmd->NumHandles = 0; cmd->NumHandlesCopy = 0;
cmd->NumHandlesMove = 0;
} }
typedef struct { // todo: Make sure sizeof isn't 16 bytes! typedef struct { // todo: Make sure sizeof isn't 16 bytes!
@ -36,7 +37,7 @@ typedef struct {
u32 Addr; u32 Addr;
} IpcStaticSendDescriptor; } 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; size_t off = cmd->NumSend;
cmd->Buffers[off] = buffer; cmd->Buffers[off] = buffer;
cmd->Sizes[off] = size; cmd->Sizes[off] = size;
@ -44,7 +45,7 @@ static inline void ipcAddSendBuffer(IpcCommand* cmd, void* buffer, size_t size,
cmd->NumSend++; 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; size_t off = cmd->NumSend + cmd->NumRecv;
cmd->Buffers[off] = buffer; cmd->Buffers[off] = buffer;
cmd->Sizes[off] = size; 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) { static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) {
u32* buf = armGetTlsPtr(); u32* buf = armGetTls();
*buf++ = 4 | (cmd->NumSend << 20) | (cmd->NumRecv << 24); *buf++ = 4 | (cmd->NumSend << 20) | (cmd->NumRecv << 24);
u32 flag = 0;
if (cmd->SendPid || cmd->NumHandlesCopy > 0 || cmd->NumHandlesMove > 0) { if (cmd->SendPid || cmd->NumHandlesCopy > 0 || cmd->NumHandlesMove > 0) {
*buf++ = (sizeof_raw/4) | 0x80000000; *buf++ = (sizeof_raw/4) | 0x80000000;
*buf++ = (!!cmd->SendPid) | (cmd->NumHandlesCopy << 1) | (cmd->NumHandlesMove << 1); *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) { for (i=0; i<(cmd->NumSend + cmd->NumRecv); i++, buf+=3) {
IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf; IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf;
desc->Size = cmd->Sizes[i]; 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 = desc->Packed =
(((ptr) >> 36) << 28) | (((ptr) >> 36) << 28) | (((ptr >> 32) & 15) << 28) | cmd->Flags[i];
(((ptr >> 32) & 15) << 28) |
cmd->Flags[i];
} }
// todo: More // todo: More
return (void*) ((uintptr_t)buf + 15) &~ 15; return (void*) ((((uintptr_t)buf) + 15) &~ 15);
} }
static inline Result ipcDispatch(Handle session) { static inline Result ipcDispatch(Handle session) {

View File

@ -21,9 +21,9 @@ static inline void* armGetTls(void) {
Result svcCloseHandle(Handle handle); Result svcCloseHandle(Handle handle);
Result svcWaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout); Result svcWaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout);
Result svcConnectToNamedPort(Handle* session, const char* name); Result svcConnectToNamedPort(Handle* session, const char* name);
Result svcSendSyncRequest(Handle session);
Result svcBreak(u32 BreakReason, u64 inval1, u64 inval2); Result svcBreak(u32 BreakReason, u64 inval1, u64 inval2);
Result svcAcceptSession(Handle *session_handle, Handle port_handle); Result svcAcceptSession(Handle *session_handle, Handle port_handle);
Result svcReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); Result svcReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout);
Result svcQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size); Result svcQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size);
Result svcManageNamedPort(Handle* portServer, const char* name, s32 maxSessions); Result svcManageNamedPort(Handle* portServer, const char* name, s32 maxSessions);

27
nx/source/srv/sm.c Normal file
View File

@ -0,0 +1,27 @@
#include <switch.h>
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;
}

View File

@ -32,6 +32,11 @@ SVC_BEGIN svcConnectToNamedPort
ret ret
SVC_END SVC_END
SVC_BEGIN svcSendSyncRequest
svc 0x21
ret
SVC_END
SVC_BEGIN svcBreak SVC_BEGIN svcBreak
svc 0x26 svc 0x26
ret ret