Annotation of kernel/machdep/ppc/swapgeneric.m, revision 1.1.1.1

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) 1987, 1988 NeXT, Inc.
                     27:  *
                     28:  * HISTORY
                     29:  *
                     30:  * Tue Dec  7 17:37:14 PST 1993 Matt Watson (mwatson) at NeXT
                     31:  *     Added netboot capability.
                     32:  *
                     33:  * 07-Apr-90   Doug Mitchell at NeXT
                     34:  *     Added fd driver support.
                     35:  *
                     36:  * 16-Feb-88  John Seamons (jks) at NeXT
                     37:  *     Updated to Mach release 2.
                     38:  *
                     39:  * 29-Oct-87  Robert V. Baron (rvb) at Carnegie-Mellon University
                     40:  *     Allow root to be an arbitrary slice on the drive.
                     41:  *
                     42:  * 14-Nov-86  John Seamons (jks) at NeXT
                     43:  *     Ported to NeXT.
                     44:  */ 
                     45: 
                     46: #import <sys/param.h>
                     47: #import <sys/conf.h>
                     48: #import <sys/buf.h>
                     49: #import <sys/time.h>
                     50: #import <sys/systm.h>
                     51: #import <sys/mount.h>
                     52: #import <sys/reboot.h>
                     53: #import <sys/vnode.h>
                     54: #import <sys/socket.h>
                     55: #import <sys/errno.h>
                     56: #import <sys/ioctl.h>
                     57: #import <net/if.h>
                     58: #import <netinet/in_systm.h>
                     59: #import <netinet/in.h>
                     60: #import <netinet/in_var.h>
                     61: #import <netinet/ip.h>
                     62: #import <netinet/udp.h>
                     63: #import <netinet/if_ether.h>
                     64: //#import <machdep/ppc/kernBootStruct.h>
                     65: #import <machdep/ppc/powermac.h>
                     66: #import <driverkit/kernelDriver.h>
                     67: #import <driverkit/IODiskPartition.h>
                     68: #import <bsd/dev/scsireg.h>
                     69: /*
                     70:  * Hack to avoid collision with vnode.h!
                     71:  */
                     72: #undef IO_UNIT
                     73: #import <driverkit/IODeviceParams.h>
                     74: #import <driverkit/SCSIDisk.h>
                     75: 
                     76: extern int ffs_mountroot();
                     77: 
                     78: #ifdef NFSCLIENT
                     79: extern char    *nfsbootdevname;        /* nfs_boot.c */
                     80: extern int nfs_mountroot();    /* nfs_vfsops.c */
                     81: #else  /* NFSCLIENT */
                     82: static char    *nfsbootdevname;
                     83: static int nfs_mountroot() { return ENOSYS; }
                     84: #endif /* NFSCLIENT */
                     85: 
                     86: extern int (*mountroot)();
                     87: 
                     88: extern char hostname[], boot_info[], boot_dev[];
                     89: extern char domainname[];
                     90: extern struct xdr_ops xdrmbuf_ops;
                     91: extern int hostnamelen;
                     92: char rootdevice[ 128 ];
                     93: 
                     94: // wait until 30 seconds after probe for non-ready root disk
                     95: #define MAX_DISK_PROBE_TIME    30
                     96: 
                     97: int    boottype = 0, boothowto = RB_DEBUG;
                     98: 
                     99: /*
                    100:  * Generic configuration;  all in one
                    101:  */
                    102: extern long    dumplo;
                    103: int    dmmin, dmmax, dmtext;
                    104: 
                    105: struct genericconf {
                    106:        char    *gc_name;
                    107:        dev_t   gc_root;        /* NODEV means remote root */
                    108: } genericconf[] = {
                    109:        { "sd", makedev(6, 0) },
                    110:        { "hd", makedev(3, 0) },
                    111:        { "fd", makedev(1, 0) },
                    112:        { "en", NODEV },
                    113:        { "tr", NODEV },
                    114:        { 0 },
                    115: };
                    116: 
                    117: static struct genericconf *gc;
                    118: static int scsiControllerDetected(void);
                    119: 
                    120: #include <machdep/ppc/DeviceTree.h>
                    121: 
                    122: id
                    123: SearchForDeviceByPath( char * path, char ** firstArg )
                    124: {
                    125:     IOReturn   err;
                    126:     int                objectNum = 0;
                    127:     id         dev = nil;
                    128:     char    *  tail;
                    129:     char       c;
                    130: 
                    131:     if( firstArg)
                    132:         *firstArg = NULL;
                    133:     do {
                    134:         err = [IODevice lookupByObjectNumber:objectNum++ instance:&dev];
                    135:         if( err != IO_R_SUCCESS)
                    136:             continue;
                    137: 
                    138:         if( (tail = [dev matchDevicePath:path])) {
                    139:            c = tail[ 0 ];
                    140:            if( c) {
                    141:                if( c == ':') {
                    142:                    if( firstArg)
                    143:                         *firstArg = tail + 1;
                    144:                } else
                    145:                    dev = nil;
                    146:            }
                    147:        } else
                    148:             dev = nil;
                    149: 
                    150:     } while( (dev == nil) && (err != IO_R_NO_DEVICE));
                    151: 
                    152:     return( dev);
                    153: }
                    154: 
                    155: setconf()
                    156: {
                    157:        int             devmajor, devminor;
                    158:        int             unit = 0;
                    159:         int            slice = 0;
                    160:         char   *       firstArg;
                    161:        id              dev, disk;
                    162:        char    *       name, stringBuf[ 32 ];
                    163:         char   *       chosen = NULL;
                    164:        char            scsiName[ 10 ];
                    165:        int             panelUp = 0;
                    166:        BOOL            sliceValid = NO;
                    167:         char           c;
                    168: 
                    169:         if( 0 == (boothowto & RB_ASKNAME)) do {
                    170:             DTEntry            dtEntry;
                    171:            int                 size;
                    172: 
                    173:            c = rootdevice[ 0 ];
                    174:            if( c == '*')
                    175:                 chosen = rootdevice + 1;
                    176:            if( c)
                    177:                 continue;
                    178:             sliceValid = NO;
                    179: 
                    180:             if( (kSuccess == DTLookupEntry( 0, "/chosen", &dtEntry))
                    181:              && (kSuccess == DTGetProperty( dtEntry, "rootpath", (void **)&chosen, &size)) )
                    182:                 continue;
                    183: 
                    184:             if( kSuccess != DTLookupEntry( 0, "/options", &dtEntry))
                    185:                 continue;
                    186:             if( kSuccess == DTGetProperty( dtEntry, "boot-file", (void **)&chosen, &size) )
                    187:                 continue;
                    188: 
                    189:         } while( NO);
                    190: 
                    191:        if( chosen) {
                    192: 
                    193:             char *     path = NULL;
                    194:             enum {     kPathSize = 256 };
                    195: 
                    196:             path = kalloc( kPathSize );
                    197:             if( path ) {
                    198:                 IODealiasPath( path, chosen );
                    199:                 dev = SearchForDeviceByPath( path, &firstArg );
                    200:            } else
                    201:                dev = NULL;
                    202: 
                    203:            if( dev) {
                    204:                printf("Root device for %s found: %s\n", chosen, [dev name]);
                    205: 
                    206:                if( sliceValid && firstArg) {
                    207:                    slice = strtol( firstArg, 0, 16);
                    208:                    if( (slice >= 8) || (slice < 0))
                    209:                        slice = 0;
                    210:                }
                    211:                if( firstArg) {
                    212:                    char        * tail;
                    213:                    extern char   boot_file[];
                    214: 
                    215:                    // look backwards for ",kernel-name"
                    216:                    tail = firstArg + strlen( firstArg);
                    217:                    while( (tail != firstArg) && (tail[ 0 ] != ','))
                    218:                        tail--;
                    219:                    if( tail != firstArg) {
                    220:                        strcpy( boot_file, tail + 1);
                    221:                        kprintf("Kernel name: %s\n", boot_file);
                    222:                    }
                    223:                }
                    224: 
                    225:                 if( [dev respondsTo:@selector(nextLogicalDisk)]) {
                    226:                     disk = [dev nextLogicalDisk];
                    227:                     if( [disk respondsTo:@selector(waitForProbe:)]) {
                    228:                         if( nil == [disk waitForProbe:MAX_DISK_PROBE_TIME])
                    229:                             dev = nil;
                    230:                     }
                    231:                 }
                    232:            }
                    233:             if( nil == dev)
                    234:                 boothowto |= RB_ASKNAME;
                    235:            else
                    236:                 strcpy( rootdevice, [dev name]);
                    237:            if( path)
                    238:                kfree( path, kPathSize );
                    239:        }
                    240: 
                    241:        if ((boothowto & RB_ASKNAME) || rootdevice[0]) {
                    242: retry:
                    243:                if (boothowto & RB_ASKNAME) {
                    244: 
                    245:                        if( 0 == panelUp) {
                    246:                             DoSafeAlert("Root Device?", "", TRUE);
                    247:                            panelUp = 1;
                    248:                        }
                    249:                        safe_prf("root device? ");
                    250:                        name = stringBuf;
                    251:                        our_gets(name, name);
                    252:                        if (*name == 0) {
                    253:                            safe_prf("defaulting to en0\n");
                    254:                            strcpy(name, "en0");
                    255:                        }
                    256:                        strcpy(rootdevice, name);
                    257:                } else {
                    258:                        /* 
                    259:                         * If we've been asked for CDROM, find the 
                    260:                         * corresponding sd device.
                    261:                         */
                    262:                        if(!strcmp("cdrom", rootdevice)) {
                    263:                            id scsiId = nil;
                    264:                            int i;
                    265:                            IOReturn rtn;
                    266:                            unsigned char inquiryType;
                    267:                            
                    268:                            for(i=0; i<16; i++) {
                    269:                                sprintf(scsiName, "sd%d", i);
                    270:                                rtn = IOGetObjectForDeviceName(scsiName,
                    271:                                        &scsiId);
                    272:                                if(rtn) {
                    273:                                    break;      // no more sd's
                    274:                                }
                    275:                                inquiryType = [scsiId inquiryDeviceType];
                    276:                                if(inquiryType == DEVTYPE_CDROM) {
                    277:                                    name = scsiName;
                    278:                                    goto name_found;
                    279:                                }
                    280:                                /* else continue to next sd */
                    281:                            }
                    282:                            if (scsiControllerDetected())
                    283:                                printf("No CD-ROM drive found\n");
                    284:                            else
                    285:                                printf("No SCSI controller or CD-ROM drive found\n");
                    286:                            goto bad;
                    287:                        }
                    288:                        else {
                    289:                            name = rootdevice;
                    290:                        }
                    291: name_found:
                    292:                        printf ("root on %s\n", name);
                    293:                }
                    294:                for (gc = genericconf; gc->gc_name; gc++)
                    295:                        if (gc->gc_name[0] == name[0] &&
                    296:                            gc->gc_name[1] == name[1])
                    297:                                goto gotit;
                    298:                goto bad;
                    299: 
                    300: gotit:
                    301:                if (gc->gc_root == NODEV) {
                    302:                        goto found;
                    303:                }
                    304:                if (name[2] >= '0' && name[2] <= '7') {
                    305:                        if (name[3] >= 'a' && name[3] <= 'h') {
                    306:                                slice = name[3] - 'a';
                    307:                        } else if (name[3]) {
                    308:                                printf("bad partition number\n");
                    309:                                goto bad;
                    310:                        }
                    311:                        unit = name[2] - '0';
                    312:                        goto found;
                    313:                }
                    314:                printf("bad/missing unit number\n");
                    315: bad:
                    316:                for (gc = genericconf; gc->gc_name; gc++)
                    317:                        printf("%s%s%%d",
                    318:                               (gc == genericconf)?"use ":
                    319:                                    (((gc+1)->gc_name)?", ":" or "),
                    320:                               gc->gc_name);
                    321:                printf("\n");
                    322:                boothowto |= RB_ASKNAME;
                    323:                goto retry;
                    324: found:
                    325:               if (gc->gc_root == NODEV) {
                    326:                                printf("mounting nfs root\n");
                    327:                                nfsbootdevname = rootdevice;
                    328:                                mountroot = nfs_mountroot;
                    329:                                rootdev = NODEV;
                    330:               } else {
                    331:                                mountroot = ffs_mountroot;
                    332:                                gc->gc_root = makedev(major(gc->gc_root), unit*8+slice);
                    333:                                rootdev = gc->gc_root;
                    334:               }
                    335:        }
                    336:        else
                    337:        {
                    338: #ifdef BOOT_ARGS_PASSED
                    339: 
                    340:                boottype = kernBootStruct->rootdev;
                    341:                devmajor = (boottype >> B_TYPESHIFT) & B_TYPEMASK;
                    342:                devminor = (boottype >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
                    343:                devminor |= (((boottype >> B_UNITSHIFT) & B_UNITMASK) << 3);
                    344: 
                    345:                rootdev = makedev(devmajor, devminor);
                    346: #else
                    347: #if 0
                    348:                printf("mounting nfs root\n");
                    349:                if (!rootdevice[0])
                    350:                    strcpy(rootdevice, "en0");
                    351:                nfsbootdevname = rootdevice;
                    352:                mountroot = nfs_mountroot;
                    353:                rootdev = NODEV;
                    354: #else
                    355:                boothowto |= RB_ASKNAME;
                    356:                goto retry;
                    357: #endif
                    358: #endif
                    359:        }
                    360:                printf("rootdev %x, howto %x\n", rootdev, boothowto);
                    361: 
                    362:     if( panelUp)
                    363:        alert_done();
                    364: }
                    365: 
                    366: our_gets(cp, lp)
                    367:        char *cp, *lp;
                    368: {
                    369:        register c;
                    370: 
                    371:        for (;;) {
                    372:                c = cngetc() & 0177;
                    373:                switch (c) {
                    374:                case '\n':
                    375:                case '\r':
                    376:                        *lp++ = '\0';
                    377:                        return;
                    378:                case '\177':
                    379:                        if (lp == cp) {
                    380:                                cnputc('\b');
                    381:                                continue;
                    382:                        }
                    383:                        cnputc('\b');
                    384:                        cnputc('\b');
                    385:                        /* fall into ... */
                    386:                case '\b':
                    387:                        if (lp == cp) {
                    388:                                cnputc('\b');
                    389:                                continue;
                    390:                        }
                    391:                        cnputc(' ');
                    392:                        cnputc('\b');
                    393:                        lp--;
                    394:                        continue;
                    395:                case '@':
                    396:                case 'u'&037:
                    397:                        lp = cp;
                    398:                        cnputc('\n');
                    399:                        continue;
                    400:                default:
                    401:                        *lp++ = c;
                    402:                }
                    403:        }
                    404: }
                    405: 
                    406: /*
                    407:  * If booted with ASKNAME, prompt on the console for a filesystem
                    408:  * name and return it.
                    409:  */
                    410: getfsname(askfor, name)
                    411:        char *askfor;
                    412:        char *name;
                    413: {
                    414: 
                    415:        if (boothowto & RB_ASKNAME) {
                    416:                printf("%s key [%s]: ", askfor, askfor);
                    417:                our_gets(name, name);
                    418:        }
                    419: }
                    420: 
                    421: static int
                    422: scsiControllerDetected(void)
                    423: {
                    424:     IOReturn rtn;
                    425:     IOObjectNumber i;
                    426:     IOString name, kind;
                    427:     Protocol **protos;
                    428:     id deviceId;
                    429:     int j;
                    430:     
                    431:     protos = [SCSIDisk requiredProtocols];
                    432:     if (protos == NULL || *protos == nil) {
                    433:        /*
                    434:         * We can't search for a SCSI adapter,
                    435:         * so don't say we didn't find one.
                    436:         */
                    437:        return 1;
                    438:     }
                    439:     for(i = 0; ; i++) {
                    440:        rtn = [IODevice lookupByObjectNumber:i deviceKind:&kind 
                    441:                deviceName:&name];
                    442:        if (rtn != IO_R_SUCCESS && rtn != IO_R_OFFLINE)
                    443:            break;
                    444:        rtn = IOGetObjectForDeviceName(name, &deviceId);
                    445:        if (rtn == IO_R_SUCCESS) {
                    446:            int conforms = 1;
                    447:            /* Check to see if it implements the correct protocols. */
                    448:            for(j=0; protos[j]; j++) {
                    449:                    if(![deviceId conformsTo:protos[j]]) {
                    450:                        conforms = 0;
                    451:                        break;
                    452:                    }
                    453:            }
                    454:            if (conforms)
                    455:                return 1;
                    456:        }
                    457:     }
                    458:     return 0;
                    459: }
                    460: 
                    461: bsd_autoconf()
                    462: {
                    463: #if GDB
                    464:   if (IsPowerSurge())
                    465:     mace_init();
                    466: #endif
                    467: }
                    468: 

unix.superglobalmegacorp.com

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