Annotation of XNU/osfmk/ipc/ipc_init.c, revision 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.