mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
Merge branch 'master' of gitlab.com:yellows8/libnx
This commit is contained in:
commit
1d20c999f1
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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
27
nx/source/srv/sm.c
Normal 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;
|
||||||
|
}
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user