18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* Definitions for the Linux module syscall interface. 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd Copyright 1996, 1997 Linux International. 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd Contributed by Richard Henderson <rth@tamu.edu> 58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd This file is part of the Linux modutils. 78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd This program is free software; you can redistribute it and/or modify it 98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd under the terms of the GNU General Public License as published by the 108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd Free Software Foundation; either version 2 of the License, or (at your 118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd option) any later version. 128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd This program is distributed in the hope that it will be useful, but 148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd WITHOUT ANY WARRANTY; without even the implied warranty of 158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd General Public License for more details. 178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd You should have received a copy of the GNU General Public License 198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd along with this program; if not, write to the Free Software Foundation, 208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef MODUTILS_MODULE_H 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define MODUTILS_MODULE_H 1 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* This file contains the structures used by the 2.0 and 2.1 kernels. 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd We do not use the kernel headers directly because we do not wish 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd to be dependant on a particular kernel version to compile insmod. */ 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/*======================================================================*/ 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* The structures used by Linux 2.0. */ 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* The symbol format used by get_kernel_syms(2). */ 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct old_kernel_sym 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long value; 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char name[60]; 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct old_module_ref 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long module; /* kernel addresses */ 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long next; 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct old_module_symbol 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long addr; 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long name; 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct old_symbol_table 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd int size; /* total, including string table!!! */ 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd int n_symbols; 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd int n_refs; 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */ 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd struct old_module_ref ref[0]; /* actual size defined by n_refs */ 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct old_mod_routines 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long init; 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long cleanup; 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct old_module 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long next; 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long ref; /* the list of modules that refer to me */ 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long symtab; 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long name; 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd int size; /* size of module in pages */ 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long addr; /* address of module */ 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd int state; 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long cleanup; /* cleanup routine */ 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* Sent to init_module(2) or'ed into the code size parameter. */ 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */ 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint get_kernel_syms(struct old_kernel_sym *); 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint old_sys_init_module(char const * name, char *code, unsigned codesize, 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd struct old_mod_routines *, struct old_symbol_table *); 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/*======================================================================*/ 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* For sizeof() which are related to the module platform and not to the 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */ 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_char sizeof(char) 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_short sizeof(short) 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_int sizeof(int) 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_long sizeof(long) 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_char_p sizeof(char *) 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_void_p sizeof(void *) 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_long long 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_long_fmt "l" 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* This assumes that long long on a 32 bit system is equivalent to long on the 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * equivalent 64 bit system. Also that void and char pointers are 8 bytes on 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * all 64 bit systems. Add per system tweaks if it ever becomes necessary. 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#if defined(COMMON_3264) && defined(ONLY_64) 1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#undef tgt_long 1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#undef tgt_long_fmt 1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#undef tgt_sizeof_long 1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#undef tgt_sizeof_char_p 1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#undef tgt_sizeof_void_p 1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_long long long 1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_long_fmt "ll" 1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_long 8 1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_char_p 8 1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define tgt_sizeof_void_p 8 1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif 1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/*======================================================================*/ 1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* The structures used in Linux 2.1 onwards. */ 1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* Note: module_symbol does not use tgt_long intentionally */ 1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct module_symbol 1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long value; 1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long name; 1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct module_ref 1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long dep; /* kernel addresses */ 1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long ref; 1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long next_ref; 1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct module 1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long size_of_struct; /* == sizeof(module) */ 1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long next; 1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long name; 1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long size; 1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd tgt_long usecount; 1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long flags; /* AUTOCLEAN et al */ 1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned nsyms; 1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned ndeps; 1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long syms; 1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long deps; 1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long refs; 1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long init; 1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long cleanup; 1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long ex_table_start; 1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long ex_table_end; 1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifdef __alpha__ 1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long gp; 1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif 1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /* Everything after here is extension. */ 1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long read_start; /* Read data from existing module */ 1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long read_end; 1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long can_unload; 1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long runsize; 1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long kallsyms_start; 1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long kallsyms_end; 1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long archdata_start; 1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long archdata_end; 1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned tgt_long kernel_data; 1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct module_info 1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long addr; 1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long size; 1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long flags; 1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd long usecount; 1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* Bits of module.flags. */ 1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NEW_MOD_RUNNING 1 1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NEW_MOD_DELETED 2 1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NEW_MOD_AUTOCLEAN 4 1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NEW_MOD_VISITED 8 1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NEW_MOD_USED_ONCE 16 1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NEW_MOD_INITIALIZING 64 1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint sys_init_module(char const * name, const struct module *); 1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint query_module(char const * name, int which, void *buf, size_t bufsize, 1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t *ret); 1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* Values for query_module's which. */ 1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define QM_MODULES 1 1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define QM_DEPS 2 1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define QM_REFS 3 1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define QM_SYMBOLS 4 1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define QM_INFO 5 1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/*======================================================================*/ 1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* The system calls unchanged between 2.0 and 2.1. */ 1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddunsigned long create_module(const char *, size_t); 2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint delete_module(const char *); 2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* In safe mode the last parameter is forced to be a module name and meta 2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * expansion is not allowed on that name. 2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern unsigned int safemode; 2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* module.h */ 208