From 7b7bd9dd9d1b3cfc8bc758fc0b0f333d925e89c9 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sat, 10 Nov 2018 12:26:49 -0800 Subject: [PATCH] Add setsys fatal commands --- nx/include/switch/services/set.h | 15 +++++++ nx/source/services/set.c | 73 ++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/nx/include/switch/services/set.h b/nx/include/switch/services/set.h index 1b085ac2..ee1a7ac6 100644 --- a/nx/include/switch/services/set.h +++ b/nx/include/switch/services/set.h @@ -3,10 +3,12 @@ * @brief Settings services IPC wrapper. * @author plutoo * @author yellows8 + * @author SciresM * @copyright libnx Authors */ #pragma once #include "../result.h" +#include "../kernel/event.h" #define SET_MAX_NAME_SIZE 0x48 @@ -154,3 +156,16 @@ Result setsysSetFlag(SetSysFlag flag, bool enable); * @param out Firmware version to populate. */ Result setsysGetFirmwareVersion(SetSysFirmwareVersion *out); + +/** + * @brief Gets an event that settings will signal on flag change. + * @param out Event to bind. Output event will have autoclear=false. + */ +Result setsysBindFatalDirtyFlagEvent(Event *out); + +/** + * @brief Gets the settings flags that have changed. + * @param flags_0 Pointer to populate with first 64 flags. + * @param flags_0 Pointer to populate with second 64 flags. + */ +Result setsysGetFatalDirtyFlags(u64 *flags_0, u64 *flags_1); diff --git a/nx/source/services/set.c b/nx/source/services/set.c index 375735bf..a2d08d60 100644 --- a/nx/source/services/set.c +++ b/nx/source/services/set.c @@ -613,3 +613,76 @@ Result setsysGetFirmwareVersion(SetSysFirmwareVersion *out) { return _setsysGetFirmwareVersionImpl(out, 3); } } + +Result setsysBindFatalDirtyFlagEvent(Event *out) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 93; + + Result rc = serviceIpcDispatch(&g_setsysSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + eventLoadRemote(out, r.Handles[0], false); + } + } + + return rc; +} + +Result setsysGetFatalDirtyFlags(u64 *flags_0, u64 *flags_1) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 94; + + Result rc = serviceIpcDispatch(&g_setsysSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + u64 flags_0; + u64 flags_1; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *flags_0 = resp->flags_0; + *flags_1 = resp->flags_1; + } + } + + return rc; +} \ No newline at end of file