|
|
1.1 ! root 1: /* ! 2: * Mach Operating System ! 3: * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University. ! 4: * Copyright (c) 1993,1994 The University of Utah and ! 5: * the Computer Systems Laboratory (CSL). ! 6: * All rights reserved. ! 7: * ! 8: * Permission to use, copy, modify and distribute this software and its ! 9: * documentation is hereby granted, provided that both the copyright ! 10: * notice and this permission notice appear in all copies of the ! 11: * software, derivative works or modified versions, and any portions ! 12: * thereof, and that both notices appear in supporting documentation. ! 13: * ! 14: * CARNEGIE MELLON, THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF ! 15: * THIS SOFTWARE IN ITS "AS IS" CONDITION, AND DISCLAIM ANY LIABILITY ! 16: * OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF ! 17: * THIS SOFTWARE. ! 18: * ! 19: * Carnegie Mellon requests users of this software to return to ! 20: * ! 21: * Software Distribution Coordinator or [email protected] ! 22: * School of Computer Science ! 23: * Carnegie Mellon University ! 24: * Pittsburgh PA 15213-3890 ! 25: * ! 26: * any improvements or extensions that they make and grant Carnegie Mellon ! 27: * the rights to redistribute these changes. ! 28: */ ! 29: /* ! 30: * Matchmaker definitions file for Mach kernel interface. ! 31: */ ! 32: ! 33: #ifdef MACH_KERNEL ! 34: #include <mach_ipc_compat.h> ! 35: ! 36: simport <kern/compat_xxx_defs.h>; /* for obsolete routines */ ! 37: #endif /* MACH_KERNEL */ ! 38: ! 39: subsystem ! 40: #if KERNEL_USER ! 41: KernelUser ! 42: #endif /* KERNEL_USER */ ! 43: #if KERNEL_SERVER ! 44: KernelServer ! 45: #endif /* KERNEL_SERVER */ ! 46: mach 2000; ! 47: ! 48: #ifdef KERNEL_USER ! 49: userprefix r_; ! 50: #endif /* KERNEL_USER */ ! 51: ! 52: #include <mach/std_types.defs> ! 53: #include <mach/mach_types.defs> ! 54: ! 55: skip; /* old port_allocate */ ! 56: skip; /* old port_deallocate */ ! 57: skip; /* old port_enable */ ! 58: skip; /* old port_disable */ ! 59: skip; /* old port_select */ ! 60: skip; /* old port_set_backlog */ ! 61: skip; /* old port_status */ ! 62: ! 63: /* ! 64: * Create a new task with an empty set of IPC rights, ! 65: * and having an address space constructed from the ! 66: * target task (or empty, if inherit_memory is FALSE). ! 67: */ ! 68: routine task_create( ! 69: target_task : task_t; ! 70: inherit_memory : boolean_t; ! 71: out child_task : task_t); ! 72: ! 73: /* ! 74: * Destroy the target task, causing all of its threads ! 75: * to be destroyed, all of its IPC rights to be deallocated, ! 76: * and all of its address space to be deallocated. ! 77: */ ! 78: routine task_terminate( ! 79: target_task : task_t); ! 80: ! 81: /* ! 82: * Get user-level handler entry points for all ! 83: * emulated system calls. ! 84: */ ! 85: routine task_get_emulation_vector( ! 86: task : task_t; ! 87: out vector_start : int; ! 88: out emulation_vector: emulation_vector_t); ! 89: ! 90: /* ! 91: * Establish user-level handlers for the specified ! 92: * system calls. Non-emulated system calls are specified ! 93: * with emulation_vector[i] == EML_ROUTINE_NULL. ! 94: */ ! 95: routine task_set_emulation_vector( ! 96: task : task_t; ! 97: vector_start : int; ! 98: emulation_vector: emulation_vector_t); ! 99: ! 100: ! 101: /* ! 102: * Returns the set of threads belonging to the target task. ! 103: */ ! 104: routine task_threads( ! 105: target_task : task_t; ! 106: out thread_list : thread_array_t); ! 107: ! 108: /* ! 109: * Returns information about the target task. ! 110: */ ! 111: routine task_info( ! 112: target_task : task_t; ! 113: flavor : int; ! 114: out task_info_out : task_info_t, CountInOut); ! 115: ! 116: ! 117: skip; /* old task_status */ ! 118: skip; /* old task_set_notify */ ! 119: skip; /* old thread_create */ ! 120: ! 121: /* ! 122: * Destroy the target thread. ! 123: */ ! 124: routine thread_terminate( ! 125: target_thread : thread_t); ! 126: ! 127: /* ! 128: * Return the selected state information for the target ! 129: * thread. If the thread is currently executing, the results ! 130: * may be stale. [Flavor THREAD_STATE_FLAVOR_LIST provides a ! 131: * list of valid flavors for the target thread.] ! 132: */ ! 133: routine thread_get_state( ! 134: target_thread : thread_t; ! 135: flavor : int; ! 136: out old_state : thread_state_t, CountInOut); ! 137: ! 138: /* ! 139: * Set the selected state information for the target thread. ! 140: * If the thread is currently executing, the state change ! 141: * may be ill-defined. ! 142: */ ! 143: routine thread_set_state( ! 144: target_thread : thread_t; ! 145: flavor : int; ! 146: new_state : thread_state_t); ! 147: ! 148: /* ! 149: * Returns information about the target thread. ! 150: */ ! 151: routine thread_info( ! 152: target_thread : thread_t; ! 153: flavor : int; ! 154: out thread_info_out : thread_info_t, CountInOut); ! 155: ! 156: skip; /* old thread_mutate */ ! 157: ! 158: /* ! 159: * Allocate zero-filled memory in the address space ! 160: * of the target task, either at the specified address, ! 161: * or wherever space can be found (if anywhere is TRUE), ! 162: * of the specified size. The address at which the ! 163: * allocation actually took place is returned. ! 164: */ ! 165: #ifdef EMULATOR ! 166: skip; /* the emulator redefines vm_allocate using vm_map */ ! 167: #else /* EMULATOR */ ! 168: routine vm_allocate( ! 169: target_task : vm_task_t; ! 170: inout address : vm_address_t; ! 171: size : vm_size_t; ! 172: anywhere : boolean_t); ! 173: #endif /* EMULATOR */ ! 174: ! 175: skip; /* old vm_allocate_with_pager */ ! 176: ! 177: /* ! 178: * Deallocate the specified range from the virtual ! 179: * address space of the target task. ! 180: */ ! 181: routine vm_deallocate( ! 182: target_task : vm_task_t; ! 183: address : vm_address_t; ! 184: size : vm_size_t); ! 185: ! 186: /* ! 187: * Set the current or maximum protection attribute ! 188: * for the specified range of the virtual address ! 189: * space of the target task. The current protection ! 190: * limits the memory access rights of threads within ! 191: * the task; the maximum protection limits the accesses ! 192: * that may be given in the current protection. ! 193: * Protections are specified as a set of {read, write, execute} ! 194: * *permissions*. ! 195: */ ! 196: routine vm_protect( ! 197: target_task : vm_task_t; ! 198: address : vm_address_t; ! 199: size : vm_size_t; ! 200: set_maximum : boolean_t; ! 201: new_protection : vm_prot_t); ! 202: ! 203: /* ! 204: * Set the inheritance attribute for the specified range ! 205: * of the virtual address space of the target task. ! 206: * The inheritance value is one of {none, copy, share}, and ! 207: * specifies how the child address space should acquire ! 208: * this memory at the time of a task_create call. ! 209: */ ! 210: routine vm_inherit( ! 211: target_task : vm_task_t; ! 212: address : vm_address_t; ! 213: size : vm_size_t; ! 214: new_inheritance : vm_inherit_t); ! 215: ! 216: /* ! 217: * Returns the contents of the specified range of the ! 218: * virtual address space of the target task. [The ! 219: * range must be aligned on a virtual page boundary, ! 220: * and must be a multiple of pages in extent. The ! 221: * protection on the specified range must permit reading.] ! 222: */ ! 223: routine vm_read( ! 224: target_task : vm_task_t; ! 225: address : vm_address_t; ! 226: size : vm_size_t; ! 227: out data : pointer_t); ! 228: ! 229: /* ! 230: * Writes the contents of the specified range of the ! 231: * virtual address space of the target task. [The ! 232: * range must be aligned on a virtual page boundary, ! 233: * and must be a multiple of pages in extent. The ! 234: * protection on the specified range must permit writing.] ! 235: */ ! 236: routine vm_write( ! 237: target_task : vm_task_t; ! 238: address : vm_address_t; ! 239: data : pointer_t); ! 240: ! 241: /* ! 242: * Copy the contents of the source range of the virtual ! 243: * address space of the target task to the destination ! 244: * range in that same address space. [Both of the ! 245: * ranges must be aligned on a virtual page boundary, ! 246: * and must be multiples of pages in extent. The ! 247: * protection on the source range must permit reading, ! 248: * and the protection on the destination range must ! 249: * permit writing.] ! 250: */ ! 251: routine vm_copy( ! 252: target_task : vm_task_t; ! 253: source_address : vm_address_t; ! 254: size : vm_size_t; ! 255: dest_address : vm_address_t); ! 256: ! 257: /* ! 258: * Returns information about the contents of the virtual ! 259: * address space of the target task at the specified ! 260: * address. The returned protection, inheritance, sharing ! 261: * and memory object values apply to the entire range described ! 262: * by the address range returned; the memory object offset ! 263: * corresponds to the beginning of the address range. ! 264: * [If the specified address is not allocated, the next ! 265: * highest address range is described. If no addresses beyond ! 266: * the one specified are allocated, the call returns KERN_NO_SPACE.] ! 267: */ ! 268: routine vm_region( ! 269: target_task : vm_task_t; ! 270: inout address : vm_address_t; ! 271: out size : vm_size_t; ! 272: out protection : vm_prot_t; ! 273: out max_protection : vm_prot_t; ! 274: out inheritance : vm_inherit_t; ! 275: out is_shared : boolean_t; ! 276: /* avoid out-translation of the argument */ ! 277: out object_name : memory_object_name_t = ! 278: MACH_MSG_TYPE_MOVE_SEND ! 279: ctype: mach_port_t; ! 280: out offset : vm_offset_t); ! 281: ! 282: /* ! 283: * Return virtual memory statistics for the host ! 284: * on which the target task resides. [Note that the ! 285: * statistics are not specific to the target task.] ! 286: */ ! 287: routine vm_statistics( ! 288: target_task : vm_task_t; ! 289: out vm_stats : vm_statistics_data_t); ! 290: ! 291: skip; /* old task_by_u*x_pid */ ! 292: skip; /* old vm_pageable */ ! 293: ! 294: /* ! 295: * Stash a handful of ports for the target task; child ! 296: * tasks inherit this stash at task_create time. ! 297: */ ! 298: routine mach_ports_register( ! 299: target_task : task_t; ! 300: init_port_set : mach_port_array_t = ! 301: ^array[] of mach_port_t); ! 302: ! 303: /* ! 304: * Retrieve the stashed ports for the target task. ! 305: */ ! 306: routine mach_ports_lookup( ! 307: target_task : task_t; ! 308: out init_port_set : mach_port_array_t = ! 309: ^array[] of mach_port_t); ! 310: ! 311: skip; /* old u*x_pid */ ! 312: skip; /* old netipc_listen */ ! 313: skip; /* old netipc_ignore */ ! 314: ! 315: /* ! 316: * Provide the data contents of a range of the given memory ! 317: * object, with the access restriction specified. [Only ! 318: * whole virtual pages of data can be accepted; partial pages ! 319: * will be discarded. Data should be provided on request, but ! 320: * may be provided in advance as desired. When data already ! 321: * held by this kernel is provided again, the new data is ignored. ! 322: * The access restriction is the subset of {read, write, execute} ! 323: * which are prohibited. The kernel may not provide any data (or ! 324: * protection) consistency among pages with different virtual page ! 325: * alignments within the same object.] ! 326: */ ! 327: simpleroutine memory_object_data_provided( ! 328: memory_control : memory_object_control_t; ! 329: offset : vm_offset_t; ! 330: data : pointer_t; ! 331: lock_value : vm_prot_t); ! 332: ! 333: /* ! 334: * Indicate that a range of the given temporary memory object does ! 335: * not exist, and that the backing memory object should be used ! 336: * instead (or zero-fill memory be used, if no backing object exists). ! 337: * [This call is intended for use only by the default memory manager. ! 338: * It should not be used to indicate a real error -- ! 339: * memory_object_data_error should be used for that purpose.] ! 340: */ ! 341: simpleroutine memory_object_data_unavailable( ! 342: memory_control : memory_object_control_t; ! 343: offset : vm_offset_t; ! 344: size : vm_size_t); ! 345: ! 346: /* ! 347: * Retrieves the attributes currently associated with ! 348: * a memory object. ! 349: */ ! 350: routine memory_object_get_attributes( ! 351: memory_control : memory_object_control_t; ! 352: out object_ready : boolean_t; ! 353: out may_cache : boolean_t; ! 354: out copy_strategy : memory_object_copy_strategy_t); ! 355: ! 356: /* ! 357: * Sets the default memory manager, the port to which ! 358: * newly-created temporary memory objects are delivered. ! 359: * [See (memory_object_default)memory_object_create.] ! 360: * The old memory manager port is returned. ! 361: */ ! 362: routine vm_set_default_memory_manager( ! 363: host_priv : host_priv_t; ! 364: inout default_manager : mach_port_make_send_t); ! 365: ! 366: skip; /* old pager_flush_request */ ! 367: ! 368: /* ! 369: * Control use of the data associated with the given ! 370: * memory object. For each page in the given range, ! 371: * perform the following operations, in order: ! 372: * 1) restrict access to the page (disallow ! 373: * forms specified by "prot"); ! 374: * 2) write back modifications (if "should_return" ! 375: * is RETURN_DIRTY and the page is dirty, or ! 376: * "should_return" is RETURN_ALL and the page ! 377: * is either dirty or precious); and, ! 378: * 3) flush the cached copy (if "should_flush" ! 379: * is asserted). ! 380: * The set of pages is defined by a starting offset ! 381: * ("offset") and size ("size"). Only pages with the ! 382: * same page alignment as the starting offset are ! 383: * considered. ! 384: * ! 385: * A single acknowledgement is sent (to the "reply_to" ! 386: * port) when these actions are complete. ! 387: * ! 388: * There are two versions of this routine because IPC distinguishes ! 389: * between booleans and integers (a 2-valued integer is NOT a ! 390: * boolean). The new routine is backwards compatible at the C ! 391: * language interface. ! 392: */ ! 393: simpleroutine xxx_memory_object_lock_request( ! 394: memory_control : memory_object_control_t; ! 395: offset : vm_offset_t; ! 396: size : vm_size_t; ! 397: should_clean : boolean_t; ! 398: should_flush : boolean_t; ! 399: lock_value : vm_prot_t; ! 400: reply_to : mach_port_t = ! 401: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic); ! 402: ! 403: ! 404: simpleroutine memory_object_lock_request( ! 405: memory_control : memory_object_control_t; ! 406: offset : vm_offset_t; ! 407: size : vm_size_t; ! 408: should_return : memory_object_return_t; ! 409: should_flush : boolean_t; ! 410: lock_value : vm_prot_t; ! 411: reply_to : mach_port_t = ! 412: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic); ! 413: ! 414: /* obsolete */ ! 415: routine xxx_task_get_emulation_vector( ! 416: task : task_t; ! 417: out vector_start : int; ! 418: out emulation_vector: xxx_emulation_vector_t, IsLong); ! 419: ! 420: /* obsolete */ ! 421: routine xxx_task_set_emulation_vector( ! 422: task : task_t; ! 423: vector_start : int; ! 424: emulation_vector: xxx_emulation_vector_t, IsLong); ! 425: ! 426: /* ! 427: * Returns information about the host on which the ! 428: * target object resides. [This object may be ! 429: * a task, thread, or memory_object_control port.] ! 430: */ ! 431: routine xxx_host_info( ! 432: target_task : mach_port_t; ! 433: out info : machine_info_data_t); ! 434: ! 435: /* ! 436: * Returns information about a particular processor on ! 437: * the host on which the target task resides. ! 438: */ ! 439: routine xxx_slot_info( ! 440: target_task : task_t; ! 441: slot : int; ! 442: out info : machine_slot_data_t); ! 443: ! 444: /* ! 445: * Performs control operations (currently only ! 446: * turning off or on) on a particular processor on ! 447: * the host on which the target task resides. ! 448: */ ! 449: routine xxx_cpu_control( ! 450: target_task : task_t; ! 451: cpu : int; ! 452: running : boolean_t); ! 453: ! 454: skip; /* old thread_statistics */ ! 455: skip; /* old task_statistics */ ! 456: skip; /* old netport_init */ ! 457: skip; /* old netport_enter */ ! 458: skip; /* old netport_remove */ ! 459: skip; /* old thread_set_priority */ ! 460: ! 461: /* ! 462: * Increment the suspend count for the target task. ! 463: * No threads within a task may run when the suspend ! 464: * count for that task is non-zero. ! 465: */ ! 466: routine task_suspend( ! 467: target_task : task_t); ! 468: ! 469: /* ! 470: * Decrement the suspend count for the target task, ! 471: * if the count is currently non-zero. If the resulting ! 472: * suspend count is zero, then threads within the task ! 473: * that also have non-zero suspend counts may execute. ! 474: */ ! 475: routine task_resume( ! 476: target_task : task_t); ! 477: ! 478: /* ! 479: * Returns the current value of the selected special port ! 480: * associated with the target task. ! 481: */ ! 482: routine task_get_special_port( ! 483: task : task_t; ! 484: which_port : int; ! 485: out special_port : mach_port_t); ! 486: ! 487: /* ! 488: * Set one of the special ports associated with the ! 489: * target task. ! 490: */ ! 491: routine task_set_special_port( ! 492: task : task_t; ! 493: which_port : int; ! 494: special_port : mach_port_t); ! 495: ! 496: /* obsolete */ ! 497: routine xxx_task_info( ! 498: target_task : task_t; ! 499: flavor : int; ! 500: out task_info_out : task_info_t, IsLong); ! 501: ! 502: ! 503: /* ! 504: * Create a new thread within the target task, returning ! 505: * the port representing that new thread. The ! 506: * initial execution state of the thread is undefined. ! 507: */ ! 508: routine thread_create( ! 509: parent_task : task_t; ! 510: out child_thread : thread_t); ! 511: ! 512: /* ! 513: * Increment the suspend count for the target thread. ! 514: * Once this call has completed, the thread will not ! 515: * execute any further user or meta- instructions. ! 516: * Once suspended, a thread may not execute again until ! 517: * its suspend count is zero, and the suspend count ! 518: * for its task is also zero. ! 519: */ ! 520: routine thread_suspend( ! 521: target_thread : thread_t); ! 522: ! 523: /* ! 524: * Decrement the suspend count for the target thread, ! 525: * if that count is not already zero. ! 526: */ ! 527: routine thread_resume( ! 528: target_thread : thread_t); ! 529: ! 530: /* ! 531: * Cause any user or meta- instructions currently being ! 532: * executed by the target thread to be aborted. [Meta- ! 533: * instructions consist of the basic traps for IPC ! 534: * (e.g., msg_send, msg_receive) and self-identification ! 535: * (e.g., task_self, thread_self, thread_reply). Calls ! 536: * described by MiG interfaces are not meta-instructions ! 537: * themselves.] ! 538: */ ! 539: routine thread_abort( ! 540: target_thread : thread_t); ! 541: ! 542: /* obsolete */ ! 543: routine xxx_thread_get_state( ! 544: target_thread : thread_t; ! 545: flavor : int; ! 546: out old_state : thread_state_t, IsLong); ! 547: ! 548: /* obsolete */ ! 549: routine xxx_thread_set_state( ! 550: target_thread : thread_t; ! 551: flavor : int; ! 552: new_state : thread_state_t, IsLong); ! 553: ! 554: /* ! 555: * Returns the current value of the selected special port ! 556: * associated with the target thread. ! 557: */ ! 558: routine thread_get_special_port( ! 559: thread : thread_t; ! 560: which_port : int; ! 561: out special_port : mach_port_t); ! 562: ! 563: /* ! 564: * Set one of the special ports associated with the ! 565: * target thread. ! 566: */ ! 567: routine thread_set_special_port( ! 568: thread : thread_t; ! 569: which_port : int; ! 570: special_port : mach_port_t); ! 571: ! 572: /* obsolete */ ! 573: routine xxx_thread_info( ! 574: target_thread : thread_t; ! 575: flavor : int; ! 576: out thread_info_out : thread_info_t, IsLong); ! 577: ! 578: /* ! 579: * Establish a user-level handler for the specified ! 580: * system call. ! 581: */ ! 582: routine task_set_emulation( ! 583: target_port : task_t; ! 584: routine_entry_pt: vm_address_t; ! 585: routine_number : int); ! 586: ! 587: /* ! 588: * Establish restart pc for interrupted atomic sequences. ! 589: * This reuses the message number for the old task_get_io_port. ! 590: * See task_info.h for description of flavors. ! 591: * ! 592: */ ! 593: routine task_ras_control( ! 594: target_task : task_t; ! 595: basepc : vm_address_t; ! 596: boundspc : vm_address_t; ! 597: flavor : int); ! 598: ! 599: ! 600: ! 601: skip; /* old host_ipc_statistics */ ! 602: ! 603: ! 604: #if MACH_IPC_COMPAT ! 605: ! 606: /* ! 607: * Returns the set of port and port set names ! 608: * to which the target task has access, along with ! 609: * the type (set or port) for each name. ! 610: */ ! 611: routine port_names( ! 612: task : ipc_space_t; ! 613: out port_names_p : port_name_array_t; ! 614: out port_types : port_type_array_t); ! 615: ! 616: /* ! 617: * Returns the type (set or port) for the port name ! 618: * within the target task. ! 619: */ ! 620: routine port_type( ! 621: task : ipc_space_t; ! 622: port_name : port_name_t; ! 623: out port_type_p : port_type_t); ! 624: ! 625: /* ! 626: * Changes the name by which a port (or port set) is known to ! 627: * the target task. ! 628: */ ! 629: routine port_rename( ! 630: task : ipc_space_t; ! 631: old_name : port_name_t; ! 632: new_name : port_name_t); ! 633: ! 634: /* ! 635: * Allocate a new port (with all rights) in the target task. ! 636: * The port name in that task is returned. ! 637: */ ! 638: routine port_allocate( ! 639: task : ipc_space_t; ! 640: out port_name : port_name_t); ! 641: ! 642: /* ! 643: * Deallocate the port with the given name from the target task. ! 644: */ ! 645: routine port_deallocate( ! 646: task : ipc_space_t; ! 647: port_name : port_name_t); ! 648: ! 649: /* ! 650: * Set the number of messages that may be queued to ! 651: * the port in the target task with the given name ! 652: * before further message queueing operations block. ! 653: * The target task must hold receive rights for the ! 654: * port named. ! 655: */ ! 656: routine port_set_backlog( ! 657: task : ipc_space_t; ! 658: port_name : port_name_t; ! 659: backlog : int); ! 660: ! 661: /* ! 662: * Return information about the port with the given ! 663: * name in the target task. Only the ownership and ! 664: * receive_rights results are meaningful unless the ! 665: * target task holds receive rights for the port. ! 666: */ ! 667: routine port_status( ! 668: task : ipc_space_t; ! 669: port_name : port_name_t; ! 670: out enabled : port_set_name_t; ! 671: out num_msgs : int; ! 672: out backlog : int; ! 673: out ownership : boolean_t; ! 674: out receive_rights : boolean_t); ! 675: ! 676: /* ! 677: * Allocate a new port set in the target task, returning ! 678: * the name of that new port set. [The new set is ! 679: * initially empty.] ! 680: */ ! 681: routine port_set_allocate( ! 682: task : ipc_space_t; ! 683: out set_name : port_set_name_t); ! 684: ! 685: /* ! 686: * Deallocate the named port set from the target task. ! 687: * Ports that are currently members of the named port ! 688: * set are first removed from the set. ! 689: */ ! 690: routine port_set_deallocate( ! 691: task : ipc_space_t; ! 692: set_name : port_set_name_t); ! 693: ! 694: /* ! 695: * Add the named port to the port set named within ! 696: * the target task. [If the port currently is a member ! 697: * of another port set, it is removed from that set.] ! 698: */ ! 699: routine port_set_add( ! 700: task : ipc_space_t; ! 701: set_name : port_set_name_t; ! 702: port_name : port_name_t); ! 703: ! 704: /* ! 705: * Remove the named port from the port set named within ! 706: * the target task. ! 707: */ ! 708: routine port_set_remove( ! 709: task : ipc_space_t; ! 710: port_name : port_name_t); ! 711: ! 712: /* ! 713: * Returns the current set of ports that are members ! 714: * of the named port set in the target task. ! 715: */ ! 716: routine port_set_status( ! 717: task : ipc_space_t; ! 718: set_name : port_set_name_t; ! 719: out members : port_name_array_t); ! 720: ! 721: /* ! 722: * Insert send rights for the specified port into ! 723: * the target task with the specified port name. ! 724: * [If the name is in use, or the target task already ! 725: * has another name for the specified port, then ! 726: * the operation will fail.] ! 727: */ ! 728: routine port_insert_send( ! 729: task : ipc_space_t; ! 730: my_port : port_t; ! 731: his_name : port_name_t); ! 732: ! 733: /* ! 734: * Returns send rights for the named port in the ! 735: * target task, removing that port name and port ! 736: * send rights from the target task. [If the ! 737: * target task holds receive rights for this port, ! 738: * the operation will fail.] ! 739: */ ! 740: routine port_extract_send( ! 741: task : ipc_space_t; ! 742: his_name : port_name_t; ! 743: out his_port : port_t); ! 744: ! 745: /* ! 746: * Insert receive rights for the specified port into ! 747: * the target task with the specified port name. ! 748: * [If the name is in use, or the target task already ! 749: * has another name for the specified port, then ! 750: * the operation will fail. ! 751: */ ! 752: routine port_insert_receive( ! 753: task : ipc_space_t; ! 754: my_port : port_all_t; ! 755: his_name : port_name_t); ! 756: ! 757: /* ! 758: * Returns receive rights for the named port in the ! 759: * target task, removing that port name and all port ! 760: * rights from the target task. ! 761: */ ! 762: routine port_extract_receive( ! 763: task : ipc_space_t; ! 764: his_name : port_name_t; ! 765: out his_port : port_all_t); ! 766: ! 767: #else /* MACH_IPC_COMPAT */ ! 768: ! 769: skip; /* old port_names */ ! 770: skip; /* old port_type */ ! 771: skip; /* old port_rename */ ! 772: skip; /* old port_allocate */ ! 773: skip; /* old port_deallocate */ ! 774: skip; /* old port_set_backlog */ ! 775: skip; /* old port_status */ ! 776: skip; /* old port_set_allocate */ ! 777: skip; /* old port_set_deallocate */ ! 778: skip; /* old port_set_add */ ! 779: skip; /* old port_set_remove */ ! 780: skip; /* old port_set_status */ ! 781: skip; /* old port_insert_send */ ! 782: skip; /* old port_extract_send */ ! 783: skip; /* old port_insert_receive */ ! 784: skip; /* old port_extract_receive */ ! 785: ! 786: #endif /* MACH_IPC_COMPAT */ ! 787: ! 788: /* ! 789: * Map a user-defined memory object into the virtual address ! 790: * space of the target task. If desired (anywhere is TRUE), ! 791: * the kernel will find a suitable address range of the ! 792: * specified size; else, the specific address will be allocated. ! 793: * ! 794: * The beginning address of the range will be aligned on a virtual ! 795: * page boundary, be at or beyond the address specified, and ! 796: * meet the mask requirements (bits turned on in the mask must not ! 797: * be turned on in the result); the size of the range, in bytes, ! 798: * will be rounded up to an integral number of virtual pages. ! 799: * ! 800: * The memory in the resulting range will be associated with the ! 801: * specified memory object, with the beginning of the memory range ! 802: * referring to the specified offset into the memory object. ! 803: * ! 804: * The mapping will take the current and maximum protections and ! 805: * the inheritance attributes specified; see the vm_protect and ! 806: * vm_inherit calls for a description of these attributes. ! 807: * ! 808: * If desired (copy is TRUE), the memory range will be filled ! 809: * with a copy of the data from the memory object; this copy will ! 810: * be private to this mapping in this target task. Otherwise, ! 811: * the memory in this mapping will be shared with other mappings ! 812: * of the same memory object at the same offset (in this task or ! 813: * in other tasks). [The Mach kernel only enforces shared memory ! 814: * consistency among mappings on one host with similar page alignments. ! 815: * The user-defined memory manager for this object is responsible ! 816: * for further consistency.] ! 817: */ ! 818: #ifdef EMULATOR ! 819: routine htg_vm_map( ! 820: target_task : vm_task_t; ! 821: ureplyport reply_port : mach_port_make_send_once_t; ! 822: inout address : vm_address_t; ! 823: size : vm_size_t; ! 824: mask : vm_address_t; ! 825: anywhere : boolean_t; ! 826: memory_object : memory_object_t; ! 827: offset : vm_offset_t; ! 828: copy : boolean_t; ! 829: cur_protection : vm_prot_t; ! 830: max_protection : vm_prot_t; ! 831: inheritance : vm_inherit_t); ! 832: #else /* EMULATOR */ ! 833: routine vm_map( ! 834: target_task : vm_task_t; ! 835: inout address : vm_address_t; ! 836: size : vm_size_t; ! 837: mask : vm_address_t; ! 838: anywhere : boolean_t; ! 839: memory_object : memory_object_t; ! 840: offset : vm_offset_t; ! 841: copy : boolean_t; ! 842: cur_protection : vm_prot_t; ! 843: max_protection : vm_prot_t; ! 844: inheritance : vm_inherit_t); ! 845: #endif /* EMULATOR */ ! 846: ! 847: /* ! 848: * Indicate that a range of the specified memory object cannot ! 849: * be provided at this time. [Threads waiting for memory pages ! 850: * specified by this call will experience a memory exception. ! 851: * Only threads waiting at the time of the call are affected.] ! 852: */ ! 853: simpleroutine memory_object_data_error( ! 854: memory_control : memory_object_control_t; ! 855: offset : vm_offset_t; ! 856: size : vm_size_t; ! 857: error_value : kern_return_t); ! 858: ! 859: /* ! 860: * Make decisions regarding the use of the specified ! 861: * memory object. ! 862: */ ! 863: simpleroutine memory_object_set_attributes( ! 864: memory_control : memory_object_control_t; ! 865: object_ready : boolean_t; ! 866: may_cache : boolean_t; ! 867: copy_strategy : memory_object_copy_strategy_t); ! 868: ! 869: /* ! 870: */ ! 871: simpleroutine memory_object_destroy( ! 872: memory_control : memory_object_control_t; ! 873: reason : kern_return_t); ! 874: ! 875: /* ! 876: * Provide the data contents of a range of the given memory ! 877: * object, with the access restriction specified, optional ! 878: * precious attribute, and reply message. [Only ! 879: * whole virtual pages of data can be accepted; partial pages ! 880: * will be discarded. Data should be provided on request, but ! 881: * may be provided in advance as desired. When data already ! 882: * held by this kernel is provided again, the new data is ignored. ! 883: * The access restriction is the subset of {read, write, execute} ! 884: * which are prohibited. The kernel may not provide any data (or ! 885: * protection) consistency among pages with different virtual page ! 886: * alignments within the same object. The precious value controls ! 887: * how the kernel treats the data. If it is FALSE, the kernel treats ! 888: * its copy as a temporary and may throw it away if it hasn't been ! 889: * changed. If the precious value is TRUE, the kernel treats its ! 890: * copy as a data repository and promises to return it to the manager; ! 891: * the manager may tell the kernel to throw it away instead by flushing ! 892: * and not cleaning the data -- see memory_object_lock_request. The ! 893: * reply_to port is for a compeletion message; it will be ! 894: * memory_object_supply_completed.] ! 895: */ ! 896: ! 897: simpleroutine memory_object_data_supply( ! 898: memory_control : memory_object_control_t; ! 899: offset : vm_offset_t; ! 900: data : pointer_t, Dealloc[]; ! 901: lock_value : vm_prot_t; ! 902: precious : boolean_t; ! 903: reply_to : mach_port_t = ! 904: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic); ! 905: ! 906: simpleroutine memory_object_ready( ! 907: memory_control : memory_object_control_t; ! 908: may_cache : boolean_t; ! 909: copy_strategy : memory_object_copy_strategy_t); ! 910: ! 911: simpleroutine memory_object_change_attributes( ! 912: memory_control : memory_object_control_t; ! 913: may_cache : boolean_t; ! 914: copy_strategy : memory_object_copy_strategy_t; ! 915: reply_to : mach_port_t = ! 916: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic); ! 917: ! 918: skip; /* old host_callout_statistics_reset */ ! 919: skip; /* old port_set_select */ ! 920: ! 921: #if MACH_IPC_COMPAT ! 922: ! 923: /* ! 924: * Sets a backup port for the named port. The task ! 925: * must have receive rights for the named port. ! 926: * Returns the previous backup port, if any. ! 927: */ ! 928: ! 929: routine port_set_backup( ! 930: task : ipc_space_t; ! 931: port_name : port_name_t; ! 932: backup : port_t = MACH_MSG_TYPE_MAKE_SEND ! 933: ctype: mach_port_t; ! 934: out previous : port_t); ! 935: ! 936: #else /* MACH_IPC_COMPAT */ ! 937: ! 938: skip; /* old port_set_backup */ ! 939: ! 940: #endif /* MACH_IPC_COMPAT */ ! 941: ! 942: /* ! 943: * Set/Get special properties of memory associated ! 944: * to some virtual address range, such as cachability, ! 945: * migrability, replicability. Machine-dependent. ! 946: */ ! 947: routine vm_machine_attribute( ! 948: target_task : vm_task_t; ! 949: address : vm_address_t; ! 950: size : vm_size_t; ! 951: attribute : vm_machine_attribute_t; ! 952: inout value : vm_machine_attribute_val_t); ! 953: ! 954: skip; /* old host_fpa_counters_reset */ ! 955: ! 956: /* ! 957: * There is no more room in this interface for additional calls. ! 958: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.