Annotation of XNU/osfmk/ipc/ipc_init.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * @OSF_COPYRIGHT@
                     24:  */
                     25: /*
                     26:  * HISTORY
                     27:  * Revision 1.1.1.1  1998/09/22 21:05:29  wsanchez
                     28:  * Import of Mac OS X kernel (~semeria)
                     29:  *
                     30:  * Revision 1.1.1.1  1998/03/07 02:26:15  wsanchez
                     31:  * Import of OSF Mach kernel (~mburg)
                     32:  *
                     33:  * Revision 1.2.35.1  1997/10/15  15:54:14  barbou
                     34:  *     Made the "ipc_space" and "ipc_tree_entry" zones non-exhaustible. They
                     35:  *     need to grow with the "task" zone which is itself non-exhaustible.
                     36:  *     [1997/10/15  15:52:29  barbou]
                     37:  *
                     38:  * Revision 1.2.24.7  1995/06/09  02:26:59  mmp
                     39:  *     Add a call to initialize the ikm cache.
                     40:  *     [95/04/20            alanl]
                     41:  * 
                     42:  * Revision 1.2.24.6  1995/02/24  16:58:12  alanl
                     43:  *     Promoted MACH_RT to a full-fledged build option.  (w/mmp)
                     44:  *     [95/02/21            alanl]
                     45:  * 
                     46:  *     DIPC:  Merge from nmk17b2 to nmk18b8.
                     47:  *     [95/01/03            mmp]
                     48:  * 
                     49:  * Revision 1.2.21.3  1994/12/06  20:09:33  alanl
                     50:  *     Intel merge, Oct 94 code drop.
                     51:  * 
                     52:  *     Revision 1.6  1994/07/12  19:21:45  andyp
                     53:  *     Merge of the NORMA2 branch back to the mainline.
                     54:  * 
                     55:  *     [...]
                     56:  * 
                     57:  *     Add hook to initialize ipc object subsystem for debugging.
                     58:  *     [[email protected]]
                     59:  *     [94/11/10            alanl]
                     60:  * 
                     61:  * Revision 1.2.21.2  1994/08/11  14:42:31  rwd
                     62:  *     Update zone intialization to use zchange.
                     63:  *     [94/08/04            rwd]
                     64:  * 
                     65:  * Revision 1.2.15.3  1994/05/20  18:32:49  alanl
                     66:  *     Initialize ipc_space_remote for DIPC.
                     67:  *     [94/05/17            rwd]
                     68:  * 
                     69:  * Revision 1.2.15.2  1994/04/28  00:26:52  alanl
                     70:  *     Removed redundant dipc_bootstrap call, which was only required
                     71:  *     when all ipc_ports were also having dipc_ports allocated for
                     72:  *     them, automatically.
                     73:  *     [1994/04/27  23:33:49  alanl]
                     74:  * 
                     75:  * Revision 1.2.15.1  1994/04/20  18:41:46  alanl
                     76:  *     DIPC:  Delete all support for send notifications.  They have
                     77:  *     been removed from the Mach specification and DIPC is easier
                     78:  *     to implement without this feature.  In this file:  removed
                     79:  *     initialization of marequest module.
                     80:  *     DIPC:  add call to bootstrap DIPC.
                     81:  *     [1994/04/20  18:29:30  alanl]
                     82:  * 
                     83:  * Revision 1.2.21.1  1994/08/04  02:21:21  mmp
                     84:  *     NOTE: file was moved back to b11 version for dipc2_shared.
                     85:  *     Initialize ipc_space_remote for DIPC.
                     86:  *     [94/05/17            rwd]
                     87:  * 
                     88:  * Revision 1.2.29.2  1994/12/09  22:16:19  dwm
                     89:  *     mk6 CR801 - merge up from nmk18b4 to nmk18b7
                     90:  *     * Rev 1.2.24.4  1994/10/14  10:29:31  bolinger
                     91:  *       Fix ri-osc CR665:  re-enable the use of a conventional IPC
                     92:  *       namespace for collocated tasks.
                     93:  *     [1994/12/09  20:53:10  dwm]
                     94:  * 
                     95:  * Revision 1.2.29.1  1994/11/04  10:05:04  dwm
                     96:  *     mk6 CR668 - 1.3b26 merge
                     97:  *     * Revision 1.2.5.6  1993/11/08  15:04:09  gm
                     98:  *     CR9710: Updated to new zinit() and zone_change() interfaces.
                     99:  *     * End1.3merge
                    100:  *     [1994/11/04  09:16:22  dwm]
                    101:  * 
                    102:  * Revision 1.2.24.3  1994/09/23  02:07:44  ezf
                    103:  *     change marker to not FREE
                    104:  *     [1994/09/22  21:28:59  ezf]
                    105:  * 
                    106:  * Revision 1.2.24.2  1994/08/18  23:10:37  widyono
                    107:  *     ipc_init(), init msg_ool_size_small_rt
                    108:  *     [1994/07/28  22:15:24  widyono]
                    109:  * 
                    110:  * Revision 1.2.24.1  1994/08/07  20:45:30  bolinger
                    111:  *     Merge up to colo_shared (post-b7, pre-MP).
                    112:  *     [1994/08/07  18:34:17  bolinger]
                    113:  * 
                    114:  * Revision 1.2.12.8  1994/07/13  03:53:06  dwm
                    115:  *     Back out zalloc module changes in the interest of stability.
                    116:  *     [1994/07/13  03:51:03  dwm]
                    117:  * 
                    118:  * Revision 1.2.12.7  1994/07/07  06:42:03  dwm
                    119:  *     mk6 CR219 - pick up changes from IK (via 1.3) to zalloc module;
                    120:  *     convert zchange() to new zone_change() interface.
                    121:  *     [1994/07/07  06:40:15  dwm]
                    122:  * 
                    123:  * Revision 1.2.12.6  1994/06/14  19:11:36  dwm
                    124:  *     CR107: back out misguided conditional ipc_entry storage changes.
                    125:  *     [1994/06/14  18:37:10  dwm]
                    126:  * 
                    127:  * Revision 1.2.12.5  1994/06/08  20:11:28  dswartz
                    128:  *     Preemption merge.
                    129:  *     [1994/06/08  20:09:02  dswartz]
                    130:  * 
                    131:  * Revision 1.2.12.4  1994/05/13  20:38:33  dwm
                    132:  *     Make ipc_entry storage conditional on is_is_kloaded_space,
                    133:  *     using a separate object type.
                    134:  *     [1994/05/13  20:32:02  dwm]
                    135:  * 
                    136:  * Revision 1.2.12.3  1994/04/19  02:18:23  bolinger
                    137:  *     Under MACH_DEBUG, enable access to all of the ports in an IPC space
                    138:  *     for kernel-loaded tasks.
                    139:  *     [1994/04/19  02:13:45  bolinger]
                    140:  * 
                    141:  * Revision 1.2.12.2  1994/01/22  03:38:34  bolinger
                    142:  *     Add code to create new IPC space for kernel-loaded tasks.
                    143:  *     [1994/01/21  22:32:28  bolinger]
                    144:  * 
                    145:  * Revision 1.2.12.1  1994/01/05  19:42:49  bolinger
                    146:  *     Update calls to kmem_suballoc().
                    147:  *     [1994/01/05  17:41:22  bolinger]
                    148:  * 
                    149:  * Revision 1.2.5.5  1993/09/09  16:06:26  jeffc
                    150:  *     CR9745 - Delete message accepted notifications
                    151:  *     [1993/09/03  20:44:41  jeffc]
                    152:  * 
                    153:  * Revision 1.2.5.4  1993/08/05  19:07:06  jeffc
                    154:  *     CR9508 - delete dead Mach3 code. Remove MACH_IPC_TYPED
                    155:  *     [1993/08/04  17:11:50  jeffc]
                    156:  * 
                    157:  * Revision 1.2.5.3  1993/07/22  16:16:01  rod
                    158:  *     Add ANSI prototypes.  CR #9523.
                    159:  *     [1993/07/22  13:29:53  rod]
                    160:  * 
                    161:  * Revision 1.2.5.2  1993/06/09  02:31:32  gm
                    162:  *     CR9176 - ANSI C violations: trailing tokens on CPP
                    163:  *     directives, extra semicolons after decl_ ..., asm keywords
                    164:  *     [1993/06/07  19:01:21  jeffc]
                    165:  * 
                    166:  *     Added to OSF/1 R1.3 from NMK15.0.
                    167:  *     [1993/06/02  21:09:26  jeffc]
                    168:  * 
                    169:  * Revision 1.2  1993/04/19  16:19:54  devrcs
                    170:  *     Allocate ipc_kernel_copy_map under !MACH_IPC_TYPED.     [rod.osf.org]
                    171:  *     [1993/04/06  14:32:18  travos]
                    172:  * 
                    173:  *     Untyped ipc merge:
                    174:  *     Put mig_init() @ #if !MACH_IPC_TYPED
                    175:  *     [1993/03/04  13:42:28  travos]
                    176:  *     New dispatching model for kernel services: hash instead of linear search
                    177:  *     [1993/03/01  21:51:28  travos]
                    178:  *     Initialization of NDR_record
                    179:  *     [1993/02/17  22:13:07  travos]
                    180:  *     Make msg_ool_size_small a function of kalloc_max_prerounded.
                    181:  *     [1993/02/16  15:09:03  rod]
                    182:  *     Allocate kernel submap for eager ipc copyin
                    183:  *     and mark it wait_for_space and no_zero_fill. [[email protected]]
                    184:  *     [1993/01/27  00:46:09  rod]
                    185:  * 
                    186:  * Revision 1.1  1992/09/30  02:07:22  robert
                    187:  *     Initial revision
                    188:  * 
                    189:  * $EndLog$
                    190:  */
                    191: /* CMU_HIST */
                    192: /*
                    193:  * Revision 2.12.2.2  92/03/03  16:18:29  jeffreyh
                    194:  *     19-Feb-92 David L. Black (dlb) at Open Software Foundation
                    195:  *     Don't make port zone exhaustible.  Kernel panics when
                    196:  *     it fails to allocate an internal port after exhaustion.
                    197:  *     [92/02/26  11:41:12  jeffreyh]
                    198:  * 
                    199:  * Revision 2.12.2.1  92/01/03  16:34:52  jsb
                    200:  *     Corrected log.
                    201:  *     [91/12/24  14:18:23  jsb]
                    202:  * 
                    203:  * Revision 2.12  91/12/10  13:25:41  jsb
                    204:  *     Removed reference counting bug workaround.
                    205:  *     [91/12/10  11:17:21  jsb]
                    206:  * 
                    207:  * Revision 2.11  91/11/19  09:54:12  rvb
                    208:  *     Added reference counting bug workaround.
                    209:  *     [91/11/00            jsb]
                    210:  * 
                    211:  * Revision 2.10  91/08/03  18:18:12  jsb
                    212:  *     Removed call to ipc_clport_init.
                    213:  *     [91/07/24  22:11:04  jsb]
                    214:  * 
                    215:  * Revision 2.9  91/06/17  15:46:00  jsb
                    216:  *     Renamed NORMA conditionals.
                    217:  *     [91/06/17  10:45:48  jsb]
                    218:  * 
                    219:  * Revision 2.8  91/06/06  17:05:46  jsb
                    220:  *     Added call to ipc_clport_init.
                    221:  *     [91/05/13  17:17:10  jsb]
                    222:  * 
                    223:  * Revision 2.7  91/05/14  16:32:33  mrt
                    224:  *     Correcting copyright
                    225:  * 
                    226:  * Revision 2.6  91/02/05  17:21:37  mrt
                    227:  *     Changed to new Mach copyright
                    228:  *     [91/02/01  15:45:02  mrt]
                    229:  * 
                    230:  * Revision 2.5  91/01/08  15:13:40  rpd
                    231:  *     Changed zchange calls to make the IPC zones non-collectable.
                    232:  *     [90/12/29            rpd]
                    233:  * 
                    234:  * Revision 2.4  90/12/20  16:38:41  jeffreyh
                    235:  *     Changes to zchange to account for new collectable field. Made all
                    236:  *     ipc zones collectable.
                    237:  *     [90/12/11            jeffreyh]
                    238:  * 
                    239:  * Revision 2.3  90/09/28  16:54:44  jsb
                    240:  *     Added NORMA_IPC support.
                    241:  *     [90/09/28  14:02:05  jsb]
                    242:  * 
                    243:  * Revision 2.2  90/06/02  14:49:55  rpd
                    244:  *     Created for new IPC.
                    245:  *     [90/03/26  20:55:13  rpd]
                    246:  * 
                    247:  */
                    248: /* CMU_ENDHIST */
                    249: /* 
                    250:  * Mach Operating System
                    251:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
                    252:  * All Rights Reserved.
                    253:  * 
                    254:  * Permission to use, copy, modify and distribute this software and its
                    255:  * documentation is hereby granted, provided that both the copyright
                    256:  * notice and this permission notice appear in all copies of the
                    257:  * software, derivative works or modified versions, and any portions
                    258:  * thereof, and that both notices appear in supporting documentation.
                    259:  * 
                    260:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                    261:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                    262:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                    263:  * 
                    264:  * Carnegie Mellon requests users of this software to return to
                    265:  * 
                    266:  *  Software Distribution Coordinator  or  [email protected]
                    267:  *  School of Computer Science
                    268:  *  Carnegie Mellon University
                    269:  *  Pittsburgh PA 15213-3890
                    270:  * 
                    271:  * any improvements or extensions that they make and grant Carnegie Mellon
                    272:  * the rights to redistribute these changes.
                    273:  */
                    274: /*
                    275:  */
                    276: /*
                    277:  *     File:   ipc/ipc_init.c
                    278:  *     Author: Rich Draves
                    279:  *     Date:   1989
                    280:  *
                    281:  *     Functions to initialize the IPC system.
                    282:  */
                    283: 
                    284: #include <mach_debug.h>
                    285: #include <dipc.h>
                    286: #include <mach_rt.h>
                    287: 
                    288: #include <mach/kern_return.h>
                    289: #include <kern/mach_param.h>
                    290: #include <kern/ipc_host.h>
                    291: #include <kern/misc_protos.h>
                    292: #include <vm/vm_map.h>
                    293: #include <vm/vm_kern.h>
                    294: #include <ipc/ipc_entry.h>
                    295: #include <ipc/ipc_space.h>
                    296: #include <ipc/ipc_object.h>
                    297: #include <ipc/ipc_port.h>
                    298: #include <ipc/ipc_pset.h>
                    299: #include <ipc/ipc_notify.h>
                    300: #include <ipc/ipc_kmsg.h>
                    301: #include <ipc/ipc_hash.h>
                    302: #include <ipc/ipc_init.h>
                    303: #include <mach/machine/ndr_def.h>   /* NDR_record */
                    304: 
                    305: vm_map_t ipc_kernel_map;
                    306: vm_size_t ipc_kernel_map_size = 1024 * 1024;
                    307: 
                    308: vm_map_t ipc_kernel_copy_map;
                    309: #define IPC_KERNEL_COPY_MAP_SIZE (8 * 1024 * 1024)
                    310: vm_size_t ipc_kernel_copy_map_size = IPC_KERNEL_COPY_MAP_SIZE;
                    311: vm_size_t ipc_kmsg_max_vm_space = (IPC_KERNEL_COPY_MAP_SIZE * 7)/8;
                    312: 
                    313: int ipc_space_max = SPACE_MAX;
                    314: int ipc_tree_entry_max = ITE_MAX;
                    315: int ipc_port_max = PORT_MAX;
                    316: int ipc_pset_max = SET_MAX;
                    317: 
                    318: extern void mig_init(void);
                    319: extern void ikm_cache_init(void);
                    320: 
                    321: /*
                    322:  *     Routine:        ipc_bootstrap
                    323:  *     Purpose:
                    324:  *             Initialization needed before the kernel task
                    325:  *             can be created.
                    326:  */
                    327: 
                    328: void
                    329: ipc_bootstrap(void)
                    330: {
                    331:        kern_return_t kr;
                    332: 
                    333:        ipc_port_multiple_lock_init();
                    334: 
                    335:        ipc_port_timestamp_lock_init();
                    336:        ipc_port_timestamp_data = 0;
                    337: 
                    338:        /* all IPC zones should be exhaustible */
                    339: 
                    340:        ipc_space_zone = zinit(sizeof(struct ipc_space),
                    341:                               ipc_space_max * sizeof(struct ipc_space),
                    342:                               sizeof(struct ipc_space),
                    343:                               "ipc spaces");
                    344: #if 0
                    345:        /* make it exhaustible */
                    346:        zone_change(ipc_space_zone, Z_EXHAUST, TRUE);
                    347: #endif
                    348: 
                    349:        ipc_tree_entry_zone =
                    350:                zinit(sizeof(struct ipc_tree_entry),
                    351:                        ipc_tree_entry_max * sizeof(struct ipc_tree_entry),
                    352:                        sizeof(struct ipc_tree_entry),
                    353:                        "ipc tree entries");
                    354: #if 0
                    355:        /* make it exhaustible */
                    356:        zone_change(ipc_tree_entry_zone, Z_EXHAUST, TRUE);
                    357: #endif
                    358: 
                    359:        /*
                    360:         * populate all port(set) zones
                    361:         */
                    362:        ipc_object_zones[IOT_PORT] =
                    363:                zinit(sizeof(struct ipc_port),
                    364:                      ipc_port_max * sizeof(struct ipc_port),
                    365:                      sizeof(struct ipc_port),
                    366:                      "ipc ports");
                    367:        /*
                    368:         * XXX  Can't make the port zone exhaustible because the kernel
                    369:         * XXX  panics when port allocation for an internal object fails.
                    370:         *zone_change(ipc_object_zones[IOT_PORT], Z_EXHAUST, TRUE);
                    371:         */
                    372: 
                    373:        ipc_object_zones[IOT_PORT_SET] =
                    374:                zinit(sizeof(struct ipc_pset),
                    375:                      ipc_pset_max * sizeof(struct ipc_pset),
                    376:                      sizeof(struct ipc_pset),
                    377:                      "ipc port sets");
                    378:        /* make it exhaustible */
                    379:        zone_change(ipc_object_zones[IOT_PORT_SET], Z_EXHAUST, TRUE);
                    380: 
                    381:        /* create special spaces */
                    382: 
                    383:        kr = ipc_space_create_special(&ipc_space_kernel);
                    384:        assert(kr == KERN_SUCCESS);
                    385: 
                    386: 
                    387:        kr = ipc_space_create_special(&ipc_space_reply);
                    388:        assert(kr == KERN_SUCCESS);
                    389: 
                    390: #if    DIPC
                    391:        kr = ipc_space_create_special(&ipc_space_remote);
                    392:        assert(kr == KERN_SUCCESS);
                    393: #endif /* DIPC */
                    394: 
                    395:        /* initialize modules with hidden data structures */
                    396: 
                    397: #if    MACH_ASSERT
                    398:        ipc_port_debug_init();
                    399: #endif
                    400:        mig_init();
                    401:        ipc_table_init();
                    402:        ipc_notify_init();
                    403:        ipc_hash_init();
                    404:        ikm_cache_init();
                    405: }
                    406: 
                    407: /* 
                    408:  * XXX tunable, belongs in mach.message.h 
                    409:  */
                    410: #define MSG_OOL_SIZE_SMALL 2049
                    411: vm_size_t msg_ool_size_small;
                    412: 
                    413: #if    MACH_RT
                    414: vm_size_t msg_ool_size_small_rt;
                    415: #endif /* MACH_RT */
                    416: 
                    417: /*
                    418:  *     Routine:        ipc_init
                    419:  *     Purpose:
                    420:  *             Final initialization of the IPC system.
                    421:  */
                    422: 
                    423: void
                    424: ipc_init(void)
                    425: {
                    426:        kern_return_t retval;
                    427:        vm_offset_t min, max;
                    428:        extern vm_size_t kalloc_max_prerounded;
                    429: #if    MACH_RT
                    430:        extern vm_size_t rtmalloc_max_prerounded;
                    431: #endif /* MACH_RT */
                    432: 
                    433:        retval = kmem_suballoc(kernel_map, &min, ipc_kernel_map_size,
                    434:                               TRUE, TRUE, &ipc_kernel_map);
                    435:        if (retval != KERN_SUCCESS)
                    436:                panic("ipc_init: kmem_suballoc of ipc_kernel_map failed");
                    437: 
                    438:        retval = kmem_suballoc(kernel_map, &min, ipc_kernel_copy_map_size,
                    439:                               TRUE, TRUE, &ipc_kernel_copy_map);
                    440:        if (retval != KERN_SUCCESS)
                    441:                panic("ipc_init: kmem_suballoc of ipc_kernel_copy_map failed");
                    442: 
                    443:        ipc_kernel_copy_map->no_zero_fill = TRUE;
                    444:        ipc_kernel_copy_map->wait_for_space = TRUE;
                    445: 
                    446:        /*
                    447:         * As an optimization, 'small' out of line data regions using a 
                    448:         * physical copy strategy are copied into kalloc'ed buffers.
                    449:         * The value of 'small' is determined here.  Requests kalloc()
                    450:         * with sizes greater or equal to kalloc_max_prerounded may fail.
                    451:         */
                    452:        if (kalloc_max_prerounded <=  MSG_OOL_SIZE_SMALL) {
                    453:                msg_ool_size_small = kalloc_max_prerounded;
                    454:        }
                    455:        else {
                    456:                msg_ool_size_small = MSG_OOL_SIZE_SMALL;
                    457:        }
                    458: 
                    459: #if    MACH_RT
                    460:        /*
                    461:         * Real-time IPC, on the other hand, requires that all out-of-line
                    462:         * data be obtained from rtmalloc'ed buffers.
                    463:         */
                    464:        msg_ool_size_small_rt = rtmalloc_max_prerounded;
                    465: #endif /* MACH_RT */
                    466:        
                    467:        ipc_host_init();
                    468: }

unix.superglobalmegacorp.com

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