xref: /xnu-8792.81.2/iokit/IOKit/IORPC.h (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
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 #if defined(__cplusplus)
194 extern "C"
195 #else
196 extern
197 #endif
198 IORPCMessage *
199 IORPCMessageFromMach(IORPCMessageMach * msg, bool reply);
200 
201 struct IORPCMessageErrorReturnContent {
202 	IORPCMessage  hdr;
203 	kern_return_t result;
204 	uint32_t      pad;
205 };
206 typedef struct IORPCMessageErrorReturnContent IORPCMessageErrorReturnContent;
207 
208 #pragma pack(4)
209 struct IORPCMessageErrorReturn {
210 	IORPCMessageMach mach;
211 	IORPCMessageErrorReturnContent content;
212 };
213 #pragma pack()
214 
215 
216 #if defined(__cplusplus)
217 class OSMetaClassBase;
218 struct IORPC;
219 typedef kern_return_t (*OSDispatchMethod)(OSMetaClassBase * self, const IORPC rpc);
220 #endif
221 
222 struct IORPC {
223 	IORPCMessageMach * message;
224 	IORPCMessageMach * reply;
225 	uint32_t           sendSize;
226 	uint32_t           replySize;
227 };
228 typedef struct IORPC IORPC;
229 
230 enum {
231 	kOSClassCanRemote   = 0x00000001,
232 };
233 
234 struct OSClassDescription {
235 	uint32_t    descriptionSize;
236 
237 	char        name[96];
238 	char        superName[96];
239 
240 	uint32_t    methodOptionsSize;
241 	uint32_t    methodOptionsOffset;
242 	uint32_t    metaMethodOptionsSize;
243 	uint32_t    metaMethodOptionsOffset;
244 	uint32_t    queueNamesSize;
245 	uint32_t    queueNamesOffset;
246 	uint32_t    methodNamesSize;
247 	uint32_t    methodNamesOffset;
248 	uint32_t    metaMethodNamesSize;
249 	uint32_t    metaMethodNamesOffset;
250 
251 	uint64_t    flags;
252 
253 	uint64_t    resv1[8];
254 
255 	uint64_t    methodOptions[0];
256 	uint64_t    metaMethodOptions[0];
257 
258 	char        dispatchNames[0];
259 	char        methodNames[0];
260 	char        metaMethodNames[0];
261 };
262 
263 #endif /* _IORPC_H */
264