libnx v4.9.0
Loading...
Searching...
No Matches
sm.h
Go to the documentation of this file.
1/**
2 * @file sm.h
3 * @brief Service manager (sm) IPC wrapper.
4 * @author plutoo
5 * @author yellows8
6 * @copyright libnx Authors
7 */
8#pragma once
9#include "../types.h"
10#include "../kernel/svc.h"
11#include "../sf/service.h"
12#include "../sf/tipc.h"
13
14/// Structure representing a service name (null terminated, remaining characters set to zero).
15typedef struct SmServiceName {
16 char name[8];
18
19/// Converts a service name into a 64-bit integer.
21{
22 u64 ret = 0;
23 __builtin_memcpy(&ret, &name, sizeof(u64));
24 return ret;
25}
26
27/// Converts a 64-bit integer into a service name.
29{
30 SmServiceName ret = {0};
31 __builtin_memcpy(&ret, &name, sizeof(SmServiceName));
32 return ret;
33}
34
35/**
36 * @brief Checks whether two service names are equal.
37 * @param[in] a First name.
38 * @param[in] b Second name.
39 * @return Comparison result.
40 */
45
46/**
47 * @brief Encodes a service name string as a \ref SmServiceName structure.
48 * @param[in] name Name of the service.
49 * @return Encoded name.
50 */
52{
53 SmServiceName name_encoded = {};
54 unsigned len = __builtin_strlen(name);
55#define __COPY_CHAR(_n) \
56 if (len > _n) name_encoded.name[_n] = name[_n]
57 __COPY_CHAR(0); __COPY_CHAR(1); __COPY_CHAR(2); __COPY_CHAR(3);
58 __COPY_CHAR(4); __COPY_CHAR(5); __COPY_CHAR(6); __COPY_CHAR(7);
59#undef __COPY_CHAR
60 return name_encoded;
61}
62
63/**
64 * @brief Initializes SM.
65 * @return Result code.
66 * @note This function is already called in the default application startup code (before main() is called).
67 */
69
70/**
71 * @brief Uninitializes SM.
72 * @return Result code.
73 * @note This function is already handled in the default application exit code (after main() returns).
74 */
75void smExit(void);
76
77/**
78 * @brief Requests a service from SM, allowing overrides.
79 * @param[out] service_out Service structure which will be filled in.
80 * @param[in] name Name of the service to request.
81 * @return Result code.
82 */
84
85/**
86 * @brief Requests a service from SM, as an IPC session handle directly
87 * @param[out] handle_out Variable containing IPC session handle.
88 * @param[in] name Name of the service to request.
89 * @return Result code.
90 */
92
93/**
94 * @brief Requests a service from SM.
95 * @param[out] service_out Service structure which will be filled in.
96 * @param[in] name Name of the service to request (as a string).
97 * @return Result code.
98 */
99NX_INLINE Result smGetService(Service* service_out, const char* name)
100{
101 return smGetServiceWrapper(service_out, smEncodeName(name));
102}
103
104/**
105 * @brief Retrieves an overriden service in the homebrew environment.
106 * @param[in] name Name of the service to request.
107 * @return IPC session handle.
108 */
110
111/**
112 * @brief Creates and registers a new service within SM.
113 * @param[out] handle_out Variable containing IPC port handle.
114 * @param[in] name Name of the service.
115 * @param[in] is_light "Is light"
116 * @param[in] max_sessions Maximum number of concurrent sessions that the service will accept.
117 * @return Result code.
118 */
119Result smRegisterService(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions);
120
121/// Same as \ref smRegisterService, but always using cmif serialization.
122Result smRegisterServiceCmif(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions);
123
124/// Same as \ref smRegisterService, but always using tipc serialization.
125Result smRegisterServiceTipc(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions);
126
127/**
128 * @brief Unregisters a previously registered service in SM.
129 * @param[in] name Name of the service.
130 * @return Result code.
131 */
133
134/// Same as \ref smUnregisterService, but always using cmif serialization.
136
137/// Same as \ref smUnregisterService, but always using tipc serialization.
139
140/**
141 * @brief Detaches the current SM session.
142 * @note After this function is called, the rest of the SM API cannot be used.
143 * @note Only available on [11.0.0-11.0.1], or Atmosphère.
144 */
146
147/// Same as \ref smDetachClient, but always using cmif serialization.
149
150/// Same as \ref smDetachClient, but always using tipc serialization.
152
153/**
154 * @brief Gets the Service session used to communicate with SM.
155 * @return Pointer to service session used to communicate with SM.
156 */
158
159/**
160 * @brief Gets the TipcService session used to communicate with SM.
161 * @return Pointer to tipc service session used to communicate with SM.
162 * @note Only available on [12.0.0+], or Atmosphère.
163 */
165
166/**
167 * @brief Overrides a service with a custom IPC service handle.
168 * @param[in] name Name of the service.
169 * @param[in] handle IPC session handle.
170 */
TipcService * smGetServiceSessionTipc(void)
Gets the TipcService session used to communicate with SM.
Result smRegisterServiceCmif(Handle *handle_out, SmServiceName name, bool is_light, s32 max_sessions)
Same as smRegisterService, but always using cmif serialization.
static SmServiceName smEncodeName(const char *name)
Encodes a service name string as a SmServiceName structure.
Definition sm.h:51
static u64 smServiceNameToU64(SmServiceName name)
Converts a service name into a 64-bit integer.
Definition sm.h:20
Handle smGetServiceOverride(SmServiceName name)
Retrieves an overriden service in the homebrew environment.
void smAddOverrideHandle(SmServiceName name, Handle handle)
Overrides a service with a custom IPC service handle.
Result smGetServiceOriginal(Handle *handle_out, SmServiceName name)
Requests a service from SM, as an IPC session handle directly.
static SmServiceName smServiceNameFromU64(u64 name)
Converts a 64-bit integer into a service name.
Definition sm.h:28
Result smUnregisterServiceTipc(SmServiceName name)
Same as smUnregisterService, but always using tipc serialization.
Result smRegisterService(Handle *handle_out, SmServiceName name, bool is_light, s32 max_sessions)
Creates and registers a new service within SM.
Result smRegisterServiceTipc(Handle *handle_out, SmServiceName name, bool is_light, s32 max_sessions)
Same as smRegisterService, but always using tipc serialization.
Result smInitialize(void)
Initializes SM.
static bool smServiceNamesAreEqual(SmServiceName a, SmServiceName b)
Checks whether two service names are equal.
Definition sm.h:41
Service * smGetServiceSession(void)
Gets the Service session used to communicate with SM.
Result smDetachClientTipc(void)
Same as smDetachClient, but always using tipc serialization.
void smExit(void)
Uninitializes SM.
Result smUnregisterServiceCmif(SmServiceName name)
Same as smUnregisterService, but always using cmif serialization.
static Result smGetService(Service *service_out, const char *name)
Requests a service from SM.
Definition sm.h:99
Result smGetServiceWrapper(Service *service_out, SmServiceName name)
Requests a service from SM, allowing overrides.
Result smDetachClient(void)
Detaches the current SM session.
Result smDetachClientCmif(void)
Same as smDetachClient, but always using cmif serialization.
Result smUnregisterService(SmServiceName name)
Unregisters a previously registered service in SM.
Service object structure.
Definition service.h:14
Structure representing a service name (null terminated, remaining characters set to zero).
Definition sm.h:15
tipc Service object structure
Definition tipc.h:18
#define NX_INLINE
Flags a function as (always) inline.
Definition types.h:86
uint64_t u64
64-bit unsigned integer.
Definition types.h:22
u32 Handle
Kernel object handle.
Definition types.h:43
u32 Result
Function error code result type.
Definition types.h:44
#define NX_CONSTEXPR
Flags a function as constexpr in C++14 and above; or as (always) inline otherwise.
Definition types.h:92
int32_t s32
32-bit signed integer.
Definition types.h:27