From 06e9eaa29f34271a99115922e7c793f61e073c08 Mon Sep 17 00:00:00 2001 From: Simon Aarons Date: Thu, 24 Jan 2019 18:13:34 +1100 Subject: [PATCH] Added initial implementation of es services --- nx/include/switch.h | 2 + nx/include/switch/services/es.h | 18 +++++++ nx/source/services/es.c | 92 +++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 nx/include/switch/services/es.h create mode 100644 nx/source/services/es.c diff --git a/nx/include/switch.h b/nx/include/switch.h index 807f16e5..06158baa 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -81,6 +81,8 @@ extern "C" { #include "switch/services/spl.h" #include "switch/services/ncm.h" #include "switch/services/psc.h" +#include "switch/services/es.h" + #include "switch/display/binder.h" #include "switch/display/parcel.h" diff --git a/nx/include/switch/services/es.h b/nx/include/switch/services/es.h new file mode 100644 index 00000000..035852de --- /dev/null +++ b/nx/include/switch/services/es.h @@ -0,0 +1,18 @@ +/** + * @file es.h + * @brief ETicket service IPC wrapper. + * @author simontime + * @copyright libnx Authors + */ + +#pragma once + +#include "../kernel/ipc.h" + +#include "../services/sm.h" + +Result esInitialize(void); +void esExit(void); + +Result esCountCommmonTicket(u32* out); +Result esCountPersonalizedTicket(u32* out); diff --git a/nx/source/services/es.c b/nx/source/services/es.c new file mode 100644 index 00000000..6355b8bb --- /dev/null +++ b/nx/source/services/es.c @@ -0,0 +1,92 @@ +/** + * @file es.c + * @brief ETicket service IPC wrapper. + * @author simontime + * @copyright libnx Authors + */ + +#include "services/es.h" +#include "arm/atomics.h" + +static Service g_esSrv; +static u64 g_RefCnt; + +Result esInitialize(void) { + atomicIncrement64(&g_RefCnt); + + if (serviceIsActive(&g_esSrv)) + return 0; + + return smGetService(&g_esSrv, "es"); +} + +void esExit(void) { + if (atomicDecrement64(&g_RefCnt) == 0) + serviceClose(&g_esSrv); +} + +Result esCountCommmonTicket(u32* out) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof *raw); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 9; + + Result rc = serviceIpcDispatch(&g_esSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + u32 out; + } *resp = r.Raw; + + rc = resp->result; + *out = resp->out; + } + + return rc; +} + +Result esCountPersonalizedTicket(u32* out) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof *raw); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 10; + + Result rc = serviceIpcDispatch(&g_esSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + u32 out; + } *resp = r.Raw; + + rc = resp->result; + *out = resp->out; + } + + return rc; +}