Annotation of XNU/osfmk/ipc/ipc_table.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:  * 
                     28:  * Revision 1.1.1.1  1998/09/22 21:05:28  wsanchez
                     29:  * Import of Mac OS X kernel (~semeria)
                     30:  *
                     31:  * Revision 1.2  1998/06/01 17:29:25  youngwor
                     32:  * Added infrastructure for shared port space support
                     33:  *
                     34:  * Revision 1.1.1.1  1998/03/07 02:26:16  wsanchez
                     35:  * Import of OSF Mach kernel (~mburg)
                     36:  *
                     37:  * Revision 1.2.10.1  1994/09/23  02:12:16  ezf
                     38:  *     change marker to not FREE
                     39:  *     [1994/09/22  21:30:49  ezf]
                     40:  *
                     41:  * Revision 1.2.2.3  1993/07/22  16:17:30  rod
                     42:  *     Add ANSI prototypes.  CR #9523.
                     43:  *     [1993/07/22  13:33:29  rod]
                     44:  * 
                     45:  * Revision 1.2.2.2  1993/06/02  23:33:55  jeffc
                     46:  *     Added to OSF/1 R1.3 from NMK15.0.
                     47:  *     [1993/06/02  21:11:14  jeffc]
                     48:  * 
                     49:  * Revision 1.2  1992/11/25  01:09:56  robert
                     50:  *     integrate changes below for norma_14
                     51:  * 
                     52:  *     Philippe Bernadat (bernadat) at gr.osf.org
                     53:  *     Limit ipc table allocation chunks to 8 pages, otherwise
                     54:  *     the kernel might dead lock because of VM_PAGE_FREE_RESERVED
                     55:  *     limited to 15. [[email protected] & [email protected]]
                     56:  *     [1992/11/13  19:31:46  robert]
                     57:  * 
                     58:  * Revision 1.1  1992/09/30  02:08:13  robert
                     59:  *     Initial revision
                     60:  * 
                     61:  * $EndLog$
                     62:  */
                     63: /* CMU_HIST */
                     64: /*
                     65:  * Revision 2.6  91/10/09  16:11:08  af
                     66:  *      Revision 2.5.2.1  91/09/16  10:16:06  rpd
                     67:  *             Removed unused variables.
                     68:  *             [91/09/02            rpd]
                     69:  * 
                     70:  * Revision 2.5.2.1  91/09/16  10:16:06  rpd
                     71:  *     Removed unused variables.
                     72:  *     [91/09/02            rpd]
                     73:  * 
                     74:  * Revision 2.5  91/05/14  16:37:35  mrt
                     75:  *     Correcting copyright
                     76:  * 
                     77:  * Revision 2.4  91/03/16  14:48:52  rpd
                     78:  *     Added ipc_table_realloc and ipc_table_reallocable.
                     79:  *     [91/03/04            rpd]
                     80:  * 
                     81:  * Revision 2.3  91/02/05  17:24:15  mrt
                     82:  *     Changed to new Mach copyright
                     83:  *     [91/02/01  15:52:05  mrt]
                     84:  * 
                     85:  * Revision 2.2  90/06/02  14:51:58  rpd
                     86:  *     Created for new IPC.
                     87:  *     [90/03/26  21:04:20  rpd]
                     88:  * 
                     89:  */
                     90: /* CMU_ENDHIST */
                     91: /* 
                     92:  * Mach Operating System
                     93:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
                     94:  * All Rights Reserved.
                     95:  * 
                     96:  * Permission to use, copy, modify and distribute this software and its
                     97:  * documentation is hereby granted, provided that both the copyright
                     98:  * notice and this permission notice appear in all copies of the
                     99:  * software, derivative works or modified versions, and any portions
                    100:  * thereof, and that both notices appear in supporting documentation.
                    101:  * 
                    102:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                    103:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                    104:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                    105:  * 
                    106:  * Carnegie Mellon requests users of this software to return to
                    107:  * 
                    108:  *  Software Distribution Coordinator  or  [email protected]
                    109:  *  School of Computer Science
                    110:  *  Carnegie Mellon University
                    111:  *  Pittsburgh PA 15213-3890
                    112:  * 
                    113:  * any improvements or extensions that they make and grant Carnegie Mellon
                    114:  * the rights to redistribute these changes.
                    115:  */
                    116: /*
                    117:  */
                    118: /*
                    119:  *     File:   ipc/ipc_table.c
                    120:  *     Author: Rich Draves
                    121:  *     Date:   1989
                    122:  *
                    123:  *     Functions to manipulate tables of IPC capabilities.
                    124:  */
                    125: 
                    126: #include <mach/kern_return.h>
                    127: #include <mach/vm_param.h>
                    128: #include <ipc/ipc_table.h>
                    129: #include <ipc/ipc_port.h>
                    130: #include <ipc/ipc_entry.h>
                    131: #include <kern/kalloc.h>
                    132: #include <vm/vm_kern.h>
                    133: 
                    134: /*
                    135:  * Forward declarations
                    136:  */
                    137: void ipc_table_fill(
                    138:        ipc_table_size_t        its,
                    139:        unsigned int            num,
                    140:        unsigned int            min,
                    141:        vm_size_t               elemsize);
                    142: 
                    143: /*
                    144:  *     We borrow the kalloc map, rather than creating
                    145:  *     yet another submap of the kernel map.
                    146:  */
                    147: 
                    148: extern vm_map_t kalloc_map;
                    149: 
                    150: ipc_table_size_t ipc_table_entries;
                    151: unsigned int ipc_table_entries_size = 512;
                    152: 
                    153: ipc_table_size_t ipc_table_dnrequests;
                    154: unsigned int ipc_table_dnrequests_size = 64;
                    155: 
                    156: void
                    157: ipc_table_fill(
                    158:        ipc_table_size_t        its,         /* array to fill */
                    159:        unsigned int            num,         /* size of array */
                    160:        unsigned int            min,         /* at least this many elements */
                    161:        vm_size_t               elemsize)    /* size of elements */
                    162: {
                    163:        unsigned int index;
                    164:        vm_size_t minsize = min * elemsize;
                    165:        vm_size_t size;
                    166:        vm_size_t incrsize;
                    167: 
                    168:        /* first use powers of two, up to the page size */
                    169: 
                    170:        for (index = 0, size = 1;
                    171:             (index < num) && (size < PAGE_SIZE);
                    172:             size <<= 1) {
                    173:                if (size >= minsize) {
                    174:                        its[index].its_size = size / elemsize;
                    175:                        index++;
                    176:                }
                    177:        }
                    178: 
                    179:        /* then increments of a page, then two pages, etc. */
                    180: 
                    181:        for (incrsize = PAGE_SIZE; index < num;) {
                    182:                unsigned int period;
                    183: 
                    184:                for (period = 0;
                    185:                     (period < 15) && (index < num);
                    186:                     period++, size += incrsize) {
                    187:                        if (size >= minsize) {
                    188:                                its[index].its_size = size / elemsize;
                    189:                                index++;
                    190:                        }
                    191:                }
                    192:                if (incrsize < (PAGE_SIZE << 3))
                    193:                        incrsize <<= 1;
                    194:        }
                    195: }
                    196: 
                    197: void
                    198: ipc_table_init(void)
                    199: {
                    200:        ipc_table_entries = (ipc_table_size_t)
                    201:                kalloc(sizeof(struct ipc_table_size) *
                    202:                       ipc_table_entries_size);
                    203:        assert(ipc_table_entries != ITS_NULL);
                    204: 
                    205:        ipc_table_fill(ipc_table_entries, ipc_table_entries_size - 1,
                    206:                        4, sizeof(struct ipc_entry) + 
                    207:                        sizeof(ipc_entry_bits_t) + 
                    208:                        sizeof(ipc_table_index_t));
                    209: 
                    210:        /* the last two elements should have the same size */
                    211: 
                    212:        ipc_table_entries[ipc_table_entries_size - 1].its_size =
                    213:                ipc_table_entries[ipc_table_entries_size - 2].its_size;
                    214: 
                    215: 
                    216:        ipc_table_dnrequests = (ipc_table_size_t)
                    217:                kalloc(sizeof(struct ipc_table_size) *
                    218:                       ipc_table_dnrequests_size);
                    219:        assert(ipc_table_dnrequests != ITS_NULL);
                    220: 
                    221:        ipc_table_fill(ipc_table_dnrequests, ipc_table_dnrequests_size - 1,
                    222:                       2, sizeof(struct ipc_port_request));
                    223: 
                    224:        /* the last element should have zero size */
                    225: 
                    226:        ipc_table_dnrequests[ipc_table_dnrequests_size - 1].its_size = 0;
                    227: }
                    228: 
                    229: /*
                    230:  *     Routine:        ipc_table_alloc
                    231:  *     Purpose:
                    232:  *             Allocate a table.
                    233:  *     Conditions:
                    234:  *             May block.
                    235:  */
                    236: 
                    237: vm_offset_t
                    238: ipc_table_alloc(
                    239:        vm_size_t       size)
                    240: {
                    241:        vm_offset_t table;
                    242: 
                    243:        if (size < PAGE_SIZE)
                    244:                table = kalloc(size);
                    245:        else
                    246:                if (kmem_alloc(kalloc_map, &table, size) != KERN_SUCCESS)
                    247:                        table = 0;
                    248: 
                    249:        return table;
                    250: }
                    251: 
                    252: /*
                    253:  *     Routine:        ipc_table_realloc
                    254:  *     Purpose:
                    255:  *             Reallocate a big table.
                    256:  *
                    257:  *             The new table remaps the old table,
                    258:  *             so copying is not necessary.
                    259:  *     Conditions:
                    260:  *             Only works for page-size or bigger tables.
                    261:  *             May block.
                    262:  */
                    263: 
                    264: vm_offset_t
                    265: ipc_table_realloc(
                    266:        vm_size_t       old_size,
                    267:        vm_offset_t     old_table,
                    268:        vm_size_t       new_size)
                    269: {
                    270:        vm_offset_t new_table;
                    271: 
                    272:        if (kmem_realloc(kalloc_map, old_table, old_size,
                    273:                         &new_table, new_size) != KERN_SUCCESS)
                    274:                new_table = 0;
                    275: 
                    276:        return new_table;
                    277: }
                    278: 
                    279: /*
                    280:  *     Routine:        ipc_table_free
                    281:  *     Purpose:
                    282:  *             Free a table allocated with ipc_table_alloc or
                    283:  *             ipc_table_realloc.
                    284:  *     Conditions:
                    285:  *             May block.
                    286:  */
                    287: 
                    288: void
                    289: ipc_table_free(
                    290:        vm_size_t       size,
                    291:        vm_offset_t     table)
                    292: {
                    293:        if (size < PAGE_SIZE)
                    294:                kfree(table, size);
                    295:        else
                    296:                kmem_free(kalloc_map, table, size);
                    297: }

unix.superglobalmegacorp.com

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