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