From f5f768ea5c01e37ca4c33f0138c8652fcaf76efd Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Fri, 20 Sep 2019 12:17:46 -0700 Subject: [PATCH] fsldr: update to use new-ipc --- nx/source/services/fsldr.c | 146 ++++++------------------------------- 1 file changed, 23 insertions(+), 123 deletions(-) diff --git a/nx/source/services/fsldr.c b/nx/source/services/fsldr.c index 8d9fa85c..62336071 100644 --- a/nx/source/services/fsldr.c +++ b/nx/source/services/fsldr.c @@ -1,42 +1,32 @@ // Copyright 2018 SciresM #include -#include "types.h" -#include "result.h" -#include "arm/atomics.h" -#include "kernel/ipc.h" +#include "service_guard.h" #include "runtime/hosversion.h" #include "services/fs.h" -#include "services/sm.h" #include "services/fsldr.h" static Service g_fsldrSrv; -static u64 g_fsldrRefCnt; -Result fsldrSetCurrentProcess(void); +NX_GENERATE_SERVICE_GUARD(fsldr); -Result fsldrInitialize(void) { - atomicIncrement64(&g_fsldrRefCnt); - - if (serviceIsActive(&g_fsldrSrv)) - return 0; +NX_INLINE Result _fsldrSetCurrentProcess(void); +Result _fsldrInitialize(void) { Result rc = smGetService(&g_fsldrSrv, "fsp-ldr"); - + if (R_SUCCEEDED(rc)) { rc = serviceConvertToDomain(&g_fsldrSrv); } if (R_SUCCEEDED(rc) && hosversionAtLeast(4,0,0)) { - rc = fsldrSetCurrentProcess(); + rc = _fsldrSetCurrentProcess(); } return rc; - } -void fsldrExit(void) { - if (atomicDecrement64(&g_fsldrRefCnt) == 0) - serviceClose(&g_fsldrSrv); +void _fsldrCleanup(void) { + serviceClose(&g_fsldrSrv); } Service* fsldrGetServiceSession(void) { @@ -44,115 +34,25 @@ Service* fsldrGetServiceSession(void) { } Result fsldrOpenCodeFileSystem(u64 tid, const char *path, FsFileSystem* out) { - char send_path[FS_MAX_PATH+1] = {0}; - IpcCommand c; - ipcInitialize(&c); - ipcAddSendStatic(&c, send_path, FS_MAX_PATH, 0); - - struct { - u64 magic; - u64 cmd_id; - u64 tid; - } *raw; - - raw = serviceIpcPrepareHeader(&g_fsldrSrv, &c, sizeof(*raw)); - raw->magic = SFCI_MAGIC; - raw->cmd_id = 0; - raw->tid = tid; - + char send_path[FS_MAX_PATH + 1]; strncpy(send_path, path, FS_MAX_PATH); - Result rc = serviceIpcDispatch(&g_fsldrSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - struct { - u64 magic; - u64 result; - } *resp; - - serviceIpcParse(&g_fsldrSrv, &r, sizeof(*resp)); - resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - serviceCreateSubservice(&out->s, &g_fsldrSrv, &r, 0); - } - } - - return rc; + return serviceDispatchIn(&g_fsldrSrv, 0, tid, + .buffer_attrs = { + SfBufferAttr_HipcPointer | SfBufferAttr_In, + }, + .buffers = { + { send_path, FS_MAX_PATH }, + }, + .out_num_objects = 1, + .out_objects = &out->s, + ); } Result fsldrIsArchivedProgram(u64 pid, bool *out) { - IpcCommand c; - ipcInitialize(&c); - - struct { - u64 magic; - u64 cmd_id; - u64 pid; - } *raw; - - raw = serviceIpcPrepareHeader(&g_fsldrSrv, &c, sizeof(*raw)); - raw->magic = SFCI_MAGIC; - raw->cmd_id = 1; - raw->pid = pid; - - Result rc = serviceIpcDispatch(&g_fsldrSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - struct { - u64 magic; - u64 result; - u8 is_archived; - } *resp; - - serviceIpcParse(&g_fsldrSrv, &r, sizeof(*resp)); - resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - *out = resp->is_archived != 0; - } - } - - return rc; + return serviceDispatchInOut(&g_fsldrSrv, 1, pid, *out); } -Result fsldrSetCurrentProcess(void) { - IpcCommand c; - ipcInitialize(&c); - ipcSendPid(&c); - - struct { - u64 magic; - u64 cmd_id; - u64 unk; - } *raw; - - raw = serviceIpcPrepareHeader(&g_fsldrSrv, &c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 2; - raw->unk = 0; - - Result rc = serviceIpcDispatch(&g_fsldrSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - struct { - u64 magic; - u64 result; - } *resp; - - serviceIpcParse(&g_fsldrSrv, &r, sizeof(*resp)); - resp = r.Raw; - - rc = resp->result; - } - - return rc; +Result _fsldrSetCurrentProcess(void) { + u64 pid_placeholder = 0; + return serviceDispatchIn(&g_fsldrSrv, 2, pid_placeholder, .in_send_pid = true); } -