Annotation of coherent/d/PS2_KERNEL/coh.386/null.c, revision 1.1.1.1

1.1       root        1: /* $Header: /kernel/kersrc/coh.386/RCS/null.c,v 1.2 92/08/04 12:33:53 bin Exp Locker: bin $ */
                      2: /* (lgl-
                      3:  *     The information contained herein is a trade secret of Mark Williams
                      4:  *     Company, and  is confidential information.  It is provided  under a
                      5:  *     license agreement,  and may be  copied or disclosed  only under the
                      6:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
                      7:  *     material without the express written authorization of Mark Williams
                      8:  *     Company or persuant to the license agreement is unlawful.
                      9:  *
                     10:  *     COHERENT Version 2.3.37
                     11:  *     Copyright (c) 1982, 1983, 1984.
                     12:  *     An unpublished work by Mark Williams Company, Chicago.
                     13:  *     All rights reserved.
                     14:  -lgl) */
                     15: /*
                     16:  * Null and memory driver.
                     17:  *  Minor device 0 is /dev/null
                     18:  *  Minor device 1 is /dev/mem, physical memory
                     19:  *  Minor device 2 is /dev/kmem, kernel data
                     20:  *  Minor device 3 is /dev/cmos
                     21:  *  Minor device 4 is /dev/boot_gift
                     22:  *
                     23:  * $Log:       null.c,v $
                     24:  * Revision 1.2  92/08/04  12:33:53  bin
                     25:  * changed for ker 59
                     26:  * 
                     27:  * Revision 1.2  92/01/06  11:59:49  hal
                     28:  * Compile with cc.mwc.
                     29:  * 
                     30:  * Revision 1.1        88/03/24  16:14:04      src
                     31:  * Initial revision
                     32:  * 
                     33:  */
                     34: 
                     35: /*
                     36:  * The symbol "DANGEROUS" should be undefined for a production system.
                     37:  */
                     38: #define NULL_IOCTL     /* Allow ioctl()s for /dev/kmem.  */
                     39: #define DANGEROUS      /* Allow dangerous ioctl()s for /dev/null.  */
                     40: 
                     41: #include <sys/coherent.h>
                     42: #include <sys/con.h>
                     43: #include <errno.h>
                     44: #include <sys/stat.h>
                     45: #include <sys/typed.h>
                     46: #ifdef NULL_IOCTL
                     47: #include <sys/null.h>
                     48: #endif /* NULL_IOCTL */
                     49: 
                     50: /* These are minor numbers.  */
                     51: #define DEV_NULL       0       /* /dev/null    */
                     52: #define DEV_MEM                1       /* /dev/mem     */
                     53: #define DEV_KMEM       2       /* /dev/kmem    */
                     54: #define DEV_CMOS       3       /* /dev/cmos    */
                     55: #define DEV_BOOTGIFT   4       /* /dev/bootgift  */
                     56: 
                     57: /*
                     58:  * Functions for configuration.
                     59:  */
                     60: int    nlread();
                     61: int    nlwrite();
                     62: int    nlioctl();
                     63: int    nulldev();
                     64: int    nonedev();
                     65: 
                     66: /*
                     67:  * Configuration table.
                     68:  */
                     69: CON nlcon ={
                     70:        DFCHR,                          /* Flags */
                     71:        0,                              /* Major index */
                     72:        nulldev,                        /* Open */
                     73:        nulldev,                        /* Close */
                     74:        nulldev,                        /* Block */
                     75:        nlread,                         /* Read */
                     76:        nlwrite,                        /* Write */
                     77: #ifdef NULL_IOCTL
                     78:        nlioctl,                        /* Ioctl */
                     79: #else /* NULL_IOCTL */
                     80:        nonedev,                        /* Ioctl */
                     81: #endif /* NULL_IOCTL */
                     82:        nulldev,                        /* Powerfail */
                     83:        nulldev,                        /* Timeout */
                     84:        nulldev,                        /* Load */
                     85:        nulldev                         /* Unload */
                     86: };
                     87: 
                     88: /*
                     89:  * Null/memory read routine.
                     90:  */
                     91: nlread(dev, iop)
                     92: dev_t dev;
                     93: register IO *iop;
                     94: {
                     95:        register unsigned n;
                     96:        unsigned char tmp, read_cmos();
                     97:        extern typed_space boot_gift;
                     98: 
                     99:        switch (minor(dev)) {
                    100:        case DEV_NULL:
                    101:                n = 0;
                    102:                break;
                    103: 
                    104:        case DEV_MEM:
                    105:                n = pxcopy((long)iop->io_seek, iop->io.pbase, iop->io_ioc,
                    106:                        SEG_386_UD);
                    107:                break;
                    108: 
                    109:        case DEV_KMEM:
                    110:                n = kucopy((vaddr_t)iop->io_seek, iop->io.vbase, iop->io_ioc);
                    111:                break;
                    112: 
                    113:        case DEV_CMOS:
                    114:                for (n = iop->io_ioc; n > 0; --n) {
                    115:                        tmp = read_cmos(iop->io_seek + n);
                    116:                        if (0 == kucopy(&tmp, iop->io.vbase + n, sizeof(tmp))){
                    117:                        /* Abort the loop if we run out of destination.  */
                    118:                                break;
                    119:                        }
                    120:                }
                    121:                n = iop->io_ioc - n;
                    122:                break;
                    123: 
                    124:        case DEV_BOOTGIFT:
                    125:                if (iop->io_seek < BG_LEN) {
                    126:                        n = iop->io_ioc;
                    127:                        /* Copy no more than to the end of boot_gift.  */
                    128:                        if (iop->io_seek + n > BG_LEN) {
                    129:                                n = BG_LEN - (iop->io_seek);
                    130:                        }
                    131: 
                    132:                        n = kucopy(&boot_gift, iop->io.vbase, n);
                    133:                } else {
                    134:                        n = 0;
                    135:                }
                    136:                break;
                    137: 
                    138:        default:
                    139:                u.u_error = ENXIO;
                    140:                return;
                    141:        }
                    142:        iop->io_ioc -= n;
                    143:        if (u.u_error == EFAULT)
                    144:                u.u_error = 0;
                    145: }
                    146: 
                    147: /*
                    148:  * Null/memory write routine.
                    149:  */
                    150: nlwrite(dev, iop)
                    151: dev_t dev;
                    152: register IO *iop;
                    153: {
                    154:        register unsigned n;
                    155: 
                    156:        switch (minor(dev)) {
                    157:        case DEV_NULL:
                    158:                n = iop->io_ioc;
                    159:                break;
                    160: 
                    161:        case DEV_MEM:
                    162:                n = xpcopy(iop->io.pbase, (long)iop->io_seek, iop->io_ioc,
                    163:                        SEG_386_UD);
                    164:                break;
                    165: 
                    166:        case DEV_KMEM:
                    167:                n = ukcopy(iop->io.vbase, (vaddr_t)iop->io_seek, iop->io_ioc);
                    168:                break;
                    169: 
                    170:        case DEV_CMOS:
                    171:                n = 0;  /* /dev/cmos is not writable.  */
                    172:                break;
                    173: 
                    174:        case DEV_BOOTGIFT:
                    175:                n = 0;  /* /dev/bootgift is not writable.  */
                    176:                break;
                    177: 
                    178:        default:
                    179:                u.u_error = ENXIO;
                    180:                return;
                    181:        }
                    182:        iop->io_ioc -= n;
                    183:        if (u.u_error == EFAULT)
                    184:                u.u_error = 0;
                    185: }
                    186: 
                    187: #ifdef NULL_IOCTL /* Includes all of nlioctl().  */
                    188: 
                    189: /*
                    190:  * Do an ioctl call for /dev/null.
                    191:  */
                    192: int
                    193: nlioctl(dev, cmd, vec)
                    194:        dev_t dev;
                    195:        int cmd;
                    196:        char * vec;
                    197: {
                    198:        /* Only /dev/kmem has an ioctl.  */
                    199:        if (minor(dev) != DEV_KMEM) {
                    200:                u.u_error = EINVAL;
                    201:                return (-1);
                    202:        }
                    203: 
                    204:        switch (cmd) {
                    205: #ifdef DANGEROUS
                    206:        case NLCALL:    /* Call a function.  */
                    207:                return docall(vec);
                    208: #endif /* DANGEROUS */
                    209:        default:
                    210:                u.u_error = EINVAL;
                    211:                return(-1);
                    212:        }
                    213: } /* nlioctl() */
                    214: 
                    215: #endif /* NULL_IOCTL */
                    216: 
                    217: #ifdef DANGEROUS /* Includes all of docall().  */
                    218: /*
                    219:  * MASSIVE SECURITY HOLE!  This should NOT be included in a distribution
                    220:  * system.  Among other problems, it becomes possible to do "setuid(0)".
                    221:  *
                    222:  * Call a function with arguments.
                    223:  *
                    224:  * Takes an array of unsigned ints.  The first element is the length of
                    225:  * the whole array, the second element is a pointer to the function to
                    226:  * call, all other elements are arguments.  At most 5 arguments may be
                    227:  * passed.
                    228:  *
                    229:  * Returns the return value of the called fuction in uvec[0].
                    230:  */
                    231: int
                    232: docall(uvec)
                    233:        unsigned uvec[];
                    234: {
                    235:        int (* func)();
                    236:        unsigned kvec[7];
                    237:        int retval;
                    238: 
                    239:        printf("NLCALL security hole.\n");
                    240: 
                    241:        /* Fetch the first element of vec.  */
                    242:        ukcopy(uvec, kvec, sizeof(unsigned));
                    243: 
                    244:        if ((kvec[0] < 2) || (kvec[0] > 7)) {
                    245:                /* Invalid number of elements in uvec.  */
                    246:                u.u_error = EINVAL;
                    247:                return(-1);
                    248:        }
                    249:        
                    250:        /* Fetch the whole vector.  */
                    251:        ukcopy(uvec, kvec, kvec[0] * sizeof(unsigned));
                    252: 
                    253:        /* Extract the function.  */
                    254:        func = (int (*)()) kvec[1];
                    255: 
                    256:        /* Call the function with all arguments.  */
                    257:        retval = (*func)(kvec[2], kvec[3], kvec[4], kvec[5], kvec[6]);
                    258: 
                    259:        kucopy(&retval, uvec, sizeof(unsigned));
                    260: 
                    261: } /* docall() */
                    262: 
                    263: #endif /* DANGEROUS */

unix.superglobalmegacorp.com

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