]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/dev/i386/conf.c
xnu-7195.101.1.tar.gz
[apple/xnu.git] / bsd / dev / i386 / conf.c
index b8912061874f07c0ca896002f0bc3544ff4cd560..b2ad22676d028ae2b94a86b580853c5defc3f5d0 100644 (file)
@@ -1,15 +1,20 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1997-2020 Apple Inc. All rights reserved.
+ *
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  *
- * @APPLE_LICENSE_HEADER_START@
- * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ *
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ *
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  * Please see the License for the specific language governing rights and
  * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
+ *
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
- * Copyright (c) 1997 by Apple Computer, Inc., all rights reserved
  * Copyright (c) 1993 NeXT Computer, Inc.
  *
  * UNIX Device switch tables.
@@ -29,7 +33,7 @@
  * HISTORY
  *
  * 30 July 1997 Umesh Vaishampayan (umeshv@apple.com)
- *     enabled file descriptor pseudo-device.
+ *      enabled file descriptor pseudo-device.
  * 18 June 1993 ? at NeXT
  *     Cleaned up a lot of stuff in this file.
  */
 #include <sys/conf.h>
 
 /* Prototypes that should be elsewhere: */
-extern int     isdisk(dev_t dev, int type);
-extern dev_t   chrtoblk(dev_t dev);
-extern int     chrtoblk_set(int cdev, int bdev);
-extern int     iskmemdev(dev_t dev);
+extern dev_t    chrtoblk(dev_t dev);
+extern int      chrtoblk_set(int cdev, int bdev);
 
-struct bdevsw  bdevsw[] =
+struct bdevsw   bdevsw[] =
 {
        /*
-        *      For block devices, every other block of 8 slots is 
-        *      reserved to NeXT.  The other slots are available for
+        *      For block devices, every other block of 8 slots is
+        *      reserved for Apple.  The other slots are available for
         *      the user.  This way we can both add new entries without
-        *      running into each other.  Be sure to fill in NeXT's
+        *      running into each other.  Be sure to fill in Apple's
         *      8 reserved slots when you jump over us -- we'll do the
         *      same for you.
         */
 
-       /* 0 - 7 are reserved to NeXT */
+       /* 0 - 7 are reserved for Apple */
 
-       NO_BDEVICE,                                                     /* 0*/
-       NO_BDEVICE,                                                     /* 1*/
-       NO_BDEVICE,                                                     /* 2*/
-       NO_BDEVICE,                                                     /* 3*/
-       NO_BDEVICE,                                                     /* 4*/
-       NO_BDEVICE,                                                     /* 5*/
-       NO_BDEVICE,                                                     /* 6*/
-       NO_BDEVICE,                                                     /* 7*/
+       NO_BDEVICE,                                                     /* 0*/
+       NO_BDEVICE,                                                     /* 1*/
+       NO_BDEVICE,                                                     /* 2*/
+       NO_BDEVICE,                                                     /* 3*/
+       NO_BDEVICE,                                                     /* 4*/
+       NO_BDEVICE,                                                     /* 5*/
+       NO_BDEVICE,                                                     /* 6*/
+       NO_BDEVICE,                                                     /* 7*/
 
        /* 8 - 15 are reserved to the user */
-       NO_BDEVICE,                                                     /* 8*/
-       NO_BDEVICE,                                                     /* 9*/
-       NO_BDEVICE,                                                     /*10*/
-       NO_BDEVICE,                                                     /*11*/
-       NO_BDEVICE,                                                     /*12*/
-       NO_BDEVICE,                                                     /*13*/
-       NO_BDEVICE,                                                     /*14*/
-       NO_BDEVICE,                                                     /*15*/
+       NO_BDEVICE,                                                     /* 8*/
+       NO_BDEVICE,                                                     /* 9*/
+       NO_BDEVICE,                                                     /*10*/
+       NO_BDEVICE,                                                     /*11*/
+       NO_BDEVICE,                                                     /*12*/
+       NO_BDEVICE,                                                     /*13*/
+       NO_BDEVICE,                                                     /*14*/
+       NO_BDEVICE,                                                     /*15*/
 
-       /* 16 - 23 are reserved to NeXT */
-       NO_BDEVICE,                                                     /*16*/
-       NO_BDEVICE,                                                     /*17*/
-       NO_BDEVICE,                                                     /*18*/
-       NO_BDEVICE,                                                     /*18*/
-       NO_BDEVICE,                                                     /*20*/
-       NO_BDEVICE,                                                     /*21*/
-       NO_BDEVICE,                                                     /*22*/
-       NO_BDEVICE,                                                     /*23*/
+       /* 16 - 23 are reserved for Apple */
+       NO_BDEVICE,                                                     /*16*/
+       NO_BDEVICE,                                                     /*17*/
+       NO_BDEVICE,                                                     /*18*/
+       NO_BDEVICE,                                                     /*18*/
+       NO_BDEVICE,                                                     /*20*/
+       NO_BDEVICE,                                                     /*21*/
+       NO_BDEVICE,                                                     /*22*/
+       NO_BDEVICE,                                                     /*23*/
 };
 
-int    nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]);
+const int nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]);
 
 extern struct tty *km_tty[];
-extern d_open_t                cnopen;
-extern d_close_t       cnclose;
-extern d_read_t                cnread;
-extern d_write_t       cnwrite;
-extern d_ioctl_t       cnioctl;
-extern d_select_t      cnselect;
-extern d_getc_t                cngetc;
-extern d_putc_t                cnputc;
-extern d_open_t                kmopen;
-extern d_close_t       kmclose;
-extern d_read_t                kmread;
-extern d_write_t       kmwrite;
-extern d_ioctl_t       kmioctl;
-extern d_getc_t                kmgetc;
-extern d_putc_t                kmputc;
-extern d_open_t                sgopen;
-extern d_close_t       sgclose;
-extern d_ioctl_t       sgioctl;
+extern d_open_t         cnopen;
+extern d_close_t        cnclose;
+extern d_read_t         cnread;
+extern d_write_t        cnwrite;
+extern d_ioctl_t        cnioctl;
+extern d_select_t       cnselect;
+extern d_open_t         kmopen;
+extern d_close_t        kmclose;
+extern d_read_t         kmread;
+extern d_write_t        kmwrite;
+extern d_ioctl_t        kmioctl;
+extern d_open_t         sgopen;
+extern d_close_t        sgclose;
+extern d_ioctl_t        sgioctl;
 
 #if NVOL > 0
-extern d_open_t                volopen;
-extern d_close_t       volclose;
-extern d_ioctl_t       volioctl;
+extern d_open_t         volopen;
+extern d_close_t        volclose;
+extern d_ioctl_t        volioctl;
 #else
-#define        volopen         eno_opcl
-#define        volclose        eno_opcl
-#define        volioctl        eno_ioctl
+#define volopen         eno_opcl
+#define volclose        eno_opcl
+#define volioctl        eno_ioctl
 #endif
 
-extern d_open_t                cttyopen;
-extern d_read_t                cttyread;
-extern d_write_t       cttywrite;
-extern d_ioctl_t       cttyioctl;
-extern d_select_t      cttyselect;
+extern d_open_t         cttyopen;
+extern d_read_t         cttyread;
+extern d_write_t        cttywrite;
+extern d_ioctl_t        cttyioctl;
+extern d_select_t       cttyselect;
 
-extern d_read_t                mmread;
-extern d_write_t       mmwrite;
-extern d_ioctl_t       mmioctl;
-#define        mmselect        (select_fcn_t *)seltrue
-#define mmmmap         eno_mmap
+extern d_read_t         mmread;
+extern d_write_t        mmwrite;
+extern d_ioctl_t        mmioctl;
+#define mmselect        (select_fcn_t *)seltrue
+#define mmmmap          eno_mmap
 
 #include <pty.h>
 #if NPTY > 0
-extern struct tty *pt_tty[];
-extern d_open_t                ptsopen;
-extern d_close_t       ptsclose;
-extern d_read_t                ptsread;
-extern d_write_t       ptswrite;
-extern d_stop_t                ptsstop;
-extern d_putc_t                ptsputc;
-extern d_open_t                ptcopen;
-extern d_close_t       ptcclose;
-extern d_read_t                ptcread;
-extern d_write_t       ptcwrite;
-extern d_select_t      ptcselect;
-extern d_ioctl_t       ptyioctl;
+extern d_open_t         ptsopen;
+extern d_close_t        ptsclose;
+extern d_read_t         ptsread;
+extern d_write_t        ptswrite;
+extern d_stop_t         ptsstop;
+extern d_select_t       ptsselect;
+extern d_open_t         ptcopen;
+extern d_close_t        ptcclose;
+extern d_read_t         ptcread;
+extern d_write_t        ptcwrite;
+extern d_select_t       ptcselect;
+extern d_ioctl_t        ptyioctl;
 #else
-#define ptsopen                eno_opcl
-#define ptsclose       eno_opcl
-#define ptsread                eno_rdwrt
-#define ptswrite       eno_rdwrt
-#define        ptsstop         nulldev
-#define ptsputc                nulldev
+#define ptsopen         eno_opcl
+#define ptsclose        eno_opcl
+#define ptsread         eno_rdwrt
+#define ptswrite        eno_rdwrt
+#define ptsstop         nulldev
 
-#define ptcopen                eno_opcl
-#define ptcclose       eno_opcl
-#define ptcread                eno_rdwrt
-#define ptcwrite       eno_rdwrt
-#define        ptcselect       eno_select
-#define ptyioctl       eno_ioctl
+#define ptcopen         eno_opcl
+#define ptcclose        eno_opcl
+#define ptcread         eno_rdwrt
+#define ptcwrite        eno_rdwrt
+#define ptcselect       eno_select
+#define ptyioctl        eno_ioctl
 #endif
 
-extern d_open_t                logopen;
-extern d_close_t       logclose;
-extern d_read_t                logread;
-extern d_ioctl_t       logioctl;
-extern d_select_t      logselect;
-extern d_open_t                fdesc_open;
-extern d_read_t                fdesc_read;
-extern d_write_t       fdesc_write;
-extern d_ioctl_t       fdesc_ioctl;
-extern d_select_t      fdesc_select;
+extern d_open_t         logopen;
+extern d_close_t        logclose;
+extern d_read_t         logread;
+extern d_ioctl_t        logioctl;
+extern d_select_t       logselect;
 
-#define nullopen       (d_open_t *)&nulldev
-#define nullclose      (d_close_t *)&nulldev
-#define nullread       (d_read_t *)&nulldev
-#define nullwrite      (d_write_t *)&nulldev
-#define nullioctl      (d_ioctl_t *)&nulldev
-#define nullselect     (d_select_t *)&nulldev
-#define nullstop       (d_stop_t *)&nulldev
-#define nullreset      (d_reset_t *)&nulldev
+extern d_open_t         oslog_streamopen;
+extern d_close_t        oslog_streamclose;
+extern d_read_t         oslog_streamread;
+extern d_ioctl_t        oslog_streamioctl;
+extern d_select_t       oslog_streamselect;
 
-struct cdevsw  cdevsw[] =
-{
-       /*
-        *      For character devices, every other block of 16 slots is
-        *      reserved to NeXT.  The other slots are available for
-        *      the user.  This way we can both add new entries without
-        *      running into each other.  Be sure to fill in NeXT's
-        *      16 reserved slots when you jump over us -- we'll do the
-        *      same for you.
-        */
-
-       /* 0 - 15 are reserved to NeXT */
+extern d_open_t         oslogopen;
+extern d_close_t        oslogclose;
+extern d_select_t       oslogselect;
+extern d_ioctl_t        oslogioctl;
 
-    {
-       cnopen,         cnclose,        cnread,         cnwrite,        /* 0*/
-       cnioctl,        nullstop,       nullreset,      0,              cnselect,
-       eno_mmap,       eno_strat,      cngetc,         cnputc,         D_TTY
-    },
-    NO_CDEVICE,                                                                /* 1*/
-    {
-       cttyopen,       nullclose,      cttyread,       cttywrite,      /* 2*/
-       cttyioctl,      nullstop,       nullreset,      0,              cttyselect,
-       eno_mmap,       eno_strat,      eno_getc,       eno_putc,       D_TTY
-    },
-    {
-       nullopen,       nullclose,      mmread,         mmwrite,        /* 3*/
-       mmioctl,        nullstop,       nullreset,      0,              mmselect,
-       mmmmap,         eno_strat,      eno_getc,       eno_putc,       D_DISK
-    },
-    {
-       ptsopen,        ptsclose,       ptsread,        ptswrite,       /* 4*/
-       ptyioctl,       ptsstop,        nullreset,      pt_tty,         ttselect,
-       eno_mmap,       eno_strat,      eno_getc,       eno_putc,       D_TTY
-    },
-    {
-       ptcopen,        ptcclose,       ptcread,        ptcwrite,       /* 5*/
-       ptyioctl,       nullstop,       nullreset,      0,              ptcselect,
-       eno_mmap,       eno_strat,      eno_getc,       eno_putc,       D_TTY
-    },
-    {
-       logopen,        logclose,       logread,        eno_rdwrt,      /* 6*/
-       logioctl,       eno_stop,       nullreset,      0,              logselect,
-       eno_mmap,       eno_strat,      eno_getc,       eno_putc,       0
-    },
-    NO_CDEVICE,                                                                /* 7*/
-    NO_CDEVICE,                                                                /* 8*/
-    NO_CDEVICE,                                                                /* 9*/
-    NO_CDEVICE,                                                                /*10*/
-    NO_CDEVICE,                                                                /*11*/
-    {
-       kmopen,         kmclose,        kmread,         kmwrite,        /*12*/
-       kmioctl,        nullstop,       nullreset,      km_tty,         ttselect,
-       eno_mmap,       eno_strat,      kmgetc,         kmputc,         0
-    },
-    NO_CDEVICE,                                                                /*13*/
-    NO_CDEVICE,                                                                /*14*/
-    NO_CDEVICE,                                                                /*15*/
+#define nullopen        (d_open_t *)&nulldev
+#define nullclose       (d_close_t *)&nulldev
+#define nullread        (d_read_t *)&nulldev
+#define nullwrite       (d_write_t *)&nulldev
+#define nullioctl       (d_ioctl_t *)&nulldev
+#define nullselect      (d_select_t *)&nulldev
+#define nullstop        (d_stop_t *)&nulldev
+#define nullreset       (d_reset_t *)&nulldev
 
-       /* 16 - 31 are reserved to the user */
-    NO_CDEVICE,                                                                /*16*/
-    NO_CDEVICE,                                                                /*17*/
-    NO_CDEVICE,                                                                /*18*/
-    NO_CDEVICE,                                                                /*19*/
-    NO_CDEVICE,                                                                /*20*/
-    NO_CDEVICE,                                                                /*21*/
-    NO_CDEVICE,                                                                /*22*/
-    NO_CDEVICE,                                                                /*23*/
-    NO_CDEVICE,                                                                /*24*/
-    NO_CDEVICE,                                                                /*25*/
-    NO_CDEVICE,                                                                /*26*/
-    NO_CDEVICE,                                                                /*27*/
-    NO_CDEVICE,                                                                /*28*/
-    NO_CDEVICE,                                                                /*29*/
-    NO_CDEVICE,                                                                /*30*/
-    NO_CDEVICE,                                                                /*31*/
+struct cdevsw cdevsw[] = {
+       /*
+        * To add character devices to this table dynamically, use cdevsw_add.
+        */
 
-       /* 32 - 47 are reserved to NeXT */
-    {
-       fdesc_open,     eno_opcl,       fdesc_read,     fdesc_write,    /*32*/
-       fdesc_ioctl,    eno_stop,       eno_reset,      0,              fdesc_select,
-       eno_mmap,       eno_strat,      eno_getc,       eno_putc,       0
-    },
-#if 1
-   NO_CDEVICE,
-#else
-    {
-       sgopen,         sgclose,        eno_rdwrt,      eno_rdwrt,      /*33*/
-       sgioctl,        eno_stop,       eno_reset,      0,              eno_select,
-       eno_mmap,       eno_strat,      eno_getc,       eno_putc,       D_TAPE
-    },
-#endif
-    NO_CDEVICE,                                                                /*34*/
-    NO_CDEVICE,                                                                /*35*/
-    NO_CDEVICE,                                                                /*36*/
-    NO_CDEVICE,                                                                /*37*/
-    NO_CDEVICE,                                                                /*38*/
-    NO_CDEVICE,                                                                /*39*/
-    NO_CDEVICE,                                                                /*40*/
-    NO_CDEVICE,                                                                /*41*/
-    {
-       volopen,        volclose,       eno_rdwrt,      eno_rdwrt,      /*42*/
-       volioctl,       eno_stop,       eno_reset,      0,              (select_fcn_t *)seltrue,
-       eno_mmap,       eno_strat,      eno_getc,       eno_putc,       0
-    },
+       [0] = {
+               cnopen, cnclose, cnread, cnwrite,
+               cnioctl, nullstop, nullreset, 0, cnselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
+       },
+       [1] = NO_CDEVICE,
+       [2] = {
+               cttyopen, nullclose, cttyread, cttywrite,
+               cttyioctl, nullstop, nullreset, 0, cttyselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
+       },
+       [3] = {
+               nullopen, nullclose, mmread, mmwrite,
+               mmioctl, nullstop, nullreset, 0, mmselect,
+               mmmmap, eno_strat, eno_getc, eno_putc, D_DISK
+       },
+       [PTC_MAJOR] = {
+               ptsopen, ptsclose, ptsread, ptswrite,
+               ptyioctl, ptsstop, nullreset, 0, ptsselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
+       },
+       [PTS_MAJOR] = {
+               ptcopen, ptcclose, ptcread, ptcwrite,
+               ptyioctl, nullstop, nullreset, 0, ptcselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
+       },
+       [6] = {
+               logopen, logclose, logread, eno_rdwrt,
+               logioctl, eno_stop, nullreset, 0, logselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, 0
+       },
+       [7] = {
+               oslogopen, oslogclose, eno_rdwrt, eno_rdwrt,
+               oslogioctl, eno_stop, nullreset, 0, oslogselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, 0
+       },
+       [8] = {
+               oslog_streamopen, oslog_streamclose, oslog_streamread, eno_rdwrt,
+               oslog_streamioctl, eno_stop, nullreset, 0, oslog_streamselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, 0
+       },
+       [9 ... 11] = NO_CDEVICE,
+       [12] = {
+               kmopen, kmclose, kmread, kmwrite,
+               kmioctl, nullstop, nullreset, km_tty, ttselect,
+               eno_mmap, eno_strat, eno_getc, eno_putc, 0
+       },
+       [13 ... 63] = NO_CDEVICE,
 };
-int    nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]);
+const int nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]);
 
+uint64_t cdevsw_flags[sizeof(cdevsw) / sizeof(cdevsw[0])];
 
-#include       <sys/vnode.h> /* for VCHR and VBLK */
+#include        <sys/vnode.h> /* for VCHR and VBLK */
 /*
  * return true if a disk
  */
 int
 isdisk(dev_t dev, int type)
 {
-       dev_t   maj = major(dev);
+       dev_t   maj = major(dev);
 
        switch (type) {
        case VCHR:
-               maj = chrtoblk(maj);
+               maj = chrtoblk(dev);
                if (maj == NODEV) {
                        break;
                }
-               /* FALL THROUGH */
+               OS_FALLTHROUGH;
        case VBLK:
                if (bdevsw[maj].d_type == D_DISK) {
-                       return (1);
+                       return 1;
                }
                break;
        }
-       return(0);
+       return 0;
 }
 
-static int chrtoblktab[] = {
-       /* CHR*/        /* BLK*/        /* CHR*/        /* BLK*/
-       /*  0 */        NODEV,          /*  1 */        NODEV,
-       /*  2 */        NODEV,          /*  3 */        NODEV,
-       /*  4 */        NODEV,          /*  5 */        NODEV,
-       /*  6 */        NODEV,          /*  7 */        NODEV,
-       /*  8 */        NODEV,          /*  9 */        NODEV,
-       /* 10 */        NODEV,          /* 11 */        NODEV,
-       /* 12 */        NODEV,          /* 13 */        NODEV,
-       /* 14 */        6,              /* 15 */        NODEV,
-       /* 16 */        NODEV,          /* 17 */        NODEV,
-       /* 18 */        NODEV,          /* 19 */        NODEV,
-       /* 20 */        NODEV,          /* 21 */        NODEV,
-       /* 22 */        NODEV,          /* 23 */        NODEV,
-       /* 24 */        NODEV,          /* 25 */        NODEV,
-       /* 26 */        NODEV,          /* 27 */        NODEV,
-       /* 28 */        NODEV,          /* 29 */        NODEV,
-       /* 30 */        NODEV,          /* 31 */        NODEV,
-       /* 32 */        NODEV,          /* 33 */        NODEV,
-       /* 34 */        NODEV,          /* 35 */        NODEV,
-       /* 36 */        NODEV,          /* 37 */        NODEV,
-       /* 38 */        NODEV,          /* 39 */        NODEV,
-       /* 40 */        NODEV,          /* 41 */        1,
-       /* 42 */        NODEV,          /* 43 */        NODEV,
-       /* 44 */        NODEV,
-};
+static int chrtoblktab[] = {[0 ... nchrdev] = NODEV };
 
 /*
  * convert chr dev to blk dev
@@ -352,29 +279,25 @@ chrtoblk(dev_t dev)
 {
        int blkmaj;
 
-       if (major(dev) >= nchrdev)
-               return(NODEV);
+       if (major(dev) >= nchrdev) {
+               return NODEV;
+       }
        blkmaj = chrtoblktab[major(dev)];
-       if (blkmaj == NODEV)
-               return(NODEV);
-       return(makedev(blkmaj, minor(dev)));
+       if (blkmaj == NODEV) {
+               return NODEV;
+       }
+       return makedev(blkmaj, minor(dev));
 }
 
 int
 chrtoblk_set(int cdev, int bdev)
 {
-       if (cdev >= nchrdev)
-               return (-1);
-       if (bdev != NODEV && bdev >= nblkdev)
-               return (-1);
+       if (cdev >= nchrdev) {
+               return -1;
+       }
+       if (bdev != NODEV && bdev >= nblkdev) {
+               return -1;
+       }
        chrtoblktab[cdev] = bdev;
        return 0;
 }
-
-/*
- * Returns true if dev is /dev/mem or /dev/kmem.
- */
-int iskmemdev(dev_t dev)
-{
-       return (major(dev) == 3 && minor(dev) < 2);
-}