/* Definitions for the Linux module syscall interface.
Copyright 1996, 1997 Linux International.
Contributed by Richard Henderson <rth@tamu.edu>
This file is part of the Linux modutils.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef MODUTILS_MODULE_H
#define MODUTILS_MODULE_H 1
/* This file contains the structures used by the 2.0 and 2.1 kernels.
We do not use the kernel headers directly because we do not wish
to be dependant on a particular kernel version to compile insmod. */
/*======================================================================*/
/* The structures used by Linux 2.0. */
/* The symbol format used by get_kernel_syms(2). */
struct old_kernel_sym
{
unsigned long value;
char name[60];
};
struct old_module_ref
{
unsigned long module; /* kernel addresses */
unsigned long next;
};
struct old_module_symbol
{
unsigned long addr;
unsigned long name;
};
struct old_symbol_table
{
int size; /* total, including string table!!! */
int n_symbols;
int n_refs;
struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */
struct old_module_ref ref[0]; /* actual size defined by n_refs */
};
struct old_mod_routines
{
unsigned long init;
unsigned long cleanup;
};
struct old_module
{
unsigned long next;
unsigned long ref; /* the list of modules that refer to me */
unsigned long symtab;
unsigned long name;
int size; /* size of module in pages */
unsigned long addr; /* address of module */
int state;
unsigned long cleanup; /* cleanup routine */
};
/* Sent to init_module(2) or'ed into the code size parameter. */
#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */
int get_kernel_syms(struct old_kernel_sym *);
int old_sys_init_module(char const * name, char *code, unsigned codesize,
struct old_mod_routines *, struct old_symbol_table *);
/*======================================================================*/
/* For sizeof() which are related to the module platform and not to the
environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */
#define tgt_sizeof_char sizeof(char)
#define tgt_sizeof_short sizeof(short)
#define tgt_sizeof_int sizeof(int)
#define tgt_sizeof_long sizeof(long)
#define tgt_sizeof_char_p sizeof(char *)
#define tgt_sizeof_void_p sizeof(void *)
#define tgt_long long
#define tgt_long_fmt "l"
/* This assumes that long long on a 32 bit system is equivalent to long on the
* equivalent 64 bit system. Also that void and char pointers are 8 bytes on
* all 64 bit systems. Add per system tweaks if it ever becomes necessary.
*/
#if defined(COMMON_3264) && defined(ONLY_64)
#undef tgt_long
#undef tgt_long_fmt
#undef tgt_sizeof_long
#undef tgt_sizeof_char_p
#undef tgt_sizeof_void_p
#define tgt_long long long
#define tgt_long_fmt "ll"
#define tgt_sizeof_long 8
#define tgt_sizeof_char_p 8
#define tgt_sizeof_void_p 8
#endif
/*======================================================================*/
/* The structures used in Linux 2.1 onwards. */
/* Note: module_symbol does not use tgt_long intentionally */
struct module_symbol
{
unsigned long value;
unsigned long name;
};
struct module_ref
{
unsigned tgt_long dep; /* kernel addresses */
unsigned tgt_long ref;
unsigned tgt_long next_ref;
};
struct module
{
unsigned tgt_long size_of_struct; /* == sizeof(module) */
unsigned tgt_long next;
unsigned tgt_long name;
unsigned tgt_long size;
tgt_long usecount;
unsigned tgt_long flags; /* AUTOCLEAN et al */
unsigned nsyms;
unsigned ndeps;
unsigned tgt_long syms;
unsigned tgt_long deps;
unsigned tgt_long refs;
unsigned tgt_long init;
unsigned tgt_long cleanup;
unsigned tgt_long ex_table_start;
unsigned tgt_long ex_table_end;
#ifdef __alpha__
unsigned tgt_long gp;
#endif
/* Everything after here is extension. */
unsigned tgt_long read_start; /* Read data from existing module */
unsigned tgt_long read_end;
unsigned tgt_long can_unload;
unsigned tgt_long runsize;
unsigned tgt_long kallsyms_start;
unsigned tgt_long kallsyms_end;
unsigned tgt_long archdata_start;
unsigned tgt_long archdata_end;
unsigned tgt_long kernel_data;
};
struct module_info
{
unsigned long addr;
unsigned long size;
unsigned long flags;
long usecount;
};
/* Bits of module.flags. */
#define NEW_MOD_RUNNING 1
#define NEW_MOD_DELETED 2
#define NEW_MOD_AUTOCLEAN 4
#define NEW_MOD_VISITED 8
#define NEW_MOD_USED_ONCE 16
#define NEW_MOD_INITIALIZING 64
int sys_init_module(char const * name, const struct module *);
int query_module(char const * name, int which, void *buf, size_t bufsize,
size_t *ret);
/* Values for query_module's which. */
#define QM_MODULES 1
#define QM_DEPS 2
#define QM_REFS 3
#define QM_SYMBOLS 4
#define QM_INFO 5
/*======================================================================*/
/* The system calls unchanged between 2.0 and 2.1. */
unsigned long create_module(const char *, size_t);
int delete_module(const char *);
/* In safe mode the last parameter is forced to be a module name and meta
* expansion is not allowed on that name.
*/
extern unsigned int safemode;
#endif /* module.h */