Root/
Source at commit 1270 created 12 years 11 months ago. By meklort, Add arm headers. update makefiles | |
---|---|
1 | /*␊ |
2 | * Copyright (c) 2000-2005 Apple Computer, 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 | * @OSF_COPYRIGHT@␊ |
30 | */␊ |
31 | /* ␊ |
32 | * Mach Operating System␊ |
33 | * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University␊ |
34 | * All Rights Reserved.␊ |
35 | * ␊ |
36 | * Permission to use, copy, modify and distribute this software and its␊ |
37 | * documentation is hereby granted, provided that both the copyright␊ |
38 | * notice and this permission notice appear in all copies of the␊ |
39 | * software, derivative works or modified versions, and any portions␊ |
40 | * thereof, and that both notices appear in supporting documentation.␊ |
41 | * ␊ |
42 | * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"␊ |
43 | * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR␊ |
44 | * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.␊ |
45 | * ␊ |
46 | * Carnegie Mellon requests users of this software to return to␊ |
47 | * ␊ |
48 | * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU␊ |
49 | * School of Computer Science␊ |
50 | * Carnegie Mellon University␊ |
51 | * Pittsburgh PA 15213-3890␊ |
52 | * ␊ |
53 | * any improvements or extensions that they make and grant Carnegie Mellon␊ |
54 | * the rights to redistribute these changes.␊ |
55 | */␊ |
56 | /*␊ |
57 | * NOTICE: This file was modified by McAfee Research in 2004 to introduce␊ |
58 | * support for mandatory and extensible security protections. This notice␊ |
59 | * is included in support of clause 2.2 (b) of the Apple Public License,␊ |
60 | * Version 2.0.␊ |
61 | * Copyright (c) 2005 SPARTA, Inc.␊ |
62 | */␊ |
63 | /*␊ |
64 | */␊ |
65 | /*␊ |
66 | *␉File:␉mach/message.h␊ |
67 | *␊ |
68 | *␉Mach IPC message and primitive function definitions.␊ |
69 | */␊ |
70 | ␊ |
71 | #ifndef␉_MACH_MESSAGE_H_␊ |
72 | #define _MACH_MESSAGE_H_␊ |
73 | ␊ |
74 | #include <stdint.h>␊ |
75 | #include <mach/port.h>␊ |
76 | #include <mach/boolean.h>␊ |
77 | #include <mach/kern_return.h>␊ |
78 | #include <mach/machine/vm_types.h>␊ |
79 | ␊ |
80 | #include <sys/cdefs.h>␊ |
81 | ␊ |
82 | /*␊ |
83 | * The timeout mechanism uses mach_msg_timeout_t values,␊ |
84 | * passed by value. The timeout units are milliseconds.␊ |
85 | * It is controlled with the MACH_SEND_TIMEOUT␊ |
86 | * and MACH_RCV_TIMEOUT options.␊ |
87 | */␊ |
88 | ␊ |
89 | typedef natural_t mach_msg_timeout_t;␊ |
90 | ␊ |
91 | /*␊ |
92 | * The value to be used when there is no timeout.␊ |
93 | * (No MACH_SEND_TIMEOUT/MACH_RCV_TIMEOUT option.)␊ |
94 | */␊ |
95 | ␊ |
96 | #define MACH_MSG_TIMEOUT_NONE␉␉((mach_msg_timeout_t) 0)␊ |
97 | ␊ |
98 | /*␊ |
99 | * The kernel uses MACH_MSGH_BITS_COMPLEX as a hint. If it isn't on, it␊ |
100 | * assumes the body of the message doesn't contain port rights or OOL␊ |
101 | * data. The field is set in received messages. A user task must␊ |
102 | * use caution in interpreting the body of a message if the bit isn't␊ |
103 | * on, because the mach_msg_type's in the body might "lie" about the␊ |
104 | * contents. If the bit isn't on, but the mach_msg_types␊ |
105 | * in the body specify rights or OOL data, the behavior is undefined.␊ |
106 | * (Ie, an error may or may not be produced.)␊ |
107 | *␊ |
108 | * The value of MACH_MSGH_BITS_REMOTE determines the interpretation␊ |
109 | * of the msgh_remote_port field. It is handled like a msgt_name.␊ |
110 | *␊ |
111 | * The value of MACH_MSGH_BITS_LOCAL determines the interpretation␊ |
112 | * of the msgh_local_port field. It is handled like a msgt_name.␊ |
113 | *␊ |
114 | * MACH_MSGH_BITS() combines two MACH_MSG_TYPE_* values, for the remote␊ |
115 | * and local fields, into a single value suitable for msgh_bits.␊ |
116 | *␊ |
117 | * MACH_MSGH_BITS_CIRCULAR should be zero; is is used internally.␊ |
118 | *␊ |
119 | * The unused bits should be zero and are reserved for the kernel␊ |
120 | * or for future interface expansion.␊ |
121 | */␊ |
122 | ␊ |
123 | #define MACH_MSGH_BITS_ZERO␉␉0x00000000␊ |
124 | #define MACH_MSGH_BITS_REMOTE_MASK␉0x000000ff␊ |
125 | #define MACH_MSGH_BITS_LOCAL_MASK␉0x0000ff00␊ |
126 | #define MACH_MSGH_BITS_COMPLEX␉␉0x80000000U␊ |
127 | #define MACH_MSGH_BITS_USER 0x8000ffffU␊ |
128 | ␊ |
129 | #define␉MACH_MSGH_BITS_CIRCULAR␉␉0x40000000␉/* internal use only */␊ |
130 | #define␉MACH_MSGH_BITS_USED␉␉0xc000ffffU␊ |
131 | ␊ |
132 | #define␉MACH_MSGH_BITS_PORTS_MASK␉␉␉␉\␊ |
133 | ␉␉(MACH_MSGH_BITS_REMOTE_MASK|MACH_MSGH_BITS_LOCAL_MASK)␊ |
134 | ␊ |
135 | #define MACH_MSGH_BITS(remote, local)␉␉␉␉\␊ |
136 | ␉␉((remote) | ((local) << 8))␊ |
137 | #define␉MACH_MSGH_BITS_REMOTE(bits)␉␉␉␉\␊ |
138 | ␉␉((bits) & MACH_MSGH_BITS_REMOTE_MASK)␊ |
139 | #define␉MACH_MSGH_BITS_LOCAL(bits)␉␉␉␉\␊ |
140 | ␉␉(((bits) & MACH_MSGH_BITS_LOCAL_MASK) >> 8)␊ |
141 | #define␉MACH_MSGH_BITS_PORTS(bits)␉␉␉␉\␊ |
142 | ␉␉((bits) & MACH_MSGH_BITS_PORTS_MASK)␊ |
143 | #define␉MACH_MSGH_BITS_OTHER(bits)␉␉␉␉\␊ |
144 | ␉␉((bits) &~ MACH_MSGH_BITS_PORTS_MASK)␊ |
145 | ␊ |
146 | /*␊ |
147 | * Every message starts with a message header.␊ |
148 | * Following the message header, if the message is complex, are a count␊ |
149 | * of type descriptors and the type descriptors themselves ␊ |
150 | * (mach_msg_descriptor_t). The size of the message must be specified in ␊ |
151 | * bytes, and includes the message header, descriptor count, descriptors, ␊ |
152 | * and inline data.␊ |
153 | *␊ |
154 | * The msgh_remote_port field specifies the destination of the message.␊ |
155 | * It must specify a valid send or send-once right for a port.␊ |
156 | *␊ |
157 | * The msgh_local_port field specifies a "reply port". Normally,␊ |
158 | * This field carries a send-once right that the receiver will use␊ |
159 | * to reply to the message. It may carry the values MACH_PORT_NULL,␊ |
160 | * MACH_PORT_DEAD, a send-once right, or a send right.␊ |
161 | *␊ |
162 | * The msgh_seqno field carries a sequence number associated with the␊ |
163 | * received-from port. A port's sequence number is incremented every␊ |
164 | * time a message is received from it. In sent messages, the field's␊ |
165 | * value is ignored.␊ |
166 | *␊ |
167 | * The msgh_id field is uninterpreted by the message primitives.␊ |
168 | * It normally carries information specifying the format␊ |
169 | * or meaning of the message.␊ |
170 | */␊ |
171 | ␊ |
172 | typedef unsigned int mach_msg_bits_t;␊ |
173 | typedef␉natural_t mach_msg_size_t;␊ |
174 | typedef integer_t mach_msg_id_t;␊ |
175 | ␊ |
176 | ␊ |
177 | #define MACH_MSG_SIZE_NULL (mach_msg_size_t *) 0␊ |
178 | ␊ |
179 | typedef unsigned int mach_msg_type_name_t;␊ |
180 | ␊ |
181 | #define MACH_MSG_TYPE_MOVE_RECEIVE␉16␉/* Must hold receive rights */␊ |
182 | #define MACH_MSG_TYPE_MOVE_SEND␉␉17␉/* Must hold send rights */␊ |
183 | #define MACH_MSG_TYPE_MOVE_SEND_ONCE␉18␉/* Must hold sendonce rights */␊ |
184 | #define MACH_MSG_TYPE_COPY_SEND␉␉19␉/* Must hold send rights */␊ |
185 | #define MACH_MSG_TYPE_MAKE_SEND␉␉20␉/* Must hold receive rights */␊ |
186 | #define MACH_MSG_TYPE_MAKE_SEND_ONCE␉21␉/* Must hold receive rights */␊ |
187 | #define MACH_MSG_TYPE_COPY_RECEIVE␉22␉/* Must hold receive rights */␊ |
188 | ␊ |
189 | typedef unsigned int mach_msg_copy_options_t;␊ |
190 | ␊ |
191 | #define MACH_MSG_PHYSICAL_COPY␉␉0␊ |
192 | #define MACH_MSG_VIRTUAL_COPY ␉1␊ |
193 | #define MACH_MSG_ALLOCATE␉␉2␊ |
194 | #define MACH_MSG_OVERWRITE␉␉3␊ |
195 | #ifdef MACH_KERNEL␊ |
196 | #define MACH_MSG_KALLOC_COPY_T␉␉4␊ |
197 | #endif /* MACH_KERNEL */␊ |
198 | ␊ |
199 | /*␊ |
200 | * In a complex mach message, the mach_msg_header_t is followed by ␊ |
201 | * a descriptor count, then an array of that number of descriptors ␊ |
202 | * (mach_msg_*_descriptor_t). The type field of mach_msg_type_descriptor_t␊ |
203 | * (which any descriptor can be cast to) indicates the flavor of the␊ |
204 | * descriptor.␊ |
205 | *␊ |
206 | * Note that in LP64, the various types of descriptors are no longer all␊ |
207 | * the same size as mach_msg_descriptor_t, so the array cannot be indexed ␊ |
208 | * as expected.␊ |
209 | */␊ |
210 | ␊ |
211 | typedef unsigned int mach_msg_descriptor_type_t;␊ |
212 | ␊ |
213 | #define MACH_MSG_PORT_DESCRIPTOR ␉␉0␊ |
214 | #define MACH_MSG_OOL_DESCRIPTOR ␉␉1␊ |
215 | #define MACH_MSG_OOL_PORTS_DESCRIPTOR ␉␉2␊ |
216 | #define MACH_MSG_OOL_VOLATILE_DESCRIPTOR ␉3␊ |
217 | ␊ |
218 | #pragma pack(4)␊ |
219 | ␊ |
220 | typedef struct␊ |
221 | {␊ |
222 | natural_t␉␉␉pad1;␊ |
223 | mach_msg_size_t␉␉pad2;␊ |
224 | unsigned int␉␉␉pad3 : 24;␊ |
225 | mach_msg_descriptor_type_t␉type : 8;␊ |
226 | } mach_msg_type_descriptor_t;␊ |
227 | ␊ |
228 | typedef struct␊ |
229 | {␊ |
230 | mach_port_t␉␉␉name;␊ |
231 | #if !(defined(KERNEL) && defined(__LP64__))␊ |
232 | // Pad to 8 bytes everywhere except the K64 kernel where mach_port_t is 8 bytes␊ |
233 | mach_msg_size_t␉␉pad1;␊ |
234 | #endif␊ |
235 | unsigned int␉␉␉pad2 : 16;␊ |
236 | mach_msg_type_name_t␉␉disposition : 8;␊ |
237 | mach_msg_descriptor_type_t␉type : 8;␊ |
238 | } mach_msg_port_descriptor_t;␊ |
239 | ␊ |
240 | typedef struct␊ |
241 | {␊ |
242 | uint32_t␉␉␉address;␊ |
243 | mach_msg_size_t ␉size;␊ |
244 | boolean_t ␉␉deallocate: 8;␊ |
245 | mach_msg_copy_options_t copy: 8;␊ |
246 | unsigned int ␉␉pad1: 8;␊ |
247 | mach_msg_descriptor_type_t type: 8;␊ |
248 | } mach_msg_ool_descriptor32_t;␊ |
249 | ␊ |
250 | typedef struct␊ |
251 | {␊ |
252 | uint64_t␉␉␉address;␊ |
253 | boolean_t ␉␉deallocate: 8;␊ |
254 | mach_msg_copy_options_t copy: 8;␊ |
255 | unsigned int ␉␉pad1: 8;␊ |
256 | mach_msg_descriptor_type_t type: 8;␊ |
257 | mach_msg_size_t ␉size;␊ |
258 | } mach_msg_ool_descriptor64_t;␊ |
259 | ␊ |
260 | typedef struct␊ |
261 | {␊ |
262 | void*␉␉␉␉address;␊ |
263 | #if !defined(__LP64__)␊ |
264 | mach_msg_size_t ␉size;␊ |
265 | #endif␊ |
266 | boolean_t ␉␉deallocate: 8;␊ |
267 | mach_msg_copy_options_t copy: 8;␊ |
268 | unsigned int ␉␉pad1: 8;␊ |
269 | mach_msg_descriptor_type_t type: 8;␊ |
270 | #if defined(__LP64__)␊ |
271 | mach_msg_size_t ␉size;␊ |
272 | #endif␊ |
273 | #if defined(KERNEL) && !defined(__LP64__)␊ |
274 | uint32_t pad_end;␊ |
275 | #endif␊ |
276 | } mach_msg_ool_descriptor_t;␊ |
277 | ␊ |
278 | typedef struct␊ |
279 | {␊ |
280 | uint32_t␉␉␉address;␊ |
281 | mach_msg_size_t␉␉count;␊ |
282 | boolean_t ␉␉deallocate: 8;␊ |
283 | mach_msg_copy_options_t copy: 8;␊ |
284 | mach_msg_type_name_t␉␉disposition : 8;␊ |
285 | mach_msg_descriptor_type_t␉type : 8;␊ |
286 | } mach_msg_ool_ports_descriptor32_t;␊ |
287 | ␊ |
288 | typedef struct␊ |
289 | {␊ |
290 | uint64_t␉␉␉address;␊ |
291 | boolean_t ␉␉deallocate: 8;␊ |
292 | mach_msg_copy_options_t copy: 8;␊ |
293 | mach_msg_type_name_t␉␉disposition : 8;␊ |
294 | mach_msg_descriptor_type_t␉type : 8;␊ |
295 | mach_msg_size_t␉␉count;␊ |
296 | } mach_msg_ool_ports_descriptor64_t;␊ |
297 | ␊ |
298 | typedef struct␊ |
299 | {␊ |
300 | void*␉␉␉␉address;␊ |
301 | #if !defined(__LP64__)␊ |
302 | mach_msg_size_t␉␉count;␊ |
303 | #endif␊ |
304 | boolean_t ␉␉deallocate: 8;␊ |
305 | mach_msg_copy_options_t copy: 8;␊ |
306 | mach_msg_type_name_t␉␉disposition : 8;␊ |
307 | mach_msg_descriptor_type_t␉type : 8;␊ |
308 | #if defined(__LP64__)␊ |
309 | mach_msg_size_t␉␉count;␊ |
310 | #endif␊ |
311 | #if defined(KERNEL) && !defined(__LP64__)␊ |
312 | uint32_t pad_end;␊ |
313 | #endif␊ |
314 | } mach_msg_ool_ports_descriptor_t;␊ |
315 | ␊ |
316 | /*␊ |
317 | * LP64support - This union definition is not really␊ |
318 | * appropriate in LP64 mode because not all descriptors␊ |
319 | * are of the same size in that environment.␊ |
320 | */␊ |
321 | #if defined(__LP64__) && defined(KERNEL)␊ |
322 | typedef union␊ |
323 | {␊ |
324 | mach_msg_port_descriptor_t␉␉port;␊ |
325 | mach_msg_ool_descriptor32_t␉␉out_of_line;␊ |
326 | mach_msg_ool_ports_descriptor32_t␉ool_ports;␊ |
327 | mach_msg_type_descriptor_t␉␉type;␊ |
328 | } mach_msg_descriptor_t;␊ |
329 | #else␊ |
330 | typedef union␊ |
331 | {␊ |
332 | mach_msg_port_descriptor_t␉␉port;␊ |
333 | mach_msg_ool_descriptor_t␉␉out_of_line;␊ |
334 | mach_msg_ool_ports_descriptor_t␉ool_ports;␊ |
335 | mach_msg_type_descriptor_t␉␉type;␊ |
336 | } mach_msg_descriptor_t;␊ |
337 | #endif␊ |
338 | ␊ |
339 | typedef struct␊ |
340 | {␊ |
341 | mach_msg_size_t msgh_descriptor_count;␊ |
342 | } mach_msg_body_t;␊ |
343 | ␊ |
344 | #define MACH_MSG_BODY_NULL (mach_msg_body_t *) 0␊ |
345 | #define MACH_MSG_DESCRIPTOR_NULL (mach_msg_descriptor_t *) 0␊ |
346 | ␊ |
347 | typedef␉struct ␊ |
348 | {␊ |
349 | mach_msg_bits_t␉msgh_bits;␊ |
350 | mach_msg_size_t␉msgh_size;␊ |
351 | mach_port_t␉␉msgh_remote_port;␊ |
352 | mach_port_t␉␉msgh_local_port;␊ |
353 | mach_msg_size_t ␉msgh_reserved;␊ |
354 | mach_msg_id_t␉␉msgh_id;␊ |
355 | } mach_msg_header_t;␊ |
356 | ␊ |
357 | #define MACH_MSG_NULL (mach_msg_header_t *) 0␊ |
358 | ␊ |
359 | typedef struct␊ |
360 | {␊ |
361 | mach_msg_header_t header;␊ |
362 | mach_msg_body_t body;␊ |
363 | } mach_msg_base_t;␊ |
364 | ␊ |
365 | typedef␉unsigned int mach_msg_trailer_type_t;␊ |
366 | ␊ |
367 | #define␉MACH_MSG_TRAILER_FORMAT_0␉0␊ |
368 | ␊ |
369 | typedef␉unsigned int mach_msg_trailer_size_t;␊ |
370 | ␊ |
371 | typedef struct ␊ |
372 | {␊ |
373 | mach_msg_trailer_type_t␉msgh_trailer_type;␊ |
374 | mach_msg_trailer_size_t␉msgh_trailer_size;␊ |
375 | } mach_msg_trailer_t;␊ |
376 | ␊ |
377 | typedef struct␊ |
378 | {␊ |
379 | mach_msg_trailer_type_t msgh_trailer_type;␊ |
380 | mach_msg_trailer_size_t msgh_trailer_size;␊ |
381 | mach_port_seqno_t msgh_seqno;␊ |
382 | } mach_msg_seqno_trailer_t;␊ |
383 | ␊ |
384 | typedef struct␊ |
385 | {␊ |
386 | unsigned int␉␉␉val[2];␊ |
387 | } security_token_t;␊ |
388 | ␊ |
389 | typedef struct ␊ |
390 | {␊ |
391 | mach_msg_trailer_type_t␉msgh_trailer_type;␊ |
392 | mach_msg_trailer_size_t␉msgh_trailer_size;␊ |
393 | mach_port_seqno_t␉␉msgh_seqno;␊ |
394 | security_token_t␉␉msgh_sender;␊ |
395 | } mach_msg_security_trailer_t;␊ |
396 | ␊ |
397 | /*␊ |
398 | * The audit token is an opaque token which identifies␊ |
399 | * Mach tasks and senders of Mach messages as subjects␊ |
400 | * to the BSM audit system. Only the appropriate BSM␊ |
401 | * library routines should be used to interpret the␊ |
402 | * contents of the audit token as the representation␊ |
403 | * of the subject identity within the token may change␊ |
404 | * over time.␊ |
405 | */␊ |
406 | typedef struct␊ |
407 | {␊ |
408 | unsigned int␉␉␉val[8];␊ |
409 | } audit_token_t;␊ |
410 | ␊ |
411 | typedef struct ␊ |
412 | {␊ |
413 | mach_msg_trailer_type_t␉msgh_trailer_type;␊ |
414 | mach_msg_trailer_size_t␉msgh_trailer_size;␊ |
415 | mach_port_seqno_t␉␉msgh_seqno;␊ |
416 | security_token_t␉␉msgh_sender;␊ |
417 | audit_token_t␉␉␉msgh_audit;␊ |
418 | } mach_msg_audit_trailer_t;␊ |
419 | ␊ |
420 | typedef struct ␊ |
421 | {␊ |
422 | mach_msg_trailer_type_t␉msgh_trailer_type;␊ |
423 | mach_msg_trailer_size_t␉msgh_trailer_size;␊ |
424 | mach_port_seqno_t␉␉msgh_seqno;␊ |
425 | security_token_t␉␉msgh_sender;␊ |
426 | audit_token_t␉␉␉msgh_audit;␊ |
427 | mach_vm_address_t␉␉msgh_context;␊ |
428 | } mach_msg_context_trailer_t;␊ |
429 | ␊ |
430 | ␊ |
431 | typedef struct␊ |
432 | {␊ |
433 | mach_port_name_t sender;␊ |
434 | } msg_labels_t;␊ |
435 | ␊ |
436 | /* ␊ |
437 | Trailer type to pass MAC policy label info as a mach message trailer.␊ |
438 | ␊ |
439 | */␊ |
440 | ␊ |
441 | typedef struct␊ |
442 | {␊ |
443 | mach_msg_trailer_type_t msgh_trailer_type;␊ |
444 | mach_msg_trailer_size_t msgh_trailer_size;␊ |
445 | mach_port_seqno_t msgh_seqno;␊ |
446 | security_token_t msgh_sender;␊ |
447 | audit_token_t msgh_audit;␊ |
448 | mach_vm_address_t msgh_context;␊ |
449 | int␉␉␉␉msgh_ad;␊ |
450 | msg_labels_t msgh_labels;␊ |
451 | } mach_msg_mac_trailer_t;␊ |
452 | ␊ |
453 | #define MACH_MSG_TRAILER_MINIMUM_SIZE sizeof(mach_msg_trailer_t)␊ |
454 | ␊ |
455 | /*␊ |
456 | * These values can change from release to release - but clearly␊ |
457 | * code cannot request additional trailer elements one was not␊ |
458 | * compiled to understand. Therefore, it is safe to use this␊ |
459 | * constant when the same module specified the receive options.␊ |
460 | * Otherwise, you run the risk that the options requested by␊ |
461 | * another module may exceed the local modules notion of␊ |
462 | * MAX_TRAILER_SIZE.␊ |
463 | */␊ |
464 | typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t;␊ |
465 | #define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t))␊ |
466 | ␊ |
467 | /*␊ |
468 | * Legacy requirements keep us from ever updating these defines (even␊ |
469 | * when the format_0 trailers gain new option data fields in the future).␊ |
470 | * Therefore, they shouldn't be used going forward. Instead, the sizes␊ |
471 | * should be compared against the specific element size requested using␊ |
472 | * REQUESTED_TRAILER_SIZE.␊ |
473 | */␊ |
474 | typedef mach_msg_security_trailer_t mach_msg_format_0_trailer_t;␊ |
475 | ␊ |
476 | /*typedef mach_msg_mac_trailer_t mach_msg_format_0_trailer_t;␊ |
477 | */␊ |
478 | ␊ |
479 | #define MACH_MSG_TRAILER_FORMAT_0_SIZE sizeof(mach_msg_format_0_trailer_t)␊ |
480 | ␊ |
481 | #define KERNEL_SECURITY_TOKEN_VALUE { {0, 1} }␊ |
482 | extern security_token_t KERNEL_SECURITY_TOKEN;␊ |
483 | ␊ |
484 | #define KERNEL_AUDIT_TOKEN_VALUE { {0, 0, 0, 0, 0, 0, 0, 0} }␊ |
485 | extern audit_token_t KERNEL_AUDIT_TOKEN;␊ |
486 | ␊ |
487 | typedef␉integer_t mach_msg_options_t;␊ |
488 | ␊ |
489 | typedef struct␊ |
490 | {␊ |
491 | mach_msg_header_t␉header;␊ |
492 | } mach_msg_empty_send_t;␊ |
493 | ␊ |
494 | typedef struct␊ |
495 | {␊ |
496 | mach_msg_header_t␉header;␊ |
497 | mach_msg_trailer_t␉trailer;␊ |
498 | } mach_msg_empty_rcv_t;␊ |
499 | ␊ |
500 | typedef union␊ |
501 | {␊ |
502 | mach_msg_empty_send_t␉send;␊ |
503 | mach_msg_empty_rcv_t␉rcv;␊ |
504 | } mach_msg_empty_t;␊ |
505 | ␊ |
506 | #pragma pack()␊ |
507 | ␊ |
508 | /* utility to round the message size - will become machine dependent */␊ |
509 | #define round_msg(x)␉(((mach_msg_size_t)(x) + sizeof (natural_t) - 1) & \␊ |
510 | ␉␉␉␉~(sizeof (natural_t) - 1))␊ |
511 | ␊ |
512 | /*␊ |
513 | * There is no fixed upper bound to the size of Mach messages.␊ |
514 | */␊ |
515 | ␊ |
516 | #define␉MACH_MSG_SIZE_MAX␉((mach_msg_size_t) ~0)␊ |
517 | ␊ |
518 | /*␊ |
519 | * Compatibility definitions, for code written␊ |
520 | * when there was a msgh_kind instead of msgh_seqno.␊ |
521 | */␊ |
522 | #define MACH_MSGH_KIND_NORMAL␉␉0x00000000␊ |
523 | #define MACH_MSGH_KIND_NOTIFICATION␉0x00000001␊ |
524 | #define␉msgh_kind␉␉␉msgh_seqno␊ |
525 | #define mach_msg_kind_t␉␉␉mach_port_seqno_t␊ |
526 | ␊ |
527 | typedef natural_t mach_msg_type_size_t;␊ |
528 | typedef natural_t mach_msg_type_number_t;␊ |
529 | ␊ |
530 | /*␊ |
531 | * Values received/carried in messages. Tells the receiver what␊ |
532 | * sort of port right he now has.␊ |
533 | *␊ |
534 | * MACH_MSG_TYPE_PORT_NAME is used to transfer a port name␊ |
535 | * which should remain uninterpreted by the kernel. (Port rights␊ |
536 | * are not transferred, just the port name.)␊ |
537 | */␊ |
538 | ␊ |
539 | #define MACH_MSG_TYPE_PORT_NONE␉␉0␊ |
540 | ␊ |
541 | #define MACH_MSG_TYPE_PORT_NAME␉␉15␊ |
542 | #define MACH_MSG_TYPE_PORT_RECEIVE␉MACH_MSG_TYPE_MOVE_RECEIVE␊ |
543 | #define MACH_MSG_TYPE_PORT_SEND␉␉MACH_MSG_TYPE_MOVE_SEND␊ |
544 | #define MACH_MSG_TYPE_PORT_SEND_ONCE␉MACH_MSG_TYPE_MOVE_SEND_ONCE␊ |
545 | ␊ |
546 | #define MACH_MSG_TYPE_LAST␉␉22␉␉/* Last assigned */␊ |
547 | ␊ |
548 | /*␊ |
549 | * A dummy value. Mostly used to indicate that the actual value␊ |
550 | * will be filled in later, dynamically.␊ |
551 | */␊ |
552 | ␊ |
553 | #define MACH_MSG_TYPE_POLYMORPHIC␉((mach_msg_type_name_t) -1)␊ |
554 | ␊ |
555 | /*␊ |
556 | *␉Is a given item a port type?␊ |
557 | */␊ |
558 | ␊ |
559 | #define MACH_MSG_TYPE_PORT_ANY(x)␉␉␉\␊ |
560 | ␉(((x) >= MACH_MSG_TYPE_MOVE_RECEIVE) &&␉␉\␊ |
561 | ␉ ((x) <= MACH_MSG_TYPE_MAKE_SEND_ONCE))␊ |
562 | ␊ |
563 | #define␉MACH_MSG_TYPE_PORT_ANY_SEND(x)␉␉␉\␊ |
564 | ␉(((x) >= MACH_MSG_TYPE_MOVE_SEND) &&␉␉\␊ |
565 | ␉ ((x) <= MACH_MSG_TYPE_MAKE_SEND_ONCE))␊ |
566 | ␊ |
567 | #define␉MACH_MSG_TYPE_PORT_ANY_RIGHT(x)␉␉␉\␊ |
568 | ␉(((x) >= MACH_MSG_TYPE_MOVE_RECEIVE) &&␉␉\␊ |
569 | ␉ ((x) <= MACH_MSG_TYPE_MOVE_SEND_ONCE))␊ |
570 | ␊ |
571 | typedef integer_t mach_msg_option_t;␊ |
572 | ␊ |
573 | #define MACH_MSG_OPTION_NONE␉0x00000000␊ |
574 | ␊ |
575 | #define␉MACH_SEND_MSG␉␉0x00000001␊ |
576 | #define␉MACH_RCV_MSG␉␉0x00000002␊ |
577 | #define MACH_RCV_LARGE␉␉0x00000004␊ |
578 | ␊ |
579 | #define MACH_SEND_TIMEOUT␉0x00000010␊ |
580 | #define MACH_SEND_INTERRUPT␉0x00000040␉/* libmach implements */␊ |
581 | #define MACH_SEND_CANCEL␉0x00000080␊ |
582 | #define MACH_SEND_ALWAYS␉0x00010000␉/* internal use only */␊ |
583 | #define MACH_SEND_TRAILER␉0x00020000␉␊ |
584 | ␊ |
585 | #define MACH_RCV_TIMEOUT␉0x00000100␊ |
586 | #define MACH_RCV_NOTIFY␉␉0x00000200␊ |
587 | #define MACH_RCV_INTERRUPT␉0x00000400␉/* libmach implements */␊ |
588 | #define MACH_RCV_OVERWRITE␉0x00001000␊ |
589 | ␊ |
590 | /* ␊ |
591 | * NOTE: a 0x00------ RCV mask implies to ask for␊ |
592 | * a MACH_MSG_TRAILER_FORMAT_0 with 0 Elements, ␊ |
593 | * which is equivalent to a mach_msg_trailer_t.␊ |
594 | *␊ |
595 | * XXXMAC: unlike the rest of the MACH_RCV_* flags, MACH_RCV_TRAILER_LABELS␊ |
596 | * needs its own private bit since we only calculate its fields when absolutely ␊ |
597 | * required.␊ |
598 | */␊ |
599 | #define MACH_RCV_TRAILER_NULL 0␊ |
600 | #define MACH_RCV_TRAILER_SEQNO 1␊ |
601 | #define MACH_RCV_TRAILER_SENDER 2␊ |
602 | #define MACH_RCV_TRAILER_AUDIT 3␊ |
603 | #define MACH_RCV_TRAILER_CTX 4␊ |
604 | #define MACH_RCV_TRAILER_AV 7␊ |
605 | #define MACH_RCV_TRAILER_LABELS 8␊ |
606 | ␊ |
607 | #define MACH_RCV_TRAILER_TYPE(x) (((x) & 0xf) << 28) ␊ |
608 | #define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) ␊ |
609 | #define MACH_RCV_TRAILER_MASK ␉ ((0xff << 24))␊ |
610 | ␊ |
611 | #define GET_RCV_ELEMENTS(y) (((y) >> 24) & 0xf)␊ |
612 | ␊ |
613 | /* ␊ |
614 | * XXXMAC: note that in the case of MACH_RCV_TRAILER_LABELS, ␊ |
615 | * we just fall through to mach_msg_max_trailer_t.␊ |
616 | * This is correct behavior since mach_msg_max_trailer_t is defined as␊ |
617 | * mac_msg_mac_trailer_t which is used for the LABELS trailer.␊ |
618 | * It also makes things work properly if MACH_RCV_TRAILER_LABELS is ORed ␊ |
619 | * with one of the other options.␊ |
620 | */␊ |
621 | #define REQUESTED_TRAILER_SIZE(y) ␉␉␉␉\␊ |
622 | ␉((mach_msg_trailer_size_t)␉␉␉␉\␊ |
623 | ␉ ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_NULL) ?␉\␊ |
624 | ␉ sizeof(mach_msg_trailer_t) :␉␉␉␉\␊ |
625 | ␉ ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_SEQNO) ?␉\␊ |
626 | ␉ sizeof(mach_msg_seqno_trailer_t) :␉␉␉\␊ |
627 | ␉ ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_SENDER) ?␉\␊ |
628 | ␉ sizeof(mach_msg_security_trailer_t) :␉␉\␊ |
629 | ␉ ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_AUDIT) ?␉\␊ |
630 | ␉ sizeof(mach_msg_audit_trailer_t) : ␉␉\␊ |
631 | ␉ ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_CTX) ?␉\␊ |
632 | ␉ sizeof(mach_msg_context_trailer_t) : ␉␉\␊ |
633 | ␉ ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_AV) ?␉\␊ |
634 | ␉ sizeof(mach_msg_mac_trailer_t) : ␉␉\␊ |
635 | ␉ sizeof(mach_msg_max_trailer_t))))))))␊ |
636 | ␊ |
637 | /*␊ |
638 | * Much code assumes that mach_msg_return_t == kern_return_t.␊ |
639 | * This definition is useful for descriptive purposes.␊ |
640 | *␊ |
641 | * See <mach/error.h> for the format of error codes.␊ |
642 | * IPC errors are system 4. Send errors are subsystem 0;␊ |
643 | * receive errors are subsystem 1. The code field is always non-zero.␊ |
644 | * The high bits of the code field communicate extra information␊ |
645 | * for some error codes. MACH_MSG_MASK masks off these special bits.␊ |
646 | */␊ |
647 | ␊ |
648 | typedef kern_return_t mach_msg_return_t;␊ |
649 | ␊ |
650 | #define MACH_MSG_SUCCESS␉␉0x00000000␊ |
651 | ␊ |
652 | ␊ |
653 | #define␉MACH_MSG_MASK␉␉␉0x00003e00␊ |
654 | ␉␉/* All special error code bits defined below. */␊ |
655 | #define␉MACH_MSG_IPC_SPACE␉␉0x00002000␊ |
656 | ␉␉/* No room in IPC name space for another capability name. */␊ |
657 | #define␉MACH_MSG_VM_SPACE␉␉0x00001000␊ |
658 | ␉␉/* No room in VM address space for out-of-line memory. */␊ |
659 | #define␉MACH_MSG_IPC_KERNEL␉␉0x00000800␊ |
660 | ␉␉/* Kernel resource shortage handling an IPC capability. */␊ |
661 | #define␉MACH_MSG_VM_KERNEL␉␉0x00000400␊ |
662 | ␉␉/* Kernel resource shortage handling out-of-line memory. */␊ |
663 | ␊ |
664 | #define MACH_SEND_IN_PROGRESS␉␉0x10000001␊ |
665 | ␉␉/* Thread is waiting to send. (Internal use only.) */␊ |
666 | #define MACH_SEND_INVALID_DATA␉␉0x10000002␊ |
667 | ␉␉/* Bogus in-line data. */␊ |
668 | #define MACH_SEND_INVALID_DEST␉␉0x10000003␊ |
669 | ␉␉/* Bogus destination port. */␊ |
670 | #define MACH_SEND_TIMED_OUT␉␉0x10000004␊ |
671 | ␉␉/* Message not sent before timeout expired. */␊ |
672 | #define MACH_SEND_INTERRUPTED␉␉0x10000007␊ |
673 | ␉␉/* Software interrupt. */␊ |
674 | #define MACH_SEND_MSG_TOO_SMALL␉␉0x10000008␊ |
675 | ␉␉/* Data doesn't contain a complete message. */␊ |
676 | #define MACH_SEND_INVALID_REPLY␉␉0x10000009␊ |
677 | ␉␉/* Bogus reply port. */␊ |
678 | #define MACH_SEND_INVALID_RIGHT␉␉0x1000000a␊ |
679 | ␉␉/* Bogus port rights in the message body. */␊ |
680 | #define MACH_SEND_INVALID_NOTIFY␉0x1000000b␊ |
681 | ␉␉/* Bogus notify port argument. */␊ |
682 | #define MACH_SEND_INVALID_MEMORY␉0x1000000c␊ |
683 | ␉␉/* Invalid out-of-line memory pointer. */␊ |
684 | #define MACH_SEND_NO_BUFFER␉␉0x1000000d␊ |
685 | ␉␉/* No message buffer is available. */␊ |
686 | #define MACH_SEND_TOO_LARGE␉␉0x1000000e␊ |
687 | ␉␉/* Send is too large for port */␊ |
688 | #define MACH_SEND_INVALID_TYPE␉␉0x1000000f␊ |
689 | ␉␉/* Invalid msg-type specification. */␊ |
690 | #define MACH_SEND_INVALID_HEADER␉0x10000010␊ |
691 | ␉␉/* A field in the header had a bad value. */␊ |
692 | #define MACH_SEND_INVALID_TRAILER␉0x10000011␊ |
693 | ␉␉/* The trailer to be sent does not match kernel format. */␊ |
694 | #define MACH_SEND_INVALID_RT_OOL_SIZE␉0x10000015␊ |
695 | ␉␉/* compatibility: no longer a returned error */␊ |
696 | ␊ |
697 | #define MACH_RCV_IN_PROGRESS␉␉0x10004001␊ |
698 | ␉␉/* Thread is waiting for receive. (Internal use only.) */␊ |
699 | #define MACH_RCV_INVALID_NAME␉␉0x10004002␊ |
700 | ␉␉/* Bogus name for receive port/port-set. */␊ |
701 | #define MACH_RCV_TIMED_OUT␉␉0x10004003␊ |
702 | ␉␉/* Didn't get a message within the timeout value. */␊ |
703 | #define MACH_RCV_TOO_LARGE␉␉0x10004004␊ |
704 | ␉␉/* Message buffer is not large enough for inline data. */␊ |
705 | #define MACH_RCV_INTERRUPTED␉␉0x10004005␊ |
706 | ␉␉/* Software interrupt. */␊ |
707 | #define MACH_RCV_PORT_CHANGED␉␉0x10004006␊ |
708 | ␉␉/* compatibility: no longer a returned error */␊ |
709 | #define MACH_RCV_INVALID_NOTIFY␉␉0x10004007␊ |
710 | ␉␉/* Bogus notify port argument. */␊ |
711 | #define MACH_RCV_INVALID_DATA␉␉0x10004008␊ |
712 | ␉␉/* Bogus message buffer for inline data. */␊ |
713 | #define MACH_RCV_PORT_DIED␉␉0x10004009␊ |
714 | ␉␉/* Port/set was sent away/died during receive. */␊ |
715 | #define␉MACH_RCV_IN_SET␉␉␉0x1000400a␊ |
716 | ␉␉/* compatibility: no longer a returned error */␊ |
717 | #define␉MACH_RCV_HEADER_ERROR␉␉0x1000400b␊ |
718 | ␉␉/* Error receiving message header. See special bits. */␊ |
719 | #define␉MACH_RCV_BODY_ERROR␉␉0x1000400c␊ |
720 | ␉␉/* Error receiving message body. See special bits. */␊ |
721 | #define␉MACH_RCV_INVALID_TYPE␉␉0x1000400d␊ |
722 | ␉␉/* Invalid msg-type specification in scatter list. */␊ |
723 | #define␉MACH_RCV_SCATTER_SMALL␉␉0x1000400e␊ |
724 | ␉␉/* Out-of-line overwrite region is not large enough */␊ |
725 | #define MACH_RCV_INVALID_TRAILER␉0x1000400f␊ |
726 | ␉␉/* trailer type or number of trailer elements not supported */␊ |
727 | #define MACH_RCV_IN_PROGRESS_TIMED 0x10004011␊ |
728 | /* Waiting for receive with timeout. (Internal use only.) */␊ |
729 | ␊ |
730 | ␊ |
731 | __BEGIN_DECLS␊ |
732 | ␊ |
733 | /*␊ |
734 | *␉Routine:␉mach_msg_overwrite␊ |
735 | *␉Purpose:␊ |
736 | *␉␉Send and/or receive a message. If the message operation␊ |
737 | *␉␉is interrupted, and the user did not request an indication␊ |
738 | *␉␉of that fact, then restart the appropriate parts of the␊ |
739 | *␉␉operation silently (trap version does not restart).␊ |
740 | *␊ |
741 | *␉␉Distinct send and receive buffers may be specified. If␊ |
742 | *␉␉no separate receive buffer is specified, the msg parameter␊ |
743 | *␉␉will be used for both send and receive operations.␊ |
744 | *␊ |
745 | *␉␉In addition to a distinct receive buffer, that buffer may␊ |
746 | *␉␉already contain scatter control information to direct the␊ |
747 | *␉␉receiving of the message.␊ |
748 | */␊ |
749 | ␊ |
750 | extern mach_msg_return_t␉mach_msg_overwrite(␊ |
751 | ␉␉␉␉␉mach_msg_header_t *msg,␊ |
752 | ␉␉␉␉␉mach_msg_option_t option,␊ |
753 | ␉␉␉␉␉mach_msg_size_t send_size,␊ |
754 | ␉␉␉␉␉mach_msg_size_t rcv_size,␊ |
755 | ␉␉␉␉␉mach_port_name_t rcv_name,␊ |
756 | ␉␉␉␉␉mach_msg_timeout_t timeout,␊ |
757 | ␉␉␉␉␉mach_port_name_t notify,␊ |
758 | ␉␉␉␉␉mach_msg_header_t *rcv_msg,␊ |
759 | ␉␉␉␉␉mach_msg_size_t rcv_limit);␊ |
760 | ␊ |
761 | ␊ |
762 | /*␊ |
763 | *␉Routine:␉mach_msg␊ |
764 | *␉Purpose:␊ |
765 | *␉␉Send and/or receive a message. If the message operation␊ |
766 | *␉␉is interrupted, and the user did not request an indication␊ |
767 | *␉␉of that fact, then restart the appropriate parts of the␊ |
768 | *␉␉operation silently (trap version does not restart).␊ |
769 | */␊ |
770 | extern mach_msg_return_t␉mach_msg(␊ |
771 | ␉␉␉␉␉mach_msg_header_t *msg,␊ |
772 | ␉␉␉␉␉mach_msg_option_t option,␊ |
773 | ␉␉␉␉␉mach_msg_size_t send_size,␊ |
774 | ␉␉␉␉␉mach_msg_size_t rcv_size,␊ |
775 | ␉␉␉␉␉mach_port_name_t rcv_name,␊ |
776 | ␉␉␉␉␉mach_msg_timeout_t timeout,␊ |
777 | ␉␉␉␉␉mach_port_name_t notify);␊ |
778 | ␊ |
779 | ␊ |
780 | __END_DECLS␊ |
781 | ␊ |
782 | #endif␉/* _MACH_MESSAGE_H_ */␊ |
783 | ␊ |
784 |