Annotation of Net2/sys/lkm.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * lkm.h
        !             3:  *
        !             4:  * Header file used by loadable kernel modules and loadable kernel module
        !             5:  * utilities.
        !             6:  *
        !             7:  * 23 Jan 93   Terry Lambert           Original
        !             8:  *
        !             9:  * Copyright (c) 1992 Terrence R. Lambert.
        !            10:  * All rights reserved.
        !            11:  *
        !            12:  * Redistribution and use in source and binary forms, with or without
        !            13:  * modification, are permitted provided that the following conditions
        !            14:  * are met:
        !            15:  * 1. Redistributions of source code must retain the above copyright
        !            16:  *    notice, this list of conditions and the following disclaimer.
        !            17:  * 2. Redistributions in binary form must reproduce the above copyright
        !            18:  *    notice, this list of conditions and the following disclaimer in the
        !            19:  *    documentation and/or other materials provided with the distribution.
        !            20:  * 3. All advertising materials mentioning features or use of this software
        !            21:  *    must display the following acknowledgement:
        !            22:  *      This product includes software developed by Terrence R. Lambert.
        !            23:  * 4. The name Terrence R. Lambert may not be used to endorse or promote
        !            24:  *    products derived from this software without specific prior written
        !            25:  *    permission.
        !            26:  *
        !            27:  * THIS SOFTWARE IS PROVIDED BY TERRENCE R. LAMBERT ``AS IS'' AND ANY
        !            28:  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            29:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            30:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE
        !            31:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            32:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            33:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            34:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            35:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            36:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            37:  * SUCH DAMAGE.
        !            38:  *
        !            39:  *     lkm.h,v 1.1 1993/06/07 19:52:51 cgd Exp
        !            40:  */
        !            41: #ifndef _SYS_LKM_H_
        !            42: #define _SYS_LKM_H_
        !            43: 
        !            44: 
        !            45: /*
        !            46:  * Supported module types
        !            47:  */
        !            48: typedef enum loadmod {
        !            49:        LM_SYSCALL,
        !            50:        LM_VFS,
        !            51:        LM_DEV,
        !            52:        LM_STRMOD,
        !            53:        LM_EXEC,
        !            54:        LM_MISC
        !            55: } MODTYPE;
        !            56: 
        !            57: 
        !            58: #define        LKM_VERSION     1               /* version of module loader*/
        !            59: /****************************************************************************/
        !            60: 
        !            61: /*
        !            62:  * Loadable system call
        !            63:  */
        !            64: struct lkm_syscall {
        !            65:        MODTYPE         lkm_type;
        !            66:        int             lkm_ver;
        !            67:        char            *lkm_name;
        !            68:        int             lkm_offset;             /* save/assign area*/
        !            69:        struct sysent   *lkm_sysent;
        !            70:        struct sysent   lkm_oldent;             /* save area for unload*/
        !            71: };
        !            72: 
        !            73: /*
        !            74:  * Loadable file system
        !            75:  */
        !            76: struct lkm_vfs {
        !            77:        MODTYPE         lkm_type;
        !            78:        int             lkm_ver;
        !            79:        char            *lkm_name;
        !            80:        int             lkm_offset;
        !            81:        unsigned long   lkm_flags;
        !            82:        struct vfsops   *lkm_vfsops;
        !            83: };
        !            84: 
        !            85: /*
        !            86:  * Supported device module types
        !            87:  */
        !            88: typedef enum devtype {
        !            89:        LM_DT_BLOCK,
        !            90:        LM_DT_CHAR
        !            91: } DEVTYPE;
        !            92: 
        !            93: /*
        !            94:  * Loadable device driver
        !            95:  */
        !            96: struct lkm_dev {
        !            97:        MODTYPE         lkm_type;
        !            98:        int             lkm_ver;
        !            99:        char            *lkm_name;
        !           100:        int             lkm_offset;
        !           101:        DEVTYPE         lkm_devtype;
        !           102:        union {
        !           103:                void            *anon;
        !           104:                struct bdevsw   *bdev;
        !           105:                struct cdevsw   *cdev;
        !           106:        } lkm_dev;
        !           107:        union {
        !           108:                struct bdevsw   bdev;
        !           109:                struct cdevsw   cdev;
        !           110:        } lkm_olddev;
        !           111: };
        !           112: 
        !           113: /*
        !           114:  * Loadable streams module
        !           115:  */
        !           116: struct lkm_strmod {
        !           117:        MODTYPE         lkm_type;
        !           118:        int             lkm_ver;
        !           119:        char            *lkm_name;
        !           120:        int             lkm_offset;
        !           121:        /*
        !           122:         * Removed: future release
        !           123:         */
        !           124: };
        !           125: 
        !           126: /*
        !           127:  * Exec loader
        !           128:  */
        !           129: struct lkm_exec {
        !           130:        MODTYPE         lkm_type;
        !           131:        int             lkm_ver;
        !           132:        char            *lkm_name;
        !           133:        int             lkm_offset;
        !           134:        struct execsw   *lkm_exec;
        !           135:        struct execsw   lkm_oldexec;
        !           136: };
        !           137: 
        !           138: /*
        !           139:  * Miscellaneous module (complex load/unload, potentially complex stat
        !           140:  */
        !           141: struct lkm_misc {
        !           142:        MODTYPE         lkm_type;
        !           143:        int             lkm_ver;
        !           144:        char            *lkm_name;
        !           145:        int             lkm_offset;
        !           146: };
        !           147: 
        !           148: 
        !           149: /*
        !           150:  * Any module (to get type and name info without knowing type)
        !           151:  */
        !           152: struct lkm_any {
        !           153:        MODTYPE         lkm_type;
        !           154:        int             lkm_ver;
        !           155:        char            *lkm_name;
        !           156:        int             lkm_offset;
        !           157: };
        !           158: 
        !           159: 
        !           160: 
        !           161: /*
        !           162:  * Generic reference ala XEvent to allow single entry point in the xxxinit()
        !           163:  * routine.
        !           164:  */
        !           165: union lkm_generic {
        !           166:        struct lkm_any          *lkm_any;
        !           167:        struct lkm_syscall      *lkm_syscall;
        !           168:        struct lkm_vfs          *lkm_vfs;
        !           169:        struct lkm_dev          *lkm_dev;
        !           170:        struct lkm_strmod       *lkm_strmod;
        !           171:        struct lkm_exec         *lkm_exec;
        !           172:        struct lkm_misc         *lkm_misc;
        !           173: };
        !           174: 
        !           175: union lkm_all {
        !           176:        struct lkm_any          lkm_any;
        !           177:        struct lkm_syscall      lkm_syscall;
        !           178:        struct lkm_vfs          lkm_vfs;
        !           179:        struct lkm_dev          lkm_dev;
        !           180:        struct lkm_strmod       lkm_strmod;
        !           181:        struct lkm_exec         lkm_exec;
        !           182:        struct lkm_misc         lkm_misc;
        !           183: };
        !           184: 
        !           185: /*
        !           186:  * Per module information structure
        !           187:  */
        !           188: #define        MAXLKMNAME      32
        !           189: struct lkm_table {
        !           190:        int             type;
        !           191:        unsigned int    size;
        !           192:        unsigned int    offset;
        !           193:        char            *area;
        !           194:        char            used;
        !           195: 
        !           196:        int                     ver;            /* version (INIT)*/
        !           197:        int                     refcnt;         /* reference count (INIT)*/
        !           198:        int                     depcnt;         /* dependency count (INIT)*/
        !           199:        int                     id;             /* identifier (INIT)*/
        !           200: 
        !           201:        int                     (*entry)();     /* entry function*/
        !           202:        union lkm_generic       private;        /* module private data*/
        !           203: };
        !           204: 
        !           205: 
        !           206: #define        LKM_E_LOAD      1
        !           207: #define        LKM_E_UNLOAD    2
        !           208: #define        LKM_E_STAT      3
        !           209: 
        !           210: 
        !           211: #define        MOD_SYSCALL(name,callslot,sysentp)      \
        !           212:        static struct lkm_syscall _module = {   \
        !           213:                LM_SYSCALL,                     \
        !           214:                LKM_VERSION,                    \
        !           215:                name,                           \
        !           216:                callslot,                       \
        !           217:                sysentp                         \
        !           218:        };
        !           219: 
        !           220: #define        MOD_VFS(name,vfsslot,flags,vfsopsp)             \
        !           221:        static struct lkm_vfs _module = {       \
        !           222:                LM_VFS,                         \
        !           223:                LKM_VERSION,                    \
        !           224:                name,                           \
        !           225:                vfsslot,                        \
        !           226:                flags,                          \
        !           227:                vfsopsp                         \
        !           228:        };
        !           229: 
        !           230: #define        MOD_DEV(name,devtype,devslot,devp)      \
        !           231:        static struct lkm_dev _module = {       \
        !           232:                LM_DEV,                         \
        !           233:                LKM_VERSION,                    \
        !           234:                name,                           \
        !           235:                devslot,                        \
        !           236:                devtype,                        \
        !           237:                (void *)devp                    \
        !           238:        };
        !           239: 
        !           240: #define        MOD_EXEC(name,execslot,execsw)          \
        !           241:        static struct lkm_exec _module = {      \
        !           242:                LM_EXEC,                        \
        !           243:                LKM_VERSION,                    \
        !           244:                name,                           \
        !           245:                execslot,                       \
        !           246:                execsw                          \
        !           247:        };
        !           248: 
        !           249: #define        MOD_MISC(name)                          \
        !           250:        static struct lkm_misc _module = {      \
        !           251:                LM_MISC,                        \
        !           252:                LKM_VERSION,                    \
        !           253:                name                            \
        !           254:        };
        !           255: 
        !           256: 
        !           257: extern int     nosys();
        !           258: 
        !           259: /*
        !           260:  * DISPATCH -- body function for use in module entry point function;
        !           261:  * generally, the function body will consist entirely of a single
        !           262:  * DISPATCH line.
        !           263:  *
        !           264:  * If load/unload/stat are not "nosys", then they are called on each
        !           265:  * corresponding entry instance.  "cmd" is passed to each function so
        !           266:  * that a single function can be used if desired.
        !           267:  */
        !           268: #define        DISPATCH(lkmtp,cmd,ver,load,unload,stat)                        \
        !           269:        if( ver != LKM_VERSION)                                         \
        !           270:                return( EINVAL);        /* version mismatch*/           \
        !           271:        switch( cmd) {                                                  \
        !           272:        int     _err;                                                   \
        !           273:        case LKM_E_LOAD:                                                \
        !           274:                lkmtp->private.lkm_any = (struct lkm_any *)&_module;    \
        !           275:                if( load != nosys && (_err = load( lkmtp, cmd)))        \
        !           276:                        return( _err);                                  \
        !           277:                break;                                                  \
        !           278:        case LKM_E_UNLOAD:                                              \
        !           279:                if( unload != nosys && (_err = unload( lkmtp, cmd)))    \
        !           280:                        return( _err);                                  \
        !           281:                break;                                                  \
        !           282:        case LKM_E_STAT:                                                \
        !           283:                if( stat != nosys && (_err = stat( lkmtp, cmd)))        \
        !           284:                        return( _err);                                  \
        !           285:                break;                                                  \
        !           286:        }                                                               \
        !           287:        return( lkmdispatch( lkmtp, cmd));
        !           288: 
        !           289: 
        !           290: /****************************************************************************/
        !           291: 
        !           292: 
        !           293: /*
        !           294:  * IOCTL's recognized by /dev/lkm
        !           295:  */
        !           296: #define        LMRESERV        _IOWR( 'K', 0, struct lmc_resrv)
        !           297: #define        LMLOADBUF       _IOW( 'K', 1, struct lmc_loadbuf)
        !           298: #define        LMUNRESRV       _IO( 'K', 2)
        !           299: #define        LMREADY         _IOW( 'K', 3, int)
        !           300: 
        !           301: #define        LMLOAD          _IOW( 'K', 9, struct lmc_load)
        !           302: #define        LMUNLOAD        _IOWR( 'K', 10, struct lmc_unload)
        !           303: #define        LMSTAT          _IOWR( 'K', 11, struct lmc_stat)
        !           304: 
        !           305: #define        MODIOBUF        512             /* # of bytes at a time to loadbuf*/
        !           306: 
        !           307: /*
        !           308:  * IOCTL arguments
        !           309:  */
        !           310: 
        !           311: 
        !           312: /*
        !           313:  * Reserve a page-aligned block of kernel memory for the module
        !           314:  */
        !           315: struct lmc_resrv {
        !           316:        unsigned long   size;           /* IN: size of module to reserve*/
        !           317:        char            *name;          /* IN: name (must be provided*/
        !           318:        int             slot;           /* OUT: allocated slot (module ID)*/
        !           319:        unsigned long   addr;           /* OUT: Link-to address*/
        !           320: };
        !           321: 
        !           322: 
        !           323: /*
        !           324:  * Copy a buffer at a time into the allocated area in the kernel; writes
        !           325:  * are assumed to occur contiguously.
        !           326:  */
        !           327: struct lmc_loadbuf {
        !           328:        int             cnt;            /* IN: # of chars pointed to by data*/
        !           329:        char            *data;          /* IN: pointer to data buffer*/
        !           330: };
        !           331: 
        !           332: 
        !           333: /*
        !           334:  * Load a module (assumes it's been mmapped to address before call)
        !           335:  */
        !           336: struct lmc_load {
        !           337:        caddr_t         address;        /* IN: user space mmap address*/
        !           338:        int             status;         /* OUT: status of operation*/
        !           339:        int             id;             /* OUT: module ID if loaded*/
        !           340: };
        !           341: 
        !           342: /*
        !           343:  * Unload a module (by name/id)
        !           344:  */
        !           345: struct lmc_unload {
        !           346:        int             id;             /* IN: module ID to unload*/
        !           347:        char            *name;          /* IN: module name to unload if id -1*/
        !           348:        int             status;         /* OUT: status of operation*/
        !           349: };
        !           350: 
        !           351: 
        !           352: /*
        !           353:  * Get module information for a given id (or name if id == -1).
        !           354:  */
        !           355: struct lmc_stat {
        !           356:        int             id;                     /* IN: module ID to unload*/
        !           357:        char            name[ MAXLKMNAME];      /* IN/OUT: name of module*/
        !           358:        int             offset;                 /* OUT: target table offset*/
        !           359:        MODTYPE         type;                   /* OUT: type of module*/
        !           360:        char            *area;                  /* OUT: kernel load addr*/
        !           361:        int             size;                   /* OUT: module size (pages)*/
        !           362:        unsigned long   private;                /* OUT: module private data*/
        !           363:        int             ver;                    /* OUT: lkm compile version*/
        !           364: };
        !           365: 
        !           366: #endif /* !_SYS_LKM_H_ */

unix.superglobalmegacorp.com

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