diff options
Diffstat (limited to 'include/linux/module.h')
| -rw-r--r-- | include/linux/module.h | 63 | 
1 files changed, 55 insertions, 8 deletions
diff --git a/include/linux/module.h b/include/linux/module.h index 145a75528cc..d246da0b0f8 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -248,6 +248,10 @@ struct module  	const unsigned long *crcs;  	unsigned int num_syms; +	/* Kernel parameters. */ +	struct kernel_param *kp; +	unsigned int num_kp; +  	/* GPL-only exported symbols. */  	unsigned int num_gpl_syms;  	const struct kernel_symbol *gpl_syms; @@ -350,6 +354,8 @@ struct module  #define MODULE_ARCH_INIT {}  #endif +extern struct mutex module_mutex; +  /* FIXME: It'd be nice to isolate modules during init, too, so they     aren't used before they (may) fail.  But presently too much code     (IDE & SCSI) require entry into the module during init.*/ @@ -358,10 +364,10 @@ static inline int module_is_live(struct module *mod)  	return mod->state != MODULE_STATE_GOING;  } -/* Is this address in a module? (second is with no locks, for oops) */ -struct module *module_text_address(unsigned long addr);  struct module *__module_text_address(unsigned long addr); -int is_module_address(unsigned long addr); +struct module *__module_address(unsigned long addr); +bool is_module_address(unsigned long addr); +bool is_module_text_address(unsigned long addr);  static inline int within_module_core(unsigned long addr, struct module *mod)  { @@ -375,6 +381,31 @@ static inline int within_module_init(unsigned long addr, struct module *mod)  	       addr < (unsigned long)mod->module_init + mod->init_size;  } +/* Search for module by name: must hold module_mutex. */ +struct module *find_module(const char *name); + +struct symsearch { +	const struct kernel_symbol *start, *stop; +	const unsigned long *crcs; +	enum { +		NOT_GPL_ONLY, +		GPL_ONLY, +		WILL_BE_GPL_ONLY, +	} licence; +	bool unused; +}; + +/* Search for an exported symbol by name. */ +const struct kernel_symbol *find_symbol(const char *name, +					struct module **owner, +					const unsigned long **crc, +					bool gplok, +					bool warn); + +/* Walk the exported symbol table */ +bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, +			    unsigned int symnum, void *data), void *data); +  /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if     symnum out of range. */  int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, @@ -383,6 +414,10 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,  /* Look for this name: can be of form module:name. */  unsigned long module_kallsyms_lookup_name(const char *name); +int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, +					     struct module *, unsigned long), +				   void *data); +  extern void __module_put_and_exit(struct module *mod, long code)  	__attribute__((noreturn));  #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code); @@ -444,6 +479,7 @@ static inline void __module_get(struct module *module)  #define symbol_put_addr(p) do { } while(0)  #endif /* CONFIG_MODULE_UNLOAD */ +int use_module(struct module *a, struct module *b);  /* This is a #define so the string doesn't get put in every .o file */  #define module_name(mod)			\ @@ -490,21 +526,24 @@ search_module_extables(unsigned long addr)  	return NULL;  } -/* Is this address in a module? */ -static inline struct module *module_text_address(unsigned long addr) +static inline struct module *__module_address(unsigned long addr)  {  	return NULL;  } -/* Is this address in a module? (don't take a lock, we're oopsing) */  static inline struct module *__module_text_address(unsigned long addr)  {  	return NULL;  } -static inline int is_module_address(unsigned long addr) +static inline bool is_module_address(unsigned long addr)  { -	return 0; +	return false; +} + +static inline bool is_module_text_address(unsigned long addr) +{ +	return false;  }  /* Get/put a kernel symbol (calls should be symmetric) */ @@ -559,6 +598,14 @@ static inline unsigned long module_kallsyms_lookup_name(const char *name)  	return 0;  } +static inline int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, +							   struct module *, +							   unsigned long), +						 void *data) +{ +	return 0; +} +  static inline int register_module_notifier(struct notifier_block * nb)  {  	/* no events will happen anyway, so this can always succeed */  |