xref: /xnu-11215/iokit/IOKit/IORPC.h (revision 94d3b452)
1 /*
2  * Copyright (c) 2018 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 
30 #ifndef _IORPC_H
31 #define _IORPC_H
32 
33 #include <stdint.h>
34 
35 #ifndef XNU_PLATFORM_DriverKit
36 
37 #include <mach/message.h>
38 
39 #else /* !XNU_PLATFORM_DriverKit */
40 
41 #ifndef _MACH_MESSAGE_H_
42 #define _MACH_MESSAGE_H_
43 
44 #define MACH_MSG_TYPE_MOVE_RECEIVE      16      /* Must hold receive right */
45 #define MACH_MSG_TYPE_MOVE_SEND         17      /* Must hold send right(s) */
46 #define MACH_MSG_TYPE_MOVE_SEND_ONCE    18      /* Must hold sendonce right */
47 #define MACH_MSG_TYPE_COPY_SEND         19      /* Must hold send right(s) */
48 #define MACH_MSG_TYPE_MAKE_SEND         20      /* Must hold receive right */
49 #define MACH_MSG_TYPE_MAKE_SEND_ONCE    21      /* Must hold receive right */
50 #define MACH_MSG_TYPE_COPY_RECEIVE      22      /* NOT VALID */
51 #define MACH_MSG_TYPE_DISPOSE_RECEIVE   24      /* must hold receive right */
52 #define MACH_MSG_TYPE_DISPOSE_SEND      25      /* must hold send right(s) */
53 #define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26      /* must hold sendonce right */
54 
55 #define MACH_MSG_TYPE_PORT_NONE         0
56 
57 #define MACH_MSG_PORT_DESCRIPTOR                0
58 #define MACH_MSG_OOL_DESCRIPTOR                 1
59 
60 typedef unsigned int mach_msg_copy_options_t;
61 
62 #define MACH_MSG_PHYSICAL_COPY          0
63 #define MACH_MSG_VIRTUAL_COPY           1
64 #define MACH_MSG_ALLOCATE               2
65 
66 typedef uint32_t natural_t;
67 typedef int32_t integer_t;
68 
69 typedef unsigned int mach_msg_type_name_t;
70 typedef unsigned int mach_msg_descriptor_type_t;
71 
72 #if KERNEL
73 typedef void * mach_port_t;
74 #define MACH_PORT_NULL  NULL
75 #else /* !KERNEL */
76 typedef natural_t mach_port_t;
77 #define MACH_PORT_NULL  0
78 #endif /* !KERNEL */
79 
80 typedef natural_t mach_port_name_t;
81 
82 typedef unsigned int mach_msg_bits_t;
83 typedef natural_t mach_msg_size_t;
84 typedef integer_t mach_msg_id_t;
85 
86 #pragma pack(push, 4)
87 
88 typedef struct{
89 	mach_msg_bits_t       msgh_bits;
90 	mach_msg_size_t       msgh_size;
91 	mach_port_t           msgh_remote_port;
92 	mach_port_t           msgh_local_port;
93 	mach_port_name_t      msgh_voucher_port;
94 	mach_msg_id_t         msgh_id;
95 } mach_msg_header_t;
96 
97 typedef struct{
98 	mach_msg_size_t msgh_descriptor_count;
99 } mach_msg_body_t;
100 
101 typedef struct{
102 	mach_port_t                   name;
103 #if !(defined(KERNEL) && defined(__LP64__))
104 // Pad to 8 bytes everywhere except the K64 kernel where mach_port_t is 8 bytes
105 	mach_msg_size_t               pad1;
106 #endif
107 	unsigned int                  pad2 : 16;
108 	mach_msg_type_name_t          disposition : 8;
109 	mach_msg_descriptor_type_t    type : 8;
110 #if defined(KERNEL)
111 	uint32_t          pad_end;
112 #endif
113 } mach_msg_port_descriptor_t;
114 
115 typedef struct{
116 	void *                        address;
117 #if !defined(__LP64__)
118 	mach_msg_size_t               size;
119 #endif
120 	int                           deallocate: 8;
121 	mach_msg_copy_options_t       copy: 8;
122 	unsigned int                  pad1: 8;
123 	mach_msg_descriptor_type_t    type: 8;
124 #if defined(__LP64__)
125 	mach_msg_size_t               size;
126 #endif
127 #if defined(KERNEL) && !defined(__LP64__)
128 	uint32_t          pad_end;
129 #endif
130 } mach_msg_ool_descriptor_t;
131 
132 typedef struct{
133 	unsigned int                  val[80 / sizeof(int)];
134 } mach_msg_max_trailer_t;
135 
136 #pragma pack(pop)
137 
138 #endif  /* _MACH_MESSAGE_H_ */
139 
140 #endif /* XNU_PLATFORM_DriverKit */
141 
142 #if KERNEL
143 class IOUserServer;
144 #endif /* KERNEL */
145 
146 typedef uint64_t OSObjectRef;
147 
148 enum {
149 	kIORPCVersion190615       = (mach_msg_id_t) 0x4da2b68c,
150 	kIORPCVersion190615Reply  = (mach_msg_id_t) 0x4da2b68d,
151 
152 #if DRIVERKIT_PRIVATE
153 	kIORPCVersion190501       = (mach_msg_id_t) 0xfe316a7a,
154 	kIORPCVersion190501Reply  = (mach_msg_id_t) 0xfe316a7b,
155 
156 	kIORPCVersionCurrent      = kIORPCVersion190615,
157 	kIORPCVersionCurrentReply = kIORPCVersion190615Reply
158 #endif /* DRIVERKIT_PRIVATE */
159 };
160 
161 enum{
162 	kIORPCMessageRemote     = 0x00000001,
163 	kIORPCMessageLocalHost  = 0x00000002,
164 	kIORPCMessageKernel     = 0x00000004,
165 	kIORPCMessageOneway     = 0x00000008,
166 	kIORPCMessageObjectRefs = 0x00000010,
167 	kIORPCMessageOnqueue    = 0x00000020,
168 	kIORPCMessageError      = 0x00000040,
169 	kIORPCMessageSimpleReply = 0x00000080,
170 };
171 
172 enum{
173 	kIORPCMessageIDKernel   = (1ULL << 63),
174 };
175 
176 struct IORPCMessageMach {
177 	mach_msg_header_t          msgh;
178 	mach_msg_body_t            msgh_body;
179 	mach_msg_port_descriptor_t objects[0];
180 };
181 typedef struct IORPCMessageMach IORPCMessageMach;
182 
183 #pragma pack(push, 4)
184 struct IORPCMessage {
185 	uint64_t         msgid;
186 	uint64_t         flags;
187 	uint64_t         objectRefs;
188 	OSObjectRef      objects[0];
189 };
190 #pragma pack(pop)
191 typedef struct IORPCMessage IORPCMessage;
192 
193 #ifndef KERNEL
194 
195 #if defined(__cplusplus)
196 extern "C"
197 #else
198 extern
199 #endif
200 IORPCMessage *
201 IORPCMessageFromMach(IORPCMessageMach * msg, bool reply);
202 
203 #endif /* KERNEL */
204 
205 struct IORPCMessageErrorReturnContent {
206 	IORPCMessage  hdr;
207 	kern_return_t result;
208 	uint32_t      pad;
209 };
210 typedef struct IORPCMessageErrorReturnContent IORPCMessageErrorReturnContent;
211 
212 #pragma pack(4)
213 struct IORPCMessageErrorReturn {
214 	IORPCMessageMach mach;
215 	IORPCMessageErrorReturnContent content;
216 };
217 #pragma pack()
218 
219 
220 #if defined(__cplusplus)
221 class OSMetaClassBase;
222 struct IORPC;
223 typedef kern_return_t (*OSDispatchMethod)(OSMetaClassBase * self, const IORPC rpc);
224 #endif
225 
226 struct IORPC {
227 	IORPCMessageMach * message;
228 	IORPCMessageMach * reply;
229 	uint32_t           sendSize;
230 	uint32_t           replySize;
231 #ifdef KERNEL
232 	IORPCMessage     * kernelContent;
233 #endif /* KERNEL */
234 };
235 typedef struct IORPC IORPC;
236 
237 enum {
238 	kOSClassCanRemote   = 0x00000001,
239 };
240 
241 struct OSClassDescription {
242 	uint32_t    descriptionSize;
243 
244 	char        name[96];
245 	char        superName[96];
246 
247 	uint32_t    methodOptionsSize;
248 	uint32_t    methodOptionsOffset;
249 	uint32_t    metaMethodOptionsSize;
250 	uint32_t    metaMethodOptionsOffset;
251 	uint32_t    queueNamesSize;
252 	uint32_t    queueNamesOffset;
253 	uint32_t    methodNamesSize;
254 	uint32_t    methodNamesOffset;
255 	uint32_t    metaMethodNamesSize;
256 	uint32_t    metaMethodNamesOffset;
257 
258 	uint64_t    flags;
259 
260 	uint64_t    resv1[8];
261 
262 	uint64_t    methodOptions[0];
263 	uint64_t    metaMethodOptions[0];
264 
265 	char        dispatchNames[0];
266 	char        methodNames[0];
267 	char        metaMethodNames[0];
268 };
269 
270 #endif /* _IORPC_H */
271