[BACK]Return to lkm.h CVS log [TXT][DIR] Up to [local] / sys / sys

Annotation of sys/sys/lkm.h, Revision 1.1

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

CVSweb