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