Annotation of XNU/bsd/dev/ppc/unix_startup.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:  * Copyright (c) 1992,7 NeXT Computer, Inc.
        !            24:  *
        !            25:  * Unix data structure initialization.
        !            26:  *
        !            27:  * HISTORY
        !            28:  *
        !            29:  * 11 Mar 1997 Eryk Vershen @ NeXT
        !            30:  *     Modified from hppa version.
        !            31:  * 26 May 1992 ? at NeXT
        !            32:  *     Created from 68k version.
        !            33:  */
        !            34: 
        !            35: #include <mach_nbc.h>
        !            36: #include <mach/mach_types.h>
        !            37: 
        !            38: #include <vm/vm_kern.h>
        !            39: #include <mach/vm_prot.h>
        !            40: 
        !            41: #include <sys/param.h>
        !            42: #include <sys/buf.h>
        !            43: #include <sys/clist.h>
        !            44: #include <sys/mbuf.h>
        !            45: #include <sys/systm.h>
        !            46: #include <sys/tty.h>
        !            47: #include <bsd/dev/ppc/cons.h>
        !            48: 
        !            49: 
        !            50: extern vm_map_t        mb_map;
        !            51: /*
        !            52:  * Declare these as initialized data so we can patch them.
        !            53:  */
        !            54: int    niobuf = 0;
        !            55: 
        !            56: #ifdef NBUF
        !            57: int            nbuf = NBUF;
        !            58: #else
        !            59: int            nbuf = 0;
        !            60: #endif
        !            61: #ifdef NMFSBUF
        !            62: int    nmfsbuf = NMFSBUF
        !            63: #else
        !            64: int    nmfsbuf = 0;
        !            65: #endif
        !            66: #ifdef BUFPAGES
        !            67: int            bufpages = BUFPAGES;
        !            68: #else
        !            69: int            bufpages = 0;
        !            70: #endif
        !            71: 
        !            72: int    srv = 0;          /* Flag indicates a server boot when set */
        !            73: int    ncl = 0;
        !            74: 
        !            75: vm_map_t       buffer_map;
        !            76: vm_map_t       bufferhdr_map;
        !            77: 
        !            78: 
        !            79: void
        !            80: bsd_startupearly()
        !            81: {
        !            82:        vm_offset_t             v, firstaddr, trash_offset;
        !            83:        vm_size_t               size;
        !            84:        kern_return_t   ret;
        !            85: 
        !            86: 
        !            87:        /*
        !            88:         *      Since these pages are virtual-size pages (larger
        !            89:         *      than physical page size), use only one page
        !            90:         *      per buffer.
        !            91:         */
        !            92: 
        !            93:     if (bufpages == 0) {
        !            94:                if (srv) {
        !            95:                        if (mem_size > (64 * 1024 * 1024)) {
        !            96:                                bufpages = atop(mem_size) / 2;
        !            97: 
        !            98:                        if ((mem_size - ptoa(bufpages)) < (64 * 1024 * 1024))
        !            99:                                bufpages = atop(mem_size - (64 * 1024 * 1024));
        !           100:                        } else {
        !           101:                                bufpages = atop(mem_size / 100);
        !           102:                                bufpages = bufpages * 3; /* 3% */
        !           103:                        }
        !           104:                } else {
        !           105:                        bufpages = atop(mem_size / 100);
        !           106:                        bufpages = bufpages * 3;  /* 3% */
        !           107:                }
        !           108:        }
        !           109: 
        !           110:     if (nbuf == 0) {
        !           111: #if     PRIVATE_BUFS
        !           112:                nbuf = 100;
        !           113: #else   PRIVATE_BUFS
        !           114:            /* Go for a 1-1 correspondence between the number of buffer
        !           115:             * headers and bufpages.  Then add some extra (empty) buffer
        !           116:             * headers to aid clustering.
        !           117:             */
        !           118:            if (bufpages > 65536)
        !           119:                    bufpages = 65536;
        !           120:            if ((nbuf = bufpages) < 16)
        !           121:                    nbuf = 16;
        !           122:            nbuf += 64;
        !           123: #endif  PRIVATE_BUFS
        !           124:        } else if (nbuf > 65536)
        !           125:                nbuf = 65536;
        !           126: 
        !           127:     if (bufpages > nbuf * (MAXBSIZE / page_size))
        !           128:                bufpages = nbuf * (MAXBSIZE / page_size);
        !           129: 
        !           130:        if (niobuf == 0) {
        !           131:                niobuf = bufpages / (MAXPHYSIO / page_size);
        !           132:                if (niobuf < 128)
        !           133:                        niobuf = 128;
        !           134:        }
        !           135:        if (niobuf > 4096)
        !           136:                niobuf = 4096;
        !           137: 
        !           138:        size = (nbuf + niobuf) * sizeof (struct buf);
        !           139:        size = round_page(size);
        !           140: 
        !           141:        ret = kmem_suballoc(kernel_map,
        !           142:                        &firstaddr,
        !           143:                        size,
        !           144:                        FALSE,
        !           145:                        TRUE,
        !           146:                        &bufferhdr_map);
        !           147: 
        !           148:        if (ret != KERN_SUCCESS) 
        !           149:                panic("Failed to create bufferhdr_map\n");
        !           150:        
        !           151:        if (kernel_memory_allocate(bufferhdr_map, &firstaddr, size,
        !           152:                0,
        !           153:                KMA_HERE | KMA_KOBJECT) != KERN_SUCCESS)
        !           154:                        panic("Failed to allocate bufferhdr_map\n");
        !           155: 
        !           156:        buf = (struct buf * )firstaddr;
        !           157:        bzero(buf,size);
        !           158: 
        !           159: 
        !           160:        /*
        !           161:         * Unless set at the boot command line, mfs gets no more than
        !           162:         * half of the system's bufs.  Hack to prevent buf starvation
        !           163:         * and system hang.
        !           164:         */
        !           165:        if (nmfsbuf == 0)
        !           166:                nmfsbuf = nbuf / 2;
        !           167: 
        !           168:        if ((mem_size > (64 * 1024 * 1024)) || ncl) {
        !           169:                int scale;
        !           170:                extern u_long tcp_sendspace;
        !           171:                extern u_long tcp_recvspace;
        !           172: 
        !           173:                if ((nmbclusters = ncl) == 0) {
        !           174:                        if ((nmbclusters = ((mem_size / 16) / MCLBYTES)) > 8192)
        !           175:                                nmbclusters = 8192;
        !           176:                }
        !           177:                if ((scale = nmbclusters / NMBCLUSTERS) > 1) {
        !           178:                        tcp_sendspace *= scale;
        !           179:                        tcp_recvspace *= scale;
        !           180: 
        !           181:                        if (tcp_sendspace > (32 * 1024))
        !           182:                                tcp_sendspace = 32 * 1024;
        !           183:                        if (tcp_recvspace > (32 * 1024))
        !           184:                                tcp_recvspace = 32 * 1024;
        !           185:                }
        !           186:        }
        !           187: }
        !           188: 
        !           189: void
        !           190: bsd_bufferinit()
        !           191: {
        !           192:     unsigned int       i;
        !           193:     vm_offset_t                v;
        !           194:     vm_size_t          size;
        !           195:     kern_return_t      ret;
        !           196:     vm_offset_t                trash_offset, firstaddr;
        !           197:     int                        base, residual;
        !           198: 
        !           199:     cons.t_dev = makedev(12, 0);
        !           200: 
        !           201: 
        !           202:        bsd_startupearly();
        !           203: 
        !           204:        size = round_page(nbuf * MAXBSIZE) + (niobuf * MAXPHYSIO);
        !           205:         ret = kmem_suballoc(kernel_map,
        !           206:                        &firstaddr,
        !           207:                        size,
        !           208:                        TRUE,
        !           209:                        TRUE,
        !           210:                        &buffer_map);
        !           211: 
        !           212:        if (ret != KERN_SUCCESS) 
        !           213:                panic("Failed to create buffer_map\n");
        !           214:        buffers = firstaddr;
        !           215:        printf("Buffer cache at %x\n",buffers);
        !           216:        base = bufpages / nbuf;
        !           217:        residual = bufpages % nbuf;
        !           218: 
        !           219:     for (i = 0; i < nbuf; i++) {
        !           220:        vm_size_t       thisbsize;
        !           221:        vm_offset_t     curbuf;
        !           222: 
        !           223:        /*
        !           224:         * First <residual> buffers get (base+1) physical pages
        !           225:         * allocated for them.  The rest get (base) physical pages.
        !           226:         *
        !           227:         * The rest of each buffer occupies virtual space,
        !           228:         * but has no physical memory allocated for it.
        !           229:         */
        !           230: 
        !           231:        thisbsize = page_size*(i < residual ? base+1 : base);
        !           232:        curbuf = (vm_offset_t)buffers + i * MAXBSIZE;
        !           233:        if (thisbsize) {
        !           234:        ret = vm_map_enter(buffer_map, &curbuf, thisbsize,
        !           235:                          (vm_offset_t) 0, FALSE,
        !           236:                          VM_OBJECT_NULL, (vm_offset_t) 0, FALSE,
        !           237:                          VM_PROT_DEFAULT, VM_PROT_ALL, VM_INHERIT_DEFAULT);
        !           238:        if (ret != KERN_SUCCESS) {
        !           239:                panic("Failed to allocate buffer cache pages\n");
        !           240:        }
        !           241:        ret = vm_map_wire(buffer_map, curbuf, curbuf+thisbsize, VM_PROT_READ | VM_PROT_WRITE, FALSE);
        !           242:        if (ret != KERN_SUCCESS)
        !           243:                panic("Failed to wire buffer cache pages\n");
        !           244: 
        !           245:        } else {
        !           246:                /* printf("skipping allocating buffer page to buf %d\n",i); */
        !           247:        }
        !           248:     }
        !           249: 
        !           250: 
        !           251: #define MEG    (1024*1024)
        !           252:     {
        !           253:        register int    nbytes;
        !           254: 
        !           255:        nbytes = ptoa(bufpages);
        !           256:        printf("using %d buffers containing %d.%d%d megabytes of memory\n",
        !           257:                nbuf,
        !           258:                nbytes/MEG,
        !           259:                ((nbytes%MEG)*10)/MEG,
        !           260:                ((nbytes%(MEG/10))*100)/MEG);
        !           261: 
        !           262:     }
        !           263: 
        !           264:         ret = kmem_suballoc(kernel_map,
        !           265:                        &mbutl,
        !           266:                        (vm_size_t) (nmbclusters * MCLBYTES),
        !           267:                        FALSE,
        !           268:                        TRUE,
        !           269:                        &mb_map);
        !           270: 
        !           271:        if (ret != KERN_SUCCESS) 
        !           272:                panic("Failed to allocate mb_map\n");
        !           273:        /* embutl = ((unsigned char *)mbutl + (nmbclusters * MCLBYTES)); */
        !           274:        
        !           275:     /*
        !           276:      * Set up buffers, so they can be used to read disk labels.
        !           277:      */
        !           278:     bufinit();
        !           279: }
        !           280: 

unix.superglobalmegacorp.com

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