|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Copyright (c) 1995, 1994, 1993, 1992, 1991, 1990 ! 27: * Open Software Foundation, Inc. ! 28: * ! 29: * Permission to use, copy, modify, and distribute this software and ! 30: * its documentation for any purpose and without fee is hereby granted, ! 31: * provided that the above copyright notice appears in all copies and ! 32: * that both the copyright notice and this permission notice appear in ! 33: * supporting documentation, and that the name of ("OSF") or Open Software ! 34: * Foundation not be used in advertising or publicity pertaining to ! 35: * distribution of the software without specific, written prior permission. ! 36: * ! 37: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE ! 38: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ! 39: * FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL OSF BE LIABLE FOR ANY ! 40: * SPECIAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ! 41: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ! 42: * ACTION OF CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING ! 43: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE ! 44: */ ! 45: /* ! 46: * OSF Research Institute MK6.1 (unencumbered) 1/31/1995 ! 47: */ ! 48: /* ! 49: * Mach Operating System ! 50: * Copyright (c) 1991,1990,1989 Carnegie Mellon University ! 51: * All Rights Reserved. ! 52: * ! 53: * Permission to use, copy, modify and distribute this software and its ! 54: * documentation is hereby granted, provided that both the copyright ! 55: * notice and this permission notice appear in all copies of the ! 56: * software, derivative works or modified versions, and any portions ! 57: * thereof, and that both notices appear in supporting documentation. ! 58: * ! 59: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 60: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 61: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 62: * ! 63: * Carnegie Mellon requests users of this software to return to ! 64: * ! 65: * Software Distribution Coordinator or [email protected] ! 66: * School of Computer Science ! 67: * Carnegie Mellon University ! 68: * Pittsburgh PA 15213-3890 ! 69: * ! 70: * any improvements or extensions that they make and grant Carnegie Mellon ! 71: * the rights to redistribute these changes. ! 72: */ ! 73: /* ! 74: * File: ipc/ipc_object.h ! 75: * Author: Rich Draves ! 76: * Date: 1989 ! 77: * ! 78: * Definitions for IPC objects, for which tasks have capabilities. ! 79: */ ! 80: ! 81: #ifndef _IPC_IPC_OBJECT_H_ ! 82: #define _IPC_IPC_OBJECT_H_ ! 83: ! 84: #import <mach/features.h> ! 85: ! 86: #include <mach/kern_return.h> ! 87: #include <mach/message.h> ! 88: #include <kern/lock.h> ! 89: #include <kern/macro_help.h> ! 90: #include <kern/zalloc.h> ! 91: #include <ipc/ipc_types.h> ! 92: ! 93: typedef unsigned int ipc_object_refs_t; ! 94: typedef unsigned int ipc_object_bits_t; ! 95: typedef unsigned int ipc_object_type_t; ! 96: ! 97: typedef struct ipc_object { ! 98: decl_simple_lock_data(,io_lock_data) ! 99: ipc_object_refs_t io_references; ! 100: ipc_object_bits_t io_bits; ! 101: } *ipc_object_t; ! 102: ! 103: #define IO_NULL ((ipc_object_t) 0) ! 104: #define IO_DEAD ((ipc_object_t) -1) ! 105: ! 106: #define IO_VALID(io) (((io) != IO_NULL) && ((io) != IO_DEAD)) ! 107: ! 108: #define IO_BITS_KOTYPE 0x0000ffff /* used by the object */ ! 109: #define IO_BITS_OTYPE 0x7fff0000 /* determines a zone */ ! 110: #define IO_BITS_ACTIVE 0x80000000U /* is object alive? */ ! 111: ! 112: #define io_active(io) ((int)(io)->io_bits < 0) /* hack */ ! 113: ! 114: #define io_otype(io) (((io)->io_bits & IO_BITS_OTYPE) >> 16) ! 115: #define io_kotype(io) ((io)->io_bits & IO_BITS_KOTYPE) ! 116: ! 117: #define io_makebits(active, otype, kotype) \ ! 118: (((active) ? IO_BITS_ACTIVE : 0) | ((otype) << 16) | (kotype)) ! 119: ! 120: /* ! 121: * Object types: ports, port sets, kernel-loaded ports ! 122: */ ! 123: #define IOT_PORT 0 ! 124: #define IOT_PORT_SET 1 ! 125: #define IOT_NUMBER 2 /* number of types used */ ! 126: ! 127: extern zone_t ipc_object_zones[IOT_NUMBER]; ! 128: ! 129: #define io_alloc(otype) \ ! 130: ((ipc_object_t) zalloc(ipc_object_zones[(otype)])) ! 131: ! 132: #define io_free(otype, io) \ ! 133: zfree(ipc_object_zones[(otype)], (vm_offset_t) (io)) ! 134: ! 135: #define io_lock_init(io) simple_lock_init(&(io)->io_lock_data) ! 136: #define io_lock(io) simple_lock(&(io)->io_lock_data) ! 137: #define io_lock_try(io) simple_lock_try(&(io)->io_lock_data) ! 138: #define io_unlock(io) simple_unlock(&(io)->io_lock_data) ! 139: ! 140: #define io_check_unlock(io) \ ! 141: MACRO_BEGIN \ ! 142: volatile ipc_object_refs_t _refs = (io)->io_references; \ ! 143: \ ! 144: io_unlock(io); \ ! 145: if (_refs == 0) \ ! 146: io_free(io_otype(io), io); \ ! 147: MACRO_END ! 148: ! 149: #define io_reference(io) \ ! 150: MACRO_BEGIN \ ! 151: (io)->io_references++; \ ! 152: MACRO_END ! 153: ! 154: #define io_release(io) \ ! 155: MACRO_BEGIN \ ! 156: (io)->io_references--; \ ! 157: MACRO_END ! 158: ! 159: /* ! 160: * Exported interfaces ! 161: */ ! 162: ! 163: /* Take a reference to an object */ ! 164: extern void ipc_object_reference( ! 165: ipc_object_t object); ! 166: ! 167: /* Release a reference to an object */ ! 168: extern void ipc_object_release( ! 169: ipc_object_t object); ! 170: ! 171: /* Look up an object in a space */ ! 172: extern kern_return_t ipc_object_translate( ! 173: ipc_space_t space, ! 174: mach_port_t name, ! 175: mach_port_right_t right, ! 176: ipc_object_t *objectp); ! 177: ! 178: /* Allocate a dead-name entry */ ! 179: extern kern_return_t ! 180: ipc_object_alloc_dead( ! 181: ipc_space_t space, ! 182: mach_port_t *namep); ! 183: ! 184: /* Allocate a dead-name entry, with a specific name */ ! 185: extern kern_return_t ipc_object_alloc_dead_name( ! 186: ipc_space_t space, ! 187: mach_port_t name); ! 188: ! 189: /* Allocate an object */ ! 190: extern kern_return_t ipc_object_alloc( ! 191: ipc_space_t space, ! 192: ipc_object_type_t otype, ! 193: mach_port_type_t type, ! 194: mach_port_urefs_t urefs, ! 195: mach_port_t *namep, ! 196: ipc_object_t *objectp); ! 197: ! 198: /* Allocate an object, with a specific name */ ! 199: extern kern_return_t ipc_object_alloc_name( ! 200: ipc_space_t space, ! 201: ipc_object_type_t otype, ! 202: mach_port_type_t type, ! 203: mach_port_urefs_t urefs, ! 204: mach_port_t name, ! 205: ipc_object_t *objectp); ! 206: ! 207: /* Convert a send type name to a received type name */ ! 208: extern mach_msg_type_name_t ipc_object_copyin_type( ! 209: mach_msg_type_name_t msgt_name); ! 210: ! 211: /* Copyin a capability from a space */ ! 212: extern kern_return_t ipc_object_copyin( ! 213: ipc_space_t space, ! 214: mach_port_t name, ! 215: mach_msg_type_name_t msgt_name, ! 216: ipc_object_t *objectp); ! 217: ! 218: /* Copyin a naked capability from the kernel */ ! 219: extern void ipc_object_copyin_from_kernel( ! 220: ipc_object_t object, ! 221: mach_msg_type_name_t msgt_name); ! 222: ! 223: /* Destroy a naked capability */ ! 224: extern void ipc_object_destroy( ! 225: ipc_object_t object, ! 226: mach_msg_type_name_t msgt_name); ! 227: ! 228: /* Copyout a capability, placing it into a space */ ! 229: extern kern_return_t ipc_object_copyout( ! 230: ipc_space_t space, ! 231: ipc_object_t object, ! 232: mach_msg_type_name_t msgt_name, ! 233: boolean_t overflow, ! 234: mach_port_t *namep); ! 235: ! 236: /* Copyout a capability with a name, placing it into a space */ ! 237: extern kern_return_t ipc_object_copyout_name( ! 238: ipc_space_t space, ! 239: ipc_object_t object, ! 240: mach_msg_type_name_t msgt_name, ! 241: boolean_t overflow, ! 242: mach_port_t name); ! 243: ! 244: /* Translate/consume the destination right of a message */ ! 245: extern void ipc_object_copyout_dest( ! 246: ipc_space_t space, ! 247: ipc_object_t object, ! 248: mach_msg_type_name_t msgt_name, ! 249: mach_port_t *namep); ! 250: ! 251: /* Rename an entry in a space */ ! 252: extern kern_return_t ipc_object_rename( ! 253: ipc_space_t space, ! 254: mach_port_t oname, ! 255: mach_port_t nname); ! 256: ! 257: #if MACH_IPC_COMPAT ! 258: ! 259: extern mach_msg_type_name_t ! 260: ipc_object_copyout_type_compat(/* mach_msg_type_name_t */); ! 261: ! 262: extern kern_return_t ! 263: ipc_object_copyin_compat(/* ipc_space_t, mach_port_t, ! 264: mach_msg_type_name_t, boolean_t, ! 265: ipc_object_t * */); ! 266: ! 267: extern kern_return_t ! 268: ipc_object_copyin_header(/* ipc_space_t, mach_port_t, ! 269: ipc_object_t *, mach_msg_type_name_t * */); ! 270: ! 271: extern kern_return_t ! 272: ipc_object_copyout_compat(/* ipc_space_t, ipc_object_t, ! 273: mach_msg_type_name_t, mach_port_t * */); ! 274: ! 275: extern kern_return_t ! 276: ipc_object_copyout_name_compat(/* ipc_space_t, ipc_object_t, ! 277: mach_msg_type_name_t, mach_port_t */); ! 278: ! 279: #endif /* MACH_IPC_COMPAT */ ! 280: ! 281: #endif /* _IPC_IPC_OBJECT_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.