From a3e7b1affb554ee1633f2ef5c80dcf3b64c9b08c Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Fri, 18 Oct 2019 23:57:06 -0700 Subject: [PATCH] smm: update for new-ipc --- nx/include/switch/services/smm.h | 2 +- nx/source/services/smm.c | 97 ++++++-------------------------- 2 files changed, 19 insertions(+), 80 deletions(-) diff --git a/nx/include/switch/services/smm.h b/nx/include/switch/services/smm.h index 1be3ff01..3dd33a26 100644 --- a/nx/include/switch/services/smm.h +++ b/nx/include/switch/services/smm.h @@ -6,7 +6,7 @@ */ #pragma once #include "../types.h" -#include "../services/sm.h" +#include "../sf/service.h" #include "../services/fs.h" Result smManagerInitialize(void); diff --git a/nx/source/services/smm.c b/nx/source/services/smm.c index 298f4f39..6f502592 100644 --- a/nx/source/services/smm.c +++ b/nx/source/services/smm.c @@ -1,28 +1,18 @@ -// Copyright 2018 SciresM -#include -#include "types.h" -#include "result.h" -#include "arm/atomics.h" -#include "kernel/ipc.h" -#include "services/fs.h" -#include "services/sm.h" +#define NX_SERVICE_ASSUME_NON_DOMAIN +#include "service_guard.h" #include "services/smm.h" +#include "runtime/hosversion.h" static Service g_smManagerSrv; -static u64 g_smManagerRefcnt; -Result smManagerInitialize(void) { - atomicIncrement64(&g_smManagerRefcnt); - - if (serviceIsActive(&g_smManagerSrv)) - return 0; +NX_GENERATE_SERVICE_GUARD(smManager); +Result _smManagerInitialize(void) { return smGetService(&g_smManagerSrv, "sm:m"); } -void smManagerExit(void) { - if (atomicDecrement64(&g_smManagerRefcnt) == 0) - serviceClose(&g_smManagerSrv); +void _smManagerCleanup(void) { + serviceClose(&g_smManagerSrv); } Service* smManagerGetServiceSession(void) { @@ -30,69 +20,18 @@ Service* smManagerGetServiceSession(void) { } Result smManagerRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) { - IpcCommand c; - ipcInitialize(&c); - ipcAddSendBuffer(&c, acid_sac, acid_sac_size, BufferType_Normal); - ipcAddSendBuffer(&c, aci0_sac, aci0_sac_size, BufferType_Normal); - - struct { - u64 magic; - u64 cmd_id; - u64 pid; - } *raw; - - raw = serviceIpcPrepareHeader(&g_smManagerSrv, &c, sizeof(*raw)); - raw->magic = SFCI_MAGIC; - raw->cmd_id = 0; - raw->pid = pid; - - Result rc = serviceIpcDispatch(&g_smManagerSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - - struct { - u64 magic; - u64 result; - } *resp; - serviceIpcParse(&g_smManagerSrv, &r, sizeof(*resp)); - - resp = r.Raw; - rc = resp->result; - } - - return rc; + return serviceDispatchIn(&g_smManagerSrv, 0, pid, + .buffer_attrs = { + SfBufferAttr_In | SfBufferAttr_HipcMapAlias, + SfBufferAttr_In | SfBufferAttr_HipcMapAlias, + }, + .buffers = { + { acid_sac, acid_sac_size }, + { aci0_sac, aci0_sac_size }, + }, + ); } Result smManagerUnregisterProcess(u64 pid) { - IpcCommand c; - ipcInitialize(&c); - - struct { - u64 magic; - u64 cmd_id; - u64 pid; - } *raw; - - raw = serviceIpcPrepareHeader(&g_smManagerSrv, &c, sizeof(*raw)); - raw->magic = SFCI_MAGIC; - raw->cmd_id = 1; - raw->pid = pid; - - Result rc = serviceIpcDispatch(&g_smManagerSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - - struct { - u64 magic; - u64 result; - } *resp; - serviceIpcParse(&g_smManagerSrv, &r, sizeof(*resp)); - - resp = r.Raw; - rc = resp->result; - } - - return rc; + return serviceDispatchIn(&g_smManagerSrv, 1, pid); }