1/* Definitions for the Linux module syscall interface.
2   Copyright 1996, 1997 Linux International.
3
4   Contributed by Richard Henderson <rth@tamu.edu>
5
6   This file is part of the Linux modutils.
7
8   This program is free software; you can redistribute it and/or modify it
9   under the terms of the GNU General Public License as published by the
10   Free Software Foundation; either version 2 of the License, or (at your
11   option) any later version.
12
13   This program is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16   General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software Foundation,
20   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22#ifndef MODUTILS_MODULE_H
23#define MODUTILS_MODULE_H 1
24
25/* This file contains the structures used by the 2.0 and 2.1 kernels.
26   We do not use the kernel headers directly because we do not wish
27   to be dependant on a particular kernel version to compile insmod.  */
28
29
30/*======================================================================*/
31/* The structures used by Linux 2.0.  */
32
33/* The symbol format used by get_kernel_syms(2).  */
34struct old_kernel_sym
35{
36  unsigned long value;
37  char name[60];
38};
39
40struct old_module_ref
41{
42  unsigned long module;		/* kernel addresses */
43  unsigned long next;
44};
45
46struct old_module_symbol
47{
48  unsigned long addr;
49  unsigned long name;
50};
51
52struct old_symbol_table
53{
54  int size;			/* total, including string table!!! */
55  int n_symbols;
56  int n_refs;
57  struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */
58  struct old_module_ref ref[0];	/* actual size defined by n_refs */
59};
60
61struct old_mod_routines
62{
63  unsigned long init;
64  unsigned long cleanup;
65};
66
67struct old_module
68{
69  unsigned long next;
70  unsigned long ref;		/* the list of modules that refer to me */
71  unsigned long symtab;
72  unsigned long name;
73  int size;			/* size of module in pages */
74  unsigned long addr;		/* address of module */
75  int state;
76  unsigned long cleanup;	/* cleanup routine */
77};
78
79/* Sent to init_module(2) or'ed into the code size parameter.  */
80#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */
81
82int get_kernel_syms(struct old_kernel_sym *);
83int old_sys_init_module(char const * name, char *code, unsigned codesize,
84			struct old_mod_routines *, struct old_symbol_table *);
85
86/*======================================================================*/
87/* For sizeof() which are related to the module platform and not to the
88   environment isnmod is running in, use sizeof_xx instead of sizeof(xx).  */
89
90#define tgt_sizeof_char		sizeof(char)
91#define tgt_sizeof_short	sizeof(short)
92#define tgt_sizeof_int		sizeof(int)
93#define tgt_sizeof_long		sizeof(long)
94#define tgt_sizeof_char_p	sizeof(char *)
95#define tgt_sizeof_void_p	sizeof(void *)
96#define tgt_long		long
97#define tgt_long_fmt		"l"
98
99/* This assumes that long long on a 32 bit system is equivalent to long on the
100 * equivalent 64 bit system.  Also that void and char pointers are 8 bytes on
101 * all 64 bit systems.  Add per system tweaks if it ever becomes necessary.
102 */
103#if defined(COMMON_3264) && defined(ONLY_64)
104#undef tgt_long
105#undef tgt_long_fmt
106#undef tgt_sizeof_long
107#undef tgt_sizeof_char_p
108#undef tgt_sizeof_void_p
109#define tgt_long                long long
110#define tgt_long_fmt		"ll"
111#define tgt_sizeof_long         8
112#define tgt_sizeof_char_p       8
113#define tgt_sizeof_void_p       8
114#endif
115
116/*======================================================================*/
117/* The structures used in Linux 2.1 onwards.  */
118
119/* Note: module_symbol does not use tgt_long intentionally */
120struct module_symbol
121{
122  unsigned long value;
123  unsigned long name;
124};
125
126struct module_ref
127{
128  unsigned tgt_long dep;		/* kernel addresses */
129  unsigned tgt_long ref;
130  unsigned tgt_long next_ref;
131};
132
133struct module
134{
135  unsigned tgt_long size_of_struct;	/* == sizeof(module) */
136  unsigned tgt_long next;
137  unsigned tgt_long name;
138  unsigned tgt_long size;
139
140  tgt_long usecount;
141  unsigned tgt_long flags;		/* AUTOCLEAN et al */
142
143  unsigned nsyms;
144  unsigned ndeps;
145
146  unsigned tgt_long syms;
147  unsigned tgt_long deps;
148  unsigned tgt_long refs;
149  unsigned tgt_long init;
150  unsigned tgt_long cleanup;
151  unsigned tgt_long ex_table_start;
152  unsigned tgt_long ex_table_end;
153#ifdef __alpha__
154  unsigned tgt_long gp;
155#endif
156  /* Everything after here is extension.  */
157  unsigned tgt_long read_start;		/* Read data from existing module */
158  unsigned tgt_long read_end;
159  unsigned tgt_long can_unload;
160  unsigned tgt_long runsize;
161  unsigned tgt_long kallsyms_start;
162  unsigned tgt_long kallsyms_end;
163  unsigned tgt_long archdata_start;
164  unsigned tgt_long archdata_end;
165  unsigned tgt_long kernel_data;
166};
167
168struct module_info
169{
170  unsigned long addr;
171  unsigned long size;
172  unsigned long flags;
173	   long usecount;
174};
175
176/* Bits of module.flags.  */
177#define NEW_MOD_RUNNING		1
178#define NEW_MOD_DELETED		2
179#define NEW_MOD_AUTOCLEAN	4
180#define NEW_MOD_VISITED		8
181#define NEW_MOD_USED_ONCE	16
182#define NEW_MOD_INITIALIZING	64
183
184int sys_init_module(char const * name, const struct module *);
185int query_module(char const * name, int which, void *buf, size_t bufsize,
186		 size_t *ret);
187
188/* Values for query_module's which.  */
189
190#define QM_MODULES	1
191#define QM_DEPS		2
192#define QM_REFS		3
193#define QM_SYMBOLS	4
194#define QM_INFO		5
195
196/*======================================================================*/
197/* The system calls unchanged between 2.0 and 2.1.  */
198
199unsigned long create_module(const char *, size_t);
200int delete_module(const char *);
201
202/* In safe mode the last parameter is forced to be a module name and meta
203 * expansion is not allowed on that name.
204 */
205extern unsigned int safemode;
206
207#endif /* module.h */
208