1/*
2 * Copyright (c) 2000 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 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 * File:	device/device.defs
58 * Author:	Douglas Orr
59 *		Feb 10, 1988
60 * Abstract:
61 *	Mach device support.  Mach devices are accessed through
62 *	block and character device interfaces to the kernel.
63 */
64
65subsystem
66#if	KERNEL_SERVER
67	  KernelServer
68#endif	/* KERNEL_SERVER */
69		       iokit 2800;
70
71#if IOKITSIMD || KERNEL_SERVER
72#define IOKIT_ALL_IPC 1
73#endif
74
75#include <mach/std_types.defs>
76#include <mach/mach_types.defs>
77#include <mach/clock_types.defs>
78#include <mach/clock_types.defs>
79
80#if !__LP64__
81#    define __ILP32__ 1
82#endif
83
84import <device/device_types.h>;
85
86serverprefix	is_;
87
88type reply_port_t = MACH_MSG_TYPE_MAKE_SEND_ONCE | polymorphic
89	ctype: mach_port_t;
90
91#if	IOKIT
92
93type io_name_t            = c_string[*:128];
94type io_string_t          = c_string[*:512];
95type io_struct_inband_t   = array[*:4096] of char;
96type io_buf_ptr_t	  = ^array[] of MACH_MSG_TYPE_INTEGER_8;
97type NDR_record_t         = struct[8] of char;
98
99#if KERNEL
100type io_user_scalar_t     = uint64_t;
101type io_user_reference_t  = uint64_t;
102type io_scalar_inband_t   = array[*:16] of int;
103// must be the same type as OSAsyncReference
104type io_async_ref_t 	  = array[*:8]  of natural_t;
105type io_scalar_inband64_t = array[*:16] of io_user_scalar_t;
106type io_async_ref64_t 	  = array[*:8]  of io_user_reference_t;
107#elif __LP64__
108type io_user_scalar_t     = uint64_t;
109type io_user_reference_t  = uint64_t;
110type io_scalar_inband_t   = array[*:16] of io_user_scalar_t;
111type io_async_ref_t 	  = array[*:8]  of io_user_reference_t;
112type io_scalar_inband64_t = array[*:16] of io_user_scalar_t;
113type io_async_ref64_t 	  = array[*:8]  of io_user_reference_t;
114#else
115type io_user_scalar_t     = int;
116type io_user_reference_t  = natural_t;
117type io_scalar_inband_t   = array[*:16] of io_user_scalar_t;
118type io_async_ref_t 	  = array[*:8]  of io_user_reference_t;
119type io_scalar_inband64_t = array[*:16] of uint64_t;
120type io_async_ref64_t 	  = array[*:8]  of uint64_t;
121#endif // __LP64__
122
123type io_object_t = mach_port_t
124		ctype: mach_port_t
125#if	KERNEL_SERVER
126		intran: io_object_t iokit_lookup_object_port(mach_port_t)
127		outtran: mach_port_t iokit_make_object_port(io_object_t)
128		destructor: iokit_remove_reference(io_object_t)
129#endif	/* KERNEL_SERVER */
130		;
131
132type io_connect_t = mach_port_t
133		ctype: mach_port_t
134#if	KERNEL_SERVER
135		intran: io_connect_t iokit_lookup_connect_port(mach_port_t)
136		outtran: mach_port_t iokit_make_connect_port(io_connect_t)
137		destructor: iokit_remove_reference(io_connect_t)
138#endif	/* KERNEL_SERVER */
139		;
140
141routine io_object_get_class(
142	    object		: io_object_t;
143	out className		: io_name_t
144	);
145
146routine io_object_conforms_to(
147	    object		: io_object_t;
148	in  className		: io_name_t;
149	out conforms		: boolean_t
150	);
151
152routine io_iterator_next(
153	    iterator		: io_object_t;
154	out object		: io_object_t
155	);
156
157routine io_iterator_reset(
158	    iterator		: io_object_t
159	);
160
161routine io_service_get_matching_services(
162	    master_port		: mach_port_t;
163	in  matching		: io_string_t;
164	out existing		: io_object_t
165	);
166
167routine io_registry_entry_get_property(
168	    registry_entry	: io_object_t;
169	in  property_name	: io_name_t;
170	out properties		: io_buf_ptr_t, physicalcopy
171	);
172
173routine io_registry_create_iterator(
174	    master_port		: mach_port_t;
175	in  plane		: io_name_t;
176	in  options		: uint32_t;
177	out iterator		: io_object_t
178	);
179
180routine io_registry_iterator_enter_entry(
181	    iterator		: io_object_t
182	);
183
184routine io_registry_iterator_exit_entry(
185	    iterator		: io_object_t
186	);
187
188routine io_registry_entry_from_path(
189	    master_port		: mach_port_t;
190	in  path		: io_string_t;
191	out registry_entry	: io_object_t
192	);
193
194routine io_registry_entry_get_name(
195	    registry_entry	: io_object_t;
196	out name		: io_name_t
197	);
198
199routine io_registry_entry_get_properties(
200	    registry_entry	: io_object_t;
201	out properties		: io_buf_ptr_t, physicalcopy
202	);
203
204routine io_registry_entry_get_property_bytes(
205	    registry_entry	: io_object_t;
206	in  property_name	: io_name_t;
207	out data		: io_struct_inband_t, CountInOut
208	);
209
210routine io_registry_entry_get_child_iterator(
211	    registry_entry	: io_object_t;
212	in  plane		: io_name_t;
213	out iterator		: io_object_t
214	);
215
216routine io_registry_entry_get_parent_iterator(
217	    registry_entry	: io_object_t;
218	in  plane		: io_name_t;
219	out iterator		: io_object_t
220	);
221
222skip;
223/* was routine io_service_open
224	    service		: io_object_t;
225	in  owningTask		: task_t;
226	in  connect_type	: uint32_t;
227	out connection		: io_connect_t
228	);
229*/
230
231routine io_service_close(
232	    connection		: io_connect_t
233	);
234
235routine io_connect_get_service(
236	    connection		: io_connect_t;
237	out service		: io_object_t
238	);
239
240#if  IOKIT_ALL_IPC || __ILP32__
241routine io_connect_set_notification_port(
242	    connection		: io_connect_t;
243	in  notification_type	: uint32_t;
244	in  port		: mach_port_make_send_t;
245	in  reference		: uint32_t
246	);
247
248routine io_connect_map_memory(
249	    connection		: io_connect_t;
250	in  memory_type		: uint32_t;
251	in  into_task		: task_t;
252#if  IOKIT_ALL_IPC
253	inout address		: uint32_t;
254	inout size		: uint32_t;
255#else
256	inout address		: vm_address_t;
257	inout size		: vm_size_t;
258#endif
259	in  flags		: uint32_t
260	);
261#else
262skip;
263skip;
264#endif
265
266routine io_connect_add_client(
267	    connection		: io_connect_t;
268	in  connect_to		: io_connect_t
269	);
270
271routine io_connect_set_properties(
272	    connection		: io_connect_t;
273	in  properties		: io_buf_ptr_t, physicalcopy;
274        out result		: kern_return_t
275	);
276
277#if  IOKIT_ALL_IPC || (__ILP32__ && !MAP_32B_METHODS)
278routine io_connect_method_scalarI_scalarO(
279	    connection		: io_connect_t;
280	in  selector		: uint32_t;
281	in  input		: io_scalar_inband_t;
282	out output		: io_scalar_inband_t, CountInOut
283	);
284
285routine io_connect_method_scalarI_structureO(
286	    connection		: io_connect_t;
287	in  selector		: uint32_t;
288	in  input		: io_scalar_inband_t;
289	out output		: io_struct_inband_t, CountInOut
290	);
291
292routine io_connect_method_scalarI_structureI(
293	    connection		: io_connect_t;
294	in  selector		: uint32_t;
295	in  input		: io_scalar_inband_t;
296	in  inputStruct		: io_struct_inband_t
297	);
298
299routine io_connect_method_structureI_structureO(
300	    connection		: io_connect_t;
301	in  selector		: uint32_t;
302	in  input		: io_struct_inband_t;
303	out output		: io_struct_inband_t, CountInOut
304	);
305#else
306skip;
307skip;
308skip;
309skip;
310#endif
311
312routine io_registry_entry_get_path(
313	    registry_entry	: io_object_t;
314	in  plane		: io_name_t;
315	out path		: io_string_t
316	);
317
318routine io_registry_get_root_entry(
319	    master_port		: mach_port_t;
320	out root		: io_object_t
321	);
322
323routine io_registry_entry_set_properties(
324	    registry_entry	: io_object_t;
325	in  properties		: io_buf_ptr_t, physicalcopy;
326        out result		: kern_return_t
327	);
328
329routine io_registry_entry_in_plane(
330	    registry_entry	: io_object_t;
331	in  plane		: io_name_t;
332	out inPlane		: boolean_t
333	);
334
335routine io_object_get_retain_count(
336	    object		: io_object_t;
337	out retainCount		: uint32_t
338	);
339
340routine io_service_get_busy_state(
341	    service		: io_object_t;
342	out busyState		: uint32_t
343	);
344
345routine io_service_wait_quiet(
346	    service		: io_object_t;
347	    wait_time		: mach_timespec_t
348	);
349
350routine io_registry_entry_create_iterator(
351	    registry_entry	: io_object_t;
352	in  plane		: io_name_t;
353	in  options		: uint32_t;
354	out iterator		: io_object_t
355	);
356
357routine io_iterator_is_valid(
358	    iterator		: io_object_t;
359	out is_valid		: boolean_t
360	);
361
362skip;
363/* was routine io_make_matching(
364	    master_port		: mach_port_t;
365	in  of_type		: uint32_t;
366	in  options		: uint32_t;
367	in  input		: io_struct_inband_t;
368	out matching		: io_string_t
369	);
370*/
371
372routine io_catalog_send_data(
373	    master_port		: mach_port_t;
374        in  flag                : uint32_t;
375	in  inData		: io_buf_ptr_t;
376        out result		: kern_return_t
377	);
378
379routine io_catalog_terminate(
380	    master_port		: mach_port_t;
381        in  flag                : uint32_t;
382	in  name		: io_name_t
383	);
384
385routine io_catalog_get_data(
386	    master_port		: mach_port_t;
387        in  flag                : uint32_t;
388	out outData		: io_buf_ptr_t
389	);
390
391routine io_catalog_get_gen_count(
392	    master_port		: mach_port_t;
393        out genCount            : uint32_t
394	);
395
396routine io_catalog_module_loaded(
397	    master_port		: mach_port_t;
398	in  name		: io_name_t
399	);
400
401routine io_catalog_reset(
402	    master_port		: mach_port_t;
403	in  flag		: uint32_t
404	);
405
406routine io_service_request_probe(
407	    service		: io_object_t;
408	in  options		: uint32_t
409	);
410
411routine io_registry_entry_get_name_in_plane(
412	    registry_entry	: io_object_t;
413	in  plane		: io_name_t;
414	out name		: io_name_t
415	);
416
417routine io_service_match_property_table(
418	    service		: io_object_t;
419	in  matching		: io_string_t;
420	out matches		: boolean_t
421	);
422
423#if  IOKIT_ALL_IPC || (__ILP32__ && !MAP_32B_ASYNC_METHODS)
424routine io_async_method_scalarI_scalarO(
425	    connection		: io_connect_t;
426	in  wake_port		: mach_port_make_send_t;
427	in  reference		: io_async_ref_t;
428	in  selector		: uint32_t;
429	in  input		: io_scalar_inband_t;
430	out output		: io_scalar_inband_t, CountInOut
431	);
432routine io_async_method_scalarI_structureO(
433	    connection		: io_connect_t;
434	in  wake_port		: mach_port_make_send_t;
435	in  reference		: io_async_ref_t;
436	in  selector		: uint32_t;
437	in  input		: io_scalar_inband_t;
438	out output		: io_struct_inband_t, CountInOut
439	);
440routine io_async_method_scalarI_structureI(
441	    connection		: io_connect_t;
442	in  wake_port		: mach_port_make_send_t;
443	in  reference		: io_async_ref_t;
444	in  selector		: uint32_t;
445	in  input		: io_scalar_inband_t;
446	in  inputStruct		: io_struct_inband_t
447	);
448routine io_async_method_structureI_structureO(
449	    connection		: io_connect_t;
450	in  wake_port		: mach_port_make_send_t;
451	in  reference		: io_async_ref_t;
452	in  selector		: uint32_t;
453	in  input		: io_struct_inband_t;
454	out output		: io_struct_inband_t, CountInOut
455	);
456#else
457skip;
458skip;
459skip;
460skip;
461#endif
462
463#if IOKIT_ALL_IPC || __ILP32__
464routine io_service_add_notification(
465	    master_port		: mach_port_t;
466	in  notification_type	: io_name_t;
467	in  matching		: io_string_t;
468	in  wake_port		: mach_port_make_send_t;
469	in  reference		: io_async_ref_t;
470	out notification	: io_object_t
471	);
472routine io_service_add_interest_notification(
473	    service		: io_object_t;
474	in  type_of_interest	: io_name_t;
475	in  wake_port		: mach_port_make_send_t;
476	in  reference		: io_async_ref_t;
477	out notification	: io_object_t
478        );
479routine io_service_acknowledge_notification(
480           service             : io_object_t;
481       in  notify_ref          : natural_t;
482       in  response            : natural_t
483        );
484#else
485skip;
486skip;
487skip;
488#endif
489
490routine io_connect_get_notification_semaphore(
491	    connection		: io_connect_t;
492	in  notification_type	: natural_t;
493	out semaphore		: semaphore_t
494	);
495
496#if IOKIT_ALL_IPC || __ILP32__
497routine io_connect_unmap_memory(
498	    connection		: io_connect_t;
499	in  memory_type		: uint32_t;
500	in  into_task		: task_t;
501#if IOKIT_ALL_IPC
502	in  address		: uint32_t
503#else
504	in  address		: vm_address_t
505#endif
506	);
507#else
508skip;
509#endif
510
511routine io_registry_entry_get_location_in_plane(
512	    registry_entry	: io_object_t;
513	in  plane		: io_name_t;
514	out location		: io_name_t
515	);
516
517routine io_registry_entry_get_property_recursively(
518	    registry_entry	: io_object_t;
519	in  plane		: io_name_t;
520	in  property_name	: io_name_t;
521	in  options		: uint32_t;
522	out properties		: io_buf_ptr_t, physicalcopy
523	);
524
525routine io_service_get_state(
526	    service		: io_object_t;
527	out state		: uint64_t;
528	out busy_state		: uint32_t;
529	out accumulated_busy_time : uint64_t
530	);
531
532routine io_service_get_matching_services_ool(
533	    master_port		: mach_port_t;
534	in  matching		: io_buf_ptr_t, physicalcopy;
535        out result		: kern_return_t;
536	out existing		: io_object_t
537	);
538
539routine io_service_match_property_table_ool(
540	    service		: io_object_t;
541	in  matching		: io_buf_ptr_t, physicalcopy;
542        out result		: kern_return_t;
543	out matches		: boolean_t
544	);
545
546#if IOKIT_ALL_IPC || __ILP32__
547routine io_service_add_notification_ool(
548	    master_port		: mach_port_t;
549	in  notification_type	: io_name_t;
550	in  matching		: io_buf_ptr_t, physicalcopy;
551	in  wake_port		: mach_port_make_send_t;
552	in  reference		: io_async_ref_t;
553        out result		: kern_return_t;
554	out notification	: io_object_t
555	);
556#else
557skip;
558#endif
559
560routine io_object_get_superclass(
561	    master_port		: mach_port_t;
562	in  obj_name			: io_name_t;
563	out class_name          : io_name_t
564        );
565
566routine io_object_get_bundle_identifier(
567	    master_port		: mach_port_t;
568	in  obj_name			: io_name_t;
569	out class_name          : io_name_t
570        );
571
572routine io_service_open_extended(
573	    service		: io_object_t;
574	in  owningTask		: task_t;
575	in  connect_type	: uint32_t;
576	in  ndr			: NDR_record_t;
577	in  properties		: io_buf_ptr_t, physicalcopy;
578        out result		: kern_return_t;
579	out connection		: io_connect_t
580	);
581
582
583/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
584
585routine io_connect_map_memory_into_task(
586	    connection		: io_connect_t;
587	in  memory_type		: uint32_t;
588	in  into_task		: task_t;
589	inout address		: mach_vm_address_t;
590	inout size		: mach_vm_size_t;
591	in  flags		: uint32_t
592	);
593
594routine io_connect_unmap_memory_from_task(
595	    connection		: io_connect_t;
596	in  memory_type		: uint32_t;
597	in  from_task		: task_t;
598	in  address		: mach_vm_address_t
599	);
600
601routine io_connect_method(
602	    connection		: io_connect_t;
603	in  selector		: uint32_t;
604
605	in  scalar_input	: io_scalar_inband64_t;
606	in  inband_input	: io_struct_inband_t;
607	in  ool_input		: mach_vm_address_t;
608	in  ool_input_size	: mach_vm_size_t;
609
610	out inband_output	: io_struct_inband_t, CountInOut;
611	out scalar_output	: io_scalar_inband64_t, CountInOut;
612	in  ool_output		: mach_vm_address_t;
613	inout ool_output_size	: mach_vm_size_t
614	);
615
616routine io_connect_async_method(
617	    connection		: io_connect_t;
618	in  wake_port		: mach_port_make_send_t;
619	in  reference		: io_async_ref64_t;
620	in  selector		: uint32_t;
621
622	in  scalar_input	: io_scalar_inband64_t;
623	in  inband_input	: io_struct_inband_t;
624	in  ool_input		: mach_vm_address_t;
625	in  ool_input_size	: mach_vm_size_t;
626
627	out inband_output	: io_struct_inband_t, CountInOut;
628	out scalar_output	: io_scalar_inband64_t, CountInOut;
629	in  ool_output		: mach_vm_address_t;
630	inout  ool_output_size	: mach_vm_size_t
631	);
632
633
634#if IOKIT_ALL_IPC || __LP64__
635
636#if IOKIT_ALL_IPC
637#define FUNC_NAME(name) name ## _64
638#else
639#define FUNC_NAME(name) name
640#endif
641
642routine FUNC_NAME(io_connect_set_notification_port)(
643	    connection		: io_connect_t;
644	in  notification_type	: uint32_t;
645	in  port		: mach_port_make_send_t;
646	in  reference		: io_user_reference_t
647	);
648
649routine FUNC_NAME(io_service_add_notification)(
650	    master_port		: mach_port_t;
651	in  notification_type	: io_name_t;
652	in  matching		: io_string_t;
653	in  wake_port		: mach_port_make_send_t;
654	in  reference		: io_async_ref64_t;
655	out notification	: io_object_t
656	);
657
658routine FUNC_NAME(io_service_add_interest_notification)(
659	    service		: io_object_t;
660	in  type_of_interest	: io_name_t;
661	in  wake_port		: mach_port_make_send_t;
662	in  reference		: io_async_ref64_t;
663	out notification	: io_object_t
664	);
665
666routine FUNC_NAME(io_service_add_notification_ool)(
667	    master_port		: mach_port_t;
668	in  notification_type	: io_name_t;
669	in  matching		: io_buf_ptr_t, physicalcopy;
670	in  wake_port		: mach_port_make_send_t;
671	in  reference		: io_async_ref64_t;
672        out result		: kern_return_t;
673	out notification	: io_object_t
674	);
675
676#else
677
678    skip;
679    skip;
680    skip;
681    skip;
682
683#endif /* IOKIT_ALL_IPC || __LP64__ */
684
685routine io_registry_entry_get_registry_entry_id(
686	    registry_entry	: io_object_t;
687	out entry_id		: uint64_t
688	);
689
690routine io_connect_method_var_output(
691	    connection		: io_connect_t;
692	in  selector		: uint32_t;
693
694	in  scalar_input	: io_scalar_inband64_t;
695	in  inband_input	: io_struct_inband_t;
696	in  ool_input		: mach_vm_address_t;
697	in  ool_input_size	: mach_vm_size_t;
698
699	out inband_output	: io_struct_inband_t, CountInOut;
700	out scalar_output	: io_scalar_inband64_t, CountInOut;
701	out var_output		: io_buf_ptr_t, physicalcopy
702	);
703
704routine io_service_get_matching_service(
705	    master_port		: mach_port_t;
706	in  matching		: io_string_t;
707	out service		: io_object_t
708	);
709
710routine io_service_get_matching_service_ool(
711	    master_port		: mach_port_t;
712	in  matching		: io_buf_ptr_t, physicalcopy;
713        out result		: kern_return_t;
714	out service		: io_object_t
715	);
716
717
718#endif /* IOKIT */
719
720/* vim: set ft=c : */
721