Annotation of OSKit-Mach/doc/mach.texi, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.