1 #ifndef _G_CLIENT_NVOC_H_
2 #define _G_CLIENT_NVOC_H_
3 #include "nvoc/runtime.h"
4
5 #ifdef __cplusplus
6 extern "C" {
7 #endif
8
9 /*
10 * SPDX-FileCopyrightText: Copyright (c) 2016-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
11 * SPDX-License-Identifier: MIT
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining a
14 * copy of this software and associated documentation files (the "Software"),
15 * to deal in the Software without restriction, including without limitation
16 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 * and/or sell copies of the Software, and to permit persons to whom the
18 * Software is furnished to do so, subject to the following conditions:
19 *
20 * The above copyright notice and this permission notice shall be included in
21 * all copies or substantial portions of the Software.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 * DEALINGS IN THE SOFTWARE.
30 */
31 #include "g_client_nvoc.h"
32
33 #ifndef _CLIENT_H_
34 #define _CLIENT_H_
35
36 #include "ctrl/ctrl0000/ctrl0000proc.h" // NV_PROC_NAME_MAX_LENGTH
37 #include "containers/btree.h"
38 #include "resserv/resserv.h"
39 #include "nvoc/prelude.h"
40 #include "resserv/rs_client.h"
41 #include "rmapi/resource.h"
42 #include "rmapi/event.h"
43 #include "nvsecurityinfo.h"
44
45 // event information definitions
46 typedef struct _def_client_system_event_info CLI_SYSTEM_EVENT_INFO, *PCLI_SYSTEM_EVENT_INFO;
47
48 /**
49 * This ref-counted object is shared by all clients that were registered under
50 * the same user and is used to identify clients from the same user.
51 */
52
53 // Private field names are wrapped in PRIVATE_FIELD, which does nothing for
54 // the matching C source file, but causes diagnostics to be issued if another
55 // source file references the field.
56 #ifdef NVOC_CLIENT_H_PRIVATE_ACCESS_ALLOWED
57 #define PRIVATE_FIELD(x) x
58 #else
59 #define PRIVATE_FIELD(x) NVOC_PRIVATE_FIELD(x)
60 #endif
61
62 struct UserInfo {
63 const struct NVOC_RTTI *__nvoc_rtti;
64 struct RsShared __nvoc_base_RsShared;
65 struct Object *__nvoc_pbase_Object;
66 struct RsShared *__nvoc_pbase_RsShared;
67 struct UserInfo *__nvoc_pbase_UserInfo;
68 PUID_TOKEN pUidToken;
69 };
70
71 #ifndef __NVOC_CLASS_UserInfo_TYPEDEF__
72 #define __NVOC_CLASS_UserInfo_TYPEDEF__
73 typedef struct UserInfo UserInfo;
74 #endif /* __NVOC_CLASS_UserInfo_TYPEDEF__ */
75
76 #ifndef __nvoc_class_id_UserInfo
77 #define __nvoc_class_id_UserInfo 0x21d236
78 #endif /* __nvoc_class_id_UserInfo */
79
80 extern const struct NVOC_CLASS_DEF __nvoc_class_def_UserInfo;
81
82 #define __staticCast_UserInfo(pThis) \
83 ((pThis)->__nvoc_pbase_UserInfo)
84
85 #ifdef __nvoc_client_h_disabled
86 #define __dynamicCast_UserInfo(pThis) ((UserInfo*)NULL)
87 #else //__nvoc_client_h_disabled
88 #define __dynamicCast_UserInfo(pThis) \
89 ((UserInfo*)__nvoc_dynamicCast(staticCast((pThis), Dynamic), classInfo(UserInfo)))
90 #endif //__nvoc_client_h_disabled
91
92
93 NV_STATUS __nvoc_objCreateDynamic_UserInfo(UserInfo**, Dynamic*, NvU32, va_list);
94
95 NV_STATUS __nvoc_objCreate_UserInfo(UserInfo**, Dynamic*, NvU32);
96 #define __objCreate_UserInfo(ppNewObj, pParent, createFlags) \
97 __nvoc_objCreate_UserInfo((ppNewObj), staticCast((pParent), Dynamic), (createFlags))
98
99 NV_STATUS userinfoConstruct_IMPL(struct UserInfo *arg_pUserInfo);
100
101 #define __nvoc_userinfoConstruct(arg_pUserInfo) userinfoConstruct_IMPL(arg_pUserInfo)
102 void userinfoDestruct_IMPL(struct UserInfo *pUserInfo);
103
104 #define __nvoc_userinfoDestruct(pUserInfo) userinfoDestruct_IMPL(pUserInfo)
105 #undef PRIVATE_FIELD
106
107
108 // Flags for RmClient
109 #define RMAPI_CLIENT_FLAG_RM_INTERNAL_CLIENT 0x00000001
110 #define RMAPI_CLIENT_FLAG_DELETE_PENDING 0x00000002
111
112 // Values for client debugger state
113 #define RMAPI_CLIENT_DEBUGGER_STATE_NOT_SET 0x00000000
114 #define RMAPI_CLIENT_DEBUGGER_STATE_COMPUTE_ACTIVE 0x00000001
115 #define RMAPI_CLIENT_DEBUGGER_STATE_DEBUG_ACTIVE 0x00000002
116
117
118 // Private field names are wrapped in PRIVATE_FIELD, which does nothing for
119 // the matching C source file, but causes diagnostics to be issued if another
120 // source file references the field.
121 #ifdef NVOC_CLIENT_H_PRIVATE_ACCESS_ALLOWED
122 #define PRIVATE_FIELD(x) x
123 #else
124 #define PRIVATE_FIELD(x) NVOC_PRIVATE_FIELD(x)
125 #endif
126
127 struct RmClient {
128 const struct NVOC_RTTI *__nvoc_rtti;
129 struct RsClient __nvoc_base_RsClient;
130 struct Object *__nvoc_pbase_Object;
131 struct RsClient *__nvoc_pbase_RsClient;
132 struct RmClient *__nvoc_pbase_RmClient;
133 NV_STATUS (*__rmclientValidate__)(struct RmClient *, const API_SECURITY_INFO *);
134 NV_STATUS (*__rmclientFreeResource__)(struct RmClient *, struct RsServer *, struct RS_RES_FREE_PARAMS_INTERNAL *);
135 NV_STATUS (*__rmclientInterMap__)(struct RmClient *, struct RsResourceRef *, struct RsResourceRef *, struct RS_INTER_MAP_PARAMS *);
136 NV_STATUS (*__rmclientInterUnmap__)(struct RmClient *, struct RsResourceRef *, struct RS_INTER_UNMAP_PARAMS *);
137 NV_STATUS (*__rmclientPostProcessPendingFreeList__)(struct RmClient *, struct RsResourceRef **);
138 RS_PRIV_LEVEL (*__rmclientGetCachedPrivilege__)(struct RmClient *);
139 NvBool (*__rmclientIsAdmin__)(struct RmClient *, RS_PRIV_LEVEL);
140 NV_STATUS (*__rmclientDestructResourceRef__)(struct RmClient *, RsServer *, struct RsResourceRef *);
141 NV_STATUS (*__rmclientValidateNewResourceHandle__)(struct RmClient *, NvHandle, NvBool);
142 NV_STATUS (*__rmclientShareResource__)(struct RmClient *, struct RsResourceRef *, RS_SHARE_POLICY *, struct CALL_CONTEXT *);
143 NV_STATUS (*__rmclientUnmapMemory__)(struct RmClient *, struct RsResourceRef *, struct RS_LOCK_INFO *, struct RsCpuMapping **, API_SECURITY_INFO *);
144 RS_PRIV_LEVEL cachedPrivilege;
145 NvBool bIsRootNonPriv;
146 NvU32 ProcID;
147 NvU32 SubProcessID;
148 char SubProcessName[100];
149 NvBool bIsSubProcessDisabled;
150 NvU32 Flags;
151 NvU32 ClientDebuggerState;
152 void *pOSInfo;
153 void *pOsPidInfo;
154 char name[100];
155 CLI_SYSTEM_EVENT_INFO CliSysEventInfo;
156 PSECURITY_TOKEN pSecurityToken;
157 struct UserInfo *pUserInfo;
158 NvBool bIsClientVirtualMode;
159 NvS32 imexChannel;
160 PNODE pCliSyncGpuBoostTree;
161 };
162
163 #ifndef __NVOC_CLASS_RmClient_TYPEDEF__
164 #define __NVOC_CLASS_RmClient_TYPEDEF__
165 typedef struct RmClient RmClient;
166 #endif /* __NVOC_CLASS_RmClient_TYPEDEF__ */
167
168 #ifndef __nvoc_class_id_RmClient
169 #define __nvoc_class_id_RmClient 0xb23d83
170 #endif /* __nvoc_class_id_RmClient */
171
172 extern const struct NVOC_CLASS_DEF __nvoc_class_def_RmClient;
173
174 #define __staticCast_RmClient(pThis) \
175 ((pThis)->__nvoc_pbase_RmClient)
176
177 #ifdef __nvoc_client_h_disabled
178 #define __dynamicCast_RmClient(pThis) ((RmClient*)NULL)
179 #else //__nvoc_client_h_disabled
180 #define __dynamicCast_RmClient(pThis) \
181 ((RmClient*)__nvoc_dynamicCast(staticCast((pThis), Dynamic), classInfo(RmClient)))
182 #endif //__nvoc_client_h_disabled
183
184
185 NV_STATUS __nvoc_objCreateDynamic_RmClient(RmClient**, Dynamic*, NvU32, va_list);
186
187 NV_STATUS __nvoc_objCreate_RmClient(RmClient**, Dynamic*, NvU32, struct PORT_MEM_ALLOCATOR * arg_pAllocator, struct RS_RES_ALLOC_PARAMS_INTERNAL * arg_pParams);
188 #define __objCreate_RmClient(ppNewObj, pParent, createFlags, arg_pAllocator, arg_pParams) \
189 __nvoc_objCreate_RmClient((ppNewObj), staticCast((pParent), Dynamic), (createFlags), arg_pAllocator, arg_pParams)
190
191 #define rmclientValidate(pClient, pSecInfo) rmclientValidate_DISPATCH(pClient, pSecInfo)
192 #define rmclientFreeResource(pClient, pServer, pParams) rmclientFreeResource_DISPATCH(pClient, pServer, pParams)
193 #define rmclientInterMap(pClient, pMapperRef, pMappableRef, pParams) rmclientInterMap_DISPATCH(pClient, pMapperRef, pMappableRef, pParams)
194 #define rmclientInterUnmap(pClient, pMapperRef, pParams) rmclientInterUnmap_DISPATCH(pClient, pMapperRef, pParams)
195 #define rmclientPostProcessPendingFreeList(pClient, ppFirstLowPriRef) rmclientPostProcessPendingFreeList_DISPATCH(pClient, ppFirstLowPriRef)
196 #define rmclientGetCachedPrivilege(pClient) rmclientGetCachedPrivilege_DISPATCH(pClient)
197 #define rmclientIsAdmin(pClient, privLevel) rmclientIsAdmin_DISPATCH(pClient, privLevel)
198 #define rmclientDestructResourceRef(pClient, pServer, pResourceRef) rmclientDestructResourceRef_DISPATCH(pClient, pServer, pResourceRef)
199 #define rmclientValidateNewResourceHandle(pClient, hResource, bRestrict) rmclientValidateNewResourceHandle_DISPATCH(pClient, hResource, bRestrict)
200 #define rmclientShareResource(pClient, pResourceRef, pSharePolicy, pCallContext) rmclientShareResource_DISPATCH(pClient, pResourceRef, pSharePolicy, pCallContext)
201 #define rmclientUnmapMemory(pClient, pResourceRef, pLockInfo, ppCpuMapping, pSecInfo) rmclientUnmapMemory_DISPATCH(pClient, pResourceRef, pLockInfo, ppCpuMapping, pSecInfo)
202 NV_STATUS rmclientValidate_IMPL(struct RmClient *pClient, const API_SECURITY_INFO *pSecInfo);
203
rmclientValidate_DISPATCH(struct RmClient * pClient,const API_SECURITY_INFO * pSecInfo)204 static inline NV_STATUS rmclientValidate_DISPATCH(struct RmClient *pClient, const API_SECURITY_INFO *pSecInfo) {
205 return pClient->__rmclientValidate__(pClient, pSecInfo);
206 }
207
208 NV_STATUS rmclientFreeResource_IMPL(struct RmClient *pClient, struct RsServer *pServer, struct RS_RES_FREE_PARAMS_INTERNAL *pParams);
209
rmclientFreeResource_DISPATCH(struct RmClient * pClient,struct RsServer * pServer,struct RS_RES_FREE_PARAMS_INTERNAL * pParams)210 static inline NV_STATUS rmclientFreeResource_DISPATCH(struct RmClient *pClient, struct RsServer *pServer, struct RS_RES_FREE_PARAMS_INTERNAL *pParams) {
211 return pClient->__rmclientFreeResource__(pClient, pServer, pParams);
212 }
213
214 NV_STATUS rmclientInterMap_IMPL(struct RmClient *pClient, struct RsResourceRef *pMapperRef, struct RsResourceRef *pMappableRef, struct RS_INTER_MAP_PARAMS *pParams);
215
rmclientInterMap_DISPATCH(struct RmClient * pClient,struct RsResourceRef * pMapperRef,struct RsResourceRef * pMappableRef,struct RS_INTER_MAP_PARAMS * pParams)216 static inline NV_STATUS rmclientInterMap_DISPATCH(struct RmClient *pClient, struct RsResourceRef *pMapperRef, struct RsResourceRef *pMappableRef, struct RS_INTER_MAP_PARAMS *pParams) {
217 return pClient->__rmclientInterMap__(pClient, pMapperRef, pMappableRef, pParams);
218 }
219
220 NV_STATUS rmclientInterUnmap_IMPL(struct RmClient *pClient, struct RsResourceRef *pMapperRef, struct RS_INTER_UNMAP_PARAMS *pParams);
221
rmclientInterUnmap_DISPATCH(struct RmClient * pClient,struct RsResourceRef * pMapperRef,struct RS_INTER_UNMAP_PARAMS * pParams)222 static inline NV_STATUS rmclientInterUnmap_DISPATCH(struct RmClient *pClient, struct RsResourceRef *pMapperRef, struct RS_INTER_UNMAP_PARAMS *pParams) {
223 return pClient->__rmclientInterUnmap__(pClient, pMapperRef, pParams);
224 }
225
226 NV_STATUS rmclientPostProcessPendingFreeList_IMPL(struct RmClient *pClient, struct RsResourceRef **ppFirstLowPriRef);
227
rmclientPostProcessPendingFreeList_DISPATCH(struct RmClient * pClient,struct RsResourceRef ** ppFirstLowPriRef)228 static inline NV_STATUS rmclientPostProcessPendingFreeList_DISPATCH(struct RmClient *pClient, struct RsResourceRef **ppFirstLowPriRef) {
229 return pClient->__rmclientPostProcessPendingFreeList__(pClient, ppFirstLowPriRef);
230 }
231
232 RS_PRIV_LEVEL rmclientGetCachedPrivilege_IMPL(struct RmClient *pClient);
233
rmclientGetCachedPrivilege_DISPATCH(struct RmClient * pClient)234 static inline RS_PRIV_LEVEL rmclientGetCachedPrivilege_DISPATCH(struct RmClient *pClient) {
235 return pClient->__rmclientGetCachedPrivilege__(pClient);
236 }
237
238 NvBool rmclientIsAdmin_IMPL(struct RmClient *pClient, RS_PRIV_LEVEL privLevel);
239
rmclientIsAdmin_DISPATCH(struct RmClient * pClient,RS_PRIV_LEVEL privLevel)240 static inline NvBool rmclientIsAdmin_DISPATCH(struct RmClient *pClient, RS_PRIV_LEVEL privLevel) {
241 return pClient->__rmclientIsAdmin__(pClient, privLevel);
242 }
243
rmclientDestructResourceRef_DISPATCH(struct RmClient * pClient,RsServer * pServer,struct RsResourceRef * pResourceRef)244 static inline NV_STATUS rmclientDestructResourceRef_DISPATCH(struct RmClient *pClient, RsServer *pServer, struct RsResourceRef *pResourceRef) {
245 return pClient->__rmclientDestructResourceRef__(pClient, pServer, pResourceRef);
246 }
247
rmclientValidateNewResourceHandle_DISPATCH(struct RmClient * pClient,NvHandle hResource,NvBool bRestrict)248 static inline NV_STATUS rmclientValidateNewResourceHandle_DISPATCH(struct RmClient *pClient, NvHandle hResource, NvBool bRestrict) {
249 return pClient->__rmclientValidateNewResourceHandle__(pClient, hResource, bRestrict);
250 }
251
rmclientShareResource_DISPATCH(struct RmClient * pClient,struct RsResourceRef * pResourceRef,RS_SHARE_POLICY * pSharePolicy,struct CALL_CONTEXT * pCallContext)252 static inline NV_STATUS rmclientShareResource_DISPATCH(struct RmClient *pClient, struct RsResourceRef *pResourceRef, RS_SHARE_POLICY *pSharePolicy, struct CALL_CONTEXT *pCallContext) {
253 return pClient->__rmclientShareResource__(pClient, pResourceRef, pSharePolicy, pCallContext);
254 }
255
rmclientUnmapMemory_DISPATCH(struct RmClient * pClient,struct RsResourceRef * pResourceRef,struct RS_LOCK_INFO * pLockInfo,struct RsCpuMapping ** ppCpuMapping,API_SECURITY_INFO * pSecInfo)256 static inline NV_STATUS rmclientUnmapMemory_DISPATCH(struct RmClient *pClient, struct RsResourceRef *pResourceRef, struct RS_LOCK_INFO *pLockInfo, struct RsCpuMapping **ppCpuMapping, API_SECURITY_INFO *pSecInfo) {
257 return pClient->__rmclientUnmapMemory__(pClient, pResourceRef, pLockInfo, ppCpuMapping, pSecInfo);
258 }
259
260 NV_STATUS rmclientConstruct_IMPL(struct RmClient *arg_pClient, struct PORT_MEM_ALLOCATOR *arg_pAllocator, struct RS_RES_ALLOC_PARAMS_INTERNAL *arg_pParams);
261
262 #define __nvoc_rmclientConstruct(arg_pClient, arg_pAllocator, arg_pParams) rmclientConstruct_IMPL(arg_pClient, arg_pAllocator, arg_pParams)
263 void rmclientDestruct_IMPL(struct RmClient *pClient);
264
265 #define __nvoc_rmclientDestruct(pClient) rmclientDestruct_IMPL(pClient)
266 void rmclientSetClientFlags_IMPL(struct RmClient *pClient, NvU32 clientFlags);
267
268 #ifdef __nvoc_client_h_disabled
rmclientSetClientFlags(struct RmClient * pClient,NvU32 clientFlags)269 static inline void rmclientSetClientFlags(struct RmClient *pClient, NvU32 clientFlags) {
270 NV_ASSERT_FAILED_PRECOMP("RmClient was disabled!");
271 }
272 #else //__nvoc_client_h_disabled
273 #define rmclientSetClientFlags(pClient, clientFlags) rmclientSetClientFlags_IMPL(pClient, clientFlags)
274 #endif //__nvoc_client_h_disabled
275
276 void *rmclientGetSecurityToken_IMPL(struct RmClient *pClient);
277
278 #ifdef __nvoc_client_h_disabled
rmclientGetSecurityToken(struct RmClient * pClient)279 static inline void *rmclientGetSecurityToken(struct RmClient *pClient) {
280 NV_ASSERT_FAILED_PRECOMP("RmClient was disabled!");
281 return NULL;
282 }
283 #else //__nvoc_client_h_disabled
284 #define rmclientGetSecurityToken(pClient) rmclientGetSecurityToken_IMPL(pClient)
285 #endif //__nvoc_client_h_disabled
286
287 NvBool rmclientIsCapableOrAdmin_IMPL(struct RmClient *pClient, NvU32 capability, RS_PRIV_LEVEL privLevel);
288
289 #ifdef __nvoc_client_h_disabled
rmclientIsCapableOrAdmin(struct RmClient * pClient,NvU32 capability,RS_PRIV_LEVEL privLevel)290 static inline NvBool rmclientIsCapableOrAdmin(struct RmClient *pClient, NvU32 capability, RS_PRIV_LEVEL privLevel) {
291 NV_ASSERT_FAILED_PRECOMP("RmClient was disabled!");
292 return NV_FALSE;
293 }
294 #else //__nvoc_client_h_disabled
295 #define rmclientIsCapableOrAdmin(pClient, capability, privLevel) rmclientIsCapableOrAdmin_IMPL(pClient, capability, privLevel)
296 #endif //__nvoc_client_h_disabled
297
298 NvBool rmclientIsCapable_IMPL(struct RmClient *pClient, NvU32 capability);
299
300 #ifdef __nvoc_client_h_disabled
rmclientIsCapable(struct RmClient * pClient,NvU32 capability)301 static inline NvBool rmclientIsCapable(struct RmClient *pClient, NvU32 capability) {
302 NV_ASSERT_FAILED_PRECOMP("RmClient was disabled!");
303 return NV_FALSE;
304 }
305 #else //__nvoc_client_h_disabled
306 #define rmclientIsCapable(pClient, capability) rmclientIsCapable_IMPL(pClient, capability)
307 #endif //__nvoc_client_h_disabled
308
309 #undef PRIVATE_FIELD
310
311
312 MAKE_LIST(RmClientList, RmClient*);
313 extern RmClientList g_clientListBehindGpusLock;
314 MAKE_LIST(UserInfoList, UserInfo*);
315 extern UserInfoList g_userInfoList;
316 MAKE_MULTIMAP(OsInfoMap, RmClient*);
317 extern OsInfoMap g_osInfoList;
318
319
320 //
321 // Convenience rmclientXxxByHandle util macros. Ideally, code operates on
322 // pClient directly instead of hClient but providing these for compatibility
323 // to hClient-heavy code.
324 //
325 RS_PRIV_LEVEL rmclientGetCachedPrivilegeByHandle(NvHandle hClient);
326 NvBool rmclientIsAdminByHandle(NvHandle hClient, RS_PRIV_LEVEL privLevel);
327 NvBool rmclientIsKernelOnlyByHandle(NvHandle hClient);
328 NvBool rmclientSetClientFlagsByHandle(NvHandle hClient, NvU32 clientFlags);
329 void rmclientPromoteDebuggerStateByHandle(NvHandle hClient, NvU32 newMinimumState);
330 void *rmclientGetSecurityTokenByHandle(NvHandle hClient);
331 NV_STATUS rmclientUserClientSecurityCheckByHandle(NvHandle hClient, const API_SECURITY_INFO *pSecInfo);
332 NvBool rmclientIsCapableOrAdminByHandle(NvHandle hClient, NvU32 capability, RS_PRIV_LEVEL privLevel);
333 NvBool rmclientIsCapableByHandle(NvHandle hClient, NvU32 capability);
334
335 #endif
336
337 #ifdef __cplusplus
338 } // extern "C"
339 #endif
340
341 #endif // _G_CLIENT_NVOC_H_
342