|
|
1.1 root 1: \input texinfo @c -*- Texinfo -*-
2: @setfilename mach.info
3: @settitle The GNU Mach Reference Manual
4: @setchapternewpage odd
5:
6: @comment Tell install-info what to do.
7: @dircategory Kernel
8: @direntry
9: * GNUMach: (mach). Using and programming the GNU Mach microkernel.
10: @end direntry
11:
12: @c Should have a glossary.
13: @c Unify some of our indices.
14: @syncodeindex pg cp
15: @syncodeindex vr fn
16: @syncodeindex tp fn
17:
18: @c Get the Mach version we are documenting.
19: @include version.texi
20: @set EDITION 0.4
21: @set UPDATED 2001-09-01
22: @c @set ISBN X-XXXXXX-XX-X
23:
24: @ifinfo
25: This file documents the GNU Mach microkernel.
26:
27: This is Edition @value{EDITION}, last updated @value{UPDATED}, of
28: @cite{The GNU Mach Reference Manual}, for Version @value{VERSION}.
29:
30: Copyright @copyright{} 2001 Free Software Foundation, Inc.
31:
32: Permission is granted to copy, distribute and/or modify this document
33: under the terms of the GNU Free Documentation License, Version 1.1 or
34: any later version published by the Free Software Foundation; with the
35: Invariant Sections being "Free Software Needs Free Documentation" and
36: "GNU Lesser General Public License", the Front-Cover texts being (a)
37: (see below), and with the Back-Cover Texts being (b) (see below). A
38: copy of the license is included in the section entitled "GNU Free
39: Documentation License".
40:
41: (a) The FSF's Front-Cover Text is:
42:
43: A GNU Manual
44:
45: (b) The FSF's Back-Cover Text is:
46:
47: You have freedom to copy and modify this GNU Manual, like GNU
48: software. Copies published by the Free Software Foundation raise
49: funds for GNU development.
50:
51: This work is based on manual pages under the following copyright and license:
52:
53: @noindent
54: Mach Operating System@*
55: Copyright @copyright{} 1991,1990 Carnegie Mellon University@*
56: All Rights Reserved.
57:
58: Permission to use, copy, modify and distribute this software and its
59: documentation is hereby granted, provided that both the copyright
60: notice and this permission notice appear in all copies of the
61: software, derivative works or modified versions, and any portions
62: thereof, and that both notices appear in supporting documentation.
63:
64: CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
65: CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
66: ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
67: @end ifinfo
68:
69: @iftex
70: @shorttitlepage The GNU Mach Reference Manual
71: @end iftex
72: @titlepage
73: @center @titlefont{The GNU Mach}
74: @sp 1
75: @center @titlefont{Reference Manual}
76: @sp 2
77: @center Marcus Brinkmann
78: @center with
79: @center Gordon Matzigkeit, Gibran Hasnaoui,
80: @center Robert V. Baron, Richard P. Draves, Mary R. Thompson, Joseph S. Barrera
81: @sp 3
82: @center Edition @value{EDITION}
83: @sp 1
84: @center last updated @value{UPDATED}
85: @sp 1
86: @center for version @value{VERSION}
87: @page
88: @vskip 0pt plus 1filll
89: Copyright @copyright{} 2001 Free Software Foundation, Inc.
90: @c @sp 2
91: @c Published by the Free Software Foundation @*
92: @c 59 Temple Place -- Suite 330, @*
93: @c Boston, MA 02111-1307 USA @*
94: @c ISBN @value{ISBN} @*
95:
96: Permission is granted to copy, distribute and/or modify this document
97: under the terms of the GNU Free Documentation License, Version 1.1 or
98: any later version published by the Free Software Foundation; with the
99: Invariant Sections being "Free Software Needs Free Documentation" and
100: "GNU Lesser General Public License", the Front-Cover texts being (a)
101: (see below), and with the Back-Cover Texts being (b) (see below). A
102: copy of the license is included in the section entitled "GNU Free
103: Documentation License".
104:
105: (a) The FSF's Front-Cover Text is:
106:
107: A GNU Manual
108:
109: (b) The FSF's Back-Cover Text is:
110:
111: You have freedom to copy and modify this GNU Manual, like GNU
112: software. Copies published by the Free Software Foundation raise
113: funds for GNU development.
114:
115: This work is based on manual pages under the following copyright and license:
116:
117: @noindent
118: Mach Operating System@*
119: Copyright @copyright{} 1991,1990 Carnegie Mellon University@*
120: All Rights Reserved.
121:
122: Permission to use, copy, modify and distribute this software and its
123: documentation is hereby granted, provided that both the copyright
124: notice and this permission notice appear in all copies of the
125: software, derivative works or modified versions, and any portions
126: thereof, and that both notices appear in supporting documentation.
127:
128: CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
129: CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
130: ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
131: @end titlepage
132: @c @titlepage
133: @c @finalout
134: @c @title The GNU Mach Reference Manual
135: @c @author Marcus Brinkmann
136: @c @author Gordon Matzigkeit
137: @c @author Gibran Hasnaoui
138:
139: @c @author Robert V. Baron @c (rvb)
140: @c @author Richard P. Draves @c (rpd)
141: @c @author Mary R. Thompson @c (mrt)
142: @c @author Joseph S. Barrera @c (jsb)
143: @c @c The following occur rarely in the rcs commit logs of the man pages:
144: @c @c Dan Stodolsky, (danner)
145: @c @c David B. Golub, (dbg)
146: @c @c Terri Watson, (elf)
147: @c @c Lori Iannamico, (lli) [distribution coordinator]
148: @c @c Further authors of kernel_interfaces.ps:
149: @c @c David Black [OSF]
150: @c @c William Bolosky
151: @c @c Jonathan Chew
152: @c @c Alessandro Forin
153: @c @c Richard F. Rashid
154: @c @c Avadis Tevanian Jr.
155: @c @c Michael W. Young
156: @c @c See also
157: @c @c http://www.cs.cmu.edu/afs/cs/project/mach/public/www/people-former.html
158: @page
159:
160: @ifnottex
161: @node Top
162: @top Main Menu
163: This is Edition @value{EDITION}, last updated @value{UPDATED}, of
164: @cite{The GNU Mach Reference Manual}, for Version @value{VERSION} of the
165: GNU Mach microkernel.
166: @end ifnottex
167:
168: @menu
169: * Introduction:: How to use this manual.
170: * Installing:: Setting up GNU Mach on your computer.
171: * Bootstrap:: Running GNU Mach on your machine.
172: * Inter Process Communication:: Communication between process.
173: * Virtual Memory Interface:: Allocating and deallocating virtual memory.
174: * External Memory Management:: Handling memory pages in user space.
175: * Threads and Tasks:: Handling of threads and tasks.
176: * Host Interface:: Interface to a Mach host.
177: * Processors and Processor Sets:: Handling processors and sets of processors.
178: * Device Interface:: Accessing kernel devices.
179: * Kernel Debugger:: How to use the built-in kernel debugger.
180:
181: Appendices
182:
183: * Copying:: The GNU General Public License says how you
184: can copy and share the GNU Mach microkernel.
185: * Documentation License:: This manual is under the GNU Free
186: Documentation License.
187:
188: Indices
189:
190: * Concept Index:: Index of concepts and programs.
191: * Function and Data Index:: Index of functions, variables and data types.
192:
193:
194: @detailmenu
195: --- The Detailed Node Listing ---
196:
197: Introduction
198:
199: * Audience:: The people for whom this manual is written.
200: * Features:: Reasons to install and use GNU Mach.
201: * Overview:: Basic architecture of the Mach microkernel.
202: * History:: The story about Mach.
203:
204: Installing
205:
206: * Binary Distributions:: Obtaining ready-to-run GNU distributions.
207: * Compilation:: Building GNU Mach from its source code.
208: * Configuration:: Configuration options at compilation time.
209: * Cross-Compilation:: Building GNU Mach from another system.
210:
211: Bootstrap
212:
213: * Bootloader:: Starting the microkernel, or other OSes.
214: * Modules:: Starting the first task of the OS.
215:
216: Inter Process Communication
217:
218: * Major Concepts:: The concepts behind the Mach IPC system.
219: * Messaging Interface:: Composing, sending and receiving messages.
220: * Port Manipulation Interface:: Manipulating ports, port rights, port sets.
221:
222: Messaging Interface
223:
224: * Mach Message Call:: Sending and receiving messages.
225: * Message Format:: The format of Mach messages.
226: * Exchanging Port Rights:: Sending and receiving port rights.
227: * Memory:: Passing memory regions in messages.
228: * Message Send:: Sending messages.
229: * Message Receive:: Receiving messages.
230: * Atomicity:: Atomicity of port rights.
231:
232: Port Manipulation Interface
233:
234: * Port Creation:: How to create new ports and port sets.
235: * Port Destruction:: How to destroy ports and port sets.
236: * Port Names:: How to query and manipulate port names.
237: * Port Rights:: How to work with port rights.
238: * Ports and other Tasks:: How to move rights between tasks.
239: * Receive Rights:: How to work with receive rights.
240: * Port Sets:: How to work with port sets.
241: * Request Notifications:: How to request notifications for events.
242: @c * Inherited Ports:: How to work with the inherited system ports.
243:
244: Virtual Memory Interface
245:
246: * Memory Allocation:: Allocation of new virtual memory.
247: * Memory Deallocation:: Freeing unused virtual memory.
248: * Data Transfer:: Reading, writing and copying memory.
249: * Memory Attributes:: Tweaking memory regions.
250: * Mapping Memory Objects:: How to map memory objects.
251: * Memory Statistics:: How to get statistics about memory usage.
252:
253: External Memory Management
254:
255: * Memory Object Server:: The basics of external memory management.
256: * Memory Object Creation:: How new memory objects are created.
257: * Memory Object Termination:: How memory objects are terminated.
258: * Memory Objects and Data:: Data transfer to and from memory objects.
259: * Memory Object Locking:: How memory objects are locked.
260: * Memory Object Attributes:: Manipulating attributes of memory objects.
261: * Default Memory Manager:: Setting and using the default memory manager.
262:
263: Threads and Tasks
264:
265: * Thread Interface:: Manipulating threads.
266: * Task Interface:: Manipulating tasks.
267: * Profiling:: Profiling threads and tasks.
268:
269: Thread Interface
270:
271: * Thread Creation:: Creating threads.
272: * Thread Termination:: Terminating threads.
273: * Thread Information:: How to get informations on threads.
274: * Thread Settings:: How to set threads related informations.
275: * Thread Execution:: How to control the thread's machine state.
276: * Scheduling:: Operations on thread scheduling.
277: * Thread Special Ports:: How to handle the thread's special ports.
278: * Exceptions:: Managing exceptions.
279:
280: Scheduling
281:
282: * Thread Priority:: Changing the priority of a thread.
283: * Hand-Off Scheduling:: Switch to a new thread.
284: * Scheduling Policy:: Setting the scheduling policy.
285:
286: Task Interface
287:
288: * Task Creation:: Creating tasks.
289: * Task Termination:: Terminating tasks.
290: * Task Information:: Informations on tasks.
291: * Task Execution:: Thread scheduling in a task.
292: * Task Special Ports:: How to get and set the task's special ports.
293: * Syscall Emulation:: How to emulate system calls.
294:
295: Host Interface
296:
297: * Host Ports:: Ports representing a host.
298: * Host Information:: Query information about a host.
299: * Host Time:: Functions to query manipulate the host time.
300: * Host Reboot:: Rebooting the system.
301:
302: Processors and Processor Sets
303:
304: * Processor Set Interface:: How to work with processor sets.
305: * Processor Interface:: How to work with individual processors.
306:
307: Processor Set Interface
308:
309: * Processor Set Ports:: Ports representing a processor set.
310: * Processor Set Access:: How the processor sets are accessed.
311: * Processor Set Creation:: How new processor sets are created.
312: * Processor Set Destruction:: How processor sets are destroyed.
313: * Tasks and Threads on Sets:: Assigning tasks or threads to processor sets.
314: * Processor Set Priority:: Specifying the priority of a processor set.
315: * Processor Set Policy:: Changing the processor set policies.
316: * Processor Set Info:: Obtaining information about a processor set.
317:
318: Processor Interface
319:
320: * Hosted Processors:: Getting a list of all processors on a host.
321: * Processor Control:: Starting, stopping, controlling processors.
322: * Processors and Sets:: Combining processors into processor sets.
323: * Processor Info:: Obtaining information on processors.
324:
325: Device Interface
326:
327: * Device Open:: Opening hardware devices.
328: * Device Close:: Closing hardware devices.
329: * Device Read:: Reading data from the device.
330: * Device Write:: Writing data to the device.
331: * Device Map:: Mapping devices into virtual memory.
332: * Device Status:: Querying and manipulating a device.
333: * Device Filter:: Filtering packets arriving on a device.
334:
335: Kernel Debugger
336:
337: * Operation:: Basic architecture of the kernel debugger.
338: * Commands:: Available commands in the kernel debugger.
339: * Variables:: Access of variables from the kernel debugger.
340: * Expressions:: Usage of expressions in the kernel debugger.
341:
342: Documentation License
343:
344: * Free Documentation License:: The GNU Free Documentation License.
345: * CMU License:: The CMU license applies to the original Mach
346: kernel and its documentation.
347:
348: @end detailmenu
349: @end menu
350:
351:
352: @node Introduction
353: @chapter Introduction
354:
355: GNU Mach is the microkernel of the GNU Project. It is the base of the
356: operating system, and provides its functionality to the Hurd servers,
357: the GNU C Library and all user applications. The microkernel itself
358: does not provide much functionality of the system, just enough to make
359: it possible for the Hurd servers and the C library to implement the missing
360: features you would expect from a POSIX compatible operating system.
361:
362: @menu
363: * Audience:: The people for whom this manual is written.
364: * Features:: Reasons to install and use GNU Mach.
365: * Overview:: Basic architecture of the Mach microkernel.
366: * History:: The story about Mach.
367: @end menu
368:
369:
370: @node Audience
371: @section Audience
372:
373: This manual is designed to be useful to everybody who is interested in
374: using, administering, or programming the Mach microkernel.
375:
376: If you are an end-user and you are looking for help on running the Mach
377: kernel, the first few chapters of this manual describe the essential
378: parts of installing and using the kernel in the GNU operating system.
379:
380: The rest of this manual is a technical discussion of the Mach
381: programming interface and its implementation, and would not be helpful
382: until you want to learn how to extend the system or modify the kernel.
383:
384: This manual is organized according to the subsystems of Mach, and each
385: chapter begins with descriptions of conceptual ideas that are related to
386: that subsystem. If you are a programmer and want to learn more about,
387: say, the Mach IPC subsystem, you can skip to the IPC chapter
388: (@pxref{Inter Process Communication}), and read about the related
389: concepts and interface definitions.
390:
391:
392: @node Features
393: @section Features
394:
395: GNU Mach is not the most advanced microkernel known to the planet,
396: nor is it the fastest or smallest, but it has a rich set of interfaces and
397: some features which make it useful as the base of the Hurd system.
398:
399: @table @asis
400: @item it's free software
401: Anybody can use, modify, and redistribute it under the terms of the GNU
402: General Public License (@pxref{Copying}). GNU Mach is part of the GNU
403: system, which is a complete operating system licensed under the GPL.
404:
405: @item it's built to survive
406: As a microkernel, GNU Mach doesn't implement a lot of the features
407: commonly found in an operating system, but only the bare minimum
408: that is required to implement a full operating system on top of it.
409: This means that a lot of the operating system code is maintained outside
410: of GNU Mach, and while this code may go through a complete redesign, the
411: code of the microkernel can remain comparatively stable.
412:
413: @item it's scalable
414: Mach is particularly well suited for SMP and network cluster techniques.
415: Thread support is provided at the kernel level, and the kernel itself
416: takes advantage of that. Network transparency at the IPC level makes
417: resources of the system available across machine boundaries (with NORMA
418: IPC, currently not available in GNU Mach).
419:
420: @item it exists
421: The Mach microkernel is real software that works Right Now.
422: It is not a research or a proposal. You don't have to wait at all
423: before you can start using and developing it. Mach has been used in
424: many operating systems in the past, usually as the base for a single
425: UNIX server. In the GNU system, Mach is the base of a functional
426: multi-server operating system, the Hurd.
427: @end table
428:
429:
430: @node Overview
431: @section Overview
432:
433: @c This paragraph by Gordon Matzigkeit from the Hurd manual.
434: An operating system kernel provides a framework for programs to share a
435: computer's hardware resources securely and efficiently. This requires
436: that the programs are separated and protected from each other. To make
437: running multiple programs in parallel useful, there also needs to be a
438: facility for programs to exchange information by communication.
439:
440: The Mach microkernel provides abstractions of the underlying hardware
441: resources like devices and memory. It organizes the running programs
442: into tasks and threads (points of execution in the tasks). In addition,
443: Mach provides a rich interface for inter-process communication.
444:
445: What Mach does not provide is a POSIX compatible programming interface.
446: In fact, it has no understanding of file systems, POSIX process semantics,
447: network protocols and many more. All this is implemented in tasks
448: running on top of the microkernel. In the GNU operating system, the Hurd
449: servers and the C library share the responsibility to implement the POSIX
450: interface, and the additional interfaces which are specific to the GNU
451: system.
452:
453:
454: @node History
455: @section History
456:
457: XXX A few lines about the history of Mach here.
458:
459:
460: @node Installing
461: @chapter Installing
462:
463: Before you can use the Mach microkernel in your system you'll need to install
464: it and all components you want to use with it, e.g. the rest of the operating
465: system. You also need a bootloader to load the kernel from the storage
466: medium and run it when the computer is started.
467:
468: GNU Mach is only available for Intel i386-compatible architectures
469: (such as the Pentium) currently. If you have a different architecture
470: and want to run the GNU Mach microkernel, you will need to port the
471: kernel and all other software of the system to your machine's architecture.
472: Porting is an involved process which requires considerable programming skills,
473: and it is not recommended for the faint-of-heart.
474: If you have the talent and desire to do a port, contact
475: @email{bug-hurd@@gnu.org} in order to coordinate the effort.
476:
477: @menu
478: * Binary Distributions:: Obtaining ready-to-run GNU distributions.
479: * Compilation:: Building GNU Mach from its source code.
480: * Configuration:: Configuration options at compile time.
481: * Cross-Compilation:: Building GNU Mach from another system.
482: @end menu
483:
484:
485: @node Binary Distributions
486: @section Binary Distributions
487:
488: By far the easiest and best way to install GNU Mach and the operating
489: system is to obtain a GNU binary distribution. The GNU operating
490: system consists of GNU Mach, the Hurd, the C library and many applications.
491: Without the GNU operating system, you will only have a microkernel, which
492: is not very useful by itself, without the other programs.
493:
494: Building the whole operating system takes a huge effort, and you are well
495: advised to not do it yourself, but to get a binary distribution of the
496: GNU operating system. The distribution also includes a binary of the
497: GNU Mach microkernel.
498:
499: Information on how to obtain the GNU system can be found in the Hurd
500: info manual.
501:
502:
503: @node Compilation
504: @section Compilation
505:
506: If you already have a running GNU system, and only want to recompile
507: the kernel, for example to select a different set of included hardware
508: drivers, you can easily do this. You need the GNU C compiler and
509: MiG, the Mach interface generator, which both come in their own
510: packages.
511:
512: Building and installing the kernel is as easy as with any other GNU
513: software package. The configure script is used to configure the source
514: and set the compile time options. The compilation is done by running:
515:
516: @example
517: make
518: @end example
519:
520: To install the kernel and its header files, just enter the command:
521:
522: @example
523: make install
524: @end example
525:
526: This will install the kernel into $(prefix)/boot/gnumach and the header
527: files into $(prefix)/include. You can also only install the kernel or
528: the header files. For this, the two targets install-kernel and
529: install-headers are provided.
530:
531:
532: @node Configuration
533: @section Configuration
534:
535: The following options can be passed to the configure script as command
536: line arguments and control what components are built into the kernel, or
537: where it is installed.
538:
539: The default for an option is to be disabled, unless otherwise noted.
540:
541: @table @code
542: @item --prefix @var{prefix}
543: Sets the prefix to PREFIX. The default prefix is the empty string, which
544: is the correct value for the GNU system. The prefix is prepended to all
545: file names at installation time.
546:
547: @item --enable-kdb
548: Enables the in-kernel debugger. This is only useful if you actually
549: anticipate debugging the kernel. It is not enabled by default because
550: it adds considerably to the unpageable memory footprint of the kernel.
551: @xref{Kernel Debugger}.
552:
553: @item --enable-kmsg
554: Enables the kernel message device kmsg.
555:
556: @item --enable-lpr
557: Enables the parallel port devices lpr%d.
558:
559: @item --enable-floppy
560: Enables the PC floppy disk controller devices fd%d.
561:
562: @item --enable-ide
563: Enables the IDE controller devices hd%d, hd%ds%d.
564: @end table
565:
566: The following options enable drivers for various SCSI controller.
567: SCSI devices are named sd%d (disks) or cd%d (CD ROMs).
568:
569: @table @code
570: @item --enable-advansys
571: Enables the AdvanSys SCSI controller devices sd%d, cd%d.
572:
573: @item --enable-buslogic
574: Enables the BusLogic SCSI controller devices sd%d, cd%d.
575:
576: @item --disable-flashpoint
577: Only meaningful in conjunction with @option{--enable-buslogic}. Omits the
578: FlshPoint support. This option is enabled by default if
579: @option{--enable-buslogic} is specified.
580:
581: @item --enable-u1434f
582: Enables the UltraStor 14F/34F SCSI controller devices sd%d, cd%d.
583:
584: @item --enable-ultrastor
585: Enables the UltraStor SCSI controller devices sd%d, cd%d.
586:
587: @item --enable-aha152x
588: @itemx --enable-aha2825
589: Enables the Adaptec AHA-152x/2825 SCSI controller devices sd%d, cd%d.
590:
591: @item --enable-aha1542
592: Enables the Adaptec AHA-1542 SCSI controller devices sd%d, cd%d.
593:
594: @item --enable-aha1740
595: Enables the Adaptec AHA-1740 SCSI controller devices sd%d, cd%d.
596:
597: @item --enable-aic7xxx
598: Enables the Adaptec AIC7xxx SCSI controller devices sd%d, cd%d.
599:
600: @item --enable-futuredomain
601: Enables the Future Domain 16xx SCSI controller devices sd%d, cd%d.
602:
603: @item --enable-in2000
604: Enables the Always IN 2000 SCSI controller devices sd%d, cd%d.
605:
606: @item --enable-ncr5380
607: @itemx --enable-ncr53c400
608: Enables the generic NCR5380/53c400 SCSI controller devices sd%d, cd%d.
609:
610: @item --enable-ncr53c406a
611: Enables the NCR53c406a SCSI controller devices sd%d, cd%d.
612:
613: @item --enable-pas16
614: Enables the PAS16 SCSI controller devices sd%d, cd%d.
615:
616: @item --enable-seagate
617: Enables the Seagate ST02 and Future Domain TMC-8xx SCSI controller
618: devices sd%d, cd%d.
619:
620: @item --enable-t128
621: @itemx --enable-t128f
622: @itemx --enable-t228
623: Enables the Trantor T128/T128F/T228 SCSI controller devices sd%d, cd%d.
624:
625: @item --enable-ncr53c7xx
626: Enables the NCR53C7,8xx SCSI controller devices sd%d, cd%d.
627:
628: @item --enable-eatadma
629: Enables the EATA-DMA (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix)
630: SCSI controller devices sd%d, cd%d.
631:
632: @item --enable-eatapio
633: Enables the EATA-PIO (old DPT PM2001, PM2012A) SCSI controller devices
634: sd%d, cd%d.
635:
636: @item --enable-wd7000
637: Enables the WD 7000 SCSI controller devices sd%d, cd%d.
638:
639: @item --enable-eata
640: Enables the EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards)
641: SCSI controller devices sd%d, cd%d.
642:
643: @item --enable-am53c974
644: @itemx --enable-am79c974
645: Enables the AM53/79C974 SCSI controller devices sd%d, cd%d.
646:
647: @item --enable-dtc3280
648: @itemx --enable-dtc3180
649: Enables the DTC3180/3280 SCSI controller devices sd%d, cd%d.
650:
651: @item --enable-ncr53c8xx
652: @itemx --enable-dc390w
653: @itemx --enable-dc390u
654: @itemx --enable-dc390f
655: Enables the NCR53C8XX SCSI controller devices sd%d, cd%d.
656:
657: @item --enable-dc390t
658: @itemx --enable-dc390
659: Enables the Tekram DC-390(T) SCSI controller devices sd%d, cd%d.
660:
661: @item --enable-ppa
662: Enables the IOMEGA Parallel Port ZIP drive device sd%d.
663:
664: @item --enable-qlogicfas
665: Enables the Qlogic FAS SCSI controller devices sd%d, cd%d.
666:
667: @item --enable-qlogicisp
668: Enables the Qlogic ISP SCSI controller devices sd%d, cd%d.
669:
670: @item --enable-gdth
671: Enables the GDT SCSI Disk Array controller devices sd%d, cd%d.
672: @end table
673:
674: The following options enable drivers for various ethernet cards.
675: NIC device names are usually eth%d, except for the pocket adaptors.
676:
677: GNU Mach does only autodetect one ethernet card. To enable any further
678: cards, the source code has to be edited.
679: @c XXX Reference to the source code.
680:
681: @table @code
682: @item --enable-ne2000
683: @itemx --enable-ne1000
684: Enables the NE2000/NE1000 ISA network card devices eth%d.
685:
686: @item --enable-3c503
687: @itemx --enable-el2
688: Enables the 3Com 503 (Etherlink II) network card devices eth%d.
689:
690: @item --enable-3c509
691: @itemx --enable-3c579
692: @itemx --enable-el3
693: Enables the 3Com 509/579 (Etherlink III) network card devices eth%d.
694:
695: @item --enable-wd80x3
696: Enables the WD80X3 network card devices eth%d.
697:
698: @item --enable-3c501
699: @itemx --enable-el1
700: Enables the 3COM 501 network card devices eth%d.
701:
702: @item --enable-ul
703: Enables the SMC Ultra network card devices eth%d.
704:
705: @item --enable-ul32
706: Enables the SMC Ultra 32 network card devices eth%d.
707:
708: @item --enable-hplanplus
709: Enables the HP PCLAN+ (27247B and 27252A) network card devices eth%d.
710:
711: @item --enable-hplan
712: Enables the HP PCLAN (27245 and other 27xxx series) network card devices eth%d.
713:
714: @item --enable-3c59x
715: @itemx --enable-3c90x
716: @itemx --enable-vortex
717: Enables the 3Com 590/900 series (592/595/597/900/905) "Vortex/Boomerang"
718: network card devices eth%d.
719:
720: @item --enable-seeq8005
721: Enables the Seeq8005 network card devices eth%d.
722:
723: @item --enable-hp100
724: @itemx --enable-hpj2577
725: @itemx --enable-hpj2573
726: @itemx --enable-hp27248b
727: @itemx --enable-hp2585
728: Enables the HP 10/100VG PCLAN (ISA, EISA, PCI) network card devices
729: eth%d.
730:
731: @item --enable-ac3200
732: Enables the Ansel Communications EISA 3200 network card devices eth%d.
733:
734: @item --enable-e2100
735: Enables the Cabletron E21xx network card devices eth%d.
736:
737: @item --enable-at1700
738: Enables the AT1700 (Fujitsu 86965) network card devices eth%d.
739:
740: @item --enable-eth16i
741: @itemx --enable-eth32
742: Enables the ICL EtherTeam 16i/32 network card devices eth%d.
743:
744: @item --enable-znet
745: @itemx --enable-znote
746: Enables the Zenith Z-Note network card devices eth%d.
747:
748: @item --enable-eexpress
749: Enables the EtherExpress 16 network card devices eth%d.
750:
751: @item --enable-eexpresspro
752: Enables the EtherExpressPro network card devices eth%d.
753:
754: @item --enable-eexpresspro100
755: Enables the Intel EtherExpressPro PCI 10+/100B/100+ network card devices
756: eth%d.
757:
758: @item --enable-depca
759: @itemx --enable-de100
760: @itemx --enable-de101
761: @itemx --enable-de200
762: @itemx --enable-de201
763: @itemx --enable-de202
764: @itemx --enable-de210
765: @itemx --enable-de422
766: Enables the DEPCA, DE10x, DE200, DE201, DE202, DE210, DE422 network card
767: devices eth%d.
768:
769: @item --enable-ewrk3
770: @itemx --enable-de203
771: @itemx --enable-de204
772: @itemx --enable-de205
773: Enables the EtherWORKS 3 (DE203, DE204, DE205) network card devices
774: eth%d.
775:
776: @item --enable-de4x5
777: @itemx --enable-de425
778: @itemx --enable-de434
779: @itemx --enable-435
780: @itemx --enable-de450
781: @itemx --enable-500
782: Enables the DE425, DE434, DE435, DE450, DE500 network card devices
783: eth%d.
784:
785: @item --enable-apricot
786: Enables the Apricot XEN-II on board ethernet network card devices eth%d.
787:
788: @item --enable-wavelan
789: Enables the AT&T WaveLAN & DEC RoamAbout DS network card devices eth%d.
790:
791: @item --enable-3c507
792: @itemx --enable-el16
793: Enables the 3Com 507 network card devices eth%d.
794:
795: @item --enable-3c505
796: @itemx --enable-elplus
797: Enables the 3Com 505 network card devices eth%d.
798:
799: @item --enable-de600
800: Enables the D-Link DE-600 network card devices eth%d.
801:
802: @item --enable-de620
803: Enables the D-Link DE-620 network card devices eth%d.
804:
805: @item --enable-skg16
806: Enables the Schneider & Koch G16 network card devices eth%d.
807:
808: @item --enable-ni52
809: Enables the NI5210 network card devices eth%d.
810:
811: @item --enable-ni65
812: Enables the NI6510 network card devices eth%d.
813:
814: @item --enable-atp
815: Enables the AT-LAN-TEC/RealTek pocket adaptor network card devices atp%d.
816:
817: @item --enable-lance
818: @itemx --enable-at1500
819: @itemx --enable-ne2100
820: Enables the AMD LANCE and PCnet (AT1500 and NE2100) network card devices eth%d.
821:
822: @item --enable-elcp
823: @itemx --enable-tulip
824: Enables the DECchip Tulip (dc21x4x) PCI network card devices eth%d.
825:
826: @item --enable-fmv18x
827: Enables the FMV-181/182/183/184 network card devices eth%d.
828:
829: @item --enable-3c515
830: Enables the 3Com 515 ISA Fast EtherLink network card devices eth%d.
831:
832: @item --enable-pcnet32
833: Enables the AMD PCI PCnet32 (PCI bus NE2100 cards) network card devices
834: eth%d.
835:
836: @item --enable-ne2kpci
837: Enables the PCI NE2000 network card devices eth%d.
838:
839: @item --enable-yellowfin
840: Enables the Packet Engines Yellowfin Gigabit-NIC network card devices
841: eth%d.
842:
843: @item --enable-rtl8139
844: @itemx --enable-rtl8129
845: Enables the RealTek 8129/8139 (not 8019/8029!) network card devices
846: eth%d.
847:
848: @item --enable-epic
849: @itemx --enable-epic100
850: Enables the SMC 83c170/175 EPIC/100 (EtherPower II) network card devices eth%d.
851:
852: @item --enable-tlan
853: Enables the TI ThunderLAN network card devices eth%d.
854:
855: @item --enable-viarhine
856: Enables the VIA Rhine network card devices eth%d.
857: @end table
858:
859:
860: @node Cross-Compilation
861: @section Cross-Compilation
862:
863: Another way to install the kernel is to use an existing operating system
864: in order to compile the kernel binary.
865: This is called @dfn{cross-compiling}, because it is done between two
866: different platforms. If the pre-built kernels are not working for
867: you, and you can't ask someone to compile a custom kernel for your
868: machine, this is your last chance to get a kernel that boots on your
869: hardware.
870:
871: Luckily, the kernel does have light dependencies. You don't even
872: need a cross compiler if your build machine has a compiler and is
873: the same architecture as the system you want to run GNU Mach on.
874:
875: You need a cross-mig, though.
876:
877: XXX More info needed.
878:
879:
880: @node Bootstrap
881: @chapter Bootstrap
882:
883: Bootstrapping@footnote{The term @dfn{bootstrapping} refers to a Dutch
884: legend about a boy who was able to fly by pulling himself up by his
885: bootstraps. In computers, this term refers to any process where a
886: simple system activates a more complicated system.} is the procedure by
887: which your machine loads the microkernel and transfers control to the
888: operating system.
889:
890:
891: @menu
892: * Bootloader:: Starting the microkernel, or other OSes.
893: * Modules:: Starting the first task of the OS.
894: @end menu
895:
896: @node Bootloader
897: @section Bootloader
898:
899: The @dfn{bootloader} is the first software that runs on your machine.
900: Many hardware architectures have a very simple startup routine which
901: reads a very simple bootloader from the beginning of the internal hard
902: disk, then transfers control to it. Other architectures have startup
903: routines which are able to understand more of the contents of the hard
904: disk, and directly start a more advanced bootloader.
905:
906: @cindex GRUB
907: @cindex GRand Unified Bootloader
908: Currently, @dfn{GRUB}@footnote{The GRand Unified Bootloader, available
909: from @uref{http://www.uruk.org/grub/}.} is the preferred GNU bootloader.
910: GRUB provides advanced functionality, and is capable of loading several
911: different kernels (such as Mach, Linux, DOS, and the *BSD family).
912: @xref{Top, , Introduction, grub, GRUB Manual}.
913:
914: GNU Mach conforms to the Multiboot specification which defines an
915: interface between the bootloader and the components that run very early
916: at startup. GNU Mach can be started by any bootloader which supports
917: the multiboot standard. After the bootloader loaded the kernel image to
918: a designated address in the system memory, it jumps into the startup
919: code of the kernel. This code initializes the kernel and detects the
920: available hardware devices. Afterwards, the first system task is
921: started. @xref{Top, , Overview, multiboot, Multiboot Specification}.
922:
923:
924: @node Modules
925: @section Modules
926: @pindex serverboot
927:
928: Because the microkernel does not provide filesystem support and other
929: features necessary to load the first system task from a storage medium,
930: the first task is loaded by the bootloader as a module to a specified
931: address. In the GNU system, this first program is the @code{serverboot}
932: executable. GNU Mach inserts the host control port and the device
933: master port into this task and appends the port numbers to the command
934: line before executing it.
935:
936: The @code{serverboot} program is responsible for loading and executing
937: the rest of the Hurd servers. Rather than containing specific
938: instructions for starting the Hurd, it follows general steps given in a
939: user-supplied boot script.
940:
941: XXX More about boot scripts.
942:
943:
944: @node Inter Process Communication
945: @chapter Inter Process Communication
946:
947: This chapter describes the details of the Mach IPC system. First the
948: actual calls concerned with sending and receiving messages are
949: discussed, then the details of the port system are described in detail.
950:
951: @menu
952: * Major Concepts:: The concepts behind the Mach IPC system.
953: * Messaging Interface:: Composing, sending and receiving messages.
954: * Port Manipulation Interface:: Manipulating ports, port rights, port sets.
955: @end menu
956:
957:
958: @node Major Concepts
959: @section Major Concepts
960: @cindex interprocess communication (IPC)
961: @cindex IPC (interprocess communication)
962: @cindex communication between tasks
963: @cindex remote procedure calls (RPC)
964: @cindex RPC (remote procedure calls)
965: @cindex messages
966:
967: The Mach kernel provides message-oriented, capability-based interprocess
968: communication. The interprocess communication (IPC) primitives
969: efficiently support many different styles of interaction, including
970: remote procedure calls (RPC), object-oriented distributed programming,
971: streaming of data, and sending very large amounts of data.
972:
973: The IPC primitives operate on three abstractions: messages, ports, and
974: port sets. User tasks access all other kernel services and abstractions
975: via the IPC primitives.
976:
977: The message primitives let tasks send and receive messages. Tasks send
978: messages to ports. Messages sent to a port are delivered reliably
979: (messages may not be lost) and are received in the order in which they
980: were sent. Messages contain a fixed-size header and a variable amount
981: of typed data following the header. The header describes the
982: destination and size of the message.
983:
984: The IPC implementation makes use of the VM system to efficiently
985: transfer large amounts of data. The message body can contain the
986: address of a region in the sender's address space which should be
987: transferred as part of the message. When a task receives a message
988: containing an out-of-line region of data, the data appears in an unused
989: portion of the receiver's address space. This transmission of
990: out-of-line data is optimized so that sender and receiver share the
991: physical pages of data copy-on-write, and no actual data copy occurs
992: unless the pages are written. Regions of memory up to the size of a
993: full address space may be sent in this manner.
994:
995: Ports hold a queue of messages. Tasks operate on a port to send and
996: receive messages by exercising capabilities for the port. Multiple
997: tasks can hold send capabilities, or rights, for a port. Tasks can also
998: hold send-once rights, which grant the ability to send a single message.
999: Only one task can hold the receive capability, or receive right, for a
1000: port. Port rights can be transferred between tasks via messages. The
1001: sender of a message can specify in the message body that the message
1002: contains a port right. If a message contains a receive right for a
1003: port, then the receive right is removed from the sender of the message
1004: and the right is transferred to the receiver of the message. While the
1005: receive right is in transit, tasks holding send rights can still send
1006: messages to the port, and they are queued until a task acquires the
1007: receive right and uses it to receive the messages.
1008:
1009: Tasks can receive messages from ports and port sets. The port set
1010: abstraction allows a single thread to wait for a message from any of
1011: several ports. Tasks manipulate port sets with a capability, or
1012: port-set right, which is taken from the same space as the port
1013: capabilities. The port-set right may not be transferred in a message.
1014: A port set holds receive rights, and a receive operation on a port set
1015: blocks waiting for a message sent to any of the constituent ports. A
1016: port may not belong to more than one port set, and if a port is a member
1017: of a port set, the holder of the receive right can't receive directly
1018: from the port.
1019:
1020: Port rights are a secure, location-independent way of naming ports. The
1021: port queue is a protected data structure, only accessible via the
1022: kernel's exported message primitives. Rights are also protected by the
1023: kernel; there is no way for a malicious user task to guess a port name
1024: and send a message to a port to which it shouldn't have access. Port
1025: rights do not carry any location information. When a receive right for
1026: a port moves from task to task, and even between tasks on different
1027: machines, the send rights for the port remain unchanged and continue to
1028: function.
1029:
1030: @node Messaging Interface
1031: @section Messaging Interface
1032:
1033: This section describes how messages are composed, sent and received
1034: within the Mach IPC system.
1035:
1036: @menu
1037: * Mach Message Call:: Sending and receiving messages.
1038: * Message Format:: The format of Mach messages.
1039: * Exchanging Port Rights:: Sending and receiving port rights.
1040: * Memory:: Passing memory regions in messages.
1041: * Message Send:: Sending messages.
1042: * Message Receive:: Receiving messages.
1043: * Atomicity:: Atomicity of port rights.
1044: @end menu
1045:
1046:
1047: @node Mach Message Call
1048: @subsection Mach Message Call
1049:
1050: To use the @code{mach_msg} call, you can include the header files
1051: @file{mach/port.h} and @file{mach/message.h}.
1052:
1053: @deftypefun mach_msg_return_t mach_msg (@w{mach_msg_header_t *@var{msg}}, @w{mach_msg_option_t @var{option}}, @w{mach_msg_size_t @var{send_size}}, @w{mach_msg_size_t @var{rcv_size}}, @w{mach_port_t @var{rcv_name}}, @w{mach_msg_timeout_t @var{timeout}}, @w{mach_port_t @var{notify}})
1054: The @code{mach_msg} function is used to send and receive messages. Mach
1055: messages contain typed data, which can include port rights and
1056: references to large regions of memory.
1057:
1058: @var{msg} is the address of a buffer in the caller's address space.
1059: Message buffers should be aligned on long-word boundaries. The message
1060: options @var{option} are bit values, combined with bitwise-or. One or
1061: both of @code{MACH_SEND_MSG} and @code{MACH_RCV_MSG} should be used.
1062: Other options act as modifiers. When sending a message, @var{send_size}
1063: specifies the size of the message buffer. Otherwise zero should be
1064: supplied. When receiving a message, @var{rcv_size} specifies the size
1065: of the message buffer. Otherwise zero should be supplied. When
1066: receiving a message, @var{rcv_name} specifies the port or port set.
1067: Otherwise @code{MACH_PORT_NULL} should be supplied. When using the
1068: @code{MACH_SEND_TIMEOUT} and @code{MACH_RCV_TIMEOUT} options,
1069: @var{timeout} specifies the time in milliseconds to wait before giving
1070: up. Otherwise @code{MACH_MSG_TIMEOUT_NONE} should be supplied. When
1071: using the @code{MACH_SEND_NOTIFY}, @code{MACH_SEND_CANCEL}, and
1072: @code{MACH_RCV_NOTIFY} options, @var{notify} specifies the port used for
1073: the notification. Otherwise @code{MACH_PORT_NULL} should be supplied.
1074:
1075: If the option argument is @code{MACH_SEND_MSG}, it sends a message. The
1076: @var{send_size} argument specifies the size of the message to send. The
1077: @code{msgh_remote_port} field of the message header specifies the
1078: destination of the message.
1079:
1080: If the option argument is @code{MACH_RCV_MSG}, it receives a message.
1081: The @var{rcv_size} argument specifies the size of the message buffer
1082: that will receive the message; messages larger than @var{rcv_size} are
1083: not received. The @var{rcv_name} argument specifies the port or port
1084: set from which to receive.
1085:
1086: If the option argument is @code{MACH_SEND_MSG|MACH_RCV_MSG}, then
1087: @code{mach_msg} does both send and receive operations. If the send
1088: operation encounters an error (any return code other than
1089: @code{MACH_MSG_SUCCESS}), then the call returns immediately without
1090: attempting the receive operation. Semantically the combined call is
1091: equivalent to separate send and receive calls, but it saves a system
1092: call and enables other internal optimizations.
1093:
1094: If the option argument specifies neither @code{MACH_SEND_MSG} nor
1095: @code{MACH_RCV_MSG}, then @code{mach_msg} does nothing.
1096:
1097: Some options, like @code{MACH_SEND_TIMEOUT} and @code{MACH_RCV_TIMEOUT},
1098: share a supporting argument. If these options are used together, they
1099: make independent use of the supporting argument's value.
1100: @end deftypefun
1101:
1102: @deftp {Data type} mach_msg_timeout_t
1103: This is a @code{natural_t} used by the timeout mechanism. The units are
1104: milliseconds. The value to be used when there is no timeout is
1105: @code{MACH_MSG_TIMEOUT_NONE}.
1106: @end deftp
1107:
1108:
1109: @node Message Format
1110: @subsection Message Format
1111: @cindex message format
1112: @cindex format of a message
1113: @cindex composing messages
1114: @cindex message composition
1115:
1116: A Mach message consists of a fixed size message header, a
1117: @code{mach_msg_header_t}, followed by zero or more data items. Data
1118: items are typed. Each item has a type descriptor followed by the actual
1119: data (or the address of the data, for out-of-line memory regions).
1120:
1121: The following data types are related to Mach ports:
1122:
1123: @deftp {Data type} mach_port_t
1124: The @code{mach_port_t} data type is an unsigned integer type which
1125: represents a port name in the task's port name space. In GNU Mach, this
1126: is an @code{unsigned int}.
1127: @end deftp
1128:
1129: @c This is defined elsewhere.
1130: @c @deftp {Data type} mach_port_seqno_t
1131: @c The @code{mach_port_seqno_t} data type is an unsigned integer type which
1132: @c represents a sequence number of a message. In GNU Mach, this is an
1133: @c @code{unsigned int}.
1134: @c @end deftp
1135:
1136: The following data types are related to Mach messages:
1137:
1138: @deftp {Data type} mach_msg_bits_t
1139: The @code{mach_msg_bits_t} data type is an @code{unsigned int} used to
1140: store various flags for a message.
1141: @end deftp
1142:
1143: @deftp {Data type} mach_msg_size_t
1144: The @code{mach_msg_size_t} data type is an @code{unsigned int} used to
1145: store the size of a message.
1146: @end deftp
1147:
1148: @deftp {Data type} mach_msg_id_t
1149: The @code{mach_msg_id_t} data type is an @code{integer_t} typically used to
1150: convey a function or operation id for the receiver.
1151: @end deftp
1152:
1153: @deftp {Data type} mach_msg_header_t
1154: This structure is the start of every message in the Mach IPC system. It
1155: has the following members:
1156:
1157: @table @code
1158: @item mach_msg_bits_t msgh_bits
1159: The @code{msgh_bits} field has the following bits defined, all other
1160: bits should be zero:
1161:
1162: @table @code
1163: @item MACH_MSGH_BITS_REMOTE_MASK
1164: @itemx MACH_MSGH_BITS_LOCAL_MASK
1165: The remote and local bits encode @code{mach_msg_type_name_t} values that
1166: specify the port rights in the @code{msgh_remote_port} and
1167: @code{msgh_local_port} fields. The remote value must specify a send or
1168: send-once right for the destination of the message. If the local value
1169: doesn't specify a send or send-once right for the message's reply port,
1170: it must be zero and msgh_local_port must be @code{MACH_PORT_NULL}.
1171:
1172: @item MACH_MSGH_BITS_COMPLEX
1173: The complex bit must be specified if the message body contains port
1174: rights or out-of-line memory regions. If it is not specified, then the
1175: message body carries no port rights or memory, no matter what the type
1176: descriptors may seem to indicate.
1177: @end table
1178:
1179: @code{MACH_MSGH_BITS_REMOTE} and @code{MACH_MSGH_BITS_LOCAL} macros
1180: return the appropriate @code{mach_msg_type_name_t} values, given a
1181: @code{msgh_bits} value. The @code{MACH_MSGH_BITS} macro constructs a
1182: value for @code{msgh_bits}, given two @code{mach_msg_type_name_t}
1183: values.
1184:
1185: @item mach_msg_size_t msgh_size
1186: The @code{msgh_size} field in the header of a received message contains
1187: the message's size. The message size, a byte quantity, includes the
1188: message header, type descriptors, and in-line data. For out-of-line
1189: memory regions, the message size includes the size of the in-line
1190: address, not the size of the actual memory region. There are no
1191: arbitrary limits on the size of a Mach message, the number of data items
1192: in a message, or the size of the data items.
1193:
1194: @item mach_port_t msgh_remote_port
1195: The @code{msgh_remote_port} field specifies the destination port of the
1196: message. The field must carry a legitimate send or send-once right for
1197: a port.
1198:
1199: @item mach_port_t msgh_local_port
1200: The @code{msgh_local_port} field specifies an auxiliary port right,
1201: which is conventionally used as a reply port by the recipient of the
1202: message. The field must carry a send right, a send-once right,
1203: @code{MACH_PORT_NULL}, or @code{MACH_PORT_DEAD}.
1204:
1205: @item mach_port_seqno_t msgh_seqno
1206: The @code{msgh_seqno} field provides a sequence number for the message.
1207: It is only valid in received messages; its value in sent messages is
1208: overwritten.
1209: @c XXX The "MESSAGE RECEIVE" section discusses message sequence numbers.
1210:
1211: @item mach_msg_id_t msgh_id
1212: The @code{mach_msg} call doesn't use the @code{msgh_id} field, but it
1213: conventionally conveys an operation or function id.
1214: @end table
1215: @end deftp
1216:
1217: @deftypefn Macro mach_msg_bits_t MACH_MSGH_BITS (@w{mach_msg_type_name_t @var{remote}}, @w{mach_msg_type_name_t @var{local}})
1218: This macro composes two @code{mach_msg_type_name_t} values that specify
1219: the port rights in the @code{msgh_remote_port} and
1220: @code{msgh_local_port} fields of a @code{mach_msg} call into an
1221: appropriate @code{mach_msg_bits_t} value.
1222: @end deftypefn
1223:
1224: @deftypefn Macro mach_msg_type_name_t MACH_MSGH_BITS_REMOTE (@w{mach_msg_bits_t @var{bits}})
1225: This macro extracts the @code{mach_msg_type_name_t} value for the remote
1226: port right in a @code{mach_msg_bits_t} value.
1227: @end deftypefn
1228:
1229: @deftypefn Macro mach_msg_type_name_t MACH_MSGH_BITS_LOCAL (@w{mach_msg_bits_t @var{bits}})
1230: This macro extracts the @code{mach_msg_type_name_t} value for the local
1231: port right in a @code{mach_msg_bits_t} value.
1232: @end deftypefn
1233:
1234: @deftypefn Macro mach_msg_bits_t MACH_MSGH_BITS_PORTS (@w{mach_msg_bits_t @var{bits}})
1235: This macro extracts the @code{mach_msg_bits_t} component consisting of
1236: the @code{mach_msg_type_name_t} values for the remote and local port
1237: right in a @code{mach_msg_bits_t} value.
1238: @end deftypefn
1239:
1240: @deftypefn Macro mach_msg_bits_t MACH_MSGH_BITS_OTHER (@w{mach_msg_bits_t @var{bits}})
1241: This macro extracts the @code{mach_msg_bits_t} component consisting of
1242: everything except the @code{mach_msg_type_name_t} values for the remote
1243: and local port right in a @code{mach_msg_bits_t} value.
1244: @end deftypefn
1245:
1246: Each data item has a type descriptor, a @code{mach_msg_type_t} or a
1247: @code{mach_msg_type_long_t}. The @code{mach_msg_type_long_t} type
1248: descriptor allows larger values for some fields. The
1249: @code{msgtl_header} field in the long descriptor is only used for its
1250: inline, longform, and deallocate bits.
1251:
1252: @deftp {Data type} mach_msg_type_name_t
1253: This is an @code{unsigned int} and can be used to hold the
1254: @code{msgt_name} component of the @code{mach_msg_type_t} and
1255: @code{mach_msg_type_long_t} structure.
1256: @end deftp
1257:
1258: @deftp {Data type} mach_msg_type_size_t
1259: This is an @code{unsigned int} and can be used to hold the
1260: @code{msgt_size} component of the @code{mach_msg_type_t} and
1261: @code{mach_msg_type_long_t} structure.
1262: @end deftp
1263:
1264: @deftp {Data type} mach_msg_type_number_t
1265: This is an @code{natural_t} and can be used to hold the
1266: @code{msgt_number} component of the @code{mach_msg_type_t} and
1267: @code{mach_msg_type_long_t} structure.
1268: @c XXX This is used for the size of arrays, too. Mmh?
1269: @end deftp
1270:
1271: @deftp {Data type} mach_msg_type_t
1272: This structure has the following members:
1273:
1274: @table @code
1275: @item unsigned int msgt_name : 8
1276: The @code{msgt_name} field specifies the data's type. The following
1277: types are predefined:
1278:
1279: @table @code
1280: @item MACH_MSG_TYPE_UNSTRUCTURED
1281: @item MACH_MSG_TYPE_BIT
1282: @item MACH_MSG_TYPE_BOOLEAN
1283: @item MACH_MSG_TYPE_INTEGER_16
1284: @item MACH_MSG_TYPE_INTEGER_32
1285: @item MACH_MSG_TYPE_CHAR
1286: @item MACH_MSG_TYPE_BYTE
1287: @item MACH_MSG_TYPE_INTEGER_8
1288: @item MACH_MSG_TYPE_REAL
1289: @item MACH_MSG_TYPE_STRING
1290: @item MACH_MSG_TYPE_STRING_C
1291: @item MACH_MSG_TYPE_PORT_NAME
1292: @end table
1293:
1294: The following predefined types specify port rights, and receive special
1295: treatment. The next section discusses these types in detail. The type
1296: @c XXX cross ref
1297: @code{MACH_MSG_TYPE_PORT_NAME} describes port right names, when no
1298: rights are being transferred, but just names. For this purpose, it
1299: should be used in preference to @code{MACH_MSG_TYPE_INTEGER_32}.
1300:
1301: @table @code
1302: @item MACH_MSG_TYPE_MOVE_RECEIVE
1303: @item MACH_MSG_TYPE_MOVE_SEND
1304: @item MACH_MSG_TYPE_MOVE_SEND_ONCE
1305: @item MACH_MSG_TYPE_COPY_SEND
1306: @item MACH_MSG_TYPE_MAKE_SEND
1307: @item MACH_MSG_TYPE_MAKE_SEND_ONCE
1308: @end table
1309:
1310: @item msgt_size : 8
1311: The @code{msgt_size} field specifies the size of each datum, in bits. For
1312: example, the msgt_size of @code{MACH_MSG_TYPE_INTEGER_32} data is 32.
1313:
1314: @item msgt_number : 12
1315: The @code{msgt_number} field specifies how many data elements comprise
1316: the data item. Zero is a legitimate number.
1317:
1318: The total length specified by a type descriptor is @w{@code{(msgt_size *
1319: msgt_number)}}, rounded up to an integral number of bytes. In-line data
1320: is then padded to an integral number of long-words. This ensures that
1321: type descriptors always start on long-word boundaries. It implies that
1322: message sizes are always an integral multiple of a long-word's size.
1323:
1324: @item msgt_inline : 1
1325: The @code{msgt_inline} bit specifies, when @code{FALSE}, that the data
1326: actually resides in an out-of-line region. The address of the memory
1327: region (a @code{vm_offset_t} or @code{vm_address_t}) follows the type
1328: descriptor in the message body. The @code{msgt_name}, @code{msgt_size},
1329: and @code{msgt_number} fields describe the memory region, not the
1330: address.
1331:
1332: @item msgt_longform : 1
1333: The @code{msgt_longform} bit specifies, when @code{TRUE}, that this type
1334: descriptor is a @code{mach_msg_type_long_t} instead of a
1335: @code{mach_msg_type_t}. The @code{msgt_name}, @code{msgt_size}, and
1336: @code{msgt_number} fields should be zero. Instead, @code{mach_msg} uses
1337: the following @code{msgtl_name}, @code{msgtl_size}, and
1338: @code{msgtl_number} fields.
1339:
1340: @item msgt_deallocate : 1
1341: The @code{msgt_deallocate} bit is used with out-of-line regions. When
1342: @code{TRUE}, it specifies that the memory region should be deallocated
1343: from the sender's address space (as if with @code{vm_deallocate}) when
1344: the message is sent.
1345:
1346: @item msgt_unused : 1
1347: The @code{msgt_unused} bit should be zero.
1348: @end table
1349: @end deftp
1350:
1351: @deftypefn Macro boolean_t MACH_MSG_TYPE_PORT_ANY (mach_msg_type_name_t type)
1352: This macro returns @code{TRUE} if the given type name specifies a port
1353: type, otherwise it returns @code{FALSE}.
1354: @end deftypefn
1355:
1356: @deftypefn Macro boolean_t MACH_MSG_TYPE_PORT_ANY_SEND (mach_msg_type_name_t type)
1357: This macro returns @code{TRUE} if the given type name specifies a port
1358: type with a send or send-once right, otherwise it returns @code{FALSE}.
1359: @end deftypefn
1360:
1361: @deftypefn Macro boolean_t MACH_MSG_TYPE_PORT_ANY_RIGHT (mach_msg_type_name_t type)
1362: This macro returns @code{TRUE} if the given type name specifies a port
1363: right type which is moved, otherwise it returns @code{FALSE}.
1364: @end deftypefn
1365:
1366: @deftp {Data type} mach_msg_type_long_t
1367: This structure has the following members:
1368:
1369: @table @code
1370: @item mach_msg_type_t msgtl_header
1371: Same meaning as @code{msgt_header}.
1372: @c XXX cross ref
1373:
1374: @item unsigned short msgtl_name
1375: Same meaning as @code{msgt_name}.
1376:
1377: @item unsigned short msgtl_size
1378: Same meaning as @code{msgt_size}.
1379:
1380: @item unsigned int msgtl_number
1381: Same meaning as @code{msgt_number}.
1382: @end table
1383: @end deftp
1384:
1385:
1386: @node Exchanging Port Rights
1387: @subsection Exchanging Port Rights
1388: @cindex sending port rights
1389: @cindex receiving port rights
1390: @cindex moving port rights
1391:
1392: Each task has its own space of port rights. Port rights are named with
1393: positive integers. Except for the reserved values
1394: @w{@code{MACH_PORT_NULL (0)}@footnote{In the Hurd system, we don't make
1395: the assumption that @code{MACH_PORT_NULL} is zero and evaluates to
1396: false, but rather compare port names to @code{MACH_PORT_NULL}
1397: explicitly}} and @w{@code{MACH_PORT_DEAD (~0)}}, this is a full 32-bit
1398: name space. When the kernel chooses a name for a new right, it is free
1399: to pick any unused name (one which denotes no right) in the space.
1400:
1401: There are five basic kinds of rights: receive rights, send rights,
1402: send-once rights, port-set rights, and dead names. Dead names are not
1403: capabilities. They act as place-holders to prevent a name from being
1404: otherwise used.
1405:
1406: A port is destroyed, or dies, when its receive right is deallocated.
1407: When a port dies, send and send-once rights for the port turn into dead
1408: names. Any messages queued at the port are destroyed, which deallocates
1409: the port rights and out-of-line memory in the messages.
1410:
1411: Tasks may hold multiple user-references for send rights and dead names.
1412: When a task receives a send right which it already holds, the kernel
1413: increments the right's user-reference count. When a task deallocates a
1414: send right, the kernel decrements its user-reference count, and the task
1415: only loses the send right when the count goes to zero.
1416:
1417: Send-once rights always have a user-reference count of one, although a
1418: port can have multiple send-once rights, because each send-once right
1419: held by a task has a different name. In contrast, when a task holds
1420: send rights or a receive right for a port, the rights share a single
1421: name.
1422:
1423: A message body can carry port rights; the @code{msgt_name}
1424: (@code{msgtl_name}) field in a type descriptor specifies the type of
1425: port right and how the port right is to be extracted from the caller.
1426: The values @code{MACH_PORT_NULL} and @code{MACH_PORT_DEAD} are always
1427: valid in place of a port right in a message body. In a sent message,
1428: the following @code{msgt_name} values denote port rights:
1429:
1430: @table @code
1431: @item MACH_MSG_TYPE_MAKE_SEND
1432: The message will carry a send right, but the caller must supply a
1433: receive right. The send right is created from the receive right, and
1434: the receive right's make-send count is incremented.
1435:
1436: @item MACH_MSG_TYPE_COPY_SEND
1437: The message will carry a send right, and the caller should supply a send
1438: right. The user reference count for the supplied send right is not
1439: changed. The caller may also supply a dead name and the receiving task
1440: will get @code{MACH_PORT_DEAD}.
1441:
1442: @item MACH_MSG_TYPE_MOVE_SEND
1443: The message will carry a send right, and the caller should supply a send
1444: right. The user reference count for the supplied send right is
1445: decremented, and the right is destroyed if the count becomes zero.
1446: Unless a receive right remains, the name becomes available for
1447: recycling. The caller may also supply a dead name, which loses a user
1448: reference, and the receiving task will get @code{MACH_PORT_DEAD}.
1449:
1450: @item MACH_MSG_TYPE_MAKE_SEND_ONCE
1451: The message will carry a send-once right, but the caller must supply a
1452: receive right. The send-once right is created from the receive right.
1453:
1454: @item MACH_MSG_TYPE_MOVE_SEND_ONCE
1455: The message will carry a send-once right, and the caller should supply a
1456: send-once right. The caller loses the supplied send-once right. The
1457: caller may also supply a dead name, which loses a user reference, and
1458: the receiving task will get @code{MACH_PORT_DEAD}.
1459:
1460: @item MACH_MSG_TYPE_MOVE_RECEIVE
1461: The message will carry a receive right, and the caller should supply a
1462: receive right. The caller loses the supplied receive right, but retains
1463: any send rights with the same name.
1464: @end table
1465:
1466: If a message carries a send or send-once right, and the port dies while
1467: the message is in transit, then the receiving task will get
1468: @code{MACH_PORT_DEAD} instead of a right. The following
1469: @code{msgt_name} values in a received message indicate that it carries
1470: port rights:
1471:
1472: @table @code
1473: @item MACH_MSG_TYPE_PORT_SEND
1474: This name is an alias for @code{MACH_MSG_TYPE_MOVE_SEND}. The message
1475: carried a send right. If the receiving task already has send and/or
1476: receive rights for the port, then that name for the port will be reused.
1477: Otherwise, the new right will have a new name. If the task already has
1478: send rights, it gains a user reference for the right (unless this would
1479: cause the user-reference count to overflow). Otherwise, it acquires the
1480: send right, with a user-reference count of one.
1481:
1482: @item MACH_MSG_TYPE_PORT_SEND_ONCE
1483: This name is an alias for @code{MACH_MSG_TYPE_MOVE_SEND_ONCE}. The
1484: message carried a send-once right. The right will have a new name.
1485:
1486: @item MACH_MSG_TYPE_PORT_RECEIVE
1487: This name is an alias for @code{MACH_MSG_TYPE_MOVE_RECEIVE}. The
1488: message carried a receive right. If the receiving task already has send
1489: rights for the port, then that name for the port will be reused.
1490: Otherwise, the right will have a new name. The make-send count of the
1491: receive right is reset to zero, but the port retains other attributes
1492: like queued messages, extant send and send-once rights, and requests for
1493: port-destroyed and no-senders notifications.
1494: @end table
1495:
1496: When the kernel chooses a new name for a port right, it can choose any
1497: name, other than @code{MACH_PORT_NULL} and @code{MACH_PORT_DEAD}, which
1498: is not currently being used for a port right or dead name. It might
1499: choose a name which at some previous time denoted a port right, but is
1500: currently unused.
1501:
1502:
1503: @node Memory
1504: @subsection Memory
1505: @cindex sending memory
1506: @cindex receiving memory
1507:
1508: A message body can contain the address of a region in the sender's
1509: address space which should be transferred as part of the message. The
1510: message carries a logical copy of the memory, but the kernel uses VM
1511: techniques to defer any actual page copies. Unless the sender or the
1512: receiver modifies the data, the physical pages remain shared.
1513:
1514: An out-of-line transfer occurs when the data's type descriptor specifies
1515: @code{msgt_inline} as @code{FALSE}. The address of the memory region (a
1516: @code{vm_offset_t} or @code{vm_address_t}) should follow the type
1517: descriptor in the message body. The type descriptor and the address
1518: contribute to the message's size (@code{send_size}, @code{msgh_size}).
1519: The out-of-line data does not contribute to the message's size.
1520:
1521: The name, size, and number fields in the type descriptor describe the
1522: type and length of the out-of-line data, not the in-line address.
1523: Out-of-line memory frequently requires long type descriptors
1524: (@code{mach_msg_type_long_t}), because the @code{msgt_number} field is
1525: too small to describe a page of 4K bytes.
1526:
1527: Out-of-line memory arrives somewhere in the receiver's address space as
1528: new memory. It has the same inheritance and protection attributes as
1529: newly @code{vm_allocate}'d memory. The receiver has the responsibility
1530: of deallocating (with @code{vm_deallocate}) the memory when it is no
1531: longer needed. Security-conscious receivers should exercise caution
1532: when using out-of-line memory from untrustworthy sources, because the
1533: memory may be backed by an unreliable memory manager.
1534:
1535: Null out-of-line memory is legal. If the out-of-line region size is
1536: zero (for example, because @code{msgtl_number} is zero), then the
1537: region's specified address is ignored. A received null out-of-line
1538: memory region always has a zero address.
1539:
1540: Unaligned addresses and region sizes that are not page multiples are
1541: legal. A received message can also contain memory with unaligned
1542: addresses and funny sizes. In the general case, the first and last
1543: pages in the new memory region in the receiver do not contain only data
1544: from the sender, but are partly zero.@footnote{Sending out-of-line
1545: memory with a non-page-aligned address, or a size which is not a page
1546: multiple, works but with a caveat. The extra bytes in the first and
1547: last page of the received memory are not zeroed, so the receiver can
1548: peek at more data than the sender intended to transfer. This might be a
1549: security problem for the sender.} The received address points to the
1550: start of the data in the first page. This possibility doesn't
1551: complicate deallocation, because @code{vm_deallocate} does the right
1552: thing, rounding the start address down and the end address up to
1553: deallocate all arrived pages.
1554:
1555: Out-of-line memory has a deallocate option, controlled by the
1556: @code{msgt_deallocate} bit. If it is @code{TRUE} and the out-of-line
1557: memory region is not null, then the region is implicitly deallocated
1558: from the sender, as if by @code{vm_deallocate}. In particular, the
1559: start and end addresses are rounded so that every page overlapped by the
1560: memory region is deallocated. The use of @code{msgt_deallocate}
1561: effectively changes the memory copy into a memory movement. In a
1562: received message, @code{msgt_deallocate} is @code{TRUE} in type
1563: descriptors for out-of-line memory.
1564:
1565: Out-of-line memory can carry port rights.
1566:
1567:
1568: @node Message Send
1569: @subsection Message Send
1570: @cindex sending messages
1571:
1572: The send operation queues a message to a port. The message carries a
1573: copy of the caller's data. After the send, the caller can freely modify
1574: the message buffer or the out-of-line memory regions and the message
1575: contents will remain unchanged.
1576:
1577: Message delivery is reliable and sequenced. Messages are not lost, and
1578: messages sent to a port, from a single thread, are received in the order
1579: in which they were sent.
1580:
1581: If the destination port's queue is full, then several things can happen.
1582: If the message is sent to a send-once right (@code{msgh_remote_port}
1583: carries a send-once right), then the kernel ignores the queue limit and
1584: delivers the message. Otherwise the caller blocks until there is room
1585: in the queue, unless the @code{MACH_SEND_TIMEOUT} or
1586: @code{MACH_SEND_NOTIFY} options are used. If a port has several blocked
1587: senders, then any of them may queue the next message when space in the
1588: queue becomes available, with the proviso that a blocked sender will not
1589: be indefinitely starved.
1590:
1591: These options modify @code{MACH_SEND_MSG}. If @code{MACH_SEND_MSG} is
1592: not also specified, they are ignored.
1593:
1594: @table @code
1595: @item MACH_SEND_TIMEOUT
1596: The timeout argument should specify a maximum time (in milliseconds) for
1597: the call to block before giving up.@footnote{If MACH_SEND_TIMEOUT is
1598: used without MACH_SEND_INTERRUPT, then the timeout duration might not be
1599: accurate. When the call is interrupted and automatically retried, the
1600: original timeout is used. If interrupts occur frequently enough, the
1601: timeout interval might never expire.} If the message can't be queued
1602: before the timeout interval elapses, then the call returns
1603: @code{MACH_SEND_TIMED_OUT}. A zero timeout is legitimate.
1604:
1605: @item MACH_SEND_NOTIFY
1606: The notify argument should specify a receive right for a notify port.
1607: If the send were to block, then instead the message is queued,
1608: @code{MACH_SEND_WILL_NOTIFY} is returned, and a msg-accepted
1609: notification is requested. If @code{MACH_SEND_TIMEOUT} is also
1610: specified, then @code{MACH_SEND_NOTIFY} doesn't take effect until the
1611: timeout interval elapses.
1612:
1613: With @code{MACH_SEND_NOTIFY}, a task can forcibly queue to a send right
1614: one message at a time. A msg-accepted notification is sent to the
1615: notify port when another message can be forcibly queued. If an attempt
1616: is made to use @code{MACH_SEND_NOTIFY} before then, the call returns a
1617: @code{MACH_SEND_NOTIFY_IN_PROGRESS} error.
1618:
1619: The msg-accepted notification carries the name of the send right. If
1620: the send right is deallocated before the msg-accepted notification is
1621: generated, then the msg-accepted notification carries the value
1622: @code{MACH_PORT_NULL}. If the destination port is destroyed before the
1623: notification is generated, then a send-once notification is generated
1624: instead.
1625:
1626: @item MACH_SEND_INTERRUPT
1627: If specified, the @code{mach_msg} call will return
1628: @code{MACH_SEND_INTERRUPTED} if a software interrupt aborts the call.
1629: Otherwise, the send operation will be retried.
1630:
1631: @item MACH_SEND_CANCEL
1632: The notify argument should specify a receive right for a notify port.
1633: If the send operation removes the destination port right from the
1634: caller, and the removed right had a dead-name request registered for it,
1635: and notify is the notify port for the dead-name request, then the
1636: dead-name request may be silently canceled (instead of resulting in a
1637: port-deleted notification).
1638:
1639: This option is typically used to cancel a dead-name request made with
1640: the @code{MACH_RCV_NOTIFY} option. It should only be used as an optimization.
1641: @end table
1642:
1643: The send operation can generate the following return codes. These
1644: return codes imply that the call did nothing:
1645:
1646: @table @code
1647: @item MACH_SEND_MSG_TOO_SMALL
1648: The specified send_size was smaller than the minimum size for a message.
1649:
1650: @item MACH_SEND_NO_BUFFER
1651: A resource shortage prevented the kernel from allocating a message
1652: buffer.
1653:
1654: @item MACH_SEND_INVALID_DATA
1655: The supplied message buffer was not readable.
1656:
1657: @item MACH_SEND_INVALID_HEADER
1658: The @code{msgh_bits} value was invalid.
1659:
1660: @item MACH_SEND_INVALID_DEST
1661: The @code{msgh_remote_port} value was invalid.
1662:
1663: @item MACH_SEND_INVALID_REPLY
1664: The @code{msgh_local_port} value was invalid.
1665:
1666: @item MACH_SEND_INVALID_NOTIFY
1667: When using @code{MACH_SEND_CANCEL}, the notify argument did not denote a
1668: valid receive right.
1669: @end table
1670:
1671: These return codes imply that some or all of the message was destroyed:
1672:
1673: @table @code
1674: @item MACH_SEND_INVALID_MEMORY
1675: The message body specified out-of-line data that was not readable.
1676:
1677: @item MACH_SEND_INVALID_RIGHT
1678: The message body specified a port right which the caller didn't possess.
1679:
1680: @item MACH_SEND_INVALID_TYPE
1681: A type descriptor was invalid.
1682:
1683: @item MACH_SEND_MSG_TOO_SMALL
1684: The last data item in the message ran over the end of the message.
1685: @end table
1686:
1687: These return codes imply that the message was returned to the caller
1688: with a pseudo-receive operation:
1689:
1690: @table @code
1691: @item MACH_SEND_TIMED_OUT
1692: The timeout interval expired.
1693:
1694: @item MACH_SEND_INTERRUPTED
1695: A software interrupt occurred.
1696:
1697: @item MACH_SEND_INVALID_NOTIFY
1698: When using @code{MACH_SEND_NOTIFY}, the notify argument did not denote a
1699: valid receive right.
1700:
1701: @item MACH_SEND_NO_NOTIFY
1702: A resource shortage prevented the kernel from setting up a msg-accepted
1703: notification.
1704:
1705: @item MACH_SEND_NOTIFY_IN_PROGRESS
1706: A msg-accepted notification was already requested, and hasn't yet been
1707: generated.
1708: @end table
1709:
1710: These return codes imply that the message was queued:
1711:
1712: @table @code
1713: @item MACH_SEND_WILL_NOTIFY
1714: The message was forcibly queued, and a msg-accepted notification was
1715: requested.
1716:
1717: @item MACH_MSG_SUCCESS
1718: The message was queued.
1719: @end table
1720:
1721: Some return codes, like @code{MACH_SEND_TIMED_OUT}, imply that the
1722: message was almost sent, but could not be queued. In these situations,
1723: the kernel tries to return the message contents to the caller with a
1724: pseudo-receive operation. This prevents the loss of port rights or
1725: memory which only exist in the message. For example, a receive right
1726: which was moved into the message, or out-of-line memory sent with the
1727: deallocate bit.
1728:
1729: The pseudo-receive operation is very similar to a normal receive
1730: operation. The pseudo-receive handles the port rights in the message
1731: header as if they were in the message body. They are not reversed.
1732: After the pseudo-receive, the message is ready to be resent. If the
1733: message is not resent, note that out-of-line memory regions may have
1734: moved and some port rights may have changed names.
1735:
1736: The pseudo-receive operation may encounter resource shortages. This is
1737: similar to a @code{MACH_RCV_BODY_ERROR} return code from a receive
1738: operation. When this happens, the normal send return codes are
1739: augmented with the @code{MACH_MSG_IPC_SPACE}, @code{MACH_MSG_VM_SPACE},
1740: @code{MACH_MSG_IPC_KERNEL}, and @code{MACH_MSG_VM_KERNEL} bits to
1741: indicate the nature of the resource shortage.
1742:
1743: The queueing of a message carrying receive rights may create a circular
1744: loop of receive rights and messages, which can never be received. For
1745: example, a message carrying a receive right can be sent to that receive
1746: right. This situation is not an error, but the kernel will
1747: garbage-collect such loops, destroying the messages and ports involved.
1748:
1749:
1750: @node Message Receive
1751: @subsection Message Receive
1752:
1753: The receive operation dequeues a message from a port. The receiving
1754: task acquires the port rights and out-of-line memory regions carried in
1755: the message.
1756:
1757: The @code{rcv_name} argument specifies a port or port set from which to
1758: receive. If a port is specified, the caller must possess the receive
1759: right for the port and the port must not be a member of a port set. If
1760: no message is present, then the call blocks, subject to the
1761: @code{MACH_RCV_TIMEOUT} option.
1762:
1763: If a port set is specified, the call will receive a message sent to any
1764: of the member ports. It is permissible for the port set to have no
1765: member ports, and ports may be added and removed while a receive from
1766: the port set is in progress. The received message can come from any of
1767: the member ports which have messages, with the proviso that a member
1768: port with messages will not be indefinitely starved. The
1769: @code{msgh_local_port} field in the received message header specifies
1770: from which port in the port set the message came.
1771:
1772: The @code{rcv_size} argument specifies the size of the caller's message
1773: buffer. The @code{mach_msg} call will not receive a message larger than
1774: @code{rcv_size}. Messages that are too large are destroyed, unless the
1775: @code{MACH_RCV_LARGE} option is used.
1776:
1777: The destination and reply ports are reversed in a received message
1778: header. The @code{msgh_local_port} field names the destination port,
1779: from which the message was received, and the @code{msgh_remote_port}
1780: field names the reply port right. The bits in @code{msgh_bits} are also
1781: reversed. The @code{MACH_MSGH_BITS_LOCAL} bits have the value
1782: @code{MACH_MSG_TYPE_PORT_SEND} if the message was sent to a send right,
1783: and the value @code{MACH_MSG_TYPE_PORT_SEND_ONCE} if was sent to a
1784: send-once right. The @code{MACH_MSGH_BITS_REMOTE} bits describe the
1785: reply port right.
1786:
1787: A received message can contain port rights and out-of-line memory. The
1788: @code{msgh_local_port} field does not receive a port right; the act of
1789: receiving the message destroys the send or send-once right for the
1790: destination port. The msgh_remote_port field does name a received port
1791: right, the reply port right, and the message body can carry port rights
1792: and memory if @code{MACH_MSGH_BITS_COMPLEX} is present in msgh_bits.
1793: Received port rights and memory should be consumed or deallocated in
1794: some fashion.
1795:
1796: In almost all cases, @code{msgh_local_port} will specify the name of a
1797: receive right, either @code{rcv_name} or if @code{rcv_name} is a port
1798: set, a member of @code{rcv_name}. If other threads are concurrently
1799: manipulating the receive right, the situation is more complicated. If
1800: the receive right is renamed during the call, then
1801: @code{msgh_local_port} specifies the right's new name. If the caller
1802: loses the receive right after the message was dequeued from it, then
1803: @code{mach_msg} will proceed instead of returning
1804: @code{MACH_RCV_PORT_DIED}. If the receive right was destroyed, then
1805: @code{msgh_local_port} specifies @code{MACH_PORT_DEAD}. If the receive
1806: right still exists, but isn't held by the caller, then
1807: @code{msgh_local_port} specifies @code{MACH_PORT_NULL}.
1808:
1809: Received messages are stamped with a sequence number, taken from the
1810: port from which the message was received. (Messages received from a
1811: port set are stamped with a sequence number from the appropriate member
1812: port.) Newly created ports start with a zero sequence number, and the
1813: sequence number is reset to zero whenever the port's receive right moves
1814: between tasks. When a message is dequeued from the port, it is stamped
1815: with the port's sequence number and the port's sequence number is then
1816: incremented. The dequeue and increment operations are atomic, so that
1817: multiple threads receiving messages from a port can use the
1818: @code{msgh_seqno} field to reconstruct the original order of the
1819: messages.
1820:
1821: These options modify @code{MACH_RCV_MSG}. If @code{MACH_RCV_MSG} is not
1822: also specified, they are ignored.
1823:
1824: @table @code
1825: @item MACH_RCV_TIMEOUT
1826: The timeout argument should specify a maximum time (in milliseconds) for
1827: the call to block before giving up.@footnote{If MACH_RCV_TIMEOUT is used
1828: without MACH_RCV_INTERRUPT, then the timeout duration might not be
1829: accurate. When the call is interrupted and automatically retried, the
1830: original timeout is used. If interrupts occur frequently enough, the
1831: timeout interval might never expire.} If no message arrives before the
1832: timeout interval elapses, then the call returns
1833: @code{MACH_RCV_TIMED_OUT}. A zero timeout is legitimate.
1834:
1835: @item MACH_RCV_NOTIFY
1836: The notify argument should specify a receive right for a notify port.
1837: If receiving the reply port creates a new port right in the caller, then
1838: the notify port is used to request a dead-name notification for the new
1839: port right.
1840:
1841: @item MACH_RCV_INTERRUPT
1842: If specified, the @code{mach_msg} call will return
1843: @code{MACH_RCV_INTERRUPTED} if a software interrupt aborts the call.
1844: Otherwise, the receive operation will be retried.
1845:
1846: @item MACH_RCV_LARGE
1847: If the message is larger than @code{rcv_size}, then the message remains
1848: queued instead of being destroyed. The call returns
1849: @code{MACH_RCV_TOO_LARGE} and the actual size of the message is returned
1850: in the @code{msgh_size} field of the message header.
1851: @end table
1852:
1853: The receive operation can generate the following return codes. These
1854: return codes imply that the call did not dequeue a message:
1855:
1856: @table @code
1857: @item MACH_RCV_INVALID_NAME
1858: The specified @code{rcv_name} was invalid.
1859:
1860: @item MACH_RCV_IN_SET
1861: The specified port was a member of a port set.
1862:
1863: @item MACH_RCV_TIMED_OUT
1864: The timeout interval expired.
1865:
1866: @item MACH_RCV_INTERRUPTED
1867: A software interrupt occurred.
1868:
1869: @item MACH_RCV_PORT_DIED
1870: The caller lost the rights specified by @code{rcv_name}.
1871:
1872: @item MACH_RCV_PORT_CHANGED
1873: @code{rcv_name} specified a receive right which was moved into a port
1874: set during the call.
1875:
1876: @item MACH_RCV_TOO_LARGE
1877: When using @code{MACH_RCV_LARGE}, and the message was larger than
1878: @code{rcv_size}. The message is left queued, and its actual size is
1879: returned in the @code{msgh_size} field of the message buffer.
1880: @end table
1881:
1882: These return codes imply that a message was dequeued and destroyed:
1883:
1884: @table @code
1885: @item MACH_RCV_HEADER_ERROR
1886: A resource shortage prevented the reception of the port rights in the
1887: message header.
1888:
1889: @item MACH_RCV_INVALID_NOTIFY
1890: When using @code{MACH_RCV_NOTIFY}, the notify argument did not denote a
1891: valid receive right.
1892:
1893: @item MACH_RCV_TOO_LARGE
1894: When not using @code{MACH_RCV_LARGE}, a message larger than
1895: @code{rcv_size} was dequeued and destroyed.
1896: @end table
1897:
1898: In these situations, when a message is dequeued and then destroyed, the
1899: reply port and all port rights and memory in the message body are
1900: destroyed. However, the caller receives the message's header, with all
1901: fields correct, including the destination port but excepting the reply
1902: port, which is @code{MACH_PORT_NULL}.
1903:
1904: These return codes imply that a message was received:
1905:
1906: @table @code
1907: @item MACH_RCV_BODY_ERROR
1908: A resource shortage prevented the reception of a port right or
1909: out-of-line memory region in the message body. The message header,
1910: including the reply port, is correct. The kernel attempts to transfer
1911: all port rights and memory regions in the body, and only destroys those
1912: that can't be transferred.
1913:
1914: @item MACH_RCV_INVALID_DATA
1915: The specified message buffer was not writable. The calling task did
1916: successfully receive the port rights and out-of-line memory regions in
1917: the message.
1918:
1919: @item MACH_MSG_SUCCESS
1920: A message was received.
1921: @end table
1922:
1923: Resource shortages can occur after a message is dequeued, while
1924: transferring port rights and out-of-line memory regions to the receiving
1925: task. The @code{mach_msg} call returns @code{MACH_RCV_HEADER_ERROR} or
1926: @code{MACH_RCV_BODY_ERROR} in this situation. These return codes always
1927: carry extra bits (bitwise-ored) that indicate the nature of the resource
1928: shortage:
1929:
1930: @table @code
1931: @item MACH_MSG_IPC_SPACE
1932: There was no room in the task's IPC name space for another port name.
1933:
1934: @item MACH_MSG_VM_SPACE
1935: There was no room in the task's VM address space for an out-of-line
1936: memory region.
1937:
1938: @item MACH_MSG_IPC_KERNEL
1939: A kernel resource shortage prevented the reception of a port right.
1940:
1941: @item MACH_MSG_VM_KERNEL
1942: A kernel resource shortage prevented the reception of an out-of-line
1943: memory region.
1944: @end table
1945:
1946: If a resource shortage prevents the reception of a port right, the port
1947: right is destroyed and the caller sees the name @code{MACH_PORT_NULL}.
1948: If a resource shortage prevents the reception of an out-of-line memory
1949: region, the region is destroyed and the caller receives a zero address.
1950: In addition, the @code{msgt_size} (@code{msgtl_size}) field in the
1951: data's type descriptor is changed to zero. If a resource shortage
1952: prevents the reception of out-of-line memory carrying port rights, then
1953: the port rights are always destroyed if the memory region can not be
1954: received. A task never receives port rights or memory regions that it
1955: isn't told about.
1956:
1957:
1958: @node Atomicity
1959: @subsection Atomicity
1960:
1961: The @code{mach_msg} call handles port rights in a message header
1962: atomically. Port rights and out-of-line memory in a message body do not
1963: enjoy this atomicity guarantee. The message body may be processed
1964: front-to-back, back-to-front, first out-of-line memory then port rights,
1965: in some random order, or even atomically.
1966:
1967: For example, consider sending a message with the destination port
1968: specified as @code{MACH_MSG_TYPE_MOVE_SEND} and the reply port specified
1969: as @code{MACH_MSG_TYPE_COPY_SEND}. The same send right, with one
1970: user-reference, is supplied for both the @code{msgh_remote_port} and
1971: @code{msgh_local_port} fields. Because @code{mach_msg} processes the
1972: message header atomically, this succeeds. If @code{msgh_remote_port}
1973: were processed before @code{msgh_local_port}, then @code{mach_msg} would
1974: return @code{MACH_SEND_INVALID_REPLY} in this situation.
1975:
1976: On the other hand, suppose the destination and reply port are both
1977: specified as @code{MACH_MSG_TYPE_MOVE_SEND}, and again the same send
1978: right with one user-reference is supplied for both. Now the send
1979: operation fails, but because it processes the header atomically,
1980: mach_msg can return either @code{MACH_SEND_INVALID_DEST} or
1981: @code{MACH_SEND_INVALID_REPLY}.
1982:
1983: For example, consider receiving a message at the same time another
1984: thread is deallocating the destination receive right. Suppose the reply
1985: port field carries a send right for the destination port. If the
1986: deallocation happens before the dequeuing, then the receiver gets
1987: @code{MACH_RCV_PORT_DIED}. If the deallocation happens after the
1988: receive, then the @code{msgh_local_port} and the @code{msgh_remote_port}
1989: fields both specify the same right, which becomes a dead name when the
1990: receive right is deallocated. If the deallocation happens between the
1991: dequeue and the receive, then the @code{msgh_local_port} and
1992: @code{msgh_remote_port} fields both specify @code{MACH_PORT_DEAD}.
1993: Because the header is processed atomically, it is not possible for just
1994: one of the two fields to hold @code{MACH_PORT_DEAD}.
1995:
1996: The @code{MACH_RCV_NOTIFY} option provides a more likely example.
1997: Suppose a message carrying a send-once right reply port is received with
1998: @code{MACH_RCV_NOTIFY} at the same time the reply port is destroyed. If
1999: the reply port is destroyed first, then @code{msgh_remote_port}
2000: specifies @code{MACH_PORT_DEAD} and the kernel does not generate a
2001: dead-name notification. If the reply port is destroyed after it is
2002: received, then @code{msgh_remote_port} specifies a dead name for which
2003: the kernel generates a dead-name notification. It is not possible to
2004: receive the reply port right and have it turn into a dead name before
2005: the dead-name notification is requested; as part of the message header
2006: the reply port is received atomically.
2007:
2008:
2009: @node Port Manipulation Interface
2010: @section Port Manipulation Interface
2011:
2012: This section describes the interface to create, destroy and manipulate
2013: ports, port rights and port sets.
2014:
2015: @cindex IPC space port
2016: @cindex port representing an IPC space
2017: @deftp {Data type} ipc_space_t
2018: This is a @code{task_t} (and as such a @code{mach_port_t}), which holds
2019: a port name associated with a port that represents an IPC space in the
2020: kernel. An IPC space is used by the kernel to manage the port names and
2021: rights available to a task. The IPC space doesn't get a port name of
2022: its own. Instead the port name of the task containing the IPC space is
2023: used to name the IPC space of the task (as is indicated by the fact that
2024: the type of @code{ipc_space_t} is actually @code{task_t}).
2025:
2026: The IPC spaces of tasks are the only ones accessible outside of
2027: the kernel.
2028: @end deftp
2029:
2030: @menu
2031: * Port Creation:: How to create new ports and port sets.
2032: * Port Destruction:: How to destroy ports and port sets.
2033: * Port Names:: How to query and manipulate port names.
2034: * Port Rights:: How to work with port rights.
2035: * Ports and other Tasks:: How to move rights between tasks.
2036: * Receive Rights:: How to work with receive rights.
2037: * Port Sets:: How to work with port sets.
2038: * Request Notifications:: How to request notifications for events.
2039: @c * Inherited Ports:: How to work with the inherited system ports.
2040: @end menu
2041:
2042:
2043: @node Port Creation
2044: @subsection Port Creation
2045:
2046: @deftypefun kern_return_t mach_port_allocate (@w{ipc_space_t @var{task}}, @w{mach_port_right_t @var{right}}, @w{mach_port_t *@var{name}})
2047: The @code{mach_port_allocate} function creates a new right in the
2048: specified task. The new right's name is returned in @var{name}, which
2049: may be any name that wasn't in use.
2050:
2051: The @var{right} argument takes the following values:
2052:
2053: @table @code
2054: @item MACH_PORT_RIGHT_RECEIVE
2055: @code{mach_port_allocate} creates a port. The new port is not a member
2056: of any port set. It doesn't have any extant send or send-once rights.
2057: Its make-send count is zero, its sequence number is zero, its queue
2058: limit is @code{MACH_PORT_QLIMIT_DEFAULT}, and it has no queued messages.
2059: @var{name} denotes the receive right for the new port.
2060:
2061: @var{task} does not hold send rights for the new port, only the receive
2062: right. @code{mach_port_insert_right} and @code{mach_port_extract_right}
2063: can be used to convert the receive right into a combined send/receive
2064: right.
2065:
2066: @item MACH_PORT_RIGHT_PORT_SET
2067: @code{mach_port_allocate} creates a port set. The new port set has no
2068: members.
2069:
2070: @item MACH_PORT_RIGHT_DEAD_NAME
2071: @code{mach_port_allocate} creates a dead name. The new dead name has
2072: one user reference.
2073: @end table
2074:
2075: The function returns @code{KERN_SUCCESS} if the call succeeded,
2076: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2077: @code{KERN_INVALID_VALUE} if @var{right} was invalid, @code{KERN_NO_SPACE} if
2078: there was no room in @var{task}'s IPC name space for another right and
2079: @code{KERN_RESOURCE_SHORTAGE} if the kernel ran out of memory.
2080:
2081: The @code{mach_port_allocate} call is actually an RPC to @var{task},
2082: normally a send right for a task port, but potentially any send right.
2083: In addition to the normal diagnostic return codes from the call's server
2084: (normally the kernel), the call may return @code{mach_msg} return codes.
2085: @end deftypefun
2086:
2087: @deftypefun mach_port_t mach_reply_port ()
2088: The @code{mach_reply_port} system call creates a reply port in the
2089: calling task.
2090:
2091: @code{mach_reply_port} creates a port, giving the calling task the
2092: receive right for the port. The call returns the name of the new
2093: receive right.
2094:
2095: This is very much like creating a receive right with the
2096: @code{mach_port_allocate} call, with two differences. First,
2097: @code{mach_reply_port} is a system call and not an RPC (which requires a
2098: reply port). Second, the port created by @code{mach_reply_port} may be
2099: optimized for use as a reply port.
2100:
2101: The function returns @code{MACH_PORT_NULL} if a resource shortage
2102: prevented the creation of the receive right.
2103: @end deftypefun
2104:
2105: @deftypefun kern_return_t mach_port_allocate_name (@w{ipc_space_t @var{task}}, @w{mach_port_right_t @var{right}}, @w{mach_port_t @var{name}})
2106: The function @code{mach_port_allocate_name} creates a new right in the
2107: specified task, with a specified name for the new right. @var{name}
2108: must not already be in use for some right, and it can't be the reserved
2109: values @code{MACH_PORT_NULL} and @code{MACH_PORT_DEAD}.
2110:
2111: The @var{right} argument takes the following values:
2112:
2113: @table @code
2114: @item MACH_PORT_RIGHT_RECEIVE
2115: @code{mach_port_allocate_name} creates a port. The new port is not a
2116: member of any port set. It doesn't have any extant send or send-once
2117: rights. Its make-send count is zero, its sequence number is zero, its
2118: queue limit is @code{MACH_PORT_QLIMIT_DEFAULT}, and it has no queued
2119: messages. @var{name} denotes the receive right for the new port.
2120:
2121: @var{task} does not hold send rights for the new port, only the receive
2122: right. @code{mach_port_insert_right} and @code{mach_port_extract_right}
2123: can be used to convert the receive right into a combined send/receive
2124: right.
2125:
2126: @item MACH_PORT_RIGHT_PORT_SET
2127: @code{mach_port_allocate_name} creates a port set. The new port set has
2128: no members.
2129:
2130: @item MACH_PORT_RIGHT_DEAD_NAME
2131: @code{mach_port_allocate_name} creates a new dead name. The new dead
2132: name has one user reference.
2133: @end table
2134:
2135: The function returns @code{KERN_SUCCESS} if the call succeeded,
2136: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2137: @code{KERN_INVALID_VALUE} if @var{right} was invalid or @var{name} was
2138: @code{MACH_PORT_NULL} or @code{MACH_PORT_DEAD}, @code{KERN_NAME_EXISTS}
2139: if @var{name} was already in use for a port right and
2140: @code{KERN_RESOURCE_SHORTAGE} if the kernel ran out of memory.
2141:
2142: The @code{mach_port_allocate_name} call is actually an RPC to
2143: @var{task}, normally a send right for a task port, but potentially any
2144: send right. In addition to the normal diagnostic return codes from the
2145: call's server (normally the kernel), the call may return @code{mach_msg}
2146: return codes.
2147: @end deftypefun
2148:
2149:
2150: @node Port Destruction
2151: @subsection Port Destruction
2152:
2153: @deftypefun kern_return_t mach_port_deallocate (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}})
2154: The function @code{mach_port_deallocate} releases a user reference for a
2155: right in @var{task}'s IPC name space. It allows a task to release a
2156: user reference for a send or send-once right without failing if the port
2157: has died and the right is now actually a dead name.
2158:
2159: If @var{name} denotes a dead name, send right, or send-once right, then
2160: the right loses one user reference. If it only had one user reference,
2161: then the right is destroyed.
2162:
2163: The function returns @code{KERN_SUCCESS} if the call succeeded,
2164: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2165: @code{KERN_INVALID_NAME} if @var{name} did not denote a right and
2166: @code{KERN_INVALID_RIGHT} if @var{name} denoted an invalid right.
2167:
2168: The @code{mach_port_deallocate} call is actually an RPC to
2169: @var{task}, normally a send right for a task port, but potentially any
2170: send right. In addition to the normal diagnostic return codes from the
2171: call's server (normally the kernel), the call may return @code{mach_msg}
2172: return codes.
2173: @end deftypefun
2174:
2175: @deftypefun kern_return_t mach_port_destroy (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}})
2176: The function @code{mach_port_destroy} deallocates all rights denoted by
2177: a name. The name becomes immediately available for reuse.
2178:
2179: For most purposes, @code{mach_port_mod_refs} and
2180: @code{mach_port_deallocate} are preferable.
2181:
2182: If @var{name} denotes a port set, then all members of the port set are
2183: implicitly removed from the port set.
2184:
2185: If @var{name} denotes a receive right that is a member of a port set,
2186: the receive right is implicitly removed from the port set. If there is
2187: a port-destroyed request registered for the port, then the receive right
2188: is not actually destroyed, but instead is sent in a port-destroyed
2189: notification to the backup port. If there is no registered
2190: port-destroyed request, remaining messages queued to the port are
2191: destroyed and extant send and send-once rights turn into dead names. If
2192: those send and send-once rights have dead-name requests registered, then
2193: dead-name notifications are generated for them.
2194:
2195: If @var{name} denotes a send-once right, then the send-once right is
2196: used to produce a send-once notification for the port.
2197:
2198: If @var{name} denotes a send-once, send, and/or receive right, and it
2199: has a dead-name request registered, then the registered send-once right
2200: is used to produce a port-deleted notification for the name.
2201:
2202: The function returns @code{KERN_SUCCESS} if the call succeeded,
2203: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2204: @code{KERN_INVALID_NAME} if @var{name} did not denote a right.
2205:
2206: The @code{mach_port_destroy} call is actually an RPC to
2207: @var{task}, normally a send right for a task port, but potentially any
2208: send right. In addition to the normal diagnostic return codes from the
2209: call's server (normally the kernel), the call may return @code{mach_msg}
2210: return codes.
2211: @end deftypefun
2212:
2213:
2214: @node Port Names
2215: @subsection Port Names
2216:
2217: @deftypefun kern_return_t mach_port_names (@w{ipc_space_t @var{task}}, @w{mach_port_array_t *@var{names}}, @w{mach_msg_type_number_t *@var{ncount}}, @w{mach_port_type_array_t *@var{types}}, @w{mach_msg_type_number_t *@var{tcount}})
2218: The function @code{mach_port_names} returns information about
2219: @var{task}'s port name space. For each name, it also returns what type
2220: of rights @var{task} holds. (The same information returned by
2221: @code{mach_port_type}.) @var{names} and @var{types} are arrays that are
2222: automatically allocated when the reply message is received. The user
2223: should @code{vm_deallocate} them when the data is no longer needed.
2224:
2225: @code{mach_port_names} will return in @var{names} the names of the
2226: ports, port sets, and dead names in the task's port name space, in no
2227: particular order and in @var{ncount} the number of names returned. It
2228: will return in @var{types} the type of each corresponding name, which
2229: indicates what kind of rights the task holds with that name.
2230: @var{tcount} should be the same as @var{ncount}.
2231:
2232: The function returns @code{KERN_SUCCESS} if the call succeeded,
2233: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2234: @code{KERN_RESOURCE_SHORTAGE} if the kernel ran out of memory.
2235:
2236: The @code{mach_port_names} call is actually an RPC to @var{task},
2237: normally a send right for a task port, but potentially any send right.
2238: In addition to the normal diagnostic return codes from the call's server
2239: (normally the kernel), the call may return @code{mach_msg} return codes.
2240: @end deftypefun
2241:
2242: @deftypefun kern_return_t mach_port_type (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_type_t *@var{ptype}})
2243: The function @code{mach_port_type} returns information about
2244: @var{task}'s rights for a specific name in its port name space. The
2245: returned @var{ptype} is a bitmask indicating what rights @var{task}
2246: holds for the port, port set or dead name. The bitmask is composed of
2247: the following bits:
2248:
2249: @table @code
2250: @item MACH_PORT_TYPE_SEND
2251: The name denotes a send right.
2252:
2253: @item MACH_PORT_TYPE_RECEIVE
2254: The name denotes a receive right.
2255:
2256: @item MACH_PORT_TYPE_SEND_ONCE
2257: The name denotes a send-once right.
2258:
2259: @item MACH_PORT_TYPE_PORT_SET
2260: The name denotes a port set.
2261:
2262: @item MACH_PORT_TYPE_DEAD_NAME
2263: The name is a dead name.
2264:
2265: @item MACH_PORT_TYPE_DNREQUEST
2266: A dead-name request has been registered for the right.
2267:
2268: @item MACH_PORT_TYPE_MAREQUEST
2269: A msg-accepted request for the right is pending.
2270:
2271: @item MACH_PORT_TYPE_COMPAT
2272: The port right was created in the compatibility mode.
2273: @end table
2274:
2275: The function returns @code{KERN_SUCCESS} if the call succeeded,
2276: @code{KERN_INVALID_TASK} if @var{task} was invalid and
2277: @code{KERN_INVALID_NAME} if @var{name} did not denote a right.
2278:
2279: The @code{mach_port_type} call is actually an RPC to @var{task},
2280: normally a send right for a task port, but potentially any send right.
2281: In addition to the normal diagnostic return codes from the call's server
2282: (normally the kernel), the call may return @code{mach_msg} return codes.
2283: @end deftypefun
2284:
2285: @deftypefun kern_return_t mach_port_rename (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{old_name}}, @w{mach_port_t @var{new_name}})
2286: The function @code{mach_port_rename} changes the name by which a port,
2287: port set, or dead name is known to @var{task}. @var{old_name} is the
2288: original name and @var{new_name} the new name for the port right.
2289: @var{new_name} must not already be in use, and it can't be the
2290: distinguished values @code{MACH_PORT_NULL} and @code{MACH_PORT_DEAD}.
2291:
2292: The function returns @code{KERN_SUCCESS} if the call succeeded,
2293: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2294: @code{KERN_INVALID_NAME} if @var{old_name} did not denote a right,
2295: @code{KERN_INVALID_VALUE} if @var{new_name} was @code{MACH_PORT_NULL} or
2296: @code{MACH_PORT_DEAD}, @code{KERN_NAME_EXISTS} if @code{new_name}
2297: already denoted a right and @code{KERN_RESOURCE_SHORTAGE} if the kernel
2298: ran out of memory.
2299:
2300: The @code{mach_port_rename} call is actually an RPC to @var{task},
2301: normally a send right for a task port, but potentially any send right.
2302: In addition to the normal diagnostic return codes from the call's server
2303: (normally the kernel), the call may return @code{mach_msg} return codes.
2304: @end deftypefun
2305:
2306:
2307: @node Port Rights
2308: @subsection Port Rights
2309:
2310: @deftypefun kern_return_t mach_port_get_refs (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_right_t @var{right}}, @w{mach_port_urefs_t *@var{refs}})
2311: The function @code{mach_port_get_refs} returns the number of user
2312: references a task has for a right.
2313:
2314: The @var{right} argument takes the following values:
2315: @itemize @bullet
2316: @item @code{MACH_PORT_RIGHT_SEND}
2317: @item @code{MACH_PORT_RIGHT_RECEIVE}
2318: @item @code{MACH_PORT_RIGHT_SEND_ONCE}
2319: @item @code{MACH_PORT_RIGHT_PORT_SET}
2320: @item @code{MACH_PORT_RIGHT_DEAD_NAME}
2321: @end itemize
2322:
2323: If @var{name} denotes a right, but not the type of right specified, then
2324: zero is returned. Otherwise a positive number of user references is
2325: returned. Note that a name may simultaneously denote send and receive
2326: rights.
2327:
2328: The function returns @code{KERN_SUCCESS} if the call succeeded,
2329: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2330: @code{KERN_INVALID_VALUE} if @var{right} was invalid and
2331: @code{KERN_INVALID_NAME} if @var{name} did not denote a right.
2332:
2333: The @code{mach_port_get_refs} call is actually an RPC to @var{task},
2334: normally a send right for a task port, but potentially any send right.
2335: In addition to the normal diagnostic return codes from the call's server
2336: (normally the kernel), the call may return @code{mach_msg} return codes.
2337: @end deftypefun
2338:
2339: @deftypefun kern_return_t mach_port_mod_refs (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_right_t @var{right}}, @w{mach_port_delta_t @var{delta}})
2340: The function @code{mach_port_mod_refs} requests that the number of user
2341: references a task has for a right be changed. This results in the right
2342: being destroyed, if the number of user references is changed to zero.
2343: The task holding the right is @var{task}, @var{name} should denote the
2344: specified right. @var{right} denotes the type of right being modified.
2345: @var{delta} is the signed change to the number of user references.
2346:
2347: The @var{right} argument takes the following values:
2348: @itemize @bullet
2349: @item @code{MACH_PORT_RIGHT_SEND}
2350: @item @code{MACH_PORT_RIGHT_RECEIVE}
2351: @item @code{MACH_PORT_RIGHT_SEND_ONCE}
2352: @item @code{MACH_PORT_RIGHT_PORT_SET}
2353: @item @code{MACH_PORT_RIGHT_DEAD_NAME}
2354: @end itemize
2355:
2356: The number of user references for the right is changed by the amount
2357: @var{delta}, subject to the following restrictions: port sets, receive
2358: rights, and send-once rights may only have one user reference. The
2359: resulting number of user references can't be negative. If the resulting
2360: number of user references is zero, the effect is to deallocate the
2361: right. For dead names and send rights, there is an
2362: implementation-defined maximum number of user references.
2363:
2364: If the call destroys the right, then the effect is as described for
2365: @code{mach_port_destroy}, with the exception that
2366: @code{mach_port_destroy} simultaneously destroys all the rights denoted
2367: by a name, while @code{mach_port_mod_refs} can only destroy one right.
2368: The name will be available for reuse if it only denoted the one right.
2369:
2370: The function returns @code{KERN_SUCCESS} if the call succeeded,
2371: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2372: @code{KERN_INVALID_VALUE} if @var{right} was invalid or the
2373: user-reference count would become negative, @code{KERN_INVALID_NAME} if
2374: @var{name} did not denote a right, @code{KERN_INVALID_RIGHT} if
2375: @var{name} denoted a right, but not the specified right and
2376: @code{KERN_UREFS_OVERFLOW} if the user-reference count would overflow.
2377:
2378: The @code{mach_port_mod_refs} call is actually an RPC to @var{task},
2379: normally a send right for a task port, but potentially any send right.
2380: In addition to the normal diagnostic return codes from the call's server
2381: (normally the kernel), the call may return @code{mach_msg} return codes.
2382: @end deftypefun
2383:
2384:
2385: @node Ports and other Tasks
2386: @subsection Ports and other Tasks
2387:
2388: @deftypefun kern_return_t mach_port_insert_right (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_t @var{right}}, @w{mach_msg_type_name_t @var{right_type}})
2389: The function @var{mach_port_insert_right} inserts into @var{task} the
2390: caller's right for a port, using a specified name for the right in the
2391: target task.
2392:
2393: The specified @var{name} can't be one of the reserved values
2394: @code{MACH_PORT_NULL} or @code{MACH_PORT_DEAD}. The @var{right} can't
2395: be @code{MACH_PORT_NULL} or @code{MACH_PORT_DEAD}.
2396:
2397: The argument @var{right_type} specifies a right to be inserted and how
2398: that right should be extracted from the caller. It should be a value
2399: appropriate for @var{msgt_name}; see @code{mach_msg}. @c XXX cross ref
2400:
2401: If @var{right_type} is @code{MACH_MSG_TYPE_MAKE_SEND},
2402: @code{MACH_MSG_TYPE_MOVE_SEND}, or @code{MACH_MSG_TYPE_COPY_SEND}, then
2403: a send right is inserted. If the target already holds send or receive
2404: rights for the port, then @var{name} should denote those rights in the
2405: target. Otherwise, @var{name} should be unused in the target. If the
2406: target already has send rights, then those send rights gain an
2407: additional user reference. Otherwise, the target gains a send right,
2408: with a user reference count of one.
2409:
2410: If @var{right_type} is @code{MACH_MSG_TYPE_MAKE_SEND_ONCE} or
2411: @code{MACH_MSG_TYPE_MOVE_SEND_ONCE}, then a send-once right is inserted.
2412: The name should be unused in the target. The target gains a send-once
2413: right.
2414:
2415: If @var{right_type} is @code{MACH_MSG_TYPE_MOVE_RECEIVE}, then a receive
2416: right is inserted. If the target already holds send rights for the
2417: port, then name should denote those rights in the target. Otherwise,
2418: name should be unused in the target. The receive right is moved into
2419: the target task.
2420:
2421: The function returns @code{KERN_SUCCESS} if the call succeeded,
2422: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2423: @code{KERN_INVALID_VALUE} if @var{right} was not a port right or
2424: @var{name} was @code{MACH_PORT_NULL} or @code{MACH_PORT_DEAD},
2425: @code{KERN_NAME_EXISTS} if @var{name} already denoted a right,
2426: @code{KERN_INVALID_CAPABILITY} if @var{right} was @code{MACH_PORT_NULL}
2427: or @code{MACH_PORT_DEAD} @code{KERN_RIGHT_EXISTS} if @var{task} already
2428: had rights for the port, with a different name,
2429: @code{KERN_UREFS_OVERFLOW} if the user-reference count would overflow
2430: and @code{KERN_RESOURCE_SHORTAGE} if the kernel ran out of memory.
2431:
2432: The @code{mach_port_insert_right} call is actually an RPC to @var{task},
2433: normally a send right for a task port, but potentially any send right.
2434: In addition to the normal diagnostic return codes from the call's server
2435: (normally the kernel), the call may return @code{mach_msg} return codes.
2436: @end deftypefun
2437:
2438: @deftypefun kern_return_t mach_port_extract_right (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_msg_type_name_t @var{desired_type}}, @w{mach_port_t *@var{right}}, @w{mach_msg_type_name_t *@var{acquired_type}})
2439: The function @var{mach_port_extract_right} extracts a port right from
2440: the target @var{task} and returns it to the caller as if the task sent
2441: the right voluntarily, using @var{desired_type} as the value of
2442: @var{msgt_name}. @xref{Mach Message Call}.
2443:
2444: The returned value of @var{acquired_type} will be
2445: @code{MACH_MSG_TYPE_PORT_SEND} if a send right is extracted,
2446: @code{MACH_MSG_TYPE_PORT_RECEIVE} if a receive right is extracted, and
2447: @code{MACH_MSG_TYPE_PORT_SEND_ONCE} if a send-once right is extracted.
2448:
2449: The function returns @code{KERN_SUCCESS} if the call succeeded,
2450: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2451: @code{KERN_INVALID_NAME} if @var{name} did not denote a right,
2452: @code{KERN_INVALID_RIGHT} if @var{name} denoted a right, but an invalid one,
2453: @code{KERN_INVALID_VALUE} if @var{desired_type} was invalid.
2454:
2455: The @code{mach_port_extract_right} call is actually an RPC to
2456: @var{task}, normally a send right for a task port, but potentially any
2457: send right. In addition to the normal diagnostic return codes from the
2458: call's server (normally the kernel), the call may return @code{mach_msg}
2459: return codes.
2460: @end deftypefun
2461:
2462:
2463: @node Receive Rights
2464: @subsection Receive Rights
2465:
2466: @deftp {Data type} mach_port_seqno_t
2467: The @code{mach_port_seqno_t} data type is an @code{unsigned int} which
2468: contains the sequence number of a port.
2469: @end deftp
2470:
2471: @deftp {Data type} mach_port_mscount_t
2472: The @code{mach_port_mscount_t} data type is an @code{unsigned int} which
2473: contains the make-send count for a port.
2474: @end deftp
2475:
2476: @deftp {Data type} mach_port_msgcount_t
2477: The @code{mach_port_msgcount_t} data type is an @code{unsigned int} which
2478: contains a number of messages.
2479: @end deftp
2480:
2481: @deftp {Data type} mach_port_rights_t
2482: The @code{mach_port_rights_t} data type is an @code{unsigned int} which
2483: contains a number of rights for a port.
2484: @end deftp
2485:
2486: @deftp {Data type} mach_port_status_t
2487: This structure contains some status information about a port, which can
2488: be queried with @code{mach_port_get_receive_status}. It has the following
2489: members:
2490:
2491: @table @code
2492: @item mach_port_t mps_pset
2493: The containing port set.
2494:
2495: @item mach_port_seqno_t mps_seqno
2496: The sequence number.
2497:
2498: @item mach_port_mscount_t mps_mscount
2499: The make-send count.
2500:
2501: @item mach_port_msgcount_t mps_qlimit
2502: The maximum number of messages in the queue.
2503:
2504: @item mach_port_msgcount_t mps_msgcount
2505: The current number of messages in the queue.
2506:
2507: @item mach_port_rights_t mps_sorights
2508: The number of send-once rights that exist.
2509:
2510: @item boolean_t mps_srights
2511: @code{TRUE} if send rights exist.
2512:
2513: @item boolean_t mps_pdrequest
2514: @code{TRUE} if port-deleted notification is requested.
2515:
2516: @item boolean_t mps_nsrequest
2517: @code{TRUE} if no-senders notification is requested.
2518: @end table
2519: @end deftp
2520:
2521: @deftypefun kern_return_t mach_port_get_receive_status (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_status_t *@var{status}})
2522: The function @code{mach_port_get_receive_status} returns the current
2523: status of the specified receive right.
2524:
2525: The function returns @code{KERN_SUCCESS} if the call succeeded,
2526: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2527: @code{KERN_INVALID_NAME} if @var{name} did not denote a right and
2528: @code{KERN_INVALID_RIGHT} if @var{name} denoted a right, but not a
2529: receive right.
2530:
2531: The @code{mach_port_get_receive_status} call is actually an RPC to @var{task},
2532: normally a send right for a task port, but potentially any send right.
2533: In addition to the normal diagnostic return codes from the call's server
2534: (normally the kernel), the call may return @code{mach_msg} return codes.
2535: @end deftypefun
2536:
2537: @deftypefun kern_return_t mach_port_set_mscount (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_mscount_t @var{mscount}})
2538: The function @code{mach_port_set_mscount} changes the make-send count of
2539: @var{task}'s receive right named @var{name} to @var{mscount}. All
2540: values for @var{mscount} are valid.
2541:
2542: The function returns @code{KERN_SUCCESS} if the call succeeded,
2543: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2544: @code{KERN_INVALID_NAME} if @var{name} did not denote a right and
2545: @code{KERN_INVALID_RIGHT} if @var{name} denoted a right, but not a
2546: receive right.
2547:
2548: The @code{mach_port_set_mscount} call is actually an RPC to @var{task},
2549: normally a send right for a task port, but potentially any send right.
2550: In addition to the normal diagnostic return codes from the call's server
2551: (normally the kernel), the call may return @code{mach_msg} return codes.
2552: @end deftypefun
2553:
2554: @deftypefun kern_return_t mach_port_set_qlimit (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_msgcount_t @var{qlimit}})
2555: The function @code{mach_port_set_qlimit} changes the queue limit
2556: @var{task}'s receive right named @var{name} to @var{qlimit}. Valid
2557: values for @var{qlimit} are between zero and
2558: @code{MACH_PORT_QLIMIT_MAX}, inclusive.
2559:
2560: The function returns @code{KERN_SUCCESS} if the call succeeded,
2561: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2562: @code{KERN_INVALID_NAME} if @var{name} did not denote a right,
2563: @code{KERN_INVALID_RIGHT} if @var{name} denoted a right, but not a
2564: receive right and @code{KERN_INVALID_VALUE} if @var{qlimit} was invalid.
2565:
2566: The @code{mach_port_set_qlimit} call is actually an RPC to @var{task},
2567: normally a send right for a task port, but potentially any send right.
2568: In addition to the normal diagnostic return codes from the call's server
2569: (normally the kernel), the call may return @code{mach_msg} return codes.
2570: @end deftypefun
2571:
2572: @deftypefun kern_return_t mach_port_set_seqno (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_seqno_t @var{seqno}})
2573: The function @code{mach_port_set_seqno} changes the sequence number
2574: @var{task}'s receive right named @var{name} to @var{seqno}. All
2575: sequence number values are valid. The next message received from the
2576: port will be stamped with the specified sequence number.
2577:
2578: The function returns @code{KERN_SUCCESS} if the call succeeded,
2579: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2580: @code{KERN_INVALID_NAME} if @var{name} did not denote a right and
2581: @code{KERN_INVALID_RIGHT} if @var{name} denoted a right, but not a
2582: receive right.
2583:
2584: The @code{mach_port_set_seqno} call is actually an RPC to @var{task},
2585: normally a send right for a task port, but potentially any send right.
2586: In addition to the normal diagnostic return codes from the call's server
2587: (normally the kernel), the call may return @code{mach_msg} return codes.
2588: @end deftypefun
2589:
2590:
2591: @node Port Sets
2592: @subsection Port Sets
2593:
2594: @deftypefun kern_return_t mach_port_get_set_status (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_port_array_t *@var{members}}, @w{mach_msg_type_number_t *@var{count}})
2595: The function @code{mach_port_get_set_status} returns the members of a
2596: port set. @var{members} is an array that is automatically allocated
2597: when the reply message is received. The user should
2598: @code{vm_deallocate} it when the data is no longer needed.
2599:
2600: The function returns @code{KERN_SUCCESS} if the call succeeded,
2601: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2602: @code{KERN_INVALID_NAME} if @var{name} did not denote a right,
2603: @code{KERN_INVALID_RIGHT} if @var{name} denoted a right, but not a
2604: receive right and @code{KERN_RESOURCE_SHORTAGE} if the kernel ran out of
2605: memory.
2606:
2607: The @code{mach_port_get_set_status} call is actually an RPC to
2608: @var{task}, normally a send right for a task port, but potentially any
2609: send right. In addition to the normal diagnostic return codes from the
2610: call's server (normally the kernel), the call may return @code{mach_msg}
2611: return codes.
2612: @end deftypefun
2613:
2614: @deftypefun kern_return_t mach_port_move_member (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{member}}, @w{mach_port_t @var{after}})
2615: The function @var{mach_port_move_member} moves the receive right
2616: @var{member} into the port set @var{after}. If the receive right is
2617: already a member of another port set, it is removed from that set first
2618: (the whole operation is atomic). If the port set is
2619: @code{MACH_PORT_NULL}, then the receive right is not put into a port
2620: set, but removed from its current port set.
2621:
2622: The function returns @code{KERN_SUCCESS} if the call succeeded,
2623: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2624: @code{KERN_INVALID_NAME} if @var{member} or @var{after} did not denote a
2625: right, @code{KERN_INVALID_RIGHT} if @var{member} denoted a right, but
2626: not a receive right or @var{after} denoted a right, but not a port set,
2627: and @code{KERN_NOT_IN_SET} if @var{after} was @code{MACH_PORT_NULL}, but
2628: @code{member} wasn't currently in a port set.
2629:
2630: The @code{mach_port_move_member} call is actually an RPC to @var{task},
2631: normally a send right for a task port, but potentially any send right.
2632: In addition to the normal diagnostic return codes from the call's server
2633: (normally the kernel), the call may return @code{mach_msg} return codes.
2634: @end deftypefun
2635:
2636:
2637: @node Request Notifications
2638: @subsection Request Notifications
2639:
2640: @deftypefun kern_return_t mach_port_request_notification (@w{ipc_space_t @var{task}}, @w{mach_port_t @var{name}}, @w{mach_msg_id_t @var{variant}}, @w{mach_port_mscount_t @var{sync}}, @w{mach_port_t @var{notify}}, @w{mach_msg_type_name_t @var{notify_type}}, @w{mach_port_t *@var{previous}})
2641: The function @code{mach_port_request_notification} registers a request
2642: for a notification and supplies the send-once right @var{notify} to
2643: which the notification will be sent. The @var{notify_type} denotes the
2644: IPC type for the send-once right, which can be
2645: @code{MACH_MSG_TYPE_MAKE_SEND_ONCE} or
2646: @code{MACH_MSG_TYPE_MOVE_SEND_ONCE}. It is an atomic swap, returning
2647: the previously registered send-once right (or @code{MACH_PORT_NULL} for
2648: none) in @var{previous}. A previous notification request may be
2649: cancelled by providing @code{MACH_PORT_NULL} for @var{notify}.
2650:
2651: The @var{variant} argument takes the following values:
2652:
2653: @table @code
2654: @item MACH_NOTIFY_PORT_DESTROYED
2655: @var{sync} must be zero. The @var{name} must specify a receive right,
2656: and the call requests a port-destroyed notification for the receive
2657: right. If the receive right were to have been destroyed, say by
2658: @code{mach_port_destroy}, then instead the receive right will be sent in
2659: a port-destroyed notification to the registered send-once right.
2660:
2661: @item MACH_NOTIFY_DEAD_NAME
2662: The call requests a dead-name notification. @var{name} specifies send,
2663: receive, or send-once rights for a port. If the port is destroyed (and
2664: the right remains, becoming a dead name), then a dead-name notification
2665: which carries the name of the right will be sent to the registered
2666: send-once right. If @var{notify} is not null and sync is non-zero, the
2667: name may specify a dead name, and a dead-name notification is
2668: immediately generated.
2669:
2670: Whenever a dead-name notification is generated, the user reference count
2671: of the dead name is incremented. For example, a send right with two
2672: user refs has a registered dead-name request. If the port is destroyed,
2673: the send right turns into a dead name with three user refs (instead of
2674: two), and a dead-name notification is generated.
2675:
2676: If the name is made available for reuse, perhaps because of
2677: @code{mach_port_destroy} or @code{mach_port_mod_refs}, or the name
2678: denotes a send-once right which has a message sent to it, then the
2679: registered send-once right is used to generate a port-deleted
2680: notification.
2681:
2682: @item MACH_NOTIFY_NO_SENDERS
2683: The call requests a no-senders notification. @var{name} must specify a
2684: receive right. If @var{notify} is not null, and the receive right's
2685: make-send count is greater than or equal to the sync value, and it has
2686: no extant send rights, than an immediate no-senders notification is
2687: generated. Otherwise the notification is generated when the receive
2688: right next loses its last extant send right. In either case, any
2689: previously registered send-once right is returned.
2690:
2691: The no-senders notification carries the value the port's make-send count
2692: had when it was generated. The make-send count is incremented whenever
2693: @code{MACH_MSG_TYPE_MAKE_SEND} is used to create a new send right from
2694: the receive right. The make-send count is reset to zero when the
2695: receive right is carried in a message.
2696: @end table
2697:
2698: The function returns @code{KERN_SUCCESS} if the call succeeded,
2699: @code{KERN_INVALID_TASK} if @var{task} was invalid,
2700: @code{KERN_INVALID_VALUE} if @var{variant} was invalid,
2701: @code{KERN_INVALID_NAME} if @var{name} did not denote a right,
2702: @code{KERN_INVALID_RIGHT} if @var{name} denoted an invalid right and
2703: @code{KERN_INVALID_CAPABILITY} if @var{notify} was invalid.
2704:
2705: When using @code{MACH_NOTIFY_PORT_DESTROYED}, the function returns
2706: @code{KERN_INVALID_VALUE} if @var{sync} wasn't zero.
2707:
2708: When using @code{MACH_NOTIFY_DEAD_NAME}, the function returns
2709: @code{KERN_RESOURCE_SHORTAGE} if the kernel ran out of memory,
2710: @code{KERN_INVALID_ARGUMENT} if @var{name} denotes a dead name, but
2711: @var{sync} is zero or @var{notify} is @code{MACH_PORT_NULL}, and
2712: @code{KERN_UREFS_OVERFLOW} if @var{name} denotes a dead name, but
2713: generating an immediate dead-name notification would overflow the name's
2714: user-reference count.
2715:
2716: The @code{mach_port_request_notification} call is actually an RPC to
2717: @var{task}, normally a send right for a task port, but potentially any
2718: send right. In addition to the normal diagnostic return codes from the
2719: call's server (normally the kernel), the call may return @code{mach_msg}
2720: return codes.
2721: @end deftypefun
2722:
2723: @c The inherited ports concept is not used in the Hurd,
2724: @c and so the _SLOT macros are not defined in GNU Mach.
2725:
2726: @c @node Inherited Ports
2727: @c @subsection Inherited Ports
2728:
2729: @c @deftypefun kern_return_t mach_ports_register (@w{task_t @var{target_task}, @w{port_array_t @var{init_port_set}}, @w{int @var{init_port_array_count}})
2730: @c @deftypefunx kern_return_t mach_ports_lookup (@w{task_t @var{target_task}, @w{port_array_t *@var{init_port_set}}, @w{int *@var{init_port_array_count}})
2731: @c @code{mach_ports_register} manipulates the inherited ports array,
2732: @c @code{mach_ports_lookup} is used to acquire specific parent ports.
2733: @c @var{target_task} is the task to be affected. @var{init_port_set} is an
2734: @c array of system ports to be registered, or returned. Although the array
2735: @c size is given as variable, the kernel will only accept a limited number
2736: @c of ports. @var{init_port_array_count} is the number of ports returned
2737: @c in @var{init_port_set}.
2738:
2739: @c @code{mach_ports_register} registers an array of well-known system ports
2740: @c with the kernel on behalf of a specific task. Currently the ports to be
2741: @c registered are: the port to the Network Name Server, the port to the
2742: @c Environment Manager, and a port to the Service server. These port
2743: @c values must be placed in specific slots in the init_port_set. The slot
2744: @c numbers are given by the global constants defined in @file{mach_init.h}:
2745: @c @code{NAME_SERVER_SLOT}, @code{ENVIRONMENT_SLOT}, and
2746: @c @code{SERVICE_SLOT}. These ports may later be retrieved with
2747: @c @code{mach_ports_lookup}.
2748:
2749: @c When a new task is created (see @code{task_create}), the child task will
2750: @c be given access to these ports. Only port send rights may be
2751: @c registered. Furthermore, the number of ports which may be registered is
2752: @c fixed and given by the global constant @code{MACH_PORT_SLOTS_USED}
2753: @c Attempts to register too many ports will fail.
2754:
2755: @c It is intended that this mechanism be used only for task initialization,
2756: @c and then only by runtime support modules. A parent task has three
2757: @c choices in passing these system ports to a child task. Most commonly it
2758: @c can do nothing and its child will inherit access to the same
2759: @c @var{init_port_set} that the parent has; or a parent task may register a
2760: @c set of ports it wishes to have passed to all of its children by calling
2761: @c @code{mach_ports_register} using its task port; or it may make necessary
2762: @c modifications to the set of ports it wishes its child to see, and then
2763: @c register those ports using the child's task port prior to starting the
2764: @c child's thread(s). The @code{mach_ports_lookup} call which is done by
2765: @c @code{mach_init} in the child task will acquire these initial ports for
2766: @c the child.
2767:
2768: @c Tasks other than the Network Name Server and the Environment Manager
2769: @c should not need access to the Service port. The Network Name Server port
2770: @c is the same for all tasks on a given machine. The Environment port is
2771: @c the only port likely to have different values for different tasks.
2772:
2773: @c Since the number of ports which may be registered is limited, ports
2774: @c other than those used by the runtime system to initialize a task should
2775: @c be passed to children either through an initial message, or through the
2776: @c Network Name Server for public ports, or the Environment Manager for
2777: @c private ports.
2778:
2779: @c The function returns @code{KERN_SUCCESS} if the memory was allocated,
2780: @c and @code{KERN_INVALID_ARGUMENT} if an attempt was made to register more
2781: @c ports than the current kernel implementation allows.
2782: @c @end deftypefun
2783:
2784:
2785: @node Virtual Memory Interface
2786: @chapter Virtual Memory Interface
2787:
2788: @cindex virtual memory map port
2789: @cindex port representing a virtual memory map
2790: @deftp {Data type} vm_task_t
2791: This is a @code{task_t} (and as such a @code{mach_port_t}), which holds
2792: a port name associated with a port that represents a virtual memory map
2793: in the kernel. An virtual memory map is used by the kernel to manage
2794: the address space of a task. The virtual memory map doesn't get a port
2795: name of its own. Instead the port name of the task provided with the
2796: virtual memory is used to name the virtual memory map of the task (as is
2797: indicated by the fact that the type of @code{vm_task_t} is actually
2798: @code{task_t}).
2799:
2800: The virtual memory maps of tasks are the only ones accessible outside of
2801: the kernel.
2802: @end deftp
2803:
2804: @menu
2805: * Memory Allocation:: Allocation of new virtual memory.
2806: * Memory Deallocation:: Freeing unused virtual memory.
2807: * Data Transfer:: Reading, writing and copying memory.
2808: * Memory Attributes:: Tweaking memory regions.
2809: * Mapping Memory Objects:: How to map memory objects.
2810: * Memory Statistics:: How to get statistics about memory usage.
2811: @end menu
2812:
2813: @node Memory Allocation
2814: @section Memory Allocation
2815:
2816: @deftypefun kern_return_t vm_allocate (@w{vm_task_t @var{target_task}}, @w{vm_address_t *@var{address}}, @w{vm_size_t @var{size}}, @w{boolean_t @var{anywhere}})
2817: The function @code{vm_allocate} allocates a region of virtual memory,
2818: placing it in the specified @var{task}'s address space.
2819:
2820: The starting address is @var{address}. If the @var{anywhere} option is
2821: false, an attempt is made to allocate virtual memory starting at this
2822: virtual address. If this address is not at the beginning of a virtual
2823: page, it will be rounded down to one. If there is not enough space at
2824: this address, no memory will be allocated. If the @var{anywhere} option
2825: is true, the input value of this address will be ignored, and the space
2826: will be allocated wherever it is available. In either case, the address
2827: at which memory was actually allocated will be returned in
2828: @var{address}.
2829:
2830: @var{size} is the number of bytes to allocate (rounded by the system in
2831: a machine dependent way to an integral number of virtual pages).
2832:
2833: If @var{anywhere} is true, the kernel should find and allocate any
2834: region of the specified size, and return the address of the resulting
2835: region in address address, rounded to a virtual page boundary if there
2836: is sufficient space.
2837:
2838: The physical memory is not actually allocated until the new virtual
2839: memory is referenced. By default, the kernel rounds all addresses down
2840: to the nearest page boundary and all memory sizes up to the nearest page
2841: size. The global variable @code{vm_page_size} contains the page size.
2842: @code{mach_task_self} returns the value of the current task port which
2843: should be used as the @var{target_task} argument in order to allocate
2844: memory in the caller's address space. For languages other than C, these
2845: values can be obtained by the calls @code{vm_statistics} and
2846: @code{mach_task_self}. Initially, the pages of allocated memory will be
2847: protected to allow all forms of access, and will be inherited in child
2848: tasks as a copy. Subsequent calls to @code{vm_protect} and
2849: @code{vm_inherit} may be used to change these properties. The allocated
2850: region is always zero-filled.
2851:
2852: The function returns @code{KERN_SUCCESS} if the memory was successfully
2853: allocated, @code{KERN_INVALID_ADDRESS} if an invalid address was
2854: specified and @code{KERN_NO_SPACE} if there was not enough space left to
2855: satisfy the request.
2856: @end deftypefun
2857:
2858:
2859: @node Memory Deallocation
2860: @section Memory Deallocation
2861:
2862: @deftypefun kern_return_t vm_deallocate (@w{vm_task_t @var{target_task}}, @w{vm_address_t @var{address}}, @w{vm_size_t @var{size}})
2863: @code{vm_deallocate} relinquishes access to a region of a @var{task}'s
2864: address space, causing further access to that memory to fail. This
2865: address range will be available for reallocation. @var{address} is the
2866: starting address, which will be rounded down to a page boundary.
2867: @var{size} is the number of bytes to deallocate, which will be rounded
2868: up to give a page boundary. Note, that because of the rounding to
2869: virtual page boundaries, more than @var{size} bytes may be deallocated.
2870: Use @code{vm_page_size} or @code{vm_statistics} to find out the current
2871: virtual page size.
2872:
2873: This call may be used to deallocate memory that was passed to a task in a
2874: message (via out of line data). In that case, the rounding should cause
2875: no trouble, since the region of memory was allocated as a set of pages.
2876:
2877: The @code{vm_deallocate} call affects only the task specified by the
2878: @var{target_task}. Other tasks which may have access to this memory may
2879: continue to reference it.
2880:
2881: The function returns @code{KERN_SUCCESS} if the memory was successfully
2882: deallocated and @code{KERN_INVALID_ADDRESS} if an invalid or
2883: non-allocated address was specified.
2884: @end deftypefun
2885:
2886:
2887: @node Data Transfer
2888: @section Data Transfer
2889:
2890: @deftypefun kern_return_t vm_read (@w{vm_task_t @var{target_task}}, @w{vm_address_t @var{address}}, @w{vm_size_t @var{size}}, @w{vm_offset_t *@var{data}}, @w{mach_msg_type_number_t *@var{data_count}})
2891: The function @code{vm_read} allows one task's virtual memory to be read
2892: by another task. The @var{target_task} is the task whose memory is to
2893: be read. @var{address} is the first address to be read and must be on a
2894: page boundary. @var{size} is the number of bytes of data to be read and
2895: must be an integral number of pages. @var{data} is the array of data
2896: copied from the given task, and @var{data_count} is the size of the data
2897: array in bytes (will be an integral number of pages).
2898:
2899: Note that the data array is returned in a newly allocated region; the
2900: task reading the data should @code{vm_deallocate} this region when it is
2901: done with the data.
2902:
2903: The function returns @code{KERN_SUCCESS} if the memory was successfully
2904: read, @code{KERN_INVALID_ADDRESS} if an invalid or non-allocated address
2905: was specified or there was not @var{size} bytes of data following the
2906: address, @code{KERN_INVALID_ARGUMENT} if the address does not start on a
2907: page boundary or the size is not an integral number of pages,
2908: @code{KERN_PROTECTION_FAILURE} if the address region in the target task
2909: is protected against reading and @code{KERN_NO_SPACE} if there was not
2910: enough room in the callers virtual memory to allocate space for the data
2911: to be returned.
2912: @end deftypefun
2913:
2914: @deftypefun kern_return_t vm_write (@w{vm_task_t @var{target_task}}, @w{vm_address_t @var{address}}, @w{vm_offset_t @var{data}}, @w{mach_msg_type_number_t @var{data_count}})
2915: The function @code{vm_write} allows a task to write to the virtual memory
2916: of @var{target_task}. @var{address} is the starting address in task to
2917: be affected. @var{data} is an array of bytes to be written, and
2918: @var{data_count} the size of the @var{data} array.
2919:
2920: The current implementation requires that @var{address}, @var{data} and
2921: @var{data_count} all be page-aligned. Otherwise,
2922: @code{KERN_INVALID_ARGUMENT} is returned.
2923:
2924: The function returns @code{KERN_SUCCESS} if the memory was successfully
2925: written, @code{KERN_INVALID_ADDRESS} if an invalid or non-allocated
2926: address was specified or there was not @var{data_count} bytes of
2927: allocated memory starting at @var{address} and
2928: @code{KERN_PROTECTION_FAILURE} if the address region in the target task
2929: is protected against writing.
2930: @end deftypefun
2931:
2932: @deftypefun kern_return_t vm_copy (@w{vm_task_t @var{target_task}}, @w{vm_address_t @var{source_address}}, @w{vm_size_t @var{count}}, @w{vm_offset_t @var{dest_address}})
2933: The function @code{vm_copy} causes the source memory range to be copied
2934: to the destination address. The source and destination memory ranges
2935: may overlap. The destination address range must already be allocated
2936: and writable; the source range must be readable.
2937:
2938: @code{vm_copy} is equivalent to @code{vm_read} followed by
2939: @code{vm_write}.
2940:
2941: The current implementation requires that @var{address}, @var{data} and
2942: @var{data_count} all be page-aligned. Otherwise,
2943: @code{KERN_INVALID_ARGUMENT} is returned.
2944:
2945: The function returns @code{KERN_SUCCESS} if the memory was successfully
2946: written, @code{KERN_INVALID_ADDRESS} if an invalid or non-allocated
2947: address was specified or there was insufficient memory allocated at one
2948: of the addresses and @code{KERN_PROTECTION_FAILURE} if the destination
2949: region was not writable or the source region was not readable.
2950: @end deftypefun
2951:
2952:
2953: @node Memory Attributes
2954: @section Memory Attributes
2955:
2956: @deftypefun kern_return_t vm_region (@w{vm_task_t @var{target_task}}, @w{vm_address_t *@var{address}}, @w{vm_size_t *@var{size}}, @w{vm_prot_t *@var{protection}}, @w{vm_prot_t *@var{max_protection}}, @w{vm_inherit_t *@var{inheritance}}, @w{boolean_t *@var{shared}}, @w{memory_object_name_t *@var{object_name}}, @w{vm_offset_t *@var{offset}})
2957: The function @code{vm_region} returns a description of the specified
2958: region of @var{target_task}'s virtual address space. @code{vm_region}
2959: begins at @var{address} and looks forward through memory until it comes
2960: to an allocated region. If address is within a region, then that region
2961: is used. Various bits of information about the region are returned. If
2962: @var{address} was not within a region, then @var{address} is set to the
2963: start of the first region which follows the incoming value. In this way
2964: an entire address space can be scanned.
2965:
2966: The @var{size} returned is the size of the located region in bytes.
2967: @var{protection} is the current protection of the region,
2968: @var{max_protection} is the maximum allowable protection for this
2969: region. @var{inheritance} is the inheritance attribute for this region.
2970: @var{shared} tells if the region is shared or not. The port
2971: @var{object_name} identifies the memory object associated with this
2972: region, and @var{offset} is the offset into the pager object that this
2973: region begins at.
2974: @c XXX cross ref pager_init
2975:
2976: The function returns @code{KERN_SUCCESS} if the memory region was
2977: successfully located and the information returned and @code{KERN_NO_SPACE} if
2978: there is no region at or above @var{address} in the specified task.
2979: @end deftypefun
2980:
2981: @deftypefun kern_return_t vm_protect (@w{vm_task_t @var{target_task}}, @w{vm_address_t @var{address}}, @w{vm_size_t @var{size}}, @w{boolean_t @var{set_maximum}}, @w{vm_prot_t @var{new_protection}})
2982: The function @code{vm_protect} sets the virtual memory access privileges
2983: for a range of allocated addresses in @var{target_task}'s virtual
2984: address space. The protection argument describes a combination of read,
2985: write, and execute accesses that should be @emph{permitted}.
2986:
2987: @var{address} is the starting address, which will be rounded down to a
2988: page boundary. @var{size} is the size in bytes of the region for which
2989: protection is to change, and will be rounded up to give a page boundary.
2990: If @var{set_maximum} is set, make the protection change apply to the
2991: maximum protection associated with this address range; otherwise, the
2992: current protection on this range is changed. If the maximum protection
2993: is reduced below the current protection, both will be changed to reflect
2994: the new maximum. @var{new_protection} is the new protection value for
2995: this region; a set of: @code{VM_PROT_READ}, @code{VM_PROT_WRITE},
2996: @code{VM_PROT_EXECUTE}.
2997:
2998: The enforcement of virtual memory protection is machine-dependent.
2999: Nominally read access requires @code{VM_PROT_READ} permission, write
3000: access requires @code{VM_PROT_WRITE} permission, and execute access
3001: requires @code{VM_PROT_EXECUTE} permission. However, some combinations
3002: of access rights may not be supported. In particular, the kernel
3003: interface allows write access to require @code{VM_PROT_READ} and
3004: @code{VM_PROT_WRITE} permission and execute access to require
3005: @code{VM_PROT_READ} permission.
3006:
3007: The function returns @code{KERN_SUCCESS} if the memory was successfully
3008: protected, @code{KERN_INVALID_ADDRESS} if an invalid or non-allocated
3009: address was specified and @code{KERN_PROTECTION_FAILURE} if an attempt
3010: was made to increase the current or maximum protection beyond the
3011: existing maximum protection value.
3012: @end deftypefun
3013:
3014: @deftypefun kern_return_t vm_inherit (@w{vm_task_t @var{target_task}}, @w{vm_address_t @var{address}}, @w{vm_size_t @var{size}}, @w{vm_inherit_t @var{new_inheritance}})
3015: The function @code{vm_inherit} specifies how a region of
3016: @var{target_task}'s address space is to be passed to child tasks at the
3017: time of task creation. Inheritance is an attribute of virtual pages, so
3018: @var{address} to start from will be rounded down to a page boundary and
3019: @var{size}, the size in bytes of the region for which inheritance is to
3020: change, will be rounded up to give a page boundary. How this memory is
3021: to be inherited in child tasks is specified by @var{new_inheritance}.
3022: Inheritance is specified by using one of these following three values:
3023:
3024: @table @code
3025: @item VM_INHERIT_SHARE
3026: Child tasks will share this memory with this task.
3027:
3028: @item VM_INHERIT_COPY
3029: Child tasks will receive a copy of this region.
3030:
3031: @item VM_INHERIT_NONE
3032: This region will be absent from child tasks.
3033: @end table
3034:
3035: Setting @code{vm_inherit} to @code{VM_INHERIT_SHARE} and forking a child
3036: task is the only way two Mach tasks can share physical memory. Remember
3037: that all the threads of a given task share all the same memory.
3038:
3039: The function returns @code{KERN_SUCCESS} if the memory inheritance was
3040: successfully set and @code{KERN_INVALID_ADDRESS} if an invalid or
3041: non-allocated address was specified.
3042: @end deftypefun
3043:
3044: @deftypefun kern_return_t vm_wire (@w{host_priv_t @var{host_priv}}, @w{vm_task_t @var{target_task}}, @w{vm_address_t @var{address}}, @w{vm_size_t @var{size}}, @w{vm_prot_t @var{access}})
3045: The function @code{vm_wire} allows privileged applications to control
3046: memory pageability. @var{host_priv} is the privileged host port for the
3047: host on which @var{target_task} resides. @var{address} is the starting
3048: address, which will be rounded down to a page boundary. @var{size} is
3049: the size in bytes of the region for which protection is to change, and
3050: will be rounded up to give a page boundary. @var{access} specifies the
3051: types of accesses that must not cause page faults.
3052:
3053: The semantics of a successful @code{vm_wire} operation are that memory
3054: in the specified range will not cause page faults for any accesses
3055: included in access. Data memory can be made non-pageable (wired) with a
3056: access argument of @code{VM_PROT_READ | VM_PROT_WRITE}. A special case
3057: is that @code{VM_PROT_NONE} makes the memory pageable.
3058:
3059: The function returns @code{KERN_SUCCESS} if the call succeeded,
3060: @code{KERN_INVALID_HOST} if @var{host_priv} was not the privileged host
3061: port, @code{KERN_INVALID_TASK} if @var{task} was not a valid task,
3062: @code{KERN_INVALID_VALUE} if @var{access} specified an invalid access
3063: mode, @code{KERN_FAILURE} if some memory in the specified range is not
3064: present or has an inappropriate protection value, and
3065: @code{KERN_INVALID_ARGUMENT} if unwiring (@var{access} is
3066: @code{VM_PROT_NONE}) and the memory is not already wired.
3067:
3068: The @code{vm_wire} call is actually an RPC to @var{host_priv}, normally
3069: a send right for a privileged host port, but potentially any send right.
3070: In addition to the normal diagnostic return codes from the call's server
3071: (normally the kernel), the call may return @code{mach_msg} return codes.
3072: @end deftypefun
3073:
3074: @deftypefun kern_return_t vm_machine_attribute (@w{vm_task_t @var{task}}, @w{vm_address_t @var{address}}, @w{vm_size_t @var{size}}, @w{vm_prot_t @var{access}}, @w{vm_machine_attribute_t @var{attribute}}, @w{vm_machine_attribute_val_t @var{value}})
3075: The function @code{vm_machine_attribute} specifies machine-specific
3076: attributes for a VM mapping, such as cachability, migrability,
3077: replicability. This is used on machines that allow the user control
3078: over the cache (this is the case for MIPS architectures) or placement of
3079: memory pages as in NUMA architectures (Non-Uniform Memory Access time)
3080: such as the IBM ACE multiprocessor.
3081:
3082: Machine-specific attributes can be consider additions to the
3083: machine-independent ones such as protection and inheritance, but they
3084: are not guaranteed to be supported by any given machine. Moreover,
3085: implementations of Mach on new architectures might find the need for new
3086: attribute types and or values besides the ones defined in the initial
3087: implementation.
3088:
3089: The types currently defined are
3090: @table @code
3091: @item MATTR_CACHE
3092: Controls caching of memory pages
3093:
3094: @item MATTR_MIGRATE
3095: Controls migrability of memory pages
3096:
3097: @item MATTR_REPLICATE
3098: Controls replication of memory pages
3099: @end table
3100:
3101: Corresponding values, and meaning of a specific call to
3102: @code{vm_machine_attribute}
3103: @table @code
3104: @item MATTR_VAL_ON
3105: Enables the attribute. Being enabled is the default value for any
3106: applicable attribute.
3107:
3108: @item MATTR_VAL_OFF
3109: Disables the attribute, making memory non-cached, or non-migratable, or
3110: non-replicatable.
3111:
3112: @item MATTR_VAL_GET
3113: Returns the current value of the attribute for the memory segment. If
3114: the attribute does not apply uniformly to the given range the value
3115: returned applies to the initial portion of the segment only.
3116:
3117: @item MATTR_VAL_CACHE_FLUSH
3118: Flush the memory pages from the Cache. The size value in this case
3119: might be meaningful even if not a multiple of the page size, depending
3120: on the implementation.
3121:
3122: @item MATTR_VAL_ICACHE_FLUSH
3123: Same as above, applied to the Instruction Cache alone.
3124:
3125: @item MATTR_VAL_DCACHE_FLUSH
3126: Same as above, applied to the Data Cache alone.
3127: @end table
3128:
3129: The function returns @code{KERN_SUCCESS} if call succeeded, and
3130: @code{KERN_INVALID_ARGUMENT} if @var{task} is not a task, or
3131: @var{address} and @var{size} do not define a valid address range in
3132: task, or @var{attribute} is not a valid attribute type, or it is not
3133: implemented, or @var{value} is not a permissible value for attribute.
3134: @end deftypefun
3135:
3136:
3137: @node Mapping Memory Objects
3138: @section Mapping Memory Objects
3139:
3140: @deftypefun kern_return_t vm_map (@w{vm_task_t @var{target_task}}, @w{vm_address_t *@var{address}}, @w{vm_size_t @var{size}}, @w{vm_address_t @var{mask}}, @w{boolean_t @var{anywhere}}, @w{memory_object_t @var{memory_object}}, @w{vm_offset_t @var{offset}}, @w{boolean_t @var{copy}}, @w{vm_prot_t @var{cur_protection}}, @w{vm_prot_t @var{max_protection}}, @w{vm_inherit_t @var{inheritance}})
3141: The function @code{vm_map} maps a region of virtual memory at the
3142: specified address, for which data is to be supplied by the given memory
3143: object, starting at the given offset within that object. In addition to
3144: the arguments used in @code{vm_allocate}, the @code{vm_map} call allows
3145: the specification of an address alignment parameter, and of the initial
3146: protection and inheritance values.
3147: @c XXX See the descriptions of vm_allocate, vm_protect , and vm_inherit
3148:
3149: If the memory object in question is not currently in use, the kernel
3150: will perform a @code{memory_object_init} call at this time. If the copy
3151: parameter is asserted, the specified region of the memory object will be
3152: copied to this address space; changes made to this object by other tasks
3153: will not be visible in this mapping, and changes made in this mapping
3154: will not be visible to others (or returned to the memory object).
3155:
3156: The @code{vm_map} call returns once the mapping is established.
3157: Completion of the call does not require any action on the part of the
3158: memory manager.
3159:
3160: Warning: Only memory objects that are provided by bona fide memory
3161: managers should be used in the @code{vm_map} call. A memory manager
3162: must implement the memory object interface described elsewhere in this
3163: manual. If other ports are used, a thread that accesses the mapped
3164: virtual memory may become permanently hung or may receive a memory
3165: exception.
3166:
3167: @var{target_task} is the task to be affected. The starting address is
3168: @var{address}. If the @var{anywhere} option is used, this address is
3169: ignored. The address actually allocated will be returned in
3170: @var{address}. @var{size} is the number of bytes to allocate (rounded by
3171: the system in a machine dependent way). The alignment restriction is
3172: specified by @var{mask}. Bits asserted in this mask must not be
3173: asserted in the address returned. If @var{anywhere} is set, the kernel
3174: should find and allocate any region of the specified size, and return
3175: the address of the resulting region in @var{address}.
3176:
3177: @var{memory_object} is the port that represents the memory object: used
3178: by user tasks in @code{vm_map}; used by the make requests for data or
3179: other management actions. If this port is @code{MEMORY_OBJECT_NULL},
3180: then zero-filled memory is allocated instead. Within a memory object,
3181: @var{offset} specifies an offset in bytes. This must be page aligned.
3182: If @var{copy} is set, the range of the memory object should be copied to
3183: the target task, rather than mapped read-write.
3184:
3185: The function returns @code{KERN_SUCCESS} if the object is mapped,
3186: @code{KERN_NO_SPACE} if no unused region of the task's virtual address
3187: space that meets the address, size, and alignment criteria could be
3188: found, and @code{KERN_INVALID_ARGUMENT} if an invalid argument was provided.
3189: @end deftypefun
3190:
3191:
3192: @node Memory Statistics
3193: @section Memory Statistics
3194:
3195: @deftp {Data type} vm_statistics_data_t
3196: This structure is returned in @var{vm_stats} by the @code{vm_statistics}
3197: function and provides virtual memory statistics for the system. It has
3198: the following members:
3199:
3200: @table @code
3201: @item long pagesize
3202: The page size in bytes.
3203:
3204: @item long free_count
3205: The number of free pages.
3206:
3207: @item long active_count
3208: The umber of active pages.
3209:
3210: @item long inactive_count
3211: The number of inactive pages.
3212:
3213: @item long wire_count
3214: The number of pages wired down.
3215:
3216: @item long zero_fill_count
3217: The number of zero filled pages.
3218:
3219: @item long reactivations
3220: The number of reactivated pages.
3221:
3222: @item long pageins
3223: The number of pageins.
3224:
3225: @item long pageouts
3226: The number of pageouts.
3227:
3228: @item long faults
3229: The number of faults.
3230:
3231: @item long cow_faults
3232: The number of copy-on-writes.
3233:
3234: @item long lookups
3235: The number of object cache lookups.
3236:
3237: @item long hits
3238: The number of object cache hits.
3239: @end table
3240: @end deftp
3241:
3242: @deftypefun kern_return_t vm_statistics (@w{vm_task_t @var{target_task}}, @w{vm_statistics_data_t *@var{vm_stats}})
3243: The function @code{vm_statistics} returns the statistics about the
3244: kernel's use of virtual memory since the kernel was booted.
3245: @code{pagesize} can also be found as a global variable
3246: @code{vm_page_size} which is set at task initialization and remains
3247: constant for the life of the task.
3248: @end deftypefun
3249:
3250:
3251: @node External Memory Management
3252: @chapter External Memory Management
3253:
3254: @menu
3255: * Memory Object Server:: The basics of external memory management.
3256: * Memory Object Creation:: How new memory objects are created.
3257: * Memory Object Termination:: How memory objects are terminated.
3258: * Memory Objects and Data:: Data transfer to and from memory objects.
3259: * Memory Object Locking:: How memory objects are locked.
3260: * Memory Object Attributes:: Manipulating attributes of memory objects.
3261: * Default Memory Manager:: Setting and using the default memory manager.
3262: @end menu
3263:
3264:
3265: @node Memory Object Server
3266: @section Memory Object Server
3267:
3268: @deftypefun boolean_t memory_object_server (@w{msg_header_t *@var{in_msg}}, @w{msg_header_t *@var{out_msg}})
3269: @deftypefunx boolean_t memory_object_default_server (@w{msg_header_t *@var{in_msg}}, @w{msg_header_t *@var{out_msg}})
3270: @deftypefunx boolean_t seqnos_memory_object_server (@w{msg_header_t *@var{in_msg}}, @w{msg_header_t *@var{out_msg}})
3271: @deftypefunx boolean_t seqnos_memory_object_default_server (@w{msg_header_t *@var{in_msg}}, @w{msg_header_t *@var{out_msg}})
3272: A memory manager is a server task that responds to specific messages
3273: from the kernel in order to handle memory management functions for the
3274: kernel.
3275:
3276: In order to isolate the memory manager from the specifics of message
3277: formatting, the remote procedure call generator produces a procedure,
3278: @code{memory_object_server}, to handle a received message. This
3279: function does all necessary argument handling, and actually calls one of
3280: the following functions: @code{memory_object_init},
3281: @code{memory_object_data_write}, @code{memory_object_data_return},
3282: @code{memory_object_data_request}, @code{memory_object_data_unlock},
3283: @code{memory_object_lock_completed}, @code{memory_object_copy},
3284: @code{memory_object_terminate}. The @strong{default memory manager} may
3285: get two additional requests from the kernel: @code{memory_object_create}
3286: and @code{memory_object_data_initialize}. The remote procedure call
3287: generator produces a procedure @code{memory_object_default_server} to
3288: handle those functions specific to the default memory manager.
3289:
3290: The @code{seqnos_memory_object_server} and
3291: @code{seqnos_memory_object_default_server} differ from
3292: @code{memory_object_server} and @code{memory_object_default_server} in
3293: that they supply message sequence numbers to the server interfaces.
3294: They call the @code{seqnos_memory_object_*} functions, which complement
3295: the @code{memory_object_*} set of functions.
3296:
3297: The return value from the @code{memory_object_server} function indicates
3298: that the message was appropriate to the memory management interface
3299: (returning @code{TRUE}), or that it could not handle this message
3300: (returning @code{FALSE}).
3301:
3302: The @var{in_msg} argument is the message that has been received from the
3303: kernel. The @var{out_msg} is a reply message, but this is not used for
3304: this server.
3305:
3306: The function returns @code{TRUE} to indicate that the message in
3307: question was applicable to this interface, and that the appropriate
3308: routine was called to interpret the message. It returns @code{FALSE} to
3309: indicate that the message did not apply to this interface, and that no
3310: other action was taken.
3311: @end deftypefun
3312:
3313:
3314: @node Memory Object Creation
3315: @section Memory Object Creation
3316:
3317: @deftypefun kern_return_t memory_object_init (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{memory_object_name_t @var{memory_object_name}}, @w{vm_size_t @var{memory_object_page_size}})
3318: @deftypefunx kern_return_t seqnos_memory_object_init (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{memory_object_name_t @var{memory_object_name}}, @w{vm_size_t @var{memory_object_page_size}})
3319: The function @code{memory_object_init} serves as a notification that the
3320: kernel has been asked to map the given memory object into a task's
3321: virtual address space. Additionally, it provides a port on which the
3322: memory manager may issue cache management requests, and a port which the
3323: kernel will use to name this data region. In the event that different
3324: each will perform a @code{memory_object_init} call with new request and
3325: name ports. The virtual page size that is used by the calling kernel is
3326: included for planning purposes.
3327:
3328: When the memory manager is prepared to accept requests for data for this
3329: object, it must call @code{memory_object_ready} with the attribute.
3330: Otherwise the kernel will not process requests on this object. To
3331: reject all mappings of this object, the memory manager may use
3332: @code{memory_object_destroy}.
3333:
3334: The argument @var{memory_object} is the port that represents the memory
3335: object data, as supplied to the kernel in a @code{vm_map} call.
3336: @var{memory_control} is the request port to which a response is
3337: requested. (In the event that a memory object has been supplied to more
3338: than one the kernel that has made the request.)
3339: @var{memory_object_name} is a port used by the kernel to refer to the
3340: memory object data in response to @code{vm_region} calls.
3341: @code{memory_object_page_size} is the page size to be used by this
3342: kernel. All data sizes in calls involving this kernel must be an
3343: integral multiple of the page size. Note that different kernels,
3344: indicated by a different @code{memory_control}, may have different page
3345: sizes.
3346:
3347: The function should return @code{KERN_SUCCESS}, but since this routine
3348: is called by the kernel, which does not wait for a reply message, this
3349: value is ignored.
3350: @end deftypefun
3351:
3352: @deftypefun kern_return_t memory_object_ready (@w{memory_object_control_t @var{memory_control}}, @w{boolean_t @var{may_cache_object}}, @w{memory_object_copy_strategy_t @var{copy_strategy}})
3353: The function @code{memory_object_ready} informs the kernel that the
3354: memory manager is ready to receive data or unlock requests on behalf of
3355: the clients. The argument @var{memory_control} is the port, provided by
3356: the kernel in a @code{memory_object_init} call, to which cache
3357: management requests may be issued. If @var{may_cache_object} is set,
3358: the kernel may keep data associated with this memory object, even after
3359: virtual memory references to it are gone.
3360:
3361: @var{copy_strategy} tells how the kernel should copy regions of the
3362: associated memory object. There are three possible caching strategies:
3363: @code{MEMORY_OBJECT_COPY_NONE} which specifies that nothing special
3364: should be done when data in the object is copied;
3365: @code{MEMORY_OBJECT_COPY_CALL} which specifies that the memory manager
3366: should be notified via a @code{memory_object_copy} call before any part
3367: of the object is copied; and @code{MEMORY_OBJECT_COPY_DELAY} which
3368: guarantees that the memory manager does not externally modify the data
3369: so that the kernel can use its normal copy-on-write algorithms.
3370: @code{MEMORY_OBJECT_COPY_DELAY} is the strategy most commonly used.
3371:
3372: This routine does not receive a reply message (and consequently has no
3373: return value), so only message transmission errors apply.
3374: @end deftypefun
3375:
3376:
3377: @node Memory Object Termination
3378: @section Memory Object Termination
3379:
3380: @deftypefun kern_return_t memory_object_terminate (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{memory_object_name_t @var{memory_object_name}})
3381: @deftypefunx kern_return_t seqnos_memory_object_terminate (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{memory_object_name_t @var{memory_object_name}})
3382: The function @code{memory_object_terminate} indicates that the kernel
3383: has completed its use of the given memory object. All rights to the
3384: memory object control and name ports are included, so that the memory
3385: manager can destroy them (using @code{mach_port_deallocate}) after doing
3386: appropriate bookkeeping. The kernel will terminate a memory object only
3387: after all address space mappings of that memory object have been
3388: deallocated, or upon explicit request by the memory manager.
3389:
3390: The argument @var{memory_object} is the port that represents the memory
3391: object data, as supplied to the kernel in a @code{vm_map} call.
3392: @var{memory_control} is the request port to which a response is
3393: requested. (In the event that a memory object has been supplied to more
3394: than one the kernel that has made the request.)
3395: @var{memory_object_name} is a port used by the kernel to refer to the
3396: memory object data in response to @code{vm_region} calls.
3397:
3398: The function should return @code{KERN_SUCCESS}, but since this routine
3399: is called by the kernel, which does not wait for a reply message, this
3400: value is ignored.
3401: @end deftypefun
3402:
3403: @deftypefun kern_return_t memory_object_destroy (@w{memory_object_control_t @var{memory_control}}, @w{kern_return_t @var{reason}})
3404: The function @code{memory_object_destroy} tells the kernel to shut down
3405: the memory object. As a result of this call the kernel will no longer
3406: support paging activity or any @code{memory_object} calls on this
3407: object, and all rights to the memory object port, the memory control
3408: port and the memory name port will be returned to the memory manager in
3409: a memory_object_terminate call. If the memory manager is concerned that
3410: any modified cached data be returned to it before the object is
3411: terminated, it should call @code{memory_object_lock_request} with
3412: @var{should_flush} set and a lock value of @code{VM_PROT_WRITE} before
3413: making this call.
3414:
3415: The argument @var{memory_control} is the port, provided by the kernel in
3416: a @code{memory_object_init} call, to which cache management requests may
3417: be issued. @var{reason} is an error code indicating why the object
3418: must be destroyed.
3419: @c The error code is currently ignored.
3420:
3421: This routine does not receive a reply message (and consequently has no
3422: return value), so only message transmission errors apply.
3423: @end deftypefun
3424:
3425:
3426: @node Memory Objects and Data
3427: @section Memory Objects and Data
3428:
3429: @deftypefun kern_return_t memory_object_data_return (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}}, @w{boolean_t @var{dirty}}, @w{boolean_t @var{kernel_copy}})
3430: @deftypefunx kern_return_t seqnos_memory_object_data_return (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}}, @w{boolean_t @var{dirty}}, @w{boolean_t @var{kernel_copy}})
3431: The function @code{memory_object_data_return} provides the memory
3432: manager with data that has been modified while cached in physical
3433: memory. Once the memory manager no longer needs this data (e.g., it has
3434: been written to another storage medium), it should be deallocated using
3435: @code{vm_deallocate}.
3436:
3437: The argument @var{memory_object} is the port that represents the memory
3438: object data, as supplied to the kernel in a @code{vm_map} call.
3439: @var{memory_control} is the request port to which a response is
3440: requested. (In the event that a memory object has been supplied to more
3441: than one the kernel that has made the request.) @var{offset} is the
3442: offset within a memory object to which this call refers. This will be
3443: page aligned. @var{data} is the data which has been modified while
3444: cached in physical memory. @var{data_count} is the amount of data to be
3445: written, in bytes. This will be an integral number of memory object
3446: pages.
3447:
3448: The kernel will also use this call to return precious pages. If an
3449: unmodified precious age is returned, @var{dirty} is set to @code{FALSE},
3450: otherwise it is @code{TRUE}. If @var{kernel_copy} is @code{TRUE}, the
3451: kernel kept a copy of the page. Precious data remains precious if the
3452: kernel keeps a copy. The indication that the kernel kept a copy is only
3453: a hint if the data is not precious; the cleaned copy may be discarded
3454: without further notifying the manager.
3455:
3456: The function should return @code{KERN_SUCCESS}, but since this routine
3457: is called by the kernel, which does not wait for a reply message, this
3458: value is ignored.
3459: @end deftypefun
3460:
3461: @deftypefun kern_return_t memory_object_data_request (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{length}}, @w{vm_prot_t @var{desired_access}})
3462: @deftypefunx kern_return_t seqnos_memory_object_data_request (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{length}}, @w{vm_prot_t @var{desired_access}})
3463: The function @code{memory_object_data_request} is a request for data
3464: from the specified memory object, for at least the access specified.
3465: The memory manager is expected to return at least the specified data,
3466: with as much access as it can allow, using
3467: @code{memory_object_data_supply}. If the memory manager is unable to
3468: provide the data (for example, because of a hardware error), it may use
3469: the @code{memory_object_data_error} call. The
3470: @code{memory_object_data_unavailable} call may be used to tell the
3471: kernel to supply zero-filled memory for this region.
3472:
3473: The argument @var{memory_object} is the port that represents the memory
3474: object data, as supplied to the kernel in a @code{vm_map} call.
3475: @var{memory_control} is the request port to which a response is
3476: requested. (In the event that a memory object has been supplied to more
3477: than one the kernel that has made the request.) @var{offset} is the
3478: offset within a memory object to which this call refers. This will be
3479: page aligned. @var{length} is the number of bytes of data, starting at
3480: @var{offset}, to which this call refers. This will be an integral
3481: number of memory object pages. @var{desired_access} is a protection
3482: value describing the memory access modes which must be permitted on the
3483: specified cached data. One or more of: @code{VM_PROT_READ},
3484: @code{VM_PROT_WRITE} or @code{VM_PROT_EXECUTE}.
3485:
3486: The function should return @code{KERN_SUCCESS}, but since this routine
3487: is called by the kernel, which does not wait for a reply message, this
3488: value is ignored.
3489: @end deftypefun
3490:
3491: @deftypefun kern_return_t memory_object_data_supply (@w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}}, @w{vm_prot_t @var{lock_value}}, @w{boolean_t @var{precious}}, @w{mach_port_t @var{reply}})
3492: The function @code{memory_object_data_supply} supplies the kernel with
3493: data for the specified memory object. Ordinarily, memory managers
3494: should only provide data in response to @code{memory_object_data_request}
3495: calls from the kernel (but they may provide data in advance as desired).
3496: When data already held by this kernel is provided again, the new data is
3497: ignored. The kernel may not provide any data (or protection)
3498: consistency among pages with different virtual page alignments within
3499: the same object.
3500:
3501: The argument @var{memory_control} is the port, provided by the kernel in
3502: a @code{memory_object_init} call, to which cache management requests may
3503: be issued. @var{offset} is an offset within a memory object in bytes.
3504: This must be page aligned. @var{data} is the data that is being
3505: provided to the kernel. This is a pointer to the data.
3506: @var{data_count} is the amount of data to be provided. Only whole
3507: virtual pages of data can be accepted; partial pages will be discarded.
3508:
3509: @var{lock_value} is a protection value indicating those forms of access
3510: that should @strong{not} be permitted to the specified cached data. The
3511: lock values must be one or more of the set: @code{VM_PROT_NONE},
3512: @code{VM_PROT_READ}, @code{VM_PROT_WRITE}, @code{VM_PROT_EXECUTE} and
3513: @code{VM_PROT_ALL} as defined in @file{mach/vm_prot.h}.
3514:
3515: If @var{precious} is @code{FALSE}, the kernel treats the data as a
3516: temporary and may throw it away if it hasn't been changed. If the
3517: @var{precious} value is @code{TRUE}, the kernel treats its copy as a
3518: data repository and promises to return it to the manager; the manager
3519: may tell the kernel to throw it away instead by flushing and not
3520: cleaning the data (see @code{memory_object_lock_request}).
3521:
3522: If @var{reply_to} is not @code{MACH_PORT_NULL}, the kernel will send a
3523: completion message to the provided port (see
3524: @code{memory_object_supply_completed}).
3525:
3526: This routine does not receive a reply message (and consequently has no
3527: return value), so only message transmission errors apply.
3528: @end deftypefun
3529:
3530: @deftypefun kern_return_t memory_object_supply_completed (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}}, @w{kern_return_t @var{result}}, @w{vm_offset_t @var{error_offset}})
3531: @deftypefunx kern_return_t seqnos_memory_object_supply_completed (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}}, @w{kern_return_t @var{result}}, @w{vm_offset_t @var{error_offset}})
3532: The function @code{memory_object_supply_completed} indicates that a
3533: previous @code{memory_object_data_supply} has been completed. Note that
3534: this call is made on whatever port was specified in the
3535: @code{memory_object_data_supply} call; that port need not be the memory
3536: object port itself. No reply is expected after this call.
3537:
3538: The argument @var{memory_object} is the port that represents the memory
3539: object data, as supplied to the kernel in a @code{vm_map} call.
3540: @var{memory_control} is the request port to which a response is
3541: requested. (In the event that a memory object has been supplied to more
3542: than one the kernel that has made the request.) @var{offset} is the
3543: offset within a memory object to which this call refers. @var{length}
3544: is the length of the data covered by the lock request. The @var{result}
3545: parameter indicates what happened during the supply. If it is not
3546: @code{KERN_SUCCESS}, then @var{error_offset} identifies the first offset
3547: at which a problem occurred. The pagein operation stopped at this
3548: point. Note that the only failures reported by this mechanism are
3549: @code{KERN_MEMORY_PRESENT}. All other failures (invalid argument, error
3550: on pagein of supplied data in manager's address space) cause the entire
3551: operation to fail.
3552:
3553:
3554: @end deftypefun
3555:
3556: @deftypefun kern_return_t memory_object_data_error (@w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{size}}, @w{kern_return_t @var{reason}})
3557: The function @code{memory_object_data_error} indicates that the memory
3558: manager cannot return the data requested for the given region,
3559: specifying a reason for the error. This is typically used when a
3560: hardware error is encountered.
3561:
3562: The argument @var{memory_control} is the port, provided by the kernel in
3563: a @code{memory_object_init} call, to which cache management requests may
3564: be issued. @var{offset} is an offset within a memory object in bytes.
3565: This must be page aligned. @var{data} is the data that is being
3566: provided to the kernel. This is a pointer to the data. @var{size} is
3567: the amount of cached data (starting at @var{offset}) to be handled.
3568: This must be an integral number of the memory object page size.
3569: @var{reason} is an error code indicating what type of error occurred.
3570: @c The error code is currently ignored.
3571:
3572: This routine does not receive a reply message (and consequently has no
3573: return value), so only message transmission errors apply.
3574: @end deftypefun
3575:
3576: @deftypefun kern_return_t memory_object_data_unavailable (@w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{size}}, @w{kern_return_t @var{reason}})
3577: The function @code{memory_object_data_unavailable} indicates that the
3578: memory object does not have data for the given region and that the
3579: kernel should provide the data for this range. The memory manager may
3580: use this call in three different situations.
3581:
3582: @enumerate
3583: @item
3584: The object was created by @code{memory_object_create} and the kernel has
3585: not yet provided data for this range (either via a
3586: @code{memory_object_data_initialize}, @code{memory_object_data_write} or
3587: a @code{memory_object_data_return} for the object.
3588:
3589: @item
3590: The object was created by an @code{memory_object_data_copy} and the
3591: kernel should copy this region from the original memory object.
3592:
3593: @item
3594: The object is a normal user-created memory object and the kernel should
3595: supply unlocked zero-filled pages for the range.
3596: @end enumerate
3597:
3598: The argument @var{memory_control} is the port, provided by the kernel in
3599: a @code{memory_object_init} call, to which cache management requests may
3600: be issued. @var{offset} is an offset within a memory object, in bytes.
3601: This must be page aligned. @var{size} is the amount of cached data
3602: (starting at @var{offset}) to be handled. This must be an integral
3603: number of the memory object page size.
3604:
3605: This routine does not receive a reply message (and consequently has no
3606: return value), so only message transmission errors apply.
3607: @end deftypefun
3608:
3609: @deftypefun kern_return_t memory_object_copy (@w{memory_object_t @var{old_memory_object}}, @w{memory_object_control_t @var{old_memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}}, @w{memory_object_t @var{new_memory_object}})
3610: @deftypefunx kern_return_t seqnos_memory_object_copy (@w{memory_object_t @var{old_memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{old_memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}}, @w{memory_object_t @var{new_memory_object}})
3611: The function @code{memory_object_copy} indicates that a copy has been
3612: made of the specified range of the given original memory object. This
3613: call includes only the new memory object itself; a
3614: @code{memory_object_init} call will be made on the new memory object
3615: after the currently cached pages of the original object are prepared.
3616: After the memory manager receives the init call, it must reply with the
3617: @code{memory_object_ready} call to assert the "ready" attribute. The
3618: kernel will use the new memory object, control and name ports to refer
3619: to the new copy.
3620:
3621: This call is made when the original memory object had the caching
3622: parameter set to @code{MEMORY_OBJECT_COPY_CALL} and a user of the object
3623: has asked the kernel to copy it.
3624:
3625: Cached pages from the original memory object at the time of the copy
3626: operation are handled as follows: Readable pages may be silently copied
3627: to the new memory object (with all access permissions). Pages not
3628: copied are locked to prevent write access.
3629:
3630: The new memory object is @strong{temporary}, meaning that the memory
3631: manager should not change its contents or allow the memory object to be
3632: mapped in another client. The memory manager may use the
3633: @code{memory_object_data_unavailable} call to indicate that the
3634: appropriate pages of the original memory object may be used to fulfill
3635: the data request.
3636:
3637: The argument @var{old_memory_object} is the port that represents the old
3638: memory object data. @var{old_memory_control} is the kernel port for the
3639: old object. @var{offset} is the offset within a memory object to which
3640: this call refers. This will be page aligned. @var{length} is the
3641: number of bytes of data, starting at @var{offset}, to which this call
3642: refers. This will be an integral number of memory object pages.
3643: @var{new_memory_object} is a new memory object created by the kernel;
3644: see synopsis for further description. Note that all port rights
3645: (including receive rights) are included for the new memory object.
3646:
3647: The function should return @code{KERN_SUCCESS}, but since this routine
3648: is called by the kernel, which does not wait for a reply message, this
3649: value is ignored.
3650: @end deftypefun
3651:
3652: The remaining interfaces in this section are obsolete.
3653:
3654: @deftypefun kern_return_t memory_object_data_write (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}})
3655: @deftypefunx kern_return_t seqnos_memory_object_data_write (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}})
3656: The function @code{memory_object_data_write} provides the memory manager
3657: with data that has been modified while cached in physical memory. It is the old form of @code{memory_object_data_return}. Once
3658: the memory manager no longer needs this data (e.g., it has been written
3659: to another storage medium), it should be deallocated using
3660: @code{vm_deallocate}.
3661:
3662: The argument @var{memory_object} is the port that represents the memory
3663: object data, as supplied to the kernel in a @code{vm_map} call.
3664: @var{memory_control} is the request port to which a response is
3665: requested. (In the event that a memory object has been supplied to more
3666: than one the kernel that has made the request.) @var{offset} is the
3667: offset within a memory object to which this call refers. This will be
3668: page aligned. @var{data} is the data which has been modified while
3669: cached in physical memory. @var{data_count} is the amount of data to be
3670: written, in bytes. This will be an integral number of memory object
3671: pages.
3672:
3673: The function should return @code{KERN_SUCCESS}, but since this routine
3674: is called by the kernel, which does not wait for a reply message, this
3675: value is ignored.
3676: @end deftypefun
3677:
3678: @deftypefun kern_return_t memory_object_data_provided (@w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}}, @w{vm_prot_t @var{lock_value}})
3679: The function @code{memory_object_data_provided} supplies the kernel with
3680: data for the specified memory object. It is the old form of
3681: @code{memory_object_data_supply}. Ordinarily, memory managers should
3682: only provide data in response to @code{memory_object_data_request} calls
3683: from the kernel. The @var{lock_value} specifies what type of access
3684: will not be allowed to the data range. The lock values must be one or
3685: more of the set: @code{VM_PROT_NONE}, @code{VM_PROT_READ},
3686: @code{VM_PROT_WRITE}, @code{VM_PROT_EXECUTE} and @code{VM_PROT_ALL} as
3687: defined in @file{mach/vm_prot.h}.
3688:
3689: The argument @var{memory_control} is the port, provided by the kernel in
3690: a @code{memory_object_init} call, to which cache management requests may
3691: be issued. @var{offset} is an offset within a memory object in bytes.
3692: This must be page aligned. @var{data} is the data that is being
3693: provided to the kernel. This is a pointer to the data.
3694: @var{data_count} is the amount of data to be provided. This must be an
3695: integral number of memory object pages. @var{lock_value} is a
3696: protection value indicating those forms of access that should
3697: @strong{not} be permitted to the specified cached data.
3698:
3699: This routine does not receive a reply message (and consequently has no
3700: return value), so only message transmission errors apply.
3701: @end deftypefun
3702:
3703:
3704: @node Memory Object Locking
3705: @section Memory Object Locking
3706:
3707: @deftypefun kern_return_t memory_object_lock_request (@w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{size}}, @w{memory_object_return_t @var{should_clean}}, @w{boolean_t @var{should_flush}}, @w{vm_prot_t @var{lock_value}}, @w{mach_port_t @var{reply_to}})
3708: The function @code{memory_object_lock_request} allows a memory manager
3709: to make cache management requests. As specified in arguments to the
3710: call, the kernel will:
3711: @itemize
3712: @item
3713: clean (i.e., write back using @code{memory_object_data_supply} or
3714: @code{memory_object_data_write}) any cached data which has been modified
3715: since the last time it was written
3716:
3717: @item
3718: flush (i.e., remove any uses of) that data from memory
3719:
3720: @item
3721: lock (i.e., prohibit the specified uses of) the cached data
3722: @end itemize
3723:
3724: Locks applied to cached data are not cumulative; new lock values
3725: override previous ones. Thus, data may also be unlocked using this
3726: primitive. The lock values must be one or more of the following values:
3727: @code{VM_PROT_NONE}, @code{VM_PROT_READ}, @code{VM_PROT_WRITE},
3728: @code{VM_PROT_EXECUTE} and @code{VM_PROT_ALL} as defined in
3729: @file{mach/vm_prot.h}.
3730:
3731: Only data which is cached at the time of this call is affected. When a
3732: running thread requires a prohibited access to cached data, the kernel
3733: will issue a @code{memory_object_data_unlock} call specifying the forms
3734: of access required.
3735:
3736: Once all of the actions requested by this call have been completed, the
3737: kernel issues a @code{memory_object_lock_completed} call on the
3738: specified reply port.
3739:
3740: The argument @var{memory_control} is the port, provided by the kernel in
3741: a @code{memory_object_init} call, to which cache management requests may
3742: be issued. @var{offset} is an offset within a memory object, in bytes.
3743: This must be page aligned. @var{size} is the amount of cached data
3744: (starting at @var{offset}) to be handled. This must be an integral
3745: number of the memory object page size. If @var{should_clean} is set,
3746: modified data should be written back to the memory manager. If
3747: @var{should_flush} is set, the specified cached data should be
3748: invalidated, and all uses of that data should be revoked.
3749: @var{lock_value} is a protection value indicating those forms of access
3750: that should @strong{not} be permitted to the specified cached data.
3751: @var{reply_to} is a port on which a @code{memory_object_lock_completed}
3752: call should be issued, or @code{MACH_PORT_NULL} if no acknowledgement is
3753: desired.
3754:
3755: This routine does not receive a reply message (and consequently has no
3756: return value), so only message transmission errors apply.
3757: @end deftypefun
3758:
3759: @deftypefun kern_return_t memory_object_lock_completed (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}})
3760: @deftypefunx kern_return_t seqnos_memory_object_lock_completed (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}})
3761: The function @code{memory_object_lock_completed} indicates that a
3762: previous @code{memory_object_lock_request} has been completed. Note
3763: that this call is made on whatever port was specified in the
3764: @code{memory_object_lock_request} call; that port need not be the memory
3765: object port itself. No reply is expected after this call.
3766:
3767: The argument @var{memory_object} is the port that represents the memory
3768: object data, as supplied to the kernel in a @code{vm_map} call.
3769: @var{memory_control} is the request port to which a response is
3770: requested. (In the event that a memory object has been supplied to more
3771: than one the kernel that has made the request.) @var{offset} is the
3772: offset within a memory object to which this call refers. @var{length}
3773: is the length of the data covered by the lock request.
3774:
3775: The function should return @code{KERN_SUCCESS}, but since this routine
3776: is called by the kernel, which does not wait for a reply message, this
3777: value is ignored.
3778: @end deftypefun
3779:
3780: @deftypefun kern_return_t memory_object_data_unlock (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}}, @w{vm_prot_t @var{desired_access}})
3781: @deftypefunx kern_return_t seqnos_memory_object_data_unlock (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{length}}, @w{vm_prot_t @var{desired_access}})
3782: The function @code{memory_object_data_unlock} is a request that the
3783: memory manager permit at least the desired access to the specified data
3784: cached by the kernel. A call to @code{memory_object_lock_request} is
3785: expected in response.
3786:
3787: The argument @var{memory_object} is the port that represents the memory
3788: object data, as supplied to the kernel in a @code{vm_map} call.
3789: @var{memory_control} is the request port to which a response is
3790: requested. (In the event that a memory object has been supplied to more
3791: than one the kernel that has made the request.) @var{offset} is the
3792: offset within a memory object to which this call refers. This will be
3793: page aligned. @var{length} is the number of bytes of data, starting at
3794: @var{offset}, to which this call refers. This will be an integral
3795: number of memory object pages. @var{desired_access} a protection value
3796: describing the memory access modes which must be permitted on the
3797: specified cached data. One or more of: @code{VM_PROT_READ},
3798: @code{VM_PROT_WRITE} or @code{VM_PROT_EXECUTE}.
3799:
3800: The function should return @code{KERN_SUCCESS}, but since this routine
3801: is called by the kernel, which does not wait for a reply message, this
3802: value is ignored.
3803: @end deftypefun
3804:
3805:
3806: @node Memory Object Attributes
3807: @section Memory Object Attributes
3808:
3809: @deftypefun kern_return_t memory_object_get_attributes (@w{memory_object_control_t @var{memory_control}}, @w{boolean_t *@var{object_ready}}, @w{boolean_t *@var{may_cache_object}}, @w{memory_object_copy_strategy_t *@var{copy_strategy}})
3810: The function @code{memory_object_get_attribute} retrieves the current
3811: attributes associated with the memory object.
3812:
3813: The argument @var{memory_control} is the port, provided by the kernel in
3814: a @code{memory_object_init} call, to which cache management requests may
3815: be issued. If @var{object_ready} is set, the kernel may issue new data
3816: and unlock requests on the associated memory object. If
3817: @var{may_cache_object} is set, the kernel may keep data associated with
3818: this memory object, even after virtual memory references to it are gone.
3819: @var{copy_strategy} tells how the kernel should copy regions of the
3820: associated memory object.
3821:
3822: This routine does not receive a reply message (and consequently has no
3823: return value), so only message transmission errors apply.
3824: @end deftypefun
3825:
3826: @deftypefun kern_return_t memory_object_change_attributes (@w{memory_object_control_t @var{memory_control}}, @w{boolean_t @var{may_cache_object}}, @w{memory_object_copy_strategy_t @var{copy_strategy}}, @w{mach_port_t @var{reply_to}})
3827: The function @code{memory_object_change_attribute} sets
3828: performance-related attributes for the specified memory object. If the
3829: caching attribute is asserted, the kernel is permitted (and encouraged)
3830: to maintain cached data for this memory object even after no virtual
3831: address space contains this data.
3832:
3833: There are three possible caching strategies:
3834: @code{MEMORY_OBJECT_COPY_NONE} which specifies that nothing special
3835: should be done when data in the object is copied;
3836: @code{MEMORY_OBJECT_COPY_CALL} which specifies that the memory manager
3837: should be notified via a @code{memory_object_copy} call before any part
3838: of the object is copied; and @code{MEMORY_OBJECT_COPY_DELAY} which
3839: guarantees that the memory manager does not externally modify the data
3840: so that the kernel can use its normal copy-on-write algorithms.
3841: @code{MEMORY_OBJECT_COPY_DELAY} is the strategy most commonly used.
3842:
3843: The argument @var{memory_control} is the port, provided by the kernel in
3844: a @code{memory_object_init} call, to which cache management requests may
3845: be issued. If @var{may_cache_object} is set, the kernel may keep data
3846: associated with this memory object, even after virtual memory references
3847: to it are gone. @var{copy_strategy} tells how the kernel should copy
3848: regions of the associated memory object. @var{reply_to} is a port on
3849: which a @code{memory_object_change_completed} call will be issued upon
3850: completion of the attribute change, or @code{MACH_PORT_NULL} if no
3851: acknowledgement is desired.
3852:
3853: This routine does not receive a reply message (and consequently has no
3854: return value), so only message transmission errors apply.
3855: @end deftypefun
3856:
3857: @deftypefun kern_return_t memory_object_change_completed (@w{memory_object_t @var{memory_object}}, @w{boolean_t @var{may_cache_object}}, @w{memory_object_copy_strategy_t @var{copy_strategy}})
3858: @deftypefunx kern_return_t seqnos_memory_object_change_completed (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{boolean_t @var{may_cache_object}}, @w{memory_object_copy_strategy_t @var{copy_strategy}})
3859: The function @code{memory_object_change_completed} indicates the
3860: completion of an attribute change call.
3861:
3862: @c Warning: This routine does NOT contain a memory_object_control_t because
3863: @c the memory_object_change_attributes call may cause memory object
3864: @c termination (by uncaching the object). This would yield an invalid
3865: @c port.
3866: @end deftypefun
3867:
3868: The following interface is obsoleted by @code{memory_object_ready} and
3869: @code{memory_object_change_attributes}. If the old form
3870: @code{memory_object_set_attributes} is used to make a memory object
3871: ready, the kernel will write back data using the old
3872: @code{memory_object_data_write} interface rather than
3873: @code{memory_object_data_return}..
3874:
3875: @deftypefun kern_return_t memory_object_set_attributes (@w{memory_object_control_t @var{memory_control}}, @w{boolean @var{object_ready}}, @w{boolean_t @var{may_cache_object}}, @w{memory_object_copy_strategy_t @var{copy_strategy}})
3876: The function @code{memory_object_set_attribute} controls how the
3877: memory object. The kernel will only make data or unlock requests when
3878: the ready attribute is asserted. If the caching attribute is asserted,
3879: the kernel is permitted (and encouraged) to maintain cached data for
3880: this memory object even after no virtual address space contains this
3881: data.
3882:
3883: There are three possible caching strategies:
3884: @code{MEMORY_OBJECT_COPY_NONE} which specifies that nothing special
3885: should be done when data in the object is copied;
3886: @code{MEMORY_OBJECT_COPY_CALL} which specifies that the memory manager
3887: should be notified via a @code{memory_object_copy} call before any part
3888: of the object is copied; and @code{MEMORY_OBJECT_COPY_DELAY} which
3889: guarantees that the memory manager does not externally modify the data
3890: so that the kernel can use its normal copy-on-write algorithms.
3891: @code{MEMORY_OBJECT_COPY_DELAY} is the strategy most commonly used.
3892:
3893: The argument @var{memory_control} is the port, provided by the kernel in
3894: a @code{memory_object_init} call, to which cache management requests may
3895: be issued. If @var{object_ready} is set, the kernel may issue new data
3896: and unlock requests on the associated memory object. If
3897: @var{may_cache_object} is set, the kernel may keep data associated with
3898: this memory object, even after virtual memory references to it are gone.
3899: @var{copy_strategy} tells how the kernel should copy regions of the
3900: associated memory object.
3901:
3902: This routine does not receive a reply message (and consequently has no
3903: return value), so only message transmission errors apply.
3904: @end deftypefun
3905:
3906:
3907: @node Default Memory Manager
3908: @section Default Memory Manager
3909:
3910: @deftypefun kern_return_t vm_set_default_memory_manager (@w{host_t @var{host}}, @w{mach_port_t *@var{default_manager}})
3911: The function @code{vm_set_default_memory_manager} sets the kernel's
3912: default memory manager. It sets the port to which newly-created
3913: temporary memory objects are delivered by @code{memory_object_create} to
3914: the host. The old memory manager port is returned. If
3915: @var{default_manager} is @code{MACH_PORT_NULL} then this routine just returns
3916: the current default manager port without changing it.
3917:
3918: The argument @var{host} is a task port to the kernel whose default
3919: memory manager is to be changed. @var{default_manager} is an in/out
3920: parameter. As input, @var{default_manager} is the port that the new
3921: memory manager is listening on for @code{memory_object_create} calls.
3922: As output, it is the old default memory manager's port.
3923:
3924: The function returns @code{KERN_SUCCESS} if the new memory manager is
3925: installed, and @code{KERN_INVALID_ARGUMENT} if this task does not have
3926: the privileges required for this call.
3927: @end deftypefun
3928:
3929: @deftypefun kern_return_t memory_object_create (@w{memory_object_t @var{old_memory_object}}, @w{memory_object_t @var{new_memory_object}}, @w{vm_size_t @var{new_object_size}}, @w{memory_object_control_t @var{new_control}}, @w{memory_object_name_t @var{new_name}}, @w{vm_size_t @var{new_page_size}})
3930: @deftypefunx kern_return_t seqnos_memory_object_create (@w{memory_object_t @var{old_memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_t @var{new_memory_object}}, @w{vm_size_t @var{new_object_size}}, @w{memory_object_control_t @var{new_control}}, @w{memory_object_name_t @var{new_name}}, @w{vm_size_t @var{new_page_size}})
3931: The function @code{memory_object_create} is a request that the given
3932: memory manager accept responsibility for the given memory object created
3933: by the kernel. This call will only be made to the system
3934: @strong{default memory manager}. The memory object in question
3935: initially consists of zero-filled memory; only memory pages that are
3936: actually written will ever be provided to
3937: @code{memory_object_data_request} calls, the default memory manager must
3938: use @code{memory_object_data_unavailable} for any pages that have not
3939: previously been written.
3940:
3941: No reply is expected after this call. Since this call is directed to
3942: the default memory manager, the kernel assumes that it will be ready to
3943: handle data requests to this object and does not need the confirmation
3944: of a @code{memory_object_set_attributes} call.
3945:
3946: The argument @var{old_memory_object} is a memory object provided by the
3947: default memory manager on which the kernel can make
3948: @code{memory_object_create} calls. @var{new_memory_object} is a new
3949: memory object created by the kernel; see synopsis for further
3950: description. Note that all port rights (including receive rights) are
3951: included for the new memory object. @var{new_object_size} is the
3952: maximum size of the new object. @var{new_control} is a port, created by
3953: the kernel, on which a memory manager may issue cache management
3954: requests for the new object. @var{new_name} a port used by the kernel
3955: to refer to the new memory object data in response to @code{vm_region}
3956: calls. @var{new_page_size} is the page size to be used by this kernel.
3957: All data sizes in calls involving this kernel must be an integral
3958: multiple of the page size. Note that different kernels, indicated by
3959: different a @code{memory_control}, may have different page sizes.
3960:
3961: The function should return @code{KERN_SUCCESS}, but since this routine
3962: is called by the kernel, which does not wait for a reply message, this
3963: value is ignored.
3964: @end deftypefun
3965:
3966: @deftypefun kern_return_t memory_object_data_initialize (@w{memory_object_t @var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}})
3967: @deftypefunx kern_return_t seqnos_memory_object_data_initialize (@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, @w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}})
3968: The function @code{memory_object_data_initialize} provides the memory
3969: manager with initial data for a kernel-created memory object. If the
3970: memory manager already has been supplied data (by a previous
3971: @code{memory_object_data_initialize}, @code{memory_object_data_write} or
3972: @code{memory_object_data_return}), then this data should be ignored.
3973: Otherwise, this call behaves exactly as does
3974: @code{memory_object_data_return} on memory objects created by the kernel
3975: via @code{memory_object_create} and thus will only be made to default
3976: memory managers. This call will not be made on objects created via
3977: @code{memory_object_copy}.
3978:
3979: The argument @var{memory_object} the port that represents the memory
3980: object data, as supplied by the kernel in a @code{memory_object_create}
3981: call. @var{memory_control} is the request port to which a response is
3982: requested. (In the event that a memory object has been supplied to more
3983: than one the kernel that has made the request.) @var{offset} is the
3984: offset within a memory object to which this call refers. This will be
3985: page aligned. @var{data} is the data which has been modified while
3986: cached in physical memory. @var{data_count} is the amount of data to be
3987: written, in bytes. This will be an integral number of memory object
3988: pages.
3989:
3990: The function should return @code{KERN_SUCCESS}, but since this routine
3991: is called by the kernel, which does not wait for a reply message, this
3992: value is ignored.
3993: @end deftypefun
3994:
3995:
3996: @node Threads and Tasks
3997: @chapter Threads and Tasks
3998:
3999: @menu
4000: * Thread Interface:: Manipulating threads.
4001: * Task Interface:: Manipulating tasks.
4002: * Profiling:: Profiling threads and tasks.
4003: @end menu
4004:
4005:
4006: @node Thread Interface
4007: @section Thread Interface
4008:
4009: @cindex thread port
4010: @cindex port representing a thread
4011: @deftp {Data type} thread_t
4012: This is a @code{mach_port_t} and used to hold the port name of a
4013: thread port that represents the thread. Manipulations of the thread are
4014: implemented as remote procedure calls to the thread port. A thread can
4015: get a port to itself with the @code{mach_thread_self} system call.
4016: @end deftp
4017:
4018: @menu
4019: * Thread Creation:: Creating new threads.
4020: * Thread Termination:: Terminating existing threads.
4021: * Thread Information:: How to get informations on threads.
4022: * Thread Settings:: How to set threads related informations.
4023: * Thread Execution:: How to control the thread's machine state.
4024: * Scheduling:: Operations on thread scheduling.
4025: * Thread Special Ports:: How to handle the thread's special ports.
4026: * Exceptions:: Managing exceptions.
4027: @end menu
4028:
4029:
4030: @node Thread Creation
4031: @subsection Thread Creation
4032:
4033: @deftypefun kern_return_t thread_create (@w{task_t @var{parent_task}}, @w{thread_t *@var{child_thread}})
4034: The function @code{thread_create} creates a new thread within the task
4035: specified by @var{parent_task}. The new thread has no processor state,
4036: and has a suspend count of 1. To get a new thread to run, first
4037: @code{thread_create} is called to get the new thread's identifier,
4038: (@var{child_thread}). Then @code{thread_set_state} is called to set a
4039: processor state, and finally @code{thread_resume} is called to get the
4040: thread scheduled to execute.
4041:
4042: When the thread is created send rights to its thread kernel port are
4043: given to it and returned to the caller in @var{child_thread}. The new
4044: thread's exception port is set to @code{MACH_PORT_NULL}.
4045:
4046: The function returns @code{KERN_SUCCESS} if a new thread has been
4047: created, @code{KERN_INVALID_ARGUMENT} if @var{parent_task} is not a
4048: valid task and @code{KERN_RESOURCE_SHORTAGE} if some critical kernel
4049: resource is not available.
4050: @end deftypefun
4051:
4052:
4053: @node Thread Termination
4054: @subsection Thread Termination
4055:
4056: @deftypefun kern_return_t thread_terminate (@w{thread_t @var{target_thread}})
4057: The function @code{thread_terminate} destroys the thread specified by
4058: @var{target_thread}.
4059:
4060: The function returns @code{KERN_SUCCESS} if the thread has been killed
4061: and @code{KERN_INVALID_ARGUMENT} if @var{target_thread} is not a thread.
4062: @end deftypefun
4063:
4064:
4065: @node Thread Information
4066: @subsection Thread Information
4067:
4068: @deftypefun thread_t mach_thread_self ()
4069: The @code{mach_thread_self} system call returns the calling thread's
4070: thread port.
4071:
4072: @code{mach_thread_self} has an effect equivalent to receiving a send
4073: right for the thread port. @code{mach_thread_self} returns the name of
4074: the send right. In particular, successive calls will increase the
4075: calling task's user-reference count for the send right.
4076:
4077: @c author{marcus}
4078: As a special exception, the kernel will overrun the user reference count
4079: of the thread name port, so that this function can not fail for that
4080: reason. Because of this, the user should not deallocate the port right
4081: if an overrun might have happened. Otherwise the reference count could
4082: drop to zero and the send right be destroyed while the user still
4083: expects to be able to use it. As the kernel does not make use of the
4084: number of extant send rights anyway, this is safe to do (the thread port
4085: itself is not destroyed, even when there are no send rights anymore).
4086:
4087: The function returns @code{MACH_PORT_NULL} if a resource shortage
4088: prevented the reception of the send right or if the thread port is
4089: currently null and @code{MACH_PORT_DEAD} if the thread port is currently
4090: dead.
4091: @end deftypefun
4092:
4093: @deftypefun kern_return_t thread_info (@w{thread_t @var{target_thread}}, @w{int @var{flavor}}, @w{thread_info_t @var{thread_info}}, @w{mach_msg_type_number_t *@var{thread_infoCnt}})
4094: The function @code{thread_info} returns the selected information array
4095: for a thread, as specified by @var{flavor}.
4096:
4097: @var{thread_info} is an array of integers that is supplied by the caller
4098: and returned filled with specified information. @var{thread_infoCnt} is
4099: supplied as the maximum number of integers in @var{thread_info}. On
4100: return, it contains the actual number of integers in @var{thread_info}.
4101: The maximum number of integers returned by any flavor is
4102: @code{THREAD_INFO_MAX}.
4103:
4104: The type of information returned is defined by @var{flavor}, which can
4105: be one of the following:
4106:
4107: @table @code
4108: @item THREAD_BASIC_INFO
4109: The function returns basic information about the thread, as defined by
4110: @code{thread_basic_info_t}. This includes the user and system time, the
4111: run state, and scheduling priority. The number of integers returned is
4112: @code{THREAD_BASIC_INFO_COUNT}.
4113:
4114: @item THREAD_SCHED_INFO
4115: The function returns information about the scheduling policy for the
4116: thread as defined by @code{thread_sched_info_t}. The number of integers
4117: returned is @code{THREAD_SCHED_INFO_COUNT}.
4118: @end table
4119:
4120: The function returns @code{KERN_SUCCESS} if the call succeeded and
4121: @code{KERN_INVALID_ARGUMENT} if @var{target_thread} is not a thread or
4122: @var{flavor} is not recognized. The function returns
4123: @code{MIG_ARRAY_TOO_LARGE} if the returned info array is too large for
4124: @var{thread_info}. In this case, @var{thread_info} is filled as much as
4125: possible and @var{thread_infoCnt} is set to the number of elements that
4126: would have been returned if there were enough room.
4127: @end deftypefun
4128:
4129: @deftp {Data type} {struct thread_basic_info}
4130: This structure is returned in @var{thread_info} by the
4131: @code{thread_info} function and provides basic information about the
4132: thread. You can cast a variable of type @code{thread_info_t} to a
4133: pointer of this type if you provided it as the @var{thread_info}
4134: parameter for the @code{THREAD_BASIC_INFO} flavor of @code{thread_info}.
4135: It has the following members:
4136:
4137: @table @code
4138: @item time_value_t user_time
4139: user run time
4140:
4141: @item time_value_t system_time
4142: system run time
4143: @item int cpu_usage
4144: Scaled cpu usage percentage. The scale factor is @code{TH_USAGE_SCALE}.
4145:
4146: @item int base_priority
4147: The base scheduling priority of the thread.
4148:
4149: @item int cur_priority
4150: The current scheduling priority of the thread.
4151:
4152: @item integer_t run_state
4153: The run state of the thread. The possible values of this field are:
4154: @table @code
4155: @item TH_STATE_RUNNING
4156: The thread is running normally.
4157:
4158: @item TH_STATE_STOPPED
4159: The thread is suspended.
4160:
4161: @item TH_STATE_WAITING
4162: The thread is waiting normally.
4163:
4164: @item TH_STATE_UNINTERRUPTIBLE
4165: The thread is in an uninterruptible wait.
4166:
4167: @item TH_STATE_HALTED
4168: The thread is halted at a clean point.
4169: @end table
4170:
4171: @item flags
4172: Various flags. The possible values of this field are:
4173: @table @code
4174: @item TH_FLAGS_SWAPPED
4175: The thread is swapped out.
4176:
4177: @item TH_FLAGS_IDLE
4178: The thread is an idle thread.
4179: @end table
4180:
4181: @item int suspend_count
4182: The suspend count for the thread.
4183:
4184: @item int sleep_time
4185: The number of seconds that the thread has been sleeping.
4186:
4187: @item time_value_t creation_time
4188: The time stamp of creation.
4189: @end table
4190: @end deftp
4191:
4192: @deftp {Data type} thread_basic_info_t
4193: This is a pointer to a @code{struct thread_basic_info}.
4194: @end deftp
4195:
4196: @deftp {Data type} {struct thread_sched_info}
4197: This structure is returned in @var{thread_info} by the
4198: @code{thread_info} function and provides schedule information about the
4199: thread. You can cast a variable of type @code{thread_info_t} to a
4200: pointer of this type if you provided it as the @var{thread_info}
4201: parameter for the @code{THREAD_SCHED_INFO} flavor of @code{thread_info}.
4202: It has the following members:
4203:
4204: @table @code
4205: @item int policy
4206: The scheduling policy of the thread, @ref{Scheduling Policy}.
4207:
4208: @item integer_t data
4209: Policy-dependent scheduling information, @ref{Scheduling Policy}.
4210:
4211: @item int base_priority
4212: The base scheduling priority of the thread.
4213:
4214: @item int max_priority
4215: The maximum scheduling priority of the thread.
4216:
4217: @item int cur_priority
4218: The current scheduling priority of the thread.
4219:
4220: @item int depressed
4221: @code{TRUE} if the thread is depressed.
4222:
4223: @item int depress_priority
4224: The priority the thread was depressed from.
4225: @end table
4226: @end deftp
4227:
4228: @deftp {Data type} thread_sched_info_t
4229: This is a pointer to a @code{struct thread_sched_info}.
4230: @end deftp
4231:
4232:
4233: @node Thread Settings
4234: @subsection Thread Settings
4235:
4236: @deftypefun kern_return_t thread_wire (@w{host_priv_t @var{host_priv}}, @w{thread_t @var{thread}}, @w{boolean_t @var{wired}})
4237: The function @code{thread_wire} controls the VM privilege level of the
4238: thread @var{thread}. A VM-privileged thread never waits inside the
4239: kernel for memory allocation from the kernel's free list of pages or for
4240: allocation of a kernel stack.
4241:
4242: Threads that are part of the default pageout path should be
4243: VM-privileged, to prevent system deadlocks. Threads that are not part
4244: of the default pageout path should not be VM-privileged, to prevent the
4245: kernel's free list of pages from being exhausted.
4246:
4247: The functions returns @code{KERN_SUCCESS} if the call succeeded,
4248: @code{KERN_INVALID_ARGUMENT} if @var{host_priv} or @var{thread} was
4249: invalid.
4250:
4251: The @code{thread_wire} call is actually an RPC to @var{host_priv},
4252: normally a send right for a privileged host port, but potentially any
4253: send right. In addition to the normal diagnostic return codes from the
4254: call's server (normally the kernel), the call may return @code{mach_msg}
4255: return codes.
4256: @c See also: vm_wire(2), vm_set_default_memory_manager(2).
4257: @end deftypefun
4258:
4259:
4260: @node Thread Execution
4261: @subsection Thread Execution
4262:
4263: @deftypefun kern_return_t thread_suspend (@w{thread_t @var{target_thread}})
4264: Increments the thread's suspend count and prevents the thread from
4265: executing any more user level instructions. In this context a user
4266: level instruction is either a machine instruction executed in user mode
4267: or a system trap instruction including page faults. Thus if a thread is
4268: currently executing within a system trap the kernel code may continue to
4269: execute until it reaches the system return code or it may suspend within
4270: the kernel code. In either case, when the thread is resumed the system
4271: trap will return. This could cause unpredictable results if the user
4272: did a suspend and then altered the user state of the thread in order to
4273: change its direction upon a resume. The call @code{thread_abort} is
4274: provided to allow the user to abort any system call that is in progress
4275: in a predictable way.
4276:
4277: The suspend count may become greater than one with the effect that it
4278: will take more than one resume call to restart the thread.
4279:
4280: The function returns @code{KERN_SUCCESS} if the thread has been
4281: suspended and @code{KERN_INVALID_ARGUMENT} if @var{target_thread} is not
4282: a thread.
4283: @end deftypefun
4284:
4285: @deftypefun kern_return_t thread_resume (@w{thread_t @var{target_thread}})
4286: Decrements the thread's suspend count. If the count becomes zero the
4287: thread is resumed. If it is still positive, the thread is left
4288: suspended. The suspend count may not become negative.
4289:
4290: The function returns @code{KERN_SUCCESS} if the thread has been resumed,
4291: @code{KERN_FAILURE} if the suspend count is already zero and
4292: @code{KERN_INVALID_ARGUMENT} if @var{target_thread} is not a thread.
4293: @end deftypefun
4294:
4295: @deftypefun kern_return_t thread_abort (@w{thread_t @var{target_thread}})
4296: The function @code{thread_abort} aborts the kernel primitives:
4297: @code{mach_msg}, @code{msg_send}, @code{msg_receive} and @code{msg_rpc}
4298: and page-faults, making the call return a code indicating that it was
4299: interrupted. The call is interrupted whether or not the thread (or task
4300: containing it) is currently suspended. If it is suspended, the thread
4301: receives the interrupt when it is resumed.
4302:
4303: A thread will retry an aborted page-fault if its state is not modified
4304: before it is resumed. @code{msg_send} returns @code{SEND_INTERRUPTED};
4305: @code{msg_receive} returns @code{RCV_INTERRUPTED}; @code{msg_rpc}
4306: returns either @code{SEND_INTERRUPTED} or @code{RCV_INTERRUPTED},
4307: depending on which half of the RPC was interrupted.
4308:
4309: The main reason for this primitive is to allow one thread to cleanly
4310: stop another thread in a manner that will allow the future execution of
4311: the target thread to be controlled in a predictable way.
4312: @code{thread_suspend} keeps the target thread from executing any further
4313: instructions at the user level, including the return from a system call.
4314: @code{thread_get_state}/@code{thread_set_state} allows the examination
4315: or modification of the user state of a target thread. However, if a
4316: suspended thread was executing within a system call, it also has
4317: associated with it a kernel state. This kernel state can not be
4318: modified by @code{thread_set_state} with the result that when the thread
4319: is resumed the system call may return changing the user state and
4320: possibly user memory. @code{thread_abort} aborts the kernel call from
4321: the target thread's point of view by resetting the kernel state so that
4322: the thread will resume execution at the system call return with the
4323: return code value set to one of the interrupted codes. The system call
4324: itself will either be entirely completed or entirely aborted, depending
4325: on the precise moment at which the abort was received. Thus if the
4326: thread's user state has been changed by @code{thread_set_state}, it will
4327: not be modified by any unexpected system call side effects.
4328:
4329: For example to simulate a Unix signal, the following sequence of calls
4330: may be used:
4331:
4332: @enumerate
4333: @item
4334: @code{thread_suspend}: Stops the thread.
4335:
4336: @item
4337: @code{thread_abort}: Interrupts any system call in progress, setting the
4338: return value to `interrupted'. Since the thread is stopped, it will not
4339: return to user code.
4340:
4341: @item
4342: @code{thread_set_state}: Alters thread's state to simulate a procedure
4343: call to the signal handler
4344:
4345: @item
4346: @code{thread_resume}: Resumes execution at the signal handler. If the
4347: thread's stack has been correctly set up, the thread may return to the
4348: interrupted system call. (Of course, the code to push an extra stack
4349: frame and change the registers is VERY machine-dependent.)
4350: @end enumerate
4351:
4352: Calling @code{thread_abort} on a non-suspended thread is pretty risky,
4353: since it is very difficult to know exactly what system trap, if any, the
4354: thread might be executing and whether an interrupt return would cause
4355: the thread to do something useful.
4356:
4357: The function returns @code{KERN_SUCCESS} if the thread received an
4358: interrupt and @code{KERN_INVALID_ARGUMENT} if @var{target_thread} is not
4359: a thread.
4360: @end deftypefun
4361:
4362: @deftypefun kern_return_t thread_get_state (@w{thread_t @var{target_thread}}, @w{int @var{flavor}}, @w{thread_state_t @var{old_state}}, @w{mach_msg_type_number_t *@var{old_stateCnt}})
4363: The function @code{thread_get_state} returns the execution state
4364: (e.g. the machine registers) of @var{target_thread} as specified by
4365: @var{flavor}. The @var{old_state} is an array of integers that is
4366: provided by the caller and returned filled with the specified
4367: information. @var{old_stateCnt} is input set to the maximum number of
4368: integers in @var{old_state} and returned equal to the actual number of
4369: integers in @var{old_state}.
4370:
4371: @var{target_thread} may not be @code{mach_thread_self()}.
4372:
4373: The definition of the state structures can be found in
4374: @file{machine/thread_status.h}.
4375:
4376: The function returns @code{KERN_SUCCESS} if the state has been returned,
4377: @code{KERN_INVALID_ARGUMENT} if @var{target_thread} is not a thread or
4378: is @code{mach_thread_self} or @var{flavor} is unrecognized for this machine.
4379: The function returns @code{MIG_ARRAY_TOO_LARGE} if the returned state is
4380: too large for @var{old_state}. In this case, @var{old_state} is filled
4381: as much as possible and @var{old_stateCnt} is set to the number of
4382: elements that would have been returned if there were enough room.
4383: @end deftypefun
4384:
4385: @deftypefun kern_return_t thread_set_state (@w{thread_t @var{target_thread}}, @w{int @var{flavor}}, @w{thread_state_t @var{new_state}}, @w{mach_msg_type_number_t @var{new_state_count}})
4386: The function @code{thread_set_state} sets the execution state (e.g. the
4387: machine registers) of @var{target_thread} as specified by @var{flavor}.
4388: The @var{new_state} is an array of integers. @var{new_state_count} is
4389: the number of elements in @var{new_state}. The entire set of registers
4390: is reset. This will do unpredictable things if @var{target_thread} is
4391: not suspended.
4392:
4393: @var{target_thread} may not be @code{mach_thread_self}.
4394:
4395: The definition of the state structures can be found in
4396: @file{machine/thread_status.h}.
4397:
4398: The function returns @code{KERN_SUCCESS} if the state has been set and
4399: @code{KERN_INVALID_ARGUMENT} if @var{target_thread} is not a thread or
4400: is @code{mach_thread_self} or @var{flavor} is unrecognized for this
4401: machine.
4402: @end deftypefun
4403:
4404:
4405: @node Scheduling
4406: @subsection Scheduling
4407:
4408: @menu
4409: * Thread Priority:: Changing the priority of a thread.
4410: * Hand-Off Scheduling:: Switching to a new thread.
4411: * Scheduling Policy:: Setting the scheduling policy.
4412: @end menu
4413:
4414:
4415: @node Thread Priority
4416: @subsubsection Thread Priority
4417:
4418: Threads have three priorities associated with them by the system, a
4419: priority, a maximum priority, and a scheduled priority. The scheduled
4420: priority is used to make scheduling decisions about the thread. It is
4421: determined from the priority by the policy (for timesharing, this means
4422: adding an increment derived from cpu usage). The priority can be set
4423: under user control, but may never exceed the maximum priority. Changing
4424: the maximum priority requires presentation of the control port for the
4425: thread's processor set; since the control port for the default processor
4426: set is privileged, users cannot raise their maximum priority to unfairly
4427: compete with other users on that set. Newly created threads obtain
4428: their priority from their task and their max priority from the thread.
4429:
4430: @deftypefun kern_return_t thread_priority (@w{thread_t @var{thread}}, @w{int @var{prority}}, @w{boolean_t @var{set_max}})
4431: The function @code{thread_priority} changes the priority and optionally
4432: the maximum priority of @var{thread}. Priorities range from 0 to 31,
4433: where lower numbers denote higher priorities. If the new priority is
4434: higher than the priority of the current thread, preemption may occur as
4435: a result of this call. The maximum priority of the thread is also set
4436: if @var{set_max} is @code{TRUE}. This call will fail if @var{priority}
4437: is greater than the current maximum priority of the thread. As a
4438: result, this call can only lower the value of a thread's maximum
4439: priority.
4440:
4441: The functions returns @code{KERN_SUCCESS} if the operation completed
4442: successfully, @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a
4443: thread or @var{priority} is out of range (not in 0..31), and
4444: @code{KERN_FAILURE} if the requested operation would violate the
4445: thread's maximum priority (thread_priority).
4446: @end deftypefun
4447:
4448: @deftypefun kern_return_t thread_max_priority (@w{thread_t @var{thread}}, @w{processor_set_t @var{processor_set}}, @w{int @var{priority}})
4449: The function @code{thread_max_priority} changes the maximum priority of
4450: the thread. Because it requires presentation of the corresponding
4451: processor set port, this call can reset the maximum priority to any
4452: legal value.
4453:
4454: The functions returns @code{KERN_SUCCESS} if the operation completed
4455: successfully, @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a
4456: thread or @var{processor_set} is not a control port for a processor set
4457: or @var{priority} is out of range (not in 0..31), and
4458: @code{KERN_FAILURE} if the thread is not assigned to the processor set
4459: whose control port was presented.
4460: @end deftypefun
4461:
4462:
4463: @node Hand-Off Scheduling
4464: @subsubsection Hand-Off Scheduling
4465:
4466: @deftypefun kern_return_t thread_switch (@w{thread_t @var{new_thread}}, @w{int @var{option}}, @w{int @var{time}})
4467: The function @code{thread_switch} provides low-level access to the
4468: scheduler's context switching code. @var{new_thread} is a hint that
4469: implements hand-off scheduling. The operating system will attempt to
4470: switch directly to the new thread (by passing the normal logic that
4471: selects the next thread to run) if possible. Since this is a hint, it
4472: may be incorrect; it is ignored if it doesn't specify a thread on the
4473: same host as the current thread or if that thread can't be switched to
4474: (i.e., not runnable or already running on another processor). In this
4475: case, the normal logic to select the next thread to run is used; the
4476: current thread may continue running if there is no other appropriate
4477: thread to run.
4478:
4479: Options for @var{option} are defined in @file{mach/thread_switch.h} and
4480: specify the interpretation of @var{time}. The possible values for
4481: @var{option} are:
4482:
4483: @table @code
4484: @item SWITCH_OPTION_NONE
4485: No options, the time argument is ignored.
4486:
4487: @item SWITCH_OPTION_WAIT
4488: The thread is blocked for the specified time. This can be aborted by
4489: @code{thread_abort}.
4490:
4491: @item SWITCH_OPTION_DEPRESS
4492: The thread's priority is depressed to the lowest possible value for the
4493: specified time. This can be aborted by @code{thread_depress_abort}.
4494: This depression is independent of operations that change the thread's
4495: priority (e.g. @code{thread_priority} will not abort the depression).
4496: The minimum time and units of time can be obtained as the
4497: @code{min_timeout} value from @code{host_info}. The depression is also
4498: aborted when the current thread is next run (either via hand�off
4499: scheduling or because the processor set has nothing better to do).
4500: @end table
4501:
4502: @code{thread_switch} is often called when the current thread can proceed
4503: no further for some reason; the various options and arguments allow
4504: information about this reason to be transmitted to the kernel. The
4505: @var{new_thread} argument (handoff scheduling) is useful when the
4506: identity of the thread that must make progress before the current thread
4507: runs again is known. The @code{WAIT} option is used when the amount of
4508: time that the current thread must wait before it can do anything useful
4509: can be estimated and is fairly long. The @code{DEPRESS} option is used
4510: when the amount of time that must be waited is fairly short, especially
4511: when the identity of the thread that is being waited for is not known.
4512:
4513: Users should beware of calling @code{thread_switch} with an invalid hint
4514: (e.g. @code{MACH_PORT_NULL}) and no option. Because the time-sharing
4515: scheduler varies the priority of threads based on usage, this may result
4516: in a waste of cpu time if the thread that must be run is of lower
4517: priority. The use of the @code{DEPRESS} option in this situation is
4518: highly recommended.
4519:
4520: @code{thread_switch} ignores policies. Users relying on the preemption
4521: semantics of a fixed time policy should be aware that
4522: @code{thread_switch} ignores these semantics; it will run the specified
4523: @var{new_thread} independent of its priority and the priority of any other
4524: threads that could be run instead.
4525:
4526: The function returns @code{KERN_SUCCESS} if the call succeeded,
4527: @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a thread or
4528: @var{option} is not a recognized option, and @code{KERN_FAILURE} if
4529: @code{kern_depress_abort} failed because the thread was not depressed.
4530: @end deftypefun
4531:
4532: @deftypefun kern_return_t thread_depress_abort (@w{thread_t @var{thread}})
4533: The function @code{thread_depress_abort} cancels any priority depression
4534: for @var{thread} caused by a @code{swtch_pri} or @code{thread_switch}
4535: call.
4536:
4537: The function returns @code{KERN_SUCCESS} if the call succeeded and
4538: @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a valid thread.
4539: @end deftypefun
4540:
4541: @deftypefun boolean_t swtch ()
4542: @c XXX Clear up wording.
4543: The system trap @code{swtch} attempts to switch the current thread off
4544: the processor. The return value indicates if more than the current
4545: thread is running in the processor set. This is useful for lock
4546: management routines.
4547:
4548: The call returns @code{FALSE} if the thread is justified in becoming a
4549: resource hog by continuing to spin because there's nothing else useful
4550: that the processor could do. @code{TRUE} is returned if the thread
4551: should make one more check on the lock and then be a good citizen and
4552: really suspend.
4553: @end deftypefun
4554:
4555: @deftypefun boolean_t swtch_pri (@w{int @var{priority}})
4556: The system trap @code{swtch_pri} attempts to switch the current thread
4557: off the processor as @code{swtch} does, but depressing the priority of
4558: the thread to the minimum possible value during the time.
4559: @var{priority} is not used currently.
4560:
4561: The return value is as for @code{swtch}.
4562: @end deftypefun
4563:
4564:
4565: @node Scheduling Policy
4566: @subsubsection Scheduling Policy
4567:
4568: @deftypefun kern_return_t thread_policy (@w{thread_t @var{thread}}, @w{int @var{policy}}, @w{int @var{data}})
4569: The function @code{thread_policy} changes the scheduling policy for
4570: @var{thread} to @var{policy}.
4571:
4572: @var{data} is policy-dependent scheduling information. There are
4573: currently two supported policies: @code{POLICY_TIMESHARE} and
4574: @code{POLICY_FIXEDPRI} defined in @file{mach/policy.h}; this file is
4575: included by @file{mach.h}. @var{data} is meaningless for timesharing,
4576: but is the quantum to be used (in milliseconds) for the fixed priority
4577: policy. To be meaningful, this quantum must be a multiple of the basic
4578: system quantum (min_quantum) which can be obtained from
4579: @code{host_info}. The system will always round up to the next multiple
4580: of the quantum.
4581:
4582: Processor sets may restrict the allowed policies, so this call will fail
4583: if the processor set to which @var{thread} is currently assigned does
4584: not permit @var{policy}.
4585:
4586: The function returns @code{KERN_SUCCESS} if the call succeeded.
4587: @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a thread or
4588: @var{policy} is not a recognized policy, and @code{KERN_FAILURE} if the
4589: processor set to which @var{thread} is currently assigned does not
4590: permit @var{policy}.
4591: @end deftypefun
4592:
4593:
4594: @node Thread Special Ports
4595: @subsection Thread Special Ports
4596:
4597: @deftypefun kern_return_t thread_get_special_port (@w{thread_t @var{thread}}, @w{int @var{which_port}}, @w{mach_port_t *@var{special_port}})
4598: The function @code{thread_get_special_port} returns send rights to one
4599: of a set of special ports for the thread specified by @var{thread}.
4600:
4601: The possible values for @var{which_port} are @code{THREAD_KERNEL_PORT}
4602: and @code{THREAD_EXCEPTION_PORT}. A thread also has access to its
4603: task's special ports.
4604:
4605: The function returns @code{KERN_SUCCESS} if the port was returned and
4606: @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a thread or
4607: @var{which_port} is an invalid port selector.
4608: @end deftypefun
4609:
4610: @deftypefun kern_return_t thread_get_kernel_port (@w{thread_t @var{thread}}, @w{mach_port_t *@var{kernel_port}})
4611: The function @code{thread_get_kernel_port} is equivalent to the function
4612: @code{thread_get_special_port} with the @var{which_port} argument set to
4613: @code{THREAD_KERNEL_PORT}.
4614: @end deftypefun
4615:
4616: @deftypefun kern_return_t thread_get_exception_port (@w{thread_t @var{thread}}, @w{mach_port_t *@var{exception_port}})
4617: The function @code{thread_get_exception_port} is equivalent to the
4618: function @code{thread_get_special_port} with the @var{which_port}
4619: argument set to @code{THREAD_EXCEPTION_PORT}.
4620: @end deftypefun
4621:
4622: @deftypefun kern_return_t thread_set_special_port (@w{thread_t @var{thread}}, @w{int @var{which_port}}, @w{mach_port_t @var{special_port}})
4623: The function @code{thread_set_special_port} sets one of a set of special
4624: ports for the thread specified by @var{thread}.
4625:
4626: The possible values for @var{which_port} are @code{THREAD_KERNEL_PORT}
4627: and @code{THREAD_EXCEPTION_PORT}. A thread also has access to its
4628: task's special ports.
4629:
4630: The function returns @code{KERN_SUCCESS} if the port was set and
4631: @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a thread or
4632: @var{which_port} is an invalid port selector.
4633: @end deftypefun
4634:
4635: @deftypefun kern_return_t thread_set_kernel_port (@w{thread_t @var{thread}}, @w{mach_port_t @var{kernel_port}})
4636: The function @code{thread_set_kernel_port} is equivalent to the function
4637: @code{thread_set_special_port} with the @var{which_port} argument set to
4638: @code{THREAD_KERNEL_PORT}.
4639: @end deftypefun
4640:
4641: @deftypefun kern_return_t thread_set_exception_port (@w{thread_t @var{thread}}, @w{mach_port_t @var{exception_port}})
4642: The function @code{thread_set_exception_port} is equivalent to the
4643: function @code{thread_set_special_port} with the @var{which_port}
4644: argument set to @code{THREAD_EXCEPTION_PORT}.
4645: @end deftypefun
4646:
4647:
4648: @node Exceptions
4649: @subsection Exceptions
4650:
4651: @deftypefun kern_return_t catch_exception_raise (@w{mach_port_t @var{exception_port}}, @w{thread_t @var{thread}}, @w{task_t @var{task}}, @w{int @var{exception}}, @w{int @var{code}}, @w{int @var{subcode}})
4652: XXX Fixme
4653: @end deftypefun
4654:
4655: @deftypefun kern_return_t exception_raise (@w{mach_port_t @var{exception_port}}, @w{mach_port_t @var{thread}}, @w{mach_port_t @var{task}}, @w{integer_t @var{exception}}, @w{integer_t @var{code}}, @w{integer_t @var{subcode}})
4656: XXX Fixme
4657: @end deftypefun
4658:
4659: @deftypefun kern_return_t evc_wait (@w{unsigned int @var{event}})
4660: @c XXX This is for user space drivers, the description is incomplete.
4661: The system trap @code{evc_wait} makes the calling thread wait for the
4662: event specified by @var{event}.
4663:
4664: The call returns @code{KERN_SUCCESS} if the event has occurred,
4665: @code{KERN_NO_SPACE} if another thread is waiting for the same event and
4666: @code{KERN_INVALID_ARGUMENT} if the event object is invalid.
4667: @end deftypefun
4668:
4669:
4670: @node Task Interface
4671: @section Task Interface
4672:
4673: @cindex task port
4674: @cindex port representing a task
4675: @deftp {Data type} task_t
4676: This is a @code{mach_port_t} and used to hold the port name of a task
4677: port that represents the thread. Manipulations of the task are
4678: implemented as remote procedure calls to the task port. A task can get
4679: a port to itself with the @code{mach_task_self} system call.
4680:
4681: The task port name is also used to identify the task's IPC space
4682: (@pxref{Port Manipulation Interface}) and the task's virtual memory map
4683: (@pxref{Virtual Memory Interface}).
4684: @end deftp
4685:
4686: @menu
4687: * Task Creation:: Creating tasks.
4688: * Task Termination:: Terminating tasks.
4689: * Task Information:: Informations on tasks.
4690: * Task Execution:: Thread scheduling in a task.
4691: * Task Special Ports:: How to get and set the task's special ports.
4692: * Syscall Emulation:: How to emulate system calls.
4693: @end menu
4694:
4695:
4696: @node Task Creation
4697: @subsection Task Creation
4698:
4699: @deftypefun kern_return_t task_create (@w{task_t @var{parent_task}}, @w{boolean_t @var{inherit_memory}}, @w{task_t *@var{child_task}})
4700: The function @code{task_create} creates a new task from
4701: @var{parent_task}; the resulting task (@var{child_task}) acquires shared
4702: or copied parts of the parent's address space (see @code{vm_inherit}).
4703: The child task initially contains no threads.
4704:
4705: If @var{inherit_memory} is set, the child task's address space is built
4706: from the parent task according to its memory inheritance values;
4707: otherwise, the child task is given an empty address space.
4708:
4709: The child task gets the three special ports created or copied for it at
4710: task creation. The @code{TASK_KERNEL_PORT} is created and send rights
4711: for it are given to the child and returned to the caller.
4712: @c The following is only relevant if MACH_IPC_COMPAT is used.
4713: @c The @code{TASK_NOTIFY_PORT} is created and receive, ownership and send rights
4714: @c for it are given to the child. The caller has no access to it.
4715: The @code{TASK_BOOTSTRAP_PORT} and the @code{TASK_EXCEPTION_PORT} are
4716: inherited from the parent task. The new task can get send rights to
4717: these ports with the call @code{task_get_special_port}.
4718:
4719: The function returns @code{KERN_SUCCESS} if a new task has been created,
4720: @code{KERN_INVALID_ARGUMENT} if @var{parent_task} is not a valid task
4721: port and @code{KERN_RESOURCE_SHORTAGE} if some critical kernel resource
4722: is unavailable.
4723: @end deftypefun
4724:
4725:
4726: @node Task Termination
4727: @subsection Task Termination
4728:
4729: @deftypefun kern_return_t task_terminate (@w{task_t @var{target_task}})
4730: The function @code{task_terminate} destroys the task specified by
4731: @var{target_task} and all its threads. All resources that are used only
4732: by this task are freed. Any port to which this task has receive and
4733: ownership rights is destroyed.
4734:
4735: The function returns @code{KERN_SUCCESS} if the task has been killed,
4736: @code{KERN_INVALID_ARGUMENT} if @var{target_task} is not a task.
4737: @end deftypefun
4738:
4739:
4740: @node Task Information
4741: @subsection Task Information
4742: @deftypefun task_t mach_task_self ()
4743: The @code{mach_task_self} system call returns the calling thread's task
4744: port.
4745:
4746: @code{mach_task_self} has an effect equivalent to receiving a send right
4747: for the task port. @code{mach_task_self} returns the name of the send
4748: right. In particular, successive calls will increase the calling task's
4749: user-reference count for the send right.
4750:
4751: As a special exception, the kernel will overrun the user reference count
4752: of the task name port, so that this function can not fail for that
4753: reason. Because of this, the user should not deallocate the port right
4754: if an overrun might have happened. Otherwise the reference count could
4755: drop to zero and the send right be destroyed while the user still
4756: expects to be able to use it. As the kernel does not make use of the
4757: number of extant send rights anyway, this is safe to do (the task port
4758: itself is not destroyed, even when there are no send rights anymore).
4759:
4760: The function returns @code{MACH_PORT_NULL} if a resource shortage
4761: prevented the reception of the send right, @code{MACH_PORT_NULL} if the
4762: task port is currently null, @code{MACH_PORT_DEAD} if the task port is
4763: currently dead.
4764: @end deftypefun
4765:
4766: @deftypefun kern_return_t task_threads (@w{task_t @var{target_task}}, @w{thread_array_t *@var{thread_list}}, @w{mach_msg_type_number_t *@var{thread_count}})
4767: The function @code{task_threads} gets send rights to the kernel port for
4768: each thread contained in @var{target_task}. @var{thread_list} is an
4769: array that is created as a result of this call. The caller may wish to
4770: @code{vm_deallocate} this array when the data is no longer needed.
4771:
4772: The function returns @code{KERN_SUCCESS} if the call succeeded and
4773: @code{KERN_INVALID_ARGUMENT} if @var{target_task} is not a task.
4774: @end deftypefun
4775:
4776: @deftypefun kern_return_t task_info (@w{task_t @var{target_task}}, @w{int @var{flavor}}, @w{task_info_t @var{task_info}}, @w{mach_msg_type_number_t *@var{task_info_count}})
4777: The function @code{task_info} returns the selected information array for
4778: a task, as specified by @var{flavor}. @var{task_info} is an array of
4779: integers that is supplied by the caller, and filled with specified
4780: information. @var{task_info_count} is supplied as the maximum number of
4781: integers in @var{task_info}. On return, it contains the actual number
4782: of integers in @var{task_info}. The maximum number of integers returned
4783: by any flavor is @code{TASK_INFO_MAX}.
4784:
4785: The type of information returned is defined by @var{flavor}, which can
4786: be one of the following:
4787:
4788: @table @code
4789: @item TASK_BASIC_INFO
4790: The function returns basic information about the task, as defined by
4791: @code{task_basic_info_t}. This includes the user and system time and
4792: memory consumption. The number of integers returned is
4793: @code{TASK_BASIC_INFO_COUNT}.
4794:
4795: @item TASK_EVENTS_INFO
4796: The function returns information about events for the task as defined by
4797: @code{thread_sched_info_t}. This includes statistics about virtual
4798: memory and IPC events like pageouts, pageins and messages sent and
4799: received. The number of integers returned is
4800: @code{TASK_EVENTS_INFO_COUNT}.
4801:
4802: @item TASK_THREAD_TIMES_INFO
4803: The function returns information about the total time for live threads
4804: as defined by @code{task_thread_times_info_t}. The number of integers
4805: returned is @code{TASK_THREAD_TIMES_INFO_COUNT}.
4806: @end table
4807:
4808: The function returns @code{KERN_SUCCESS} if the call succeeded and
4809: @code{KERN_INVALID_ARGUMENT} if @var{target_task} is not a thread or
4810: @var{flavor} is not recognized. The function returns
4811: @code{MIG_ARRAY_TOO_LARGE} if the returned info array is too large for
4812: @var{task_info}. In this case, @var{task_info} is filled as much as
4813: possible and @var{task_infoCnt} is set to the number of elements that
4814: would have been returned if there were enough room.
4815: @end deftypefun
4816:
4817: @deftp {Data type} {struct task_basic_info}
4818: This structure is returned in @var{task_info} by the @code{task_info}
4819: function and provides basic information about the task. You can cast a
4820: variable of type @code{task_info_t} to a pointer of this type if you
4821: provided it as the @var{task_info} parameter for the
4822: @code{TASK_BASIC_INFO} flavor of @code{task_info}. It has the following
4823: members:
4824:
4825: @table @code
4826: @item integer_t suspend_count
4827: suspend count for task
4828:
4829: @item integer_t base_priority
4830: base scheduling priority
4831:
4832: @item vm_size_t virtual_size
4833: number of virtual pages
4834:
4835: @item vm_size_t resident_size
4836: number of resident pages
4837:
4838: @item time_value_t user_time
4839: total user run time for terminated threads
4840:
4841: @item time_value_t system_time
4842: total system run time for terminated threads
4843:
4844: @item time_value_t creation_time
4845: creation time stamp
4846: @end table
4847: @end deftp
4848:
4849: @deftp {Data type} task_basic_info_t
4850: This is a pointer to a @code{struct task_basic_info}.
4851: @end deftp
4852:
4853: @deftp {Data type} {struct task_events_info}
4854: This structure is returned in @var{task_info} by the @code{task_info}
4855: function and provides event statistics for the task. You can cast a
4856: variable of type @code{task_info_t} to a pointer of this type if you
4857: provided it as the @var{task_info} parameter for the
4858: @code{TASK_EVENTS_INFO} flavor of @code{task_info}. It has the
4859: following members:
4860:
4861: @table @code
4862: @item natural_t faults
4863: number of page faults
4864:
4865: @item natural_t zero_fills
4866: number of zero fill pages
4867:
4868: @item natural_t reactivations
4869: number of reactivated pages
4870:
4871: @item natural_t pageins
4872: number of actual pageins
4873:
4874: @item natural_t cow_faults
4875: number of copy-on-write faults
4876:
4877: @item natural_t messages_sent
4878: number of messages sent
4879:
4880: @item natural_t messages_received
4881: number of messages received
4882: @end table
4883: @end deftp
4884:
4885: @deftp {Data type} task_events_info_t
4886: This is a pointer to a @code{struct task_events_info}.
4887: @end deftp
4888:
4889: @deftp {Data type} {struct task_thread_times_info}
4890: This structure is returned in @var{task_info} by the @code{task_info}
4891: function and provides event statistics for the task. You can cast a
4892: variable of type @code{task_info_t} to a pointer of this type if you
4893: provided it as the @var{task_info} parameter for the
4894: @code{TASK_THREAD_TIMES_INFO} flavor of @code{task_info}. It has the
4895: following members:
4896:
4897: @table @code
4898: @item time_value_t user_time
4899: total user run time for live threads
4900:
4901: @item time_value_t system_time
4902: total system run time for live threads
4903: @end table
4904: @end deftp
4905:
4906: @deftp {Data type} task_thread_times_info_t
4907: This is a pointer to a @code{struct task_thread_times_info}.
4908: @end deftp
4909:
4910:
4911: @node Task Execution
4912: @subsection Task Execution
4913:
4914: @deftypefun kern_return_t task_suspend (@w{task_t @var{target_task}})
4915: The function @code{task_suspend} increments the task's suspend count and
4916: stops all threads in the task. As long as the suspend count is positive
4917: newly created threads will not run. This call does not return until all
4918: threads are suspended.
4919:
4920: The count may become greater than one, with the effect that it will take
4921: more than one resume call to restart the task.
4922:
4923: The function returns @code{KERN_SUCCESS} if the task has been suspended
4924: and @code{KERN_INVALID_ARGUMENT} if @var{target_task} is not a task.
4925: @end deftypefun
4926:
4927: @deftypefun kern_return_t task_resume (@w{task_t @var{target_task}})
4928: The function @code{task_resume} decrements the task's suspend count. If
4929: it becomes zero, all threads with zero suspend counts in the task are
4930: resumed. The count may not become negative.
4931:
4932: The function returns @code{KERN_SUCCESS} if the task has been resumed,
4933: @code{KERN_FAILURE} if the suspend count is already at zero and
4934: @code{KERN_INVALID_ARGUMENT} if @var{target_task} is not a task.
4935: @end deftypefun
4936:
4937: @c XXX Should probably be in the "Scheduling" node of the Thread Interface.
4938: @deftypefun kern_return_t task_priority (@w{task_t @var{task}}, @w{int @var{priority}}, @w{boolean_t @var{change_threads}})
4939: The priority of a task is used only for creation of new threads; a new
4940: thread's priority is set to the enclosing task's priority.
4941: @code{task_priority} changes this task priority. It also sets the
4942: priorities of all threads in the task to this new priority if
4943: @var{change_threads} is @code{TRUE}. Existing threads are not affected
4944: otherwise. If this priority change violates the maximum priority of
4945: some threads, as many threads as possible will be changed and an error
4946: code will be returned.
4947:
4948: The function returns @code{KERN_SUCCESS} if the call succeeded,
4949: @code{KERN_INVALID_ARGUMENT} if @var{task} is not a task, or
4950: @var{priority} is not a valid priority and @code{KERN_FAILURE} if
4951: @var{change_threads} was @code{TRUE} and the attempt to change the
4952: priority of at least one existing thread failed because the new priority
4953: would have exceeded that thread's maximum priority.
4954: @end deftypefun
4955:
4956: @deftypefun kern_return_t task_ras_control (@w{task_t @var{target_task}}, @w{vm_address_t @var{start_pc}}, @w{vm_address_t @var{end_pc}}, @w{int @var{flavor}})
4957: The function @code{task_ras_control} manipulates a task's set of
4958: restartable atomic sequences. If a sequence is installed, and any
4959: thread in the task is preempted within the range
4960: [@var{start_pc},@var{end_pc}], then the thread is resumed at
4961: @var{start_pc}. This enables applications to build atomic sequences
4962: which, when executed to completion, will have executed atomically.
4963: Restartable atomic sequences are intended to be used on systems that do
4964: not have hardware support for low-overhead atomic primitives.
4965:
4966: As a thread can be rolled-back, the code in the sequence should have no
4967: side effects other than a final store at @var{end_pc}. The kernel does
4968: not guarantee that the sequence is restartable. It assumes the
4969: application knows what it's doing.
4970:
4971: A task may have a finite number of atomic sequences that is defined at
4972: compile time.
4973:
4974: The flavor specifies the particular operation that should be applied to
4975: this restartable atomic sequence. Possible values for flavor can be:
4976:
4977: @table @code
4978: @item TASK_RAS_CONTROL_PURGE_ALL
4979: Remove all registered sequences for this task.
4980:
4981: @item TASK_RAS_CONTROL_PURGE_ONE
4982: Remove the named registered sequence for this task.
4983:
4984: @item TASK_RAS_CONTROL_PURGE_ALL_AND_INSTALL_ONE
4985: Atomically remove all registered sequences and install the named
4986: sequence.
4987:
4988: @item TASK_RAS_CONTROL_INSTALL_ONE
4989: Install this sequence.
4990: @end table
4991:
4992: The function returns @code{KERN_SUCCESS} if the operation has been
4993: performed, @code{KERN_INVALID_ADDRESS} if the @var{start_pc} or
4994: @var{end_pc} values are not a valid address for the requested operation
4995: (for example, it is invalid to purge a sequence that has not been
4996: registered), @code{KERN_RESOURCE_SHORTAGE} if an attempt was made to
4997: install more restartable atomic sequences for a task than can be
4998: supported by the kernel, @code{KERN_INVALID_VALUE} if a bad flavor was
4999: specified, @code{KERN_INVALID_ARGUMENT} if @var{target_task} is not a
5000: task and @code{KERN_FAILURE} if the call is not not supported on this
5001: configuration.
5002: @end deftypefun
5003:
5004:
5005: @node Task Special Ports
5006: @subsection Task Special Ports
5007:
5008: @deftypefun kern_return_t task_get_special_port (@w{task_t @var{task}}, @w{int @var{which_port}}, @w{mach_port_t *@var{special_port}})
5009: The function @code{task_get_special_port} returns send rights to one of
5010: a set of special ports for the task specified by @var{task}.
5011:
5012: The special ports associated with a task are the kernel port
5013: (@code{TASK_KERNEL_PORT}), the bootstrap port
5014: (@code{TASK_BOOTSTRAP_PORT}) and the exception port
5015: (@code{TASK_EXCEPTION_PORT}). The bootstrap port is a port to which a
5016: task may send a message requesting other system service ports. This
5017: port is not used by the kernel. The task's exception port is the port
5018: to which messages are sent by the kernel when an exception occurs and
5019: the thread causing the exception has no exception port of its own.
5020:
5021: The following macros to call @code{task_get_special_port} for a specific
5022: port are defined in @code{mach/task_special_ports.h}:
5023: @code{task_get_exception_port} and @code{task_get_bootstrap_port}.
5024:
5025: The function returns @code{KERN_SUCCESS} if the port was returned and
5026: @code{KERN_INVALID_ARGUMENT} if @var{task} is not a task or
5027: @var{which_port} is an invalid port selector.
5028: @end deftypefun
5029:
5030: @deftypefun kern_return_t task_get_kernel_port (@w{task_t @var{task}}, @w{mach_port_t *@var{kernel_port}})
5031: The function @code{task_get_kernel_port} is equivalent to the function
5032: @code{task_get_special_port} with the @var{which_port} argument set to
5033: @code{TASK_KERNEL_PORT}.
5034: @end deftypefun
5035:
5036: @deftypefun kern_return_t task_get_exception_port (@w{task_t @var{task}}, @w{mach_port_t *@var{exception_port}})
5037: The function @code{task_get_exception_port} is equivalent to the
5038: function @code{task_get_special_port} with the @var{which_port} argument
5039: set to @code{TASK_EXCEPTION_PORT}.
5040: @end deftypefun
5041:
5042: @deftypefun kern_return_t task_get_bootstrap_port (@w{task_t @var{task}}, @w{mach_port_t *@var{bootstrap_port}})
5043: The function @code{task_get_bootstrap_port} is equivalent to the
5044: function @code{task_get_special_port} with the @var{which_port} argument
5045: set to @code{TASK_BOOTSTRAP_PORT}.
5046: @end deftypefun
5047:
5048: @deftypefun kern_return_t task_set_special_port (@w{task_t @var{task}}, @w{int @var{which_port}}, @w{mach_port_t @var{special_port}})
5049: The function @code{thread_set_special_port} sets one of a set of special
5050: ports for the task specified by @var{task}.
5051:
5052: The special ports associated with a task are the kernel port
5053: (@code{TASK_KERNEL_PORT}), the bootstrap port
5054: (@code{TASK_BOOTSTRAP_PORT}) and the exception port
5055: (@code{TASK_EXCEPTION_PORT}). The bootstrap port is a port to which a
5056: thread may send a message requesting other system service ports. This
5057: port is not used by the kernel. The task's exception port is the port
5058: to which messages are sent by the kernel when an exception occurs and
5059: the thread causing the exception has no exception port of its own.
5060:
5061: The function returns @code{KERN_SUCCESS} if the port was set and
5062: @code{KERN_INVALID_ARGUMENT} if @var{task} is not a task or
5063: @var{which_port} is an invalid port selector.
5064: @end deftypefun
5065:
5066: @deftypefun kern_return_t task_set_kernel_port (@w{task_t @var{task}}, @w{mach_port_t @var{kernel_port}})
5067: The function @code{task_set_kernel_port} is equivalent to the function
5068: @code{task_set_special_port} with the @var{which_port} argument set to
5069: @code{TASK_KERNEL_PORT}.
5070: @end deftypefun
5071:
5072: @deftypefun kern_return_t task_set_exception_port (@w{task_t @var{task}}, @w{mach_port_t @var{exception_port}})
5073: The function @code{task_set_exception_port} is equivalent to the
5074: function @code{task_set_special_port} with the @var{which_port} argument
5075: set to @code{TASK_EXCEPTION_PORT}.
5076: @end deftypefun
5077:
5078: @deftypefun kern_return_t task_set_bootstrap_port (@w{task_t @var{task}}, @w{mach_port_t @var{bootstrap_port}})
5079: The function @code{task_set_bootstrap_port} is equivalent to the
5080: function @code{task_set_special_port} with the @var{which_port} argument
5081: set to @code{TASK_BOOTSTRAP_PORT}.
5082: @end deftypefun
5083:
5084:
5085: @node Syscall Emulation
5086: @subsection Syscall Emulation
5087:
5088: @deftypefun kern_return_t task_get_emulation_vector (@w{task_t @var{task}}, @w{int *@var{vector_start}}, @w{emulation_vector_t *@var{emulation_vector}}, @w{mach_msg_type_number_t *@var{emulation_vector_count}})
5089: The function @code{task_get_emulation_vector} gets the user-level
5090: handler entry points for all emulated system calls.
5091: @c XXX Fixme
5092: @end deftypefun
5093:
5094: @deftypefun kern_return_t task_set_emulation_vector (@w{task_t @var{task}}, @w{int @var{vector_start}}, @w{emulation_vector_t @var{emulation_vector}}, @w{mach_msg_type_number_t @var{emulation_vector_count}})
5095: The function @code{task_set_emulation_vector} establishes user-level
5096: handlers for the specified system calls. Non-emulated system calls are
5097: specified with an entry of @code{EML_ROUTINE_NULL}. System call
5098: emulation handlers are inherited by the children of @var{task}.
5099: @c XXX Fixme
5100: @end deftypefun
5101:
5102: @deftypefun kern_return_t task_set_emulation (@w{task_t @var{task}}, @w{vm_address_t @var{routine_entry_pt}}, @w{int @var{routine_number}})
5103: The function @code{task_set_emulation} establishes a user-level handler
5104: for the specified system call. System call emulation handlers are
5105: inherited by the children of @var{task}.
5106: @c XXX Fixme
5107: @end deftypefun
5108:
5109: @c XXX Fixme datatype emulation_vector_t
5110:
5111:
5112: @node Profiling
5113: @section Profiling
5114:
5115: @deftypefun kern_return_t task_enable_pc_sampling (@w{task_t @var{task}}, @w{int *@var{ticks}}, @w{sampled_pc_flavor_t @var{flavor}})
5116: @deftypefunx kern_return_t thread_enable_pc_sampling (@w{thread_t @var{thread}}, @w{int *@var{ticks}}, @w{sampled_pc_flavor_t @var{flavor}})
5117: The function @code{task_enable_pc_sampling} enables PC sampling for
5118: @var{task}, the function @code{thread_enable_pc_sampling} enables PC
5119: sampling for @var{thread}. The kernel's idea of clock granularity is
5120: returned in @var{ticks} in usecs. (this value should not be trusted). The
5121: sampling flavor is specified by @var{flavor}.
5122:
5123: The function returns @code{KERN_SUCCESS} if the operation is completed successfully
5124: and @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a valid thread.
5125: @end deftypefun
5126:
5127: @deftypefun kern_return_t task_disable_pc_sampling (@w{task_t @var{task}}, @w{int *@var{sample_count}})
5128: @deftypefunx kern_return_t thread_disable_pc_sampling (@w{thread_t @var{thread}}, @w{int *@var{sample_count}})
5129: The function @code{task_disable_pc_sampling} disables PC sampling for
5130: @var{task}, the function @code{thread_disable_pc_sampling} disables PC
5131: sampling for @var{thread}. The number of sample elements in the kernel
5132: for the thread is returned in @var{sample_count}.
5133:
5134: The function returns @code{KERN_SUCCESS} if the operation is completed successfully
5135: and @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a valid thread.
5136: @end deftypefun
5137:
5138: @deftypefun kern_return_t task_get_sampled_pcs (@w{task_t @var{task}}, @w{sampled_pc_seqno_t *@var{seqno}}, @w{sampled_pc_array_t @var{sampled_pcs}}, @w{mach_msg_type_number_t *@var{sample_count}})
5139: @deftypefunx kern_return_t thread_get_sampled_pcs (@w{thread_t @var{thread}}, @w{sampled_pc_seqno_t *@var{seqno}}, @w{sampled_pc_array_t @var{sampled_pcs}}, @w{int *@var{sample_count}})
5140: The function @code{task_get_sampled_pcs} extracts the PC samples for
5141: @var{task}, the function @code{thread_get_sampled_pcs} extracts the PC
5142: samples for @var{thread}. @var{seqno} is the sequence number of the
5143: sampled PCs. This is useful for determining when a collector thread has
5144: missed a sample. The sampled PCs for the thread are returned in
5145: @var{sampled_pcs}. @var{sample_count} contains the number of sample
5146: elements returned.
5147:
5148: The function returns @code{KERN_SUCCESS} if the operation is completed successfully,
5149: @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a valid thread and
5150: @code{KERN_FAILURE} if @var{thread} is not sampled.
5151: @end deftypefun
5152:
5153:
5154: @deftp {Data type} sampled_pc_t
5155: This structure is returned in @var{sampled_pcs} by the
5156: @code{thread_get_sampled_pcs} and @code{task_get_sampled_pcs} functions
5157: and provides pc samples for threads or tasks. It has the following
5158: members:
5159:
5160: @table @code
5161: @item natural_t id
5162: A thread-specific unique identifier.
5163:
5164: @item vm_offset_t pc
5165: A pc value.
5166:
5167: @item sampled_pc_flavor_t sampletype
5168: The type of the sample as per flavor.
5169: @end table
5170: @end deftp
5171:
5172:
5173: @deftp {Data type} sampled_pc_flavor_t
5174: This data type specifies a pc sample flavor, either as argument passed
5175: in @var{flavor} to the @code{thread_enable_pc_sample} and
5176: @code{thread_disable_pc_sample} functions, or as member
5177: @code{sampletype} in the @code{sample_pc_t} data type. The flavor is a
5178: bitwise-or of the possible flavors defined in @file{mach/pc_sample.h}:
5179:
5180: @table @code
5181: @item SAMPLED_PC_PERIODIC
5182: default
5183: @item SAMPLED_PC_VM_ZFILL_FAULTS
5184: zero filled fault
5185: @item SAMPLED_PC_VM_REACTIVATION_FAULTS
5186: reactivation fault
5187: @item SAMPLED_PC_VM_PAGEIN_FAULTS
5188: pagein fault
5189: @item SAMPLED_PC_VM_COW_FAULTS
5190: copy-on-write fault
5191: @item SAMPLED_PC_VM_FAULTS_ANY
5192: any fault
5193: @item SAMPLED_PC_VM_FAULTS
5194: the bitwise-or of @code{SAMPLED_PC_VM_ZFILL_FAULTS},
5195: @code{SAMPLED_PC_VM_REACTIVATION_FAULTS},
5196: @code{SAMPLED_PC_VM_PAGEIN_FAULTS} and @code{SAMPLED_PC_VM_COW_FAULTS}.
5197: @end table
5198: @end deftp
5199:
5200: @c XXX sampled_pc_array_t, sampled_pc_seqno_t
5201:
5202:
5203: @node Host Interface
5204: @chapter Host Interface
5205: @cindex host interface
5206:
5207: This section describes the Mach interface to a host executing a Mach
5208: kernel. The interface allows to query statistics about a host and
5209: control its behaviour.
5210:
5211: A host is represented by two ports, a name port @var{host} used to query
5212: information about the host accessible to everyone, and a control port
5213: @var{host_priv} used to manipulate it. For example, you can query the
5214: current time using the name port, but to change the time you need to
5215: send a message to the host control port.
5216:
5217: Everything described in this section is declared in the header file
5218: @file{mach.h}.
5219:
5220: @menu
5221: * Host Ports:: Ports representing a host.
5222: * Host Information:: Retrieval of information about a host.
5223: * Host Time:: Operations on the time as seen by a host.
5224: * Host Reboot:: Rebooting the system.
5225: @end menu
5226:
5227:
5228: @node Host Ports
5229: @section Host Ports
5230: @cindex host ports
5231: @cindex ports representing a host
5232:
5233: @cindex host name port
5234: @deftp {Data type} host_t
5235: This is a @code{mach_port_t} and used to hold the port name of a host
5236: name port (or short: host port). Any task can get a send right to the
5237: name port of the host running the task using the @code{mach_host_self}
5238: system call. The name port can be used query information about the
5239: host, for example the current time.
5240: @end deftp
5241:
5242: @deftypefun host_t mach_host_self ()
5243: The @code{mach_host_self} system call returns the calling thread's host
5244: name port. It has an effect equivalent to receiving a send right for
5245: the host port. @code{mach_host_self} returns the name of the send
5246: right. In particular, successive calls will increase the calling task's
5247: user-reference count for the send right.
5248:
5249: As a special exception, the kernel will overrun the user reference count
5250: of the host name port, so that this function can not fail for that
5251: reason. Because of this, the user should not deallocate the port right
5252: if an overrun might have happened. Otherwise the reference count could
5253: drop to zero and the send right be destroyed while the user still
5254: expects to be able to use it. As the kernel does not make use of the
5255: number of extant send rights anyway, this is safe to do (the host port
5256: itself is never destroyed).
5257:
5258: The function returns @code{MACH_PORT_NULL} if a resource shortage
5259: prevented the reception of the send right.
5260:
5261: This function is also available in @file{mach/mach_traps.h}.
5262: @end deftypefun
5263:
5264: @cindex host control port
5265: @deftp {Data type} host_priv_t
5266: This is a @code{mach_port_t} and used to hold the port name of a
5267: privileged host control port. A send right to the host control port is
5268: inserted into the first task at bootstrap (@pxref{Modules}). This is
5269: the only way to get access to the host control port in Mach, so the
5270: initial task has to preserve the send right carefully, moving a copy of
5271: it to other privileged tasks if necessary and denying access to
5272: unprivileged tasks.
5273: @end deftp
5274:
5275:
5276: @node Host Information
5277: @section Host Information
5278:
5279: @deftypefun kern_return_t host_info (@w{host_t @var{host}}, @w{int @var{flavor}}, @w{host_info_t @var{host_info}}, @w{mach_msg_type_number_t *@var{host_info_count}})
5280: The @code{host_info} function returns various information about
5281: @var{host}. @var{host_info} is an array of integers that is supplied by
5282: the caller. It will be filled with the requested information.
5283: @var{host_info_count} is supplied as the maximum number of integers in
5284: @var{host_info}. On return, it contains the actual number of integers
5285: in @var{host_info}. The maximum number of integers returned by any
5286: flavor is @code{HOST_INFO_MAX}.
5287:
5288: The type of information returned is defined by @var{flavor}, which can
5289: be one of the following:
5290:
5291: @table @code
5292: @item HOST_BASIC_INFO
5293: The function returns basic information about the host, as defined by
5294: @code{host_basic_info_t}. This includes the number of processors, their
5295: type, and the amount of memory installed in the system. The number of
5296: integers returned is @code{HOST_BASIC_INFO_COUNT}. For how to get more
5297: information about the processor, see @ref{Processor Interface}.
5298:
5299: @item HOST_PROCESSOR_SLOTS
5300: The function returns the numbers of the slots with active processors in
5301: them. The number of integers returned can be up to @code{max_cpus}, as
5302: returned by the @code{HOST_BASIC_INFO} flavor of @code{host_info}.
5303:
5304: @item HOST_SCHED_INFO
5305: The function returns information of interest to schedulers as defined by
5306: @code{host_sched_info_t}. The number of integers returned is
5307: @code{HOST_SCHED_INFO_COUNT}.
5308: @end table
5309:
5310: The function returns @code{KERN_SUCCESS} if the call succeeded and
5311: @code{KERN_INVALID_ARGUMENT} if @var{host} is not a host or @var{flavor}
5312: is not recognized. The function returns @code{MIG_ARRAY_TOO_LARGE} if
5313: the returned info array is too large for @var{host_info}. In this case,
5314: @var{host_info} is filled as much as possible and @var{host_info_count}
5315: is set to the number of elements that would be returned if there were
5316: enough room.
5317: @c BUGS Availability limited. Systems without this call support a
5318: @c host_info call with an incompatible calling sequence.
5319: @end deftypefun
5320:
5321: @deftp {Data type} {struct host_basic_info}
5322: A pointer to this structure is returned in @var{host_info} by the
5323: @code{host_info} function and provides basic information about the host.
5324: You can cast a variable of type @code{host_info_t} to a pointer of this
5325: type if you provided it as the @var{host_info} parameter for the
5326: @code{HOST_BASIC_INFO} flavor of @code{host_info}. It has the following
5327: members:
5328:
5329: @table @code
5330: @item int max_cpus
5331: The maximum number of possible processors for which the kernel is
5332: configured.
5333:
5334: @item int avail_cpus
5335: The number of cpus currently available.
5336:
5337: @item vm_size_t memory_size
5338: The size of physical memory in bytes.
5339:
5340: @item cpu_type_t cpu_type
5341: The type of the master processor.
5342:
5343: @item cpu_subtype_t cpu_subtype
5344: The subtype of the master processor.
5345: @end table
5346:
5347: The type and subtype of the individual processors are also available
5348: by @code{processor_info}, see @ref{Processor Interface}.
5349: @end deftp
5350:
5351: @deftp {Data type} host_basic_info_t
5352: This is a pointer to a @code{struct host_basic_info}.
5353: @end deftp
5354:
5355: @deftp {Data type} {struct host_sched_info}
5356: A pointer to this structure is returned in @var{host_info} by the
5357: @code{host_info} function and provides information of interest to
5358: schedulers. You can cast a variable of type @code{host_info_t} to a
5359: pointer of this type if you provided it as the @var{host_info} parameter
5360: for the @code{HOST_SCHED_INFO} flavor of @code{host_info}. It has the
5361: following members:
5362:
5363: @table @code
5364: @item int min_timeout
5365: The minimum timeout and unit of time in milliseconds.
5366:
5367: @item int min_quantum
5368: The minimum quantum and unit of quantum in milliseconds.
5369: @end table
5370: @end deftp
5371:
5372: @deftp {Data type} host_sched_info_t
5373: This is a pointer to a @code{struct host_sched_info}.
5374: @end deftp
5375:
5376: @deftypefun kern_return_t host_kernel_version (@w{host_t @var{host}}, @w{kernel_version_t *@var{version}})
5377: The @code{host_kernel_version} function returns the version string
5378: compiled into the kernel executing on @var{host} at the time it was
5379: built in the character string @var{version}. This string describes the
5380: version of the kernel. The constant @code{KERNEL_VERSION_MAX} should be
5381: used to dimension storage for the returned string if the
5382: @code{kernel_version_t} declaration is not used.
5383:
5384: If the version string compiled into the kernel is longer than
5385: @code{KERNEL_VERSION_MAX}, the result is truncated and not necessarily
5386: null-terminated.
5387:
5388: If @var{host} is not a valid send right to a host port, the function
5389: returns @code{KERN_INVALID_ARGUMENT}. If @var{version} points to
5390: inaccessible memory, it returns @code{KERN_INVALID_ADDRESS}, and
5391: @code{KERN_SUCCESS} otherwise.
5392: @end deftypefun
5393:
5394: @deftypefun kern_return_t host_get_boot_info (@w{host_priv_t @var{host_priv}}, @w{kernel_boot_info_t @var{boot_info}})
5395: The @code{host_get_boot_info} function returns the boot-time information
5396: string supplied by the operator to the kernel executing on
5397: @var{host_priv} in the character string @var{boot_info}. The constant
5398: @code{KERNEL_BOOT_INFO_MAX} should be used to dimension storage for the
5399: returned string if the @code{kernel_boot_info_t} declaration is not
5400: used.
5401:
5402: If the boot-time information string supplied by the operator is longer
5403: than @code{KERNEL_BOOT_INFO_MAX}, the result is truncated and not
5404: necessarily null-terminated.
5405: @end deftypefun
5406:
5407:
5408: @node Host Time
5409: @section Host Time
5410:
5411: @deftp {Data type} time_value_t
5412: This is the representation of a time in Mach. It is a @code{struct
5413: time_value} and consists of the following members:
5414:
5415: @table @code
5416: @item integer_t seconds
5417: The number of seconds.
5418: @item integer_t microseconds
5419: The number of microseconds.
5420: @end table
5421: @end deftp
5422:
5423: The number of microseconds should always be smaller than
5424: @code{TIME_MICROS_MAX} (100000). A time with this property is
5425: @dfn{normalized}. Normalized time values can be manipulated with the
5426: following macros:
5427:
5428: @defmac time_value_add_usec (@w{time_value_t *@var{val}}, @w{integer_t *@var{micros}})
5429: Add @var{micros} microseconds to @var{val}. If @var{val} is normalized
5430: and @var{micros} smaller than @code{TIME_MICROS_MAX}, @var{val} will be
5431: normalized afterwards.
5432: @end defmac
5433:
5434: @defmac time_value_add (@w{time_value_t *@var{result}}, @w{time_value_t *@var{addend}})
5435: Add the values in @var{addend} to @var{result}. If both are normalized,
5436: @var{result} will be normalized afterwards.
5437: @end defmac
5438:
5439: A variable of type @code{time_value_t} can either represent a duration
5440: or a fixed point in time. In the latter case, it shall be interpreted as
5441: the number of seconds and microseconds after the epoch 1. Jan 1970.
5442:
5443: @deftypefun kern_return_t host_get_time (@w{host_t @var{host}}, @w{time_value_t *@var{current_time}})
5444: Get the current time as seen by @var{host}. On success, the time passed
5445: since the epoch is returned in @var{current_time}.
5446: @end deftypefun
5447:
5448: @deftypefun kern_return_t host_set_time (@w{host_priv_t @var{host_priv}}, @w{time_value_t @var{new_time}})
5449: Set the time of @var{host_priv} to @var{new_time}.
5450: @end deftypefun
5451:
5452: @deftypefun kern_return_t host_adjust_time (@w{host_priv_t @var{host_priv}}, @w{time_value_t @var{new_adjustment}}, @w{time_value_t *@var{old_adjustment}})
5453: Arrange for the current time as seen by @var{host_priv} to be gradually
5454: changed by the adjustment value @var{new_adjustment}, and return the old
5455: adjustment value in @var{old_adjustment}.
5456: @end deftypefun
5457:
5458: For efficiency, the current time is available through a mapped-time
5459: interface.
5460:
5461: @deftp {Data type} mapped_time_value_t
5462: This structure defines the mapped-time interface. It has the following
5463: members:
5464:
5465: @table @code
5466: @item integer_t seconds
5467: The number of seconds.
5468:
5469: @item integer_t microseconds
5470: The number of microseconds.
5471:
5472: @item integer_t check_seconds
5473: This is a copy of the seconds value, which must be checked to protect
5474: against a race condition when reading out the two time values.
5475: @end table
5476: @end deftp
5477:
5478: Here is an example how to read out the current time using the
5479: mapped-time interface:
5480:
5481: @c XXX Complete the example.
5482: @example
5483: do
5484: @{
5485: secs = mtime->seconds;
5486: usecs = mtime->microseconds;
5487: @}
5488: while (secs != mtime->check_seconds);
5489: @end example
5490:
5491:
5492: @node Host Reboot
5493: @section Host Reboot
5494:
5495: @deftypefun kern_return_t host_reboot (@w{host_priv_t @var{host_priv}}, @w{int @var{options}})
5496: Reboot the host specified by @var{host_priv}. The argument
5497: @var{options} specifies the flags. The available flags are defined in
5498: @file{sys/reboot.h}:
5499:
5500: @table @code
5501: @item RB_HALT
5502: Do not reboot, but halt the machine.
5503:
5504: @item RB_DEBUGGER
5505: Do not reboot, but enter kernel debugger from user space.
5506: @end table
5507:
5508: If successful, the function might not return.
5509: @end deftypefun
5510:
5511:
5512: @node Processors and Processor Sets
5513: @chapter Processors and Processor Sets
5514:
5515: This section describes the Mach interface to processor sets and
5516: individual processors. The interface allows to group processors into
5517: sets and control the processors and processor sets.
5518:
5519: A processor is not a central part of the interface. It is mostly of
5520: relevance as a part of a processor set. Threads are always assigned to
5521: processor sets, and all processors in a set are equally involved in
5522: executing all threads assigned to that set.
5523:
5524: The processor set is represented by two ports, a name port
5525: @var{processor_set_name} used to query information about the host
5526: accessible to everyone, and a control port @var{processor_set} used to
5527: manipulate it.
5528:
5529: @menu
5530: * Processor Set Interface:: How to work with processor sets.
5531: * Processor Interface:: How to work with individual processors.
5532: @end menu
5533:
5534:
5535: @node Processor Set Interface
5536: @section Processor Set Interface
5537:
5538: @menu
5539: * Processor Set Ports:: Ports representing a processor set.
5540: * Processor Set Access:: How the processor sets are accessed.
5541: * Processor Set Creation:: How new processor sets are created.
5542: * Processor Set Destruction:: How processor sets are destroyed.
5543: * Tasks and Threads on Sets:: Assigning tasks, threads to processor sets.
5544: * Processor Set Priority:: Specifying the priority of a processor set.
5545: * Processor Set Policy:: Changing the processor set policies.
5546: * Processor Set Info:: Obtaining information about a processor set.
5547: @end menu
5548:
5549:
5550: @node Processor Set Ports
5551: @subsection Processor Set Ports
5552: @cindex processor set ports
5553: @cindex ports representing a processor set
5554:
5555: @cindex processor set name port
5556: @cindex port representing a processor set name
5557: @deftp {Data type} processor_set_name_t
5558: This is a @code{mach_port_t} and used to hold the port name of a
5559: processor set name port that names the processor set. Any task can get
5560: a send right to name port of a processor set. The processor set name
5561: port allows to get information about the processor set.
5562: @end deftp
5563:
5564: @cindex processor set port
5565: @deftp {Data type} processor_set_t
5566: This is a @code{mach_port_t} and used to hold the port name of a
5567: privileged processor set control port that represents the processor set.
5568: Operations on the processor set are implemented as remote procedure
5569: calls to the processor set port. The processor set port allows to
5570: manipulate the processor set.
5571: @end deftp
5572:
5573:
5574: @node Processor Set Access
5575: @subsection Processor Set Access
5576:
5577: @deftypefun kern_return_t host_processor_sets (@w{host_t @var{host}}, @w{processor_set_name_array_t *@var{processor_sets}}, @w{mach_msg_type_number_t *@var{processor_sets_count}})
5578: The function @code{host_processor_sets} gets send rights to the name
5579: port for each processor set currently assigned to @var{host}.
5580:
5581: @code{host_processor_set_priv} can be used to obtain the control ports
5582: from these if desired. @var{processor_sets} is an array that is
5583: created as a result of this call. The caller may wish to
5584: @code{vm_deallocate} this array when the data is no longer needed.
5585: @var{processor_sets_count} is set to the number of processor sets in the
5586: @var{processor_sets}.
5587:
5588: This function returns @code{KERN_SUCCESS} if the call succeeded and
5589: @code{KERN_INVALID_ARGUMENT} if @var{host} is not a host.
5590: @end deftypefun
5591:
5592: @deftypefun kern_return_t host_processor_set_priv (@w{host_priv_t @var{host_priv}}, @w{processor_set_name_t @var{set_name}}, @w{processor_set_t *@var{set}})
5593: The function @code{host_processor_set_priv} allows a privileged
5594: application to obtain the control port @var{set} for an existing
5595: processor set from its name port @var{set_name}. The privileged host
5596: port @var{host_priv} is required.
5597:
5598: This function returns @code{KERN_SUCCESS} if the call succeeded and
5599: @code{KERN_INVALID_ARGUMENT} if @var{host_priv} is not a valid host
5600: control port.
5601: @end deftypefun
5602:
5603: @deftypefun kern_return_t processor_set_default (@w{host_t @var{host}}, @w{processor_set_name_t *@var{default_set}})
5604: The function @code{processor_set_default} returns the default processor
5605: set of @var{host} in @var{default_set}. The default processor set is
5606: used by all threads, tasks, and processors that are not explicitly
5607: assigned to other sets. processor_set_default returns a port that can
5608: be used to obtain information about this set (e.g. how many threads are
5609: assigned to it). This port cannot be used to perform operations on that
5610: set.
5611:
5612: This function returns @code{KERN_SUCCESS} if the call succeeded,
5613: @code{KERN_INVALID_ARGUMENT} if @var{host} is not a host and
5614: @code{KERN_INVALID_ADDRESS} if @var{default_set} points to
5615: inaccessible memory.
5616: @end deftypefun
5617:
5618:
5619: @node Processor Set Creation
5620: @subsection Processor Set Creation
5621:
5622: @deftypefun kern_return_t processor_set_create (@w{host_t @var{host}}, @w{processor_set_t *@var{new_set}}, @w{processor_set_name_t *@var{new_name}})
5623: The function @code{processor_set_create} creates a new processor set on
5624: @var{host} and returns the two ports associated with it. The port
5625: returned in @var{new_set} is the actual port representing the set. It
5626: is used to perform operations such as assigning processors, tasks, or
5627: threads. The port returned in @var{new_name} identifies the set, and is
5628: used to obtain information about the set.
5629:
5630: This function returns @code{KERN_SUCCESS} if the call succeeded,
5631: @code{KERN_INVALID_ARGUMENT} if @var{host} is not a host,
5632: @code{KERN_INVALID_ADDRESS} if @var{new_set} or @var{new_name} points to
5633: inaccessible memory and @code{KERN_FAILURE} is the operating system does
5634: not support processor allocation.
5635: @end deftypefun
5636:
5637:
5638: @node Processor Set Destruction
5639: @subsection Processor Set Destruction
5640:
5641: @deftypefun kern_return_t processor_set_destroy (@w{processor_set_t @var{processor_set}})
5642: The function @code{processor_set_destroy} destroys the specified
5643: processor set. Any assigned processors, tasks, or threads are
5644: reassigned to the default set. The object port for the processor set is
5645: required (not the name port). The default processor set cannot be
5646: destroyed.
5647:
5648: This function returns @code{KERN_SUCCESS} if the set was destroyed,
5649: @code{KERN_FAILURE} if an attempt was made to destroy the default
5650: processor set, or the operating system does not support processor
5651: allocation, and @code{KERN_INVALID_ARGUMENT} if @var{processor_set} is
5652: not a valid processor set control port.
5653: @end deftypefun
5654:
5655:
5656: @node Tasks and Threads on Sets
5657: @subsection Tasks and Threads on Sets
5658:
5659: @deftypefun kern_return_t processor_set_tasks (@w{processor_set_t @var{processor_set}}, @w{task_array_t *@var{task_list}}, @w{mach_msg_type_number_t *@var{task_count}})
5660: The function @code{processor_set_tasks} gets send rights to the kernel
5661: port for each task currently assigned to @var{processor_set}.
5662:
5663: @var{task_list} is an array that is created as a result of this call.
5664: The caller may wish to @code{vm_deallocate} this array when the data is
5665: no longer needed. @var{task_count} is set to the number of tasks in the
5666: @var{task_list}.
5667:
5668: This function returns @code{KERN_SUCCESS} if the call succeeded and
5669: @code{KERN_INVALID_ARGUMENT} if @var{processor_set} is not a processor
5670: set.
5671: @end deftypefun
5672:
5673: @deftypefun kern_return_t processor_set_threads (@w{processor_set_t @var{processor_set}}, @w{thread_array_t *@var{thread_list}}, @w{mach_msg_type_number_t *@var{thread_count}})
5674: The function @code{processor_set_thread} gets send rights to the kernel
5675: port for each thread currently assigned to @var{processor_set}.
5676:
5677: @var{thread_list} is an array that is created as a result of this call.
5678: The caller may wish to @code{vm_deallocate} this array when the data is
5679: no longer needed. @var{thread_count} is set to the number of threads in
5680: the @var{thread_list}.
5681:
5682: This function returns @code{KERN_SUCCESS} if the call succeeded and
5683: @code{KERN_INVALID_ARGUMENT} if @var{processor_set} is not a processor
5684: set.
5685: @end deftypefun
5686:
5687: @deftypefun kern_return_t task_assign (@w{task_t @var{task}}, @w{processor_set_t @var{processor_set}}, @w{boolean_t @var{assign_threads}})
5688: The function @code{task_assign} assigns @var{task} the set
5689: @var{processor_set}. This assignment is for the purposes of determining
5690: the initial assignment of newly created threads in task. Any previous
5691: assignment of the task is nullified. Existing threads within the task
5692: are also reassigned if @var{assign_threads} is @code{TRUE}. They are
5693: not affected if it is @code{FALSE}.
5694:
5695: This function returns @code{KERN_SUCCESS} if the assignment has been
5696: performed and @code{KERN_INVALID_ARGUMENT} if @var{task} is not a task,
5697: or @var{processor_set} is not a processor set on the same host as
5698: @var{task}.
5699: @end deftypefun
5700:
5701: @deftypefun kern_return_t task_assign_default (@w{task_t @var{task}}, @w{boolean_t @var{assign_threads}})
5702: The function @code{task_assign_default} is a variant of
5703: @code{task_assign} that assigns the task to the default processor set on
5704: that task's host. This variant exists because the control port for the
5705: default processor set is privileged and not usually available to users.
5706:
5707: This function returns @code{KERN_SUCCESS} if the assignment has been
5708: performed and @code{KERN_INVALID_ARGUMENT} if @var{task} is not a task.
5709: @end deftypefun
5710:
5711: @deftypefun kern_return_t task_get_assignment (@w{task_t @var{task}}, @w{processor_set_name_t *@var{assigned_set}})
5712: The function @code{task_get_assignment} returns the name of the
5713: processor set to which the thread is currently assigned in
5714: @var{assigned_set}. This port can only be used to obtain information
5715: about the processor set.
5716:
5717: This function returns @code{KERN_SUCCESS} if the assignment has been
5718: performed, @code{KERN_INVALID_ADDRESS} if @var{processor_set} points to
5719: inaccessible memory, and @code{KERN_INVALID_ARGUMENT} if @var{task} is
5720: not a task.
5721: @end deftypefun
5722:
5723: @deftypefun kern_return_t thread_assign (@w{thread_t @var{thread}}, @w{processor_set_t @var{processor_set}})
5724: The function @code{thread_assign} assigns @var{thread} the set
5725: @var{processor_set}. After the assignment is completed, the thread only
5726: executes on processors assigned to the designated processor set. If
5727: there are no such processors, then the thread is unable to execute. Any
5728: previous assignment of the thread is nullified. Unix system call
5729: compatibility code may temporarily force threads to execute on the
5730: master processor.
5731:
5732: This function returns @code{KERN_SUCCESS} if the assignment has been
5733: performed and @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a
5734: thread, or @var{processor_set} is not a processor set on the same host
5735: as @var{thread}.
5736: @end deftypefun
5737:
5738: @deftypefun kern_return_t thread_assign_default (@w{thread_t @var{thread}})
5739: The function @code{thread_assign_default} is a variant of
5740: @code{thread_assign} that assigns the thread to the default processor
5741: set on that thread's host. This variant exists because the control port
5742: for the default processor set is privileged and not usually available
5743: to users.
5744:
5745: This function returns @code{KERN_SUCCESS} if the assignment has been
5746: performed and @code{KERN_INVALID_ARGUMENT} if @var{thread} is not a
5747: thread.
5748: @end deftypefun
5749:
5750: @deftypefun kern_return_t thread_get_assignment (@w{thread_t @var{thread}}, @w{processor_set_name_t *@var{assigned_set}})
5751: The function @code{thread_get_assignment} returns the name of the
5752: processor set to which the thread is currently assigned in
5753: @var{assigned_set}. This port can only be used to obtain information
5754: about the processor set.
5755:
5756: This function returns @code{KERN_SUCCESS} if the assignment has been
5757: performed, @code{KERN_INVALID_ADDRESS} if @var{processor_set} points to
5758: inaccessible memory, and @code{KERN_INVALID_ARGUMENT} if @var{thread} is
5759: not a thread.
5760: @end deftypefun
5761:
5762:
5763: @node Processor Set Priority
5764: @subsection Processor Set Priority
5765:
5766: @deftypefun kern_return_t processor_set_max_priority (@w{processor_set_t @var{processor_set}}, @w{int @var{max_priority}}, @w{boolean_t @var{change_threads}})
5767: The function @code{processor_set_max_priority} is used to set the
5768: maximum priority for a processor set. The priority of a processor set
5769: is used only for newly created threads (thread's maximum priority is set
5770: to processor set's) and the assignment of threads to the set (thread's
5771: maximum priority is reduced if it exceeds the set's maximum priority,
5772: thread's priority is similarly reduced).
5773: @code{processor_set_max_priority} changes this priority. It also sets
5774: the maximum priority of all threads assigned to the processor set to
5775: this new priority if @var{change_threads} is @code{TRUE}. If this
5776: maximum priority is less than the priorities of any of these threads,
5777: their priorities will also be set to this new value.
5778:
5779: This function returns @code{KERN_SUCCESS} if the call succeeded and
5780: @code{KERN_INVALID_ARGUMENT} if @var{processor_set} is not a processor
5781: set or @var{priority} is not a valid priority.
5782: @end deftypefun
5783:
5784:
5785: @node Processor Set Policy
5786: @subsection Processor Set Policy
5787:
5788: @deftypefun kern_return_t processor_set_policy_enable (@w{processor_set_t @var{processor_set}}, @w{int @var{policy}})
5789: @deftypefunx kern_return_t processor_set_policy_disable (@w{processor_set_t @var{processor_set}}, @w{int @var{policy}}, @w{boolean_t @var{change_threads}})
5790: Processor sets may restrict the scheduling policies to be used for
5791: threads assigned to them. These two calls provide the mechanism for
5792: designating permitted and forbidden policies. The current set of
5793: permitted policies can be obtained from @code{processor_set_info}.
5794: Timesharing may not be forbidden by any processor set. This is a
5795: compromise to reduce the complexity of the assign operation; any thread
5796: whose policy is forbidden by the target processor set has its policy
5797: reset to timesharing. If the @var{change_threads} argument to
5798: @code{processor_set_policy_disable} is true, threads currently assigned
5799: to this processor set and using the newly disabled policy will have
5800: their policy reset to timesharing.
5801:
5802: @file{mach/policy.h} contains the allowed policies; it is included by
5803: @file{mach.h}. Not all policies (e.g. fixed priority) are supported by
5804: all systems.
5805:
5806: This function returns @code{KERN_SUCCESS} if the operation was completed
5807: successfully and @code{KERN_INVALID_ARGUMENT} if @var{processor_set} is
5808: not a processor set or @var{policy} is not a valid policy, or an attempt
5809: was made to disable timesharing.
5810: @end deftypefun
5811:
5812:
5813: @node Processor Set Info
5814: @subsection Processor Set Info
5815:
5816: @deftypefun kern_return_t processor_set_info (@w{processor_set_name_t @var{set_name}}, @w{int @var{flavor}}, @w{host_t *@var{host}}, @w{processor_set_info_t @var{processor_set_info}}, @w{mach_msg_type_number_t *@var{processor_set_info_count}})
5817: The function @code{processor_set_info} returns the selected information array
5818: for a processor set, as specified by @var{flavor}.
5819:
5820: @var{host} is set to the host on which the processor set resides. This
5821: is the non-privileged host port.
5822:
5823: @var{processor_set_info} is an array of integers that is supplied by the
5824: caller and returned filled with specified information.
5825: @var{processor_set_info_count} is supplied as the maximum number of
5826: integers in @var{processor_set_info}. On return, it contains the actual
5827: number of integers in @var{processor_set_info}. The maximum number of
5828: integers returned by any flavor is @code{PROCESSOR_SET_INFO_MAX}.
5829:
5830: The type of information returned is defined by @var{flavor}, which can
5831: be one of the following:
5832:
5833: @table @code
5834: @item PROCESSOR_SET_BASIC_INFO
5835: The function returns basic information about the processor set, as
5836: defined by @code{processor_set_basic_info_t}. This includes the number
5837: of tasks and threads assigned to the processor set. The number of
5838: integers returned is @code{PROCESSOR_SET_BASIC_INFO_COUNT}.
5839:
5840: @item PROCESSOR_SET_SCHED_INFO
5841: The function returns information about the scheduling policy for the
5842: processor set as defined by @code{processor_set_sched_info_t}. The
5843: number of integers returned is @code{PROCESSOR_SET_SCHED_INFO_COUNT}.
5844: @end table
5845:
5846: Some machines may define additional (machine-dependent) flavors.
5847:
5848: The function returns @code{KERN_SUCCESS} if the call succeeded and
5849: @code{KERN_INVALID_ARGUMENT} if @var{processor_set} is not a processor
5850: set or @var{flavor} is not recognized. The function returns
5851: @code{MIG_ARRAY_TOO_LARGE} if the returned info array is too large for
5852: @var{processor_set_info}. In this case, @var{processor_set_info} is
5853: filled as much as possible and @var{processor_set_info_count} is set to the
5854: number of elements that would have been returned if there were enough
5855: room.
5856: @end deftypefun
5857:
5858: @deftp {Data type} {struct processor_set_basic_info}
5859: This structure is returned in @var{processor_set_info} by the
5860: @code{processor_set_info} function and provides basic information about
5861: the processor set. You can cast a variable of type
5862: @code{processor_set_info_t} to a pointer of this type if you provided it
5863: as the @var{processor_set_info} parameter for the
5864: @code{PROCESSOR_SET_BASIC_INFO} flavor of @code{processor_set_info}. It
5865: has the following members:
5866:
5867: @table @code
5868: @item int processor_count
5869: number of processors
5870:
5871: @item int task_count
5872: number of tasks
5873:
5874: @item int thread_count
5875: number of threads
5876:
5877: @item int load_average
5878: scaled load average
5879:
5880: @item int mach_factor
5881: scaled mach factor
5882: @end table
5883: @end deftp
5884:
5885: @deftp {Data type} processor_set_basic_info_t
5886: This is a pointer to a @code{struct processor_set_basic_info}.
5887: @end deftp
5888:
5889: @deftp {Data type} {struct processor_set_sched_info}
5890: This structure is returned in @var{processor_set_info} by the
5891: @code{processor_set_info} function and provides schedule information
5892: about the processor set. You can cast a variable of type
5893: @code{processor_set_info_t} to a pointer of this type if you provided it
5894: as the @var{processor_set_info} parameter for the
5895: @code{PROCESSOR_SET_SCHED_INFO} flavor of @code{processor_set_info}. It
5896: has the following members:
5897:
5898: @table @code
5899: @item int policies
5900: allowed policies
5901:
5902: @item int max_priority
5903: max priority for new threads
5904: @end table
5905: @end deftp
5906:
5907: @deftp {Data type} processor_set_sched_info_t
5908: This is a pointer to a @code{struct processor_set_sched_info}.
5909: @end deftp
5910:
5911:
5912: @node Processor Interface
5913: @section Processor Interface
5914:
5915: @cindex processor port
5916: @cindex port representing a processor
5917: @deftp {Data type} processor_t
5918: This is a @code{mach_port_t} and used to hold the port name of a
5919: processor port that represents the processor. Operations on the
5920: processor are implemented as remote procedure calls to the processor
5921: port.
5922: @end deftp
5923:
5924: @menu
5925: * Hosted Processors:: Getting a list of all processors on a host.
5926: * Processor Control:: Starting, stopping, controlling processors.
5927: * Processors and Sets:: Combining processors into processor sets.
5928: * Processor Info:: Obtaining information on processors.
5929: @end menu
5930:
5931:
5932: @node Hosted Processors
5933: @subsection Hosted Processors
5934:
5935: @deftypefun kern_return_t host_processors (@w{host_priv_t @var{host_priv}}, @w{processor_array_t *@var{processor_list}}, @w{mach_msg_type_number_t *@var{processor_count}})
5936: The function @code{host_processors} gets send rights to the processor
5937: port for each processor existing on @var{host_priv}. This is the
5938: privileged port that allows its holder to control a processor.
5939:
5940: @var{processor_list} is an array that is created as a result of this
5941: call. The caller may wish to @code{vm_deallocate} this array when the
5942: data is no longer needed. @var{processor_count} is set to the number of
5943: processors in the @var{processor_list}.
5944:
5945: This function returns @code{KERN_SUCCESS} if the call succeeded,
5946: @code{KERN_INVALID_ARGUMENT} if @var{host_priv} is not a privileged host
5947: port, and @code{KERN_INVALID_ADDRESS} if @var{processor_count} points to
5948: inaccessible memory.
5949: @end deftypefun
5950:
5951:
5952: @node Processor Control
5953: @subsection Processor Control
5954:
5955: @deftypefun kern_return_t processor_start (@w{processor_t @var{processor}})
5956: @deftypefunx kern_return_t processor_exit (@w{processor_t @var{processor}})
5957: @deftypefunx kern_return_t processor_control (@w{processor_t @var{processor}}, @w{processor_info_t *@var{cmd}}, @w{mach_msg_type_number_t @var{count}})
5958: Some multiprocessors may allow privileged software to control
5959: processors. The @code{processor_start}, @code{processor_exit}, and
5960: @code{processor_control} operations implement this. The interpretation
5961: of the command in @var{cmd} is machine dependent. A newly started
5962: processor is assigned to the default processor set. An exited processor
5963: is removed from the processor set to which it was assigned and ceases to
5964: be active.
5965:
5966: @var{count} contains the length of the command @var{cmd} as a number of
5967: ints.
5968:
5969: Availability limited. All of these operations are machine-dependent.
5970: They may do nothing. The ability to restart an exited processor is also
5971: machine-dependent.
5972:
5973: This function returns @code{KERN_SUCCESS} if the operation was
5974: performed, @code{KERN_FAILURE} if the operation was not performed (a
5975: likely reason is that it is not supported on this processor),
5976: @code{KERN_INVALID_ARGUMENT} if @var{processor} is not a processor, and
5977: @code{KERN_INVALID_ADDRESS} if @var{cmd} points to inaccessible memory.
5978: @end deftypefun
5979:
5980: @node Processors and Sets
5981: @subsection Processors and Sets
5982:
5983: @deftypefun kern_return_t processor_assign (@w{processor_t @var{processor}}, @w{processor_set_t @var{processor_set}}, @w{boolean_t @var{wait}})
5984: The function @code{processor_assign} assigns @var{processor} to the
5985: set @var{processor_set}. After the assignment is completed, the
5986: processor only executes threads that are assigned to that processor set.
5987: Any previous assignment of the processor is nullified. The master
5988: processor cannot be reassigned. All processors take clock interrupts at
5989: all times. The @var{wait} argument indicates whether the caller should
5990: wait for the assignment to be completed or should return immediately.
5991: Dedicated kernel threads are used to perform processor assignment, so
5992: setting wait to @code{FALSE} allows assignment requests to be queued and
5993: performed faster, especially if the kernel has more than one dedicated
5994: internal thread for processor assignment. Redirection of other device
5995: interrupts away from processors assigned to other than the default
5996: processor set is machine-dependent. Intermediaries that interpose on
5997: ports must be sure to interpose on both ports involved in this call if
5998: they interpose on either.
5999:
6000: This function returns @code{KERN_SUCCESS} if the assignment has been
6001: performed, @code{KERN_INVALID_ARGUMENT} if @var{processor} is not a
6002: processor, or @var{processor_set} is not a processor set on the same
6003: host as @var{processor}.
6004: @end deftypefun
6005:
6006: @deftypefun kern_return_t processor_get_assignment (@w{processor_t @var{processor}}, @w{processor_set_name_t *@var{assigned_set}})
6007: The function @code{processor_get_assignment} obtains the current
6008: assignment of a processor. The name port of the processor set is
6009: returned in @var{assigned_set}.
6010: @end deftypefun
6011:
6012: @node Processor Info
6013: @subsection Processor Info
6014:
6015: @deftypefun kern_return_t processor_info (@w{processor_t @var{processor}}, @w{int @var{flavor}}, @w{host_t *@var{host}}, @w{processor_info_t @var{processor_info}}, @w{mach_msg_type_number_t *@var{processor_info_count}})
6016: The function @code{processor_info} returns the selected information array
6017: for a processor, as specified by @var{flavor}.
6018:
6019: @var{host} is set to the host on which the processor set resides. This
6020: is the non-privileged host port.
6021:
6022: @var{processor_info} is an array of integers that is supplied by the
6023: caller and returned filled with specified information.
6024: @var{processor_info_count} is supplied as the maximum number of integers in
6025: @var{processor_info}. On return, it contains the actual number of
6026: integers in @var{processor_info}. The maximum number of integers
6027: returned by any flavor is @code{PROCESSOR_INFO_MAX}.
6028:
6029: The type of information returned is defined by @var{flavor}, which can
6030: be one of the following:
6031:
6032: @table @code
6033: @item PROCESSOR_BASIC_INFO
6034: The function returns basic information about the processor, as defined
6035: by @code{processor_basic_info_t}. This includes the slot number of the
6036: processor. The number of integers returned is
6037: @code{PROCESSOR_BASIC_INFO_COUNT}.
6038: @end table
6039:
6040: Machines which require more configuration information beyond the slot
6041: number are expected to define additional (machine-dependent) flavors.
6042:
6043: The function returns @code{KERN_SUCCESS} if the call succeeded and
6044: @code{KERN_INVALID_ARGUMENT} if @var{processor} is not a processor or
6045: @var{flavor} is not recognized. The function returns
6046: @code{MIG_ARRAY_TOO_LARGE} if the returned info array is too large for
6047: @var{processor_info}. In this case, @var{processor_info} is filled as
6048: much as possible and @var{processor_infoCnt} is set to the number of
6049: elements that would have been returned if there were enough room.
6050: @end deftypefun
6051:
6052: @deftp {Data type} {struct processor_basic_info}
6053: This structure is returned in @var{processor_info} by the
6054: @code{processor_info} function and provides basic information about the
6055: processor. You can cast a variable of type @code{processor_info_t} to a
6056: pointer of this type if you provided it as the @var{processor_info}
6057: parameter for the @code{PROCESSOR_BASIC_INFO} flavor of
6058: @code{processor_info}. It has the following members:
6059:
6060: @table @code
6061: @item cpu_type_t cpu_type
6062: cpu type
6063:
6064: @item cpu_subtype_t cpu_subtype
6065: cpu subtype
6066:
6067: @item boolean_t running
6068: is processor running?
6069:
6070: @item int slot_num
6071: slot number
6072:
6073: @item boolean_t is_master
6074: is this the master processor
6075: @end table
6076: @end deftp
6077:
6078: @deftp {Data type} processor_basic_info_t
6079: This is a pointer to a @code{struct processor_basic_info}.
6080: @end deftp
6081:
6082:
6083: @node Device Interface
6084: @chapter Device Interface
6085:
6086: The GNU Mach microkernel provides a simple device interface that allows
6087: the user space programs to access the underlying hardware devices. Each
6088: device has a unique name, which is a string up to 127 characters long.
6089: To open a device, the device master port has to be supplied. The device
6090: master port is only available through the bootstrap port. Anyone who
6091: has control over the device master port can use all hardware devices.
6092: @c XXX FIXME bootstrap port, bootstrap
6093:
6094: @cindex device port
6095: @cindex port representing a device
6096: @deftp {Data type} device_t
6097: This is a @code{mach_port_t} and used to hold the port name of a
6098: device port that represents the device. Operations on the device are
6099: implemented as remote procedure calls to the device port. Each device
6100: provides a sequence of records. The length of a record is specific to
6101: the device. Data can be transferred ``out-of-line'' or ``in-line''
6102: (@pxref{Memory}).
6103: @end deftp
6104:
6105: All constants and functions in this chapter are defined in
6106: @file{device/device.h}.
6107:
6108: @menu
6109: * Device Reply Server:: Handling device reply messages.
6110: * Device Open:: Opening hardware devices.
6111: * Device Close:: Closing hardware devices.
6112: * Device Read:: Reading data from the device.
6113: * Device Write:: Writing data to the device.
6114: * Device Map:: Mapping devices into virtual memory.
6115: * Device Status:: Querying and manipulating a device.
6116: * Device Filter:: Filtering packets arriving on a device.
6117: @end menu
6118:
6119:
6120: @node Device Reply Server
6121: @section Device Reply Server
6122:
6123: Beside the usual synchronous interface, an asynchronous interface is
6124: provided. For this, the caller has to receive and handle the reply
6125: messages separately from the function call.
6126:
6127: @deftypefun boolean_t device_reply_server (@w{msg_header_t *@var{in_msg}}, @w{msg_header_t *@var{out_msg}})
6128: The function @code{device_reply_server} is produced by the
6129: remote procedure call generator to handle a received message. This
6130: function does all necessary argument handling, and actually calls one of
6131: the following functions: @code{ds_device_open_reply},
6132: @code{ds_device_read_reply}, @code{ds_device_read_reply_inband},
6133: @code{ds_device_write_reply} and @code{ds_device_write_reply_inband}.
6134:
6135: The @var{in_msg} argument is the message that has been received from the
6136: kernel. The @var{out_msg} is a reply message, but this is not used for
6137: this server.
6138:
6139: The function returns @code{TRUE} to indicate that the message in
6140: question was applicable to this interface, and that the appropriate
6141: routine was called to interpret the message. It returns @code{FALSE} to
6142: indicate that the message did not apply to this interface, and that no
6143: other action was taken.
6144: @end deftypefun
6145:
6146:
6147: @node Device Open
6148: @section Device Open
6149:
6150: @deftypefun kern_return_t device_open (@w{mach_port_t @var{master_port}}, @w{dev_mode_t @var{mode}}, @w{dev_name_t @var{name}}, @w{device_t *@var{device}})
6151: The function @code{device_open} opens the device @var{name} and returns
6152: a port to it in @var{device}. The open count for the device is
6153: incremented by one. If the open count was 0, the open handler for the
6154: device is invoked.
6155:
6156: @var{master_port} must hold the master device port. @var{name}
6157: specifies the device to open, and is a string up to 128 characters long.
6158: @var{mode} is the open mode. It is a bitwise-or of the following
6159: constants:
6160:
6161: @table @code
6162: @item D_READ
6163: Request read access for the device.
6164:
6165: @item D_WRITE
6166: Request write access for the device.
6167:
6168: @item D_NODELAY
6169: Do not delay an open.
6170: @c XXX Is this really used at all? Maybe for tape drives? What does it mean?
6171: @end table
6172:
6173: The function returns @code{D_SUCCESS} if the device was successfully
6174: opened, @code{D_INVALID_OPERATION} if @var{master_port} is not the
6175: master device port, @code{D_WOULD_BLOCK} is the device is busy and
6176: @code{D_NOWAIT} was specified in mode, @code{D_ALREADY_OPEN} if the
6177: device is already open in an incompatible mode and
6178: @code{D_NO_SUCH_DEVICE} if @var{name} does not denote a know device.
6179: @end deftypefun
6180:
6181: @deftypefun kern_return_t device_open_request (@w{mach_port_t @var{master_port}}, @w{mach_port_t @var{reply_port}}, @w{dev_mode_t @var{mode}}, @w{dev_name_t @var{name}})
6182: @deftypefunx kern_return_t ds_device_open_reply (@w{mach_port_t @var{reply_port}}, @w{kern_return_t @var{return}}, @w{device_t *@var{device}})
6183: This is the asynchronous form of the @code{device_open} function.
6184: @code{device_open_request} performs the open request. The meaning for
6185: the parameters is as in @code{device_open}. Additionally, the caller
6186: has to supply a reply port to which the @code{ds_device_open_reply}
6187: message is sent by the kernel when the open has been performed. The
6188: return value of the open operation is stored in @var{return_code}.
6189:
6190: As neither function receives a reply message, only message transmission
6191: errors apply. If no error occurs, @code{KERN_SUCCESS} is returned.
6192: @end deftypefun
6193:
6194:
6195: @node Device Close
6196: @section Device Close
6197:
6198: @deftypefun kern_return_t device_close (@w{device_t @var{device}})
6199: The function @code{device_close} decrements the open count of the device
6200: by one. If the open count drops to zero, the close handler for the
6201: device is called. The device to close is specified by its port
6202: @var{device}.
6203:
6204: The function returns @code{D_SUCCESS} if the device was successfully
6205: closed and @code{D_NO_SUCH_DEVICE} if @var{device} does not denote a
6206: device port.
6207: @end deftypefun
6208:
6209:
6210: @node Device Read
6211: @section Device Read
6212:
6213: @deftypefun kern_return_t device_read (@w{device_t @var{device}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{int @var{bytes_wanted}}, @w{io_buf_ptr_t *@var{data}}, @w{mach_msg_type_number_t *@var{data_count}})
6214: The function @code{device_read} reads @var{bytes_wanted} bytes from
6215: @var{device}, and stores them in a buffer allocated with
6216: @code{vm_allocate}, which address is returned in @var{data}. The caller
6217: must deallocated it if it is no longer needed. The number of bytes
6218: actually returned is stored in @var{data_count}.
6219:
6220: If @var{mode} is @code{D_NOWAIT}, the operation does not block.
6221: Otherwise @var{mode} should be 0. @var{recnum} is the record number to
6222: be read, its meaning is device specific.
6223:
6224: The function returns @code{D_SUCCESS} if some data was successfully
6225: read, @code{D_WOULD_BLOCK} if no data is currently available and
6226: @code{D_NOWAIT} is specified, and @code{D_NO_SUCH_DEVICE} if
6227: @var{device} does not denote a device port.
6228: @end deftypefun
6229:
6230: @deftypefun kern_return_t device_read_inband (@w{device_t @var{device}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{int @var{bytes_wanted}}, @w{io_buf_ptr_inband_t *@var{data}}, @w{mach_msg_type_number_t *@var{data_count}})
6231: The @code{device_read_inband} function works as the @code{device_read}
6232: function, except that the data is returned ``in-line'' in the reply IPC
6233: message (@pxref{Memory}).
6234: @end deftypefun
6235:
6236: @deftypefun kern_return_t device_read_request (@w{device_t @var{device}}, @w{mach_port_t @var{reply_port}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{int @var{bytes_wanted}})
6237: @deftypefunx kern_return_t ds_device_read_reply (@w{mach_port_t @var{reply_port}}, @w{kern_return_t @var{return_code}}, @w{io_buf_ptr_t @var{data}}, @w{mach_msg_type_number_t @var{data_count}})
6238: This is the asynchronous form of the @code{device_read} function.
6239: @code{device_read_request} performs the read request. The meaning for
6240: the parameters is as in @code{device_read}. Additionally, the caller
6241: has to supply a reply port to which the @code{ds_device_read_reply}
6242: message is sent by the kernel when the read has been performed. The
6243: return value of the read operation is stored in @var{return_code}.
6244:
6245: As neither function receives a reply message, only message transmission
6246: errors apply. If no error occurs, @code{KERN_SUCCESS} is returned.
6247: @end deftypefun
6248:
6249: @deftypefun kern_return_t device_read_request_inband (@w{device_t @var{device}}, @w{mach_port_t @var{reply_port}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{int @var{bytes_wanted}})
6250: @deftypefunx kern_return_t ds_device_read_reply_inband (@w{mach_port_t @var{reply_port}}, @w{kern_return_t @var{return_code}}, @w{io_buf_ptr_t @var{data}}, @w{mach_msg_type_number_t @var{data_count}})
6251: The @code{device_read_request_inband} and
6252: @code{ds_device_read_reply_inband} functions work as the
6253: @code{device_read_request} and @code{ds_device_read_reply} functions,
6254: except that the data is returned ``in-line'' in the reply IPC message
6255: (@pxref{Memory}).
6256: @end deftypefun
6257:
6258:
6259: @node Device Write
6260: @section Device Write
6261:
6262: @deftypefun kern_return_t device_write (@w{device_t @var{device}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{io_buf_ptr_t @var{data}}, @w{mach_msg_type_number_t @var{data_count}}, @w{int *@var{bytes_written}})
6263: The function @code{device_write} writes @var{data_count} bytes from the
6264: buffer @var{data} to @var{device}. The number of bytes actually written
6265: is returned in @var{bytes_written}.
6266:
6267: If @var{mode} is @code{D_NOWAIT}, the function returns without waiting
6268: for I/O completion. Otherwise @var{mode} should be 0. @var{recnum} is
6269: the record number to be written, its meaning is device specific.
6270:
6271: The function returns @code{D_SUCCESS} if some data was successfully
6272: written and @code{D_NO_SUCH_DEVICE} if @var{device} does not denote a
6273: device port or the device is dead or not completely open.
6274: @end deftypefun
6275:
6276: @deftypefun kern_return_t device_write_inband (@w{device_t @var{device}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{int @var{bytes_wanted}}, @w{io_buf_ptr_inband_t *@var{data}}, @w{mach_msg_type_number_t *@var{data_count}})
6277: The @code{device_write_inband} function works as the @code{device_write}
6278: function, except that the data is sent ``in-line'' in the request IPC
6279: message (@pxref{Memory}).
6280: @end deftypefun
6281:
6282: @deftypefun kern_return_t device_write_request (@w{device_t @var{device}}, @w{mach_port_t @var{reply_port}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{io_buf_ptr_t @var{data}}, @w{mach_msg_type_number_t @var{data_count}})
6283: @deftypefunx kern_return_t ds_device_write_reply (@w{mach_port_t @var{reply_port}}, @w{kern_return_t @var{return_code}}, @w{int @var{bytes_written}})
6284: This is the asynchronous form of the @code{device_write} function.
6285: @code{device_write_request} performs the write request. The meaning for
6286: the parameters is as in @code{device_write}. Additionally, the caller
6287: has to supply a reply port to which the @code{ds_device_write_reply}
6288: message is sent by the kernel when the write has been performed. The
6289: return value of the write operation is stored in @var{return_code}.
6290:
6291: As neither function receives a reply message, only message transmission
6292: errors apply. If no error occurs, @code{KERN_SUCCESS} is returned.
6293: @end deftypefun
6294:
6295: @deftypefun kern_return_t device_write_request_inband (@w{device_t @var{device}}, @w{mach_port_t @var{reply_port}}, @w{dev_mode_t @var{mode}}, @w{recnum_t @var{recnum}}, @w{io_buf_ptr_t @var{data}}, @w{mach_msg_type_number_t @var{data_count}})
6296: @deftypefunx kern_return_t ds_device_write_reply_inband (@w{mach_port_t @var{reply_port}}, @w{kern_return_t @var{return_code}}, @w{int @var{bytes_written}})
6297: The @code{device_write_request_inband} and
6298: @code{ds_device_write_reply_inband} functions work as the
6299: @code{device_write_request} and @code{ds_device_write_reply} functions,
6300: except that the data is sent ``in-line'' in the request IPC message
6301: (@pxref{Memory}).
6302: @end deftypefun
6303:
6304:
6305: @node Device Map
6306: @section Device Map
6307:
6308: @deftypefun kern_return_t device_map (@w{device_t @var{device}}, @w{vm_prot_t @var{prot}}, @w{vm_offset_t @var{offset}}, @w{vm_size_t @var{size}}, @w{mach_port_t *@var{pager}}, @w{int @var{unmap}})
6309: The function @code{device_map} creates a new memory manager for
6310: @var{device} and returns a port to it in @var{pager}. The memory
6311: manager is usable as a memory object in a @code{vm_map} call. The call
6312: is device dependant.
6313:
6314: The protection for the memory object is specified by @var{prot}. The
6315: memory object starts at @var{offset} within the device and extends
6316: @var{size} bytes. @var{unmap} is currently unused.
6317: @c XXX I suppose the caller should set it to 0.
6318:
6319: The function returns @code{D_SUCCESS} if some data was successfully
6320: written and @code{D_NO_SUCH_DEVICE} if @var{device} does not denote a
6321: device port or the device is dead or not completely open.
6322: @end deftypefun
6323:
6324:
6325: @node Device Status
6326: @section Device Status
6327:
6328: @deftypefun kern_return_t device_set_status (@w{device_t @var{device}}, @w{dev_flavor_t @var{flavor}}, @w{dev_status_t @var{status}}, @w{mach_msg_type_number_t @var{status_count}})
6329: The function @code{device_set_status} sets the status of a device. The
6330: possible values for @var{flavor} and their interpretation is device
6331: specific.
6332:
6333: The function returns @code{D_SUCCESS} if some data was successfully
6334: written and @code{D_NO_SUCH_DEVICE} if @var{device} does not denote a
6335: device port or the device is dead or not completely open.
6336: @end deftypefun
6337:
6338: @deftypefun kern_return_t device_get_status (@w{device_t @var{device}}, @w{dev_flavor_t @var{flavor}}, @w{dev_status_t @var{status}}, @w{mach_msg_type_number_t *@var{status_count}})
6339: The function @code{device_get_status} gets the status of a device. The
6340: possible values for @var{flavor} and their interpretation is device
6341: specific.
6342:
6343: The function returns @code{D_SUCCESS} if some data was successfully
6344: written and @code{D_NO_SUCH_DEVICE} if @var{device} does not denote a
6345: device port or the device is dead or not completely open.
6346: @end deftypefun
6347:
6348:
6349: @node Device Filter
6350: @section Device Filter
6351:
6352: @deftypefun kern_return_t device_set_filter (@w{device_t @var{device}}, @w{mach_port_t @var{receive_port}}, @w{mach_msg_type_name_t @var{receive_port_type}}, @w{int @var{priority}}, @w{filter_array_t @var{filter}}, @w{mach_msg_type_number_t @var{filter_count}})
6353: The function @code{device_set_filter} makes it possible to filter out
6354: selected data arriving at the device and forward it to a port.
6355: @var{filter} is a list of filter commands, which are applied to incoming
6356: data to determine if the data should be sent to @var{receive_port}. The
6357: IPC type of the send right is specified by @var{receive_port_right}, it
6358: is either @code{MACH_MSG_TYPE_MAKE_SEND} or
6359: @code{MACH_MSG_TYPE_MOVE_SEND}. The @var{priority} value is used to
6360: order multiple filters.
6361:
6362: There can be up to @code{NET_MAX_FILTER} commands in @var{filter}. The
6363: actual number of commands is passed in @var{filter_count}. For the
6364: purpose of the filter test, an internal stack is provided. After all
6365: commands have been processed, the value on the top of the stack
6366: determines if the data is forwarded or the next filter is tried.
6367:
6368: @c XXX The following description was taken verbatim from the
6369: @c kernel_interface.pdf document.
6370: Each word of the command list specifies a data (push) operation (high
6371: order NETF_NBPO bits) as well as a binary operator (low order NETF_NBPA
6372: bits). The value to be pushed onto the stack is chosen as follows.
6373:
6374: @table @code
6375: @item NETF_PUSHLIT
6376: Use the next short word of the filter as the value.
6377:
6378: @item NETF_PUSHZERO
6379: Use 0 as the value.
6380:
6381: @item NETF_PUSHWORD+N
6382: Use short word N of the ``data'' portion of the message as the value.
6383:
6384: @item NETF_PUSHHDR+N
6385: Use short word N of the ``header'' portion of the message as the value.
6386:
6387: @item NETF_PUSHIND+N
6388: Pops the top long word from the stack and then uses short word N of the
6389: ``data'' portion of the message as the value.
6390:
6391: @item NETF_PUSHHDRIND+N
6392: Pops the top long word from the stack and then uses short word N of the
6393: ``header'' portion of the message as the value.
6394:
6395: @item NETF_PUSHSTK+N
6396: Use long word N of the stack (where the top of stack is long word 0) as
6397: the value.
6398:
6399: @item NETF_NOPUSH
6400: Don't push a value.
6401: @end table
6402:
6403: The unsigned value so chosen is promoted to a long word before being
6404: pushed. Once a value is pushed (except for the case of
6405: @code{NETF_NOPUSH}), the top two long words of the stack are popped and
6406: a binary operator applied to them (with the old top of stack as the
6407: second operand). The result of the operator is pushed on the stack.
6408: These operators are:
6409:
6410: @table @code
6411: @item NETF_NOP
6412: Don't pop off any values and do no operation.
6413:
6414: @item NETF_EQ
6415: Perform an equal comparison.
6416:
6417: @item NETF_LT
6418: Perform a less than comparison.
6419:
6420: @item NETF_LE
6421: Perform a less than or equal comparison.
6422:
6423: @item NETF_GT
6424: Perform a greater than comparison.
6425:
6426: @item NETF_GE
6427: Perform a greater than or equal comparison.
6428:
6429: @item NETF_AND
6430: Perform a bitise boolean AND operation.
6431:
6432: @item NETF_OR
6433: Perform a bitise boolean inclusive OR operation.
6434:
6435: @item NETF_XOR
6436: Perform a bitise boolean exclusive OR operation.
6437:
6438: @item NETF_NEQ
6439: Perform a not equal comparison.
6440:
6441: @item NETF_LSH
6442: Perform a left shift operation.
6443:
6444: @item NETF_RSH
6445: Perform a right shift operation.
6446:
6447: @item NETF_ADD
6448: Perform an addition.
6449:
6450: @item NETF_SUB
6451: Perform a subtraction.
6452:
6453: @item NETF_COR
6454: Perform an equal comparison. If the comparison is @code{TRUE}, terminate
6455: the filter list. Otherwise, pop the result of the comparison off the
6456: stack.
6457:
6458: @item NETF_CAND
6459: Perform an equal comparison. If the comparison is @code{FALSE},
6460: terminate the filter list. Otherwise, pop the result of the comparison
6461: off the stack.
6462:
6463: @item NETF_CNOR
6464: Perform a not equal comparison. If the comparison is @code{FALSE},
6465: terminate the filter list. Otherwise, pop the result of the comparison
6466: off the stack.
6467:
6468: @item NETF_CNAND
6469: Perform a not equal comparison. If the comparison is @code{TRUE},
6470: terminate the filter list. Otherwise, pop the result of the comparison
6471: off the stack. The scan of the filter list terminates when the filter
6472: list is emptied, or a @code{NETF_C...} operation terminates the list. At
6473: this time, if the final value of the top of the stack is @code{TRUE},
6474: then the message is accepted for the filter.
6475: @end table
6476:
6477: The function returns @code{D_SUCCESS} if some data was successfully
6478: written, @code{D_INVALID_OPERATION} if @var{receive_port} is not a valid
6479: send right, and @code{D_NO_SUCH_DEVICE} if @var{device} does not denote
6480: a device port or the device is dead or not completely open.
6481: @end deftypefun
6482:
6483:
6484: @node Kernel Debugger
6485: @chapter Kernel Debugger
6486:
6487: The GNU Mach kernel debugger @code{ddb} is a powerful built-in debugger
6488: with a gdb like syntax. It is enabled at compile time using the
6489: @option{--enable-kdb} option. Whenever you want to enter the debugger
6490: while running the kernel, you can press the key combination
6491: @key{Ctrl-Alt-D}.
6492:
6493: @menu
6494: * Operation:: Basic architecture of the kernel debugger.
6495: * Commands:: Available commands in the kernel debugger.
6496: * Variables:: Access of variables from the kernel debugger.
6497: * Expressions:: Usage of expressions in the kernel debugger.
6498: @end menu
6499:
6500:
6501: @node Operation
6502: @section Operation
6503:
6504: The current location is called @dfn{dot}. The dot is displayed with a
6505: hexadecimal format at a prompt. Examine and write commands update dot
6506: to the address of the last line examined or the last location modified,
6507: and set @dfn{next} to the address of the next location to be examined or
6508: changed. Other commands don't change dot, and set next to be the same
6509: as dot.
6510:
6511: The general command syntax is:
6512:
6513: @example
6514: @var{command}[/@var{modifier}] @var{address} [,@var{count}]
6515: @end example
6516:
6517: @kbd{!!} repeats the previous command, and a blank line repeats from the
6518: address next with count 1 and no modifiers. Specifying @var{address} sets
6519: dot to the address. Omitting @var{address} uses dot. A missing @var{count}
6520: is taken to be 1 for printing commands or infinity for stack traces.
6521:
6522: Current @code{ddb} is enhanced to support multi-thread debugging. A
6523: break point can be set only for a specific thread, and the address space
6524: or registers of non current thread can be examined or modified if
6525: supported by machine dependent routines. For example,
6526:
6527: @example
6528: break/t mach_msg_trap $task11.0
6529: @end example
6530:
6531: sets a break point at @code{mach_msg_trap} for the first thread of task
6532: 11 listed by a @code{show all threads} command.
6533:
6534: In the above example, @code{$task11.0} is translated to the
6535: corresponding thread structure's address by variable translation
6536: mechanism described later. If a default target thread is set in a
6537: variable @code{$thread}, the @code{$task11.0} can be omitted. In
6538: general, if @code{t} is specified in a modifier of a command line, a
6539: specified thread or a default target thread is used as a target thread
6540: instead of the current one. The @code{t} modifier in a command line is
6541: not valid in evaluating expressions in a command line. If you want to
6542: get a value indirectly from a specific thread's address space or access
6543: to its registers within an expression, you have to specify a default
6544: target thread in advance, and to use @code{:t} modifier immediately
6545: after the indirect access or the register reference like as follows:
6546:
6547: @example
6548: set $thread $task11.0
6549: print $eax:t *(0x100):tuh
6550: @end example
6551:
6552: No sign extension and indirection @code{size(long, half word, byte)} can
6553: be specified with @code{u}, @code{l}, @code{h} and @code{b} respectively
6554: for the indirect access.
6555:
6556: Note: Support of non current space/register access and user space break
6557: point depend on the machines. If not supported, attempts of such
6558: operation may provide incorrect information or may cause strange
6559: behavior. Even if supported, the user space access is limited to the
6560: pages resident in the main memory at that time. If a target page is not
6561: in the main memory, an error will be reported.
6562:
6563: @code{ddb} has a feature like a command @code{more} for the output. If
6564: an output line exceeds the number set in the @code{$lines} variable, it
6565: displays @samp{--db_more--} and waits for a response. The valid
6566: responses for it are:
6567:
6568: @table @kbd
6569: @item @key{SPC}
6570: one more page
6571:
6572: @item @key{RET}
6573: one more line
6574:
6575: @item q
6576: abort the current command, and return to the command input mode
6577: @end table
6578:
6579:
6580: @node Commands
6581: @section Commands
6582:
6583: @table @code
6584: @item examine(x) [/@var{modifier}] @var{addr}[,@var{count}] [ @var{thread} ]
6585: Display the addressed locations according to the formats in the
6586: modifier. Multiple modifier formats display multiple locations. If no
6587: format is specified, the last formats specified for this command is
6588: used. Address space other than that of the current thread can be
6589: specified with @code{t} option in the modifier and @var{thread}
6590: parameter. The format characters are
6591:
6592: @table @code
6593: @item b
6594: look at by bytes(8 bits)
6595:
6596: @item h
6597: look at by half words(16 bits)
6598:
6599: @item l
6600: look at by long words(32 bits)
6601:
6602: @item a
6603: print the location being displayed
6604:
6605: @item ,
6606: skip one unit producing no output
6607:
6608: @item A
6609: print the location with a line number if possible
6610:
6611: @item x
6612: display in unsigned hex
6613:
6614: @item z
6615: display in signed hex
6616:
6617: @item o
6618: display in unsigned octal
6619:
6620: @item d
6621: display in signed decimal
6622:
6623: @item u
6624: display in unsigned decimal
6625:
6626: @item r
6627: display in current radix, signed
6628:
6629: @item c
6630: display low 8 bits as a character. Non-printing characters are
6631: displayed as an octal escape code (e.g. '\000').
6632:
6633: @item s
6634: display the null-terminated string at the location. Non-printing
6635: characters are displayed as octal escapes.
6636:
6637: @item m
6638: display in unsigned hex with character dump at the end of each line.
6639: The location is also displayed in hex at the beginning of each line.
6640:
6641: @item i
6642: display as an instruction
6643:
6644: @item I
6645: display as an instruction with possible alternate formats depending on
6646: the machine:
6647:
6648: @table @code
6649: @item vax
6650: don't assume that each external label is a procedure entry mask
6651:
6652: @item i386
6653: don't round to the next long word boundary
6654:
6655: @item mips
6656: print register contents
6657: @end table
6658: @end table
6659:
6660: @item xf
6661: Examine forward. It executes an examine command with the last specified
6662: parameters to it except that the next address displayed by it is used as
6663: the start address.
6664:
6665: @item xb
6666: Examine backward. It executes an examine command with the last
6667: specified parameters to it except that the last start address subtracted
6668: by the size displayed by it is used as the start address.
6669:
6670: @item print[/axzodurc] @var{addr1} [ @var{addr2} @dots{} ]
6671: Print @var{addr}'s according to the modifier character. Valid formats
6672: are: @code{a} @code{x} @code{z} @code{o} @code{d} @code{u} @code{r}
6673: @code{c}. If no modifier is specified, the last one specified to it is
6674: used. @var{addr} can be a string, and it is printed as it is. For
6675: example,
6676:
6677: @example
6678: print/x "eax = " $eax "\necx = " $ecx "\n"
6679: @end example
6680:
6681: will print like
6682:
6683: @example
6684: eax = xxxxxx
6685: ecx = yyyyyy
6686: @end example
6687:
6688: @item write[/bhlt] @var{addr} [ @var{thread} ] @var{expr1} [ @var{expr2} @dots{} ]
6689: Write the expressions at succeeding locations. The write unit size can
6690: be specified in the modifier with a letter b (byte), h (half word) or
6691: l(long word) respectively. If omitted, long word is assumed. Target
6692: address space can also be specified with @code{t} option in the modifier
6693: and @var{thread} parameter. Warning: since there is no delimiter
6694: between expressions, strange things may happen. It's best to enclose
6695: each expression in parentheses.
6696:
6697: @item set $@var{variable} [=] @var{expr}
6698: Set the named variable or register with the value of @var{expr}. Valid
6699: variable names are described below.
6700:
6701: @item break[/tuTU] @var{addr}[,@var{count}] [ @var{thread1} @dots{} ]
6702: Set a break point at @var{addr}. If count is supplied, continues
6703: (@var{count}-1) times before stopping at the break point. If the break
6704: point is set, a break point number is printed with @samp{#}. This
6705: number can be used in deleting the break point or adding conditions to
6706: it.
6707:
6708: @table @code
6709: @item t
6710: Set a break point only for a specific thread. The thread is specified
6711: by @var{thread} parameter, or default one is used if the parameter is
6712: omitted.
6713:
6714: @item u
6715: Set a break point in user space address. It may be combined with
6716: @code{t} or @code{T} option to specify the non-current target user
6717: space. Without @code{u} option, the address is considered in the kernel
6718: space, and wrong space address is rejected with an error message. This
6719: option can be used only if it is supported by machine dependent
6720: routines.
6721:
6722: @item T
6723: Set a break point only for threads in a specific task. It is like
6724: @code{t} option except that the break point is valid for all threads
6725: which belong to the same task as the specified target thread.
6726:
6727: @item U
6728: Set a break point in shared user space address. It is like @code{u}
6729: option, except that the break point is valid for all threads which share
6730: the same address space even if @code{t} option is specified. @code{t}
6731: option is used only to specify the target shared space. Without
6732: @code{t} option, @code{u} and @code{U} have the same meanings. @code{U}
6733: is useful for setting a user space break point in non-current address
6734: space with @code{t} option such as in an emulation library space. This
6735: option can be used only if it is supported by machine dependent
6736: routines.
6737: @end table
6738:
6739: Warning: if a user text is shadowed by a normal user space debugger,
6740: user space break points may not work correctly. Setting a break point
6741: at the low-level code paths may also cause strange behavior.
6742:
6743: @item delete[/tuTU] @var{addr}|#@var{number} [ @var{thread1} @dots{} ]
6744: Delete the break point. The target break point can be specified by a
6745: break point number with @code{#}, or by @var{addr} like specified in
6746: @code{break} command.
6747:
6748: @item cond #@var{number} [ @var{condition} @var{commands} ]
6749: Set or delete a condition for the break point specified by the
6750: @var{number}. If the @var{condition} and @var{commands} are null, the
6751: condition is deleted. Otherwise the condition is set for it. When the
6752: break point is hit, the @var{condition} is evaluated. The
6753: @var{commands} will be executed if the condition is true and the break
6754: point count set by a break point command becomes zero. @var{commands}
6755: is a list of commands separated by semicolons. Each command in the list
6756: is executed in that order, but if a @code{continue} command is executed,
6757: the command execution stops there, and the stopped thread resumes
6758: execution. If the command execution reaches the end of the list, and it
6759: enters into a command input mode. For example,
6760:
6761: @example
6762: set $work0 0
6763: break/Tu xxx_start $task7.0
6764: cond #1 (1) set $work0 1; set $work1 0; cont
6765: break/T vm_fault $task7.0
6766: cond #2 ($work0) set $work1 ($work1+1); cont
6767: break/Tu xxx_end $task7.0
6768: cond #3 ($work0) print $work1 " faults\n"; set $work0 0
6769: cont
6770: @end example
6771:
6772: will print page fault counts from @code{xxx_start} to @code{xxx_end} in
6773: @code{task7}.
6774:
6775: @item step[/p] [,@var{count}]
6776: Single step @var{count} times. If @code{p} option is specified, print
6777: each instruction at each step. Otherwise, only print the last
6778: instruction.
6779:
6780: Warning: depending on machine type, it may not be possible to
6781: single-step through some low-level code paths or user space code. On
6782: machines with software-emulated single-stepping (e.g., pmax), stepping
6783: through code executed by interrupt handlers will probably do the wrong
6784: thing.
6785:
6786: @item continue[/c]
6787: Continue execution until a breakpoint or watchpoint. If @code{/c},
6788: count instructions while executing. Some machines (e.g., pmax) also
6789: count loads and stores.
6790:
6791: Warning: when counting, the debugger is really silently single-stepping.
6792: This means that single-stepping on low-level code may cause strange
6793: behavior.
6794:
6795: @item until
6796: Stop at the next call or return instruction.
6797:
6798: @item next[/p]
6799: Stop at the matching return instruction. If @code{p} option is
6800: specified, print the call nesting depth and the cumulative instruction
6801: count at each call or return. Otherwise, only print when the matching
6802: return is hit.
6803:
6804: @item match[/p]
6805: A synonym for @code{next}.
6806:
6807: @item trace[/tu] [ @var{frame_addr}|@var{thread} ][,@var{count}]
6808: Stack trace. @code{u} option traces user space; if omitted, only traces
6809: kernel space. If @code{t} option is specified, it shows the stack trace
6810: of the specified thread or a default target thread. Otherwise, it shows
6811: the stack trace of the current thread from the frame address specified
6812: by a parameter or from the current frame. @var{count} is the number of
6813: frames to be traced. If the @var{count} is omitted, all frames are
6814: printed.
6815:
6816: Warning: If the target thread's stack is not in the main memory at that
6817: time, the stack trace will fail. User space stack trace is valid only
6818: if the machine dependent code supports it.
6819:
6820: @item search[/bhl] @var{addr} @var{value} [@var{mask}] [,@var{count}]
6821: Search memory for a value. This command might fail in interesting ways
6822: if it doesn't find the searched-for value. This is because @code{ddb}
6823: doesn't always recover from touching bad memory. The optional count
6824: argument limits the search.
6825:
6826: @item macro @var{name} @var{commands}
6827: Define a debugger macro as @var{name}. @var{commands} is a list of
6828: commands to be associated with the macro. In the expressions of the
6829: command list, a variable @code{$argxx} can be used to get a parameter
6830: passed to the macro. When a macro is called, each argument is evaluated
6831: as an expression, and the value is assigned to each parameter,
6832: @code{$arg1}, @code{$arg2}, @dots{} respectively. 10 @code{$arg}
6833: variables are reserved to each level of macros, and they can be used as
6834: local variables. The nesting of macro can be allowed up to 5 levels.
6835: For example,
6836:
6837: @example
6838: macro xinit set $work0 $arg1
6839: macro xlist examine/m $work0,4; set $work0 *($work0)
6840: xinit *(xxx_list)
6841: xlist
6842: @enddots{}
6843: @end example
6844:
6845: will print the contents of a list starting from @code{xxx_list} by each
6846: @code{xlist} command.
6847:
6848: @item dmacro @var{name}
6849: Delete the macro named @var{name}.
6850:
6851: @item show all threads[/ul]
6852: Display all tasks and threads information. This version of @code{ddb}
6853: prints more information than previous one. It shows UNIX process
6854: information like @command{ps} for each task. The UNIX process
6855: information may not be shown if it is not supported in the machine, or
6856: the bottom of the stack of the target task is not in the main memory at
6857: that time. It also shows task and thread identification numbers. These
6858: numbers can be used to specify a task or a thread symbolically in
6859: various commands. The numbers are valid only in the same debugger
6860: session. If the execution is resumed again, the numbers may change.
6861: The current thread can be distinguished from others by a @code{#} after
6862: the thread id instead of @code{:}. Without @code{l} option, it only
6863: shows thread id, thread structure address and the status for each
6864: thread. The status consists of 5 letters, R(run), W(wait), S(sus�
6865: pended), O(swapped out) and N(interruptible), and if corresponding
6866: status bit is off, @code{.} is printed instead. If @code{l} option is
6867: specified, more detail information is printed for each thread.
6868:
6869: @item show task [ @var{addr} ]
6870: Display the information of a task specified by @var{addr}. If
6871: @var{addr} is omitted, current task information is displayed.
6872:
6873: @item show thread [ @var{addr} ]
6874: Display the information of a thread specified by @var{addr}. If
6875: @var{addr} is omitted, current thread information is displayed.
6876:
6877: @item show registers[/tu [ @var{thread} ]]
6878: Display the register set. Target thread can be specified with @code{t}
6879: option and @var{thread} parameter. If @code{u} option is specified, it
6880: displays user registers instead of kernel or currently saved one.
6881:
6882: Warning: The support of @code{t} and @code{u} option depends on the
6883: machine. If not supported, incorrect information will be displayed.
6884:
6885: @item show map @var{addr}
6886: Prints the @code{vm_map} at @var{addr}.
6887:
6888: @item show object @var{addr}
6889: Prints the @code{vm_object} at @var{addr}.
6890:
6891: @item show page @var{addr}
6892: Prints the @code{vm_page} structure at @var{addr}.
6893:
6894: @item show port @var{addr}
6895: Prints the @code{ipc_port} structure at @var{addr}.
6896:
6897: @item show ipc_port[/t [ @var{thread} ]]
6898: Prints all @code{ipc_port} structure's addresses the target thread has.
6899: The target thread is a current thread or that specified by a parameter.
6900:
6901: @item show macro [ @var{name} ]
6902: Show the definitions of macros. If @var{name} is specified, only the
6903: definition of it is displayed. Otherwise, definitions of all macros are
6904: displayed.
6905:
6906: @item show watches
6907: Displays all watchpoints.
6908:
6909: @item watch[/T] @var{addr},@var{size} [ @var{task} ]
6910: Set a watchpoint for a region. Execution stops when an attempt to
6911: modify the region occurs. The @var{size} argument defaults to 4.
6912: Without @code{T} option, @var{addr} is assumed to be a kernel address.
6913: If you want to set a watch point in user space, specify @code{T} and
6914: @var{task} parameter where the address belongs to. If the @var{task}
6915: parameter is omitted, a task of the default target thread or a current
6916: task is assumed. If you specify a wrong space address, the request is
6917: rejected with an error message.
6918:
6919: Warning: Attempts to watch wired kernel memory may cause unrecoverable
6920: error in some systems such as i386. Watchpoints on user addresses work
6921: best.
6922: @end table
6923:
6924:
6925: @node Variables
6926: @section Variables
6927:
6928: The debugger accesses registers and variables as $@var{name}. Register
6929: names are as in the @code{show registers} command. Some variables are
6930: suffixed with numbers, and may have some modifier following a colon
6931: immediately after the variable name. For example, register variables
6932: can have @code{u} and @code{t} modifier to indicate user register and
6933: that of a default target thread instead of that of the current thread
6934: (e.g. @code{$eax:tu}).
6935:
6936: Built-in variables currently supported are:
6937:
6938: @table @code
6939: @item task@var{xx}[.@var{yy}]
6940: Task or thread structure address. @var{xx} and @var{yy} are task and
6941: thread identification numbers printed by a @code{show all threads}
6942: command respectively. This variable is read only.
6943:
6944: @item thread
6945: The default target thread. The value is used when @code{t} option is
6946: specified without explicit thread structure address parameter in command
6947: lines or expression evaluation.
6948:
6949: @item radix
6950: Input and output radix
6951:
6952: @item maxoff
6953: Addresses are printed as @var{symbol}+@var{offset} unless offset is greater than
6954: maxoff.
6955:
6956: @item maxwidth
6957: The width of the displayed line.
6958:
6959: @item lines
6960: The number of lines. It is used by @code{more} feature.
6961:
6962: @item tabstops
6963: Tab stop width.
6964:
6965: @item arg@var{xx}
6966: Parameters passed to a macro. @var{xx} can be 1 to 10.
6967:
6968: @item work@var{xx}
6969: Work variable. @var{xx} can be 0 to 31.
6970: @end table
6971:
6972:
6973: @node Expressions
6974: @section Expressions
6975:
6976: Almost all expression operators in C are supported except @code{~},
6977: @code{^}, and unary @code{&}. Special rules in @code{ddb} are:
6978:
6979: @table @code
6980: @item @var{identifier}
6981: name of a symbol. It is translated to the address(or value) of it.
6982: @code{.} and @code{:} can be used in the identifier. If supported by
6983: an object format dependent routine,
6984: [@var{file_name}:]@var{func}[:@var{line_number}]
6985: [@var{file_name}:]@var{variable}, and
6986: @var{file_name}[:@var{line_number}] can be accepted as a symbol. The
6987: symbol may be prefixed with @code{@var{symbol_table_name}::} like
6988: @code{emulator::mach_msg_trap} to specify other than kernel symbols.
6989:
6990: @item @var{number}
6991: radix is determined by the first two letters:
6992: @table @code
6993: @item 0x
6994: hex
6995: @item 0o
6996: octal
6997: @item 0t
6998: decimal
6999: @end table
7000:
7001: otherwise, follow current radix.
7002:
7003: @item .
7004: dot
7005:
7006: @item +
7007: next
7008:
7009: @item ..
7010: address of the start of the last line examined. Unlike dot or next,
7011: this is only changed by @code{examine} or @code{write} command.
7012:
7013: @item �
7014: last address explicitly specified.
7015:
7016: @item $@var{variable}
7017: register name or variable. It is translated to the value of it. It may
7018: be followed by a @code{:} and modifiers as described above.
7019:
7020: @item a
7021: multiple of right hand side.
7022:
7023: @item *@var{expr}
7024: indirection. It may be followed by a @code{:} and modifiers as
7025: described above.
7026: @end table
7027:
7028:
7029: @include gpl.texi
7030:
7031:
7032: @node Documentation License
7033: @appendix Documentation License
7034:
7035: This manual is copyrighted and licensed under the GNU Free Documentation
7036: license.
7037:
7038: Parts of this manual are derived from the Mach manual packages
7039: originally provided by Carnegie Mellon University.
7040:
7041: @menu
7042: * Free Documentation License:: The GNU Free Documentation License.
7043: * CMU License:: The CMU license applies to the original Mach
7044: kernel and its documentation.
7045: @end menu
7046:
7047: @lowersections
7048: @include fdl.texi
7049: @raisesections
7050:
7051: @node CMU License
7052: @appendixsec CMU License
7053:
7054: @quotation
7055: @display
7056: Mach Operating System
7057: Copyright @copyright{} 1991,1990,1989 Carnegie Mellon University
7058: All Rights Reserved.
7059: @end display
7060:
7061: Permission to use, copy, modify and distribute this software and its
7062: documentation is hereby granted, provided that both the copyright
7063: notice and this permission notice appear in all copies of the
7064: software, derivative works or modified versions, and any portions
7065: thereof, and that both notices appear in supporting documentation.
7066:
7067: @sc{carnegie mellon allows free use of this software in its ``as is''
7068: condition. carnegie mellon disclaims any liability of any kind for
7069: any damages whatsoever resulting from the use of this software.}
7070:
7071: Carnegie Mellon requests users of this software to return to
7072:
7073: @display
7074: Software Distribution Coordinator
7075: School of Computer Science
7076: Carnegie Mellon University
7077: Pittsburgh PA 15213-3890
7078: @end display
7079:
7080: @noindent
7081: or @email{Software.Distribution@@CS.CMU.EDU} any improvements or
7082: extensions that they make and grant Carnegie Mellon the rights to
7083: redistribute these changes.
7084: @end quotation
7085:
7086: @node Concept Index
7087: @unnumbered Concept Index
7088:
7089: @printindex cp
7090:
7091:
7092: @node Function and Data Index
7093: @unnumbered Function and Data Index
7094:
7095: @printindex fn
7096:
7097:
7098: @summarycontents
7099: @contents
7100: @bye
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.