diff --git a/nx/source/services/bpc.c b/nx/source/services/bpc.c new file mode 100644 index 00000000..5e1dbe83 --- /dev/null +++ b/nx/source/services/bpc.c @@ -0,0 +1,86 @@ +#include "types.h" +#include "result.h" +#include "arm/atomics.h" +#include "kernel/ipc.h" +#include "services/bpc.h" +#include "services/sm.h" + +static Service g_bpcSrv; +static u64 g_refCnt; + +Result bpcInitialize(void) +{ + atomicIncrement64(&g_refCnt); + + if (serviceIsActive(&g_bpcSrv)) return 0; + + Result rc = 0; + + rc = smGetService(&g_bpcSrv, "bpc"); + + return rc; +} + +void apmExit(void) +{ + if (atomicDecrement64(&g_refCnt) == 0) + { + serviceClose(&g_bpcSrv); + } +} + +Result bpcShutdownSystem(void) +{ + IpcCommand c; + ipcInitialize(&c); + struct + { + u64 magic; + u64 cmd_id; + } * raw; + raw = ipcPrepareHeader(&c, sizeof(*raw)); + raw->magic = SFCI_MAGIC; + raw->cmd_id = 0; + Result rc = 0; + rc = serviceIpcDispatch(&g_bpcSrv); + if(R_SUCCEEDED(rc)) + { + IpcParsedCommand r; + ipcParse(&r); + struct + { + u64 magic; + u64 result; + } *resp = r.Raw; + rc = resp->result; + } + return rc; +} + +Result bpcRebootSystem(void) +{ + IpcCommand c; + ipcInitialize(&c); + struct + { + u64 magic; + u64 cmd_id; + } * raw; + raw = ipcPrepareHeader(&c, sizeof(*raw)); + raw->magic = SFCI_MAGIC; + raw->cmd_id = 1; + Result rc = 0; + rc = serviceIpcDispatch(&g_bpcSrv); + if(R_SUCCEEDED(rc)) + { + IpcParsedCommand r; + ipcParse(&r); + struct + { + u64 magic; + u64 result; + } *resp = r.Raw; + rc = resp->result; + } + return rc; +}