|
|
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_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.