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
60typedef 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
66typedef uint32_t natural_t;
67typedef int32_t integer_t;
68
69typedef unsigned int mach_msg_type_name_t;
70typedef unsigned int mach_msg_descriptor_type_t;
71
72#if KERNEL
73typedef void * mach_port_t;
74#define MACH_PORT_NULL NULL
75#else /* !KERNEL */
76typedef natural_t mach_port_t;
77#define MACH_PORT_NULL 0
78#endif /* !KERNEL */
79
80typedef natural_t mach_port_name_t;
81
82typedef unsigned int mach_msg_bits_t;
83typedef natural_t mach_msg_size_t;
84typedef integer_t mach_msg_id_t;
85
86#pragma pack(push, 4)
87
88typedef 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
97typedef struct{
98 mach_msg_size_t msgh_descriptor_count;
99} mach_msg_body_t;
100
101typedef 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
115typedef 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
132typedef 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
143class IOUserServer;
144#endif /* KERNEL */
145
146typedef uint64_t OSObjectRef;
147
148enum {
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
161enum{
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
172enum{
173 kIORPCMessageIDKernel = (1ULL << 63),
174};
175
176struct IORPCMessageMach {
177 mach_msg_header_t msgh;
178 mach_msg_body_t msgh_body;
179 mach_msg_port_descriptor_t objects[0];
180};
181typedef struct IORPCMessageMach IORPCMessageMach;
182
183#pragma pack(push, 4)
184struct IORPCMessage {
185 uint64_t msgid;
186 uint64_t flags;
187 uint64_t objectRefs;
188 OSObjectRef objects[0];
189};
190#pragma pack(pop)
191typedef struct IORPCMessage IORPCMessage;
192
193#ifndef KERNEL
194
195#if defined(__cplusplus)
196extern "C"
197#else
198extern
199#endif
200IORPCMessage *
201IORPCMessageFromMach(IORPCMessageMach * msg, bool reply);
202
203#endif /* KERNEL */
204
205struct IORPCMessageErrorReturnContent {
206 IORPCMessage hdr;
207 kern_return_t result;
208 uint32_t pad;
209};
210typedef struct IORPCMessageErrorReturnContent IORPCMessageErrorReturnContent;
211
212#pragma pack(4)
213struct IORPCMessageErrorReturn {
214 IORPCMessageMach mach;
215 IORPCMessageErrorReturnContent content;
216};
217#pragma pack()
218
219
220#if defined(__cplusplus)
221class OSMetaClassBase;
222struct IORPC;
223typedef kern_return_t (*OSDispatchMethod)(OSMetaClassBase * self, const IORPC rpc);
224#endif
225
226struct 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};
235typedef struct IORPC IORPC;
236
237enum {
238 kOSClassCanRemote = 0x00000001,
239};
240
241struct 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
270IORPCMessage *IORPCMessageFromMach(IORPCMessageMach * msg, bool reply);
271
272#endif /* _IORPC_H */
273