[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

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