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