Blame view

kernel/module.c 89.2 KB
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
     Copyright (C) 2002 Richard Henderson
51f3d0f47   Rusty Russell   module: cleanup c...
3
     Copyright (C) 2001 Rusty Russell, 2002, 2010 Rusty Russell IBM.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  
      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
  */
9984de1a5   Paul Gortmaker   kernel: Map most ...
19
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
  #include <linux/moduleloader.h>
6d723736e   Steven Rostedt   tracing/events: a...
21
  #include <linux/ftrace_event.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
  #include <linux/init.h>
ae84e3247   Alexey Dobriyan   Simplify module_g...
23
  #include <linux/kallsyms.h>
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
24
  #include <linux/fs.h>
6d7601338   Roland McGrath   Add /sys/module/n...
25
  #include <linux/sysfs.h>
9f1583339   Randy Dunlap   [PATCH] use add_t...
26
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
  #include <linux/slab.h>
  #include <linux/vmalloc.h>
  #include <linux/elf.h>
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
30
  #include <linux/proc_fs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
  #include <linux/seq_file.h>
  #include <linux/syscalls.h>
  #include <linux/fcntl.h>
  #include <linux/rcupdate.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
35
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
39
40
41
  #include <linux/cpu.h>
  #include <linux/moduleparam.h>
  #include <linux/errno.h>
  #include <linux/err.h>
  #include <linux/vermagic.h>
  #include <linux/notifier.h>
f6a570333   Al Viro   [PATCH] severing ...
42
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
  #include <linux/stop_machine.h>
  #include <linux/device.h>
c988d2b28   Matt Domsch   [PATCH] modules: ...
45
  #include <linux/string.h>
97d1f15b7   Arjan van de Ven   [PATCH] sem2mutex...
46
  #include <linux/mutex.h>
d72b37513   Andi Kleen   Remove stop_machi...
47
  #include <linux/rculist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  #include <asm/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  #include <asm/cacheflush.h>
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
50
  #include <asm/mmu_context.h>
b817f6fef   Sam Ravnborg   kbuild: check lic...
51
  #include <linux/license.h>
6d7623943   Christoph Lameter   modules: include ...
52
  #include <asm/sections.h>
97e1c18e8   Mathieu Desnoyers   tracing: Kernel T...
53
  #include <linux/tracepoint.h>
90d595fe5   Steven Rostedt   ftrace: enable mc...
54
  #include <linux/ftrace.h>
22a9d6456   Arjan van de Ven   async: Asynchrono...
55
  #include <linux/async.h>
fbf59bc9d   Tejun Heo   percpu: implement...
56
  #include <linux/percpu.h>
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
57
  #include <linux/kmemleak.h>
bf5438fca   Jason Baron   jump label: Base ...
58
  #include <linux/jump_label.h>
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
59
  #include <linux/pfn.h>
403ed2784   Alessio Igor Bogani   module: Use the b...
60
  #include <linux/bsearch.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61

7ead8b831   Li Zefan   tracing/events: A...
62
63
  #define CREATE_TRACE_POINTS
  #include <trace/events/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
65
66
  #ifndef ARCH_SHF_SMALL
  #define ARCH_SHF_SMALL 0
  #endif
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  /*
   * Modules' sections will be aligned on page boundaries
   * to ensure complete separation of code and data, but
   * only when CONFIG_DEBUG_SET_MODULE_RONX=y
   */
  #ifdef CONFIG_DEBUG_SET_MODULE_RONX
  # define debug_align(X) ALIGN(X, PAGE_SIZE)
  #else
  # define debug_align(X) (X)
  #endif
  
  /*
   * Given BASE and SIZE this macro calculates the number of pages the
   * memory regions occupies
   */
  #define MOD_NUMBER_OF_PAGES(BASE, SIZE) (((SIZE) > 0) ?		\
  		(PFN_DOWN((unsigned long)(BASE) + (SIZE) - 1) -	\
  			 PFN_DOWN((unsigned long)BASE) + 1)	\
  		: (0UL))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
  /* If this is set, the section belongs in the init part of the module */
  #define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1))
75676500f   Rusty Russell   module: make lock...
88
89
90
91
92
  /*
   * Mutex protects:
   * 1) List of modules (also safely readable with preempt_disable),
   * 2) module_use links,
   * 3) module_addr_min/module_addr_max.
d72b37513   Andi Kleen   Remove stop_machi...
93
   * (delete uses stop_machine/add uses RCU list operations). */
c6b378019   Tim Abbott   module: Export sy...
94
95
  DEFINE_MUTEX(module_mutex);
  EXPORT_SYMBOL_GPL(module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  static LIST_HEAD(modules);
67fc4e0cb   Jason Wessel   kdb: core for kgd...
97
98
99
  #ifdef CONFIG_KGDB_KDB
  struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
  #endif /* CONFIG_KGDB_KDB */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100

19e4529ee   Stephen Rothwell   modules: Fix up b...
101
102
  /* Block module loading/unloading? */
  int modules_disabled = 0;
c9a3ba55b   Rusty Russell   module: wait for ...
103
104
  /* Waiting for a module to finish initializing? */
  static DECLARE_WAIT_QUEUE_HEAD(module_wq);
e041c6834   Alan Stern   [PATCH] Notifier ...
105
  static BLOCKING_NOTIFIER_HEAD(module_notify_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106

75676500f   Rusty Russell   module: make lock...
107
108
  /* Bounds of module allocation, for speeding __module_address.
   * Protected by module_mutex. */
3a642e99b   Rusty Russell   modules: Take a s...
109
  static unsigned long module_addr_min = -1UL, module_addr_max = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
  int register_module_notifier(struct notifier_block * nb)
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
112
  	return blocking_notifier_chain_register(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
115
116
117
  }
  EXPORT_SYMBOL(register_module_notifier);
  
  int unregister_module_notifier(struct notifier_block * nb)
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
118
  	return blocking_notifier_chain_unregister(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
120
  }
  EXPORT_SYMBOL(unregister_module_notifier);
eded41c1c   Rusty Russell   module: kallsyms ...
121
122
123
124
  struct load_info {
  	Elf_Ehdr *hdr;
  	unsigned long len;
  	Elf_Shdr *sechdrs;
6526c534b   Rusty Russell   module: move modu...
125
  	char *secstrings, *strtab;
d913188c7   Rusty Russell   module: layout_an...
126
  	unsigned long symoffs, stroffs;
811d66a0e   Rusty Russell   module: group pos...
127
128
  	struct _ddebug *debug;
  	unsigned int num_debug;
eded41c1c   Rusty Russell   module: kallsyms ...
129
130
131
132
  	struct {
  		unsigned int sym, str, mod, vers, info, pcpu;
  	} index;
  };
9a4b9708f   Matti Linnanvuori   module: fix and e...
133
134
  /* We require a truly strong try_module_get(): 0 means failure due to
     ongoing or failed initialization etc. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
137
  static inline int strong_try_module_get(struct module *mod)
  {
  	if (mod && mod->state == MODULE_STATE_COMING)
c9a3ba55b   Rusty Russell   module: wait for ...
138
139
  		return -EBUSY;
  	if (try_module_get(mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
  		return 0;
c9a3ba55b   Rusty Russell   module: wait for ...
141
142
  	else
  		return -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
  }
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
144
145
146
  static inline void add_taint_module(struct module *mod, unsigned flag)
  {
  	add_taint(flag);
25ddbb18a   Andi Kleen   Make the taint fl...
147
  	mod->taints |= (1U << flag);
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
148
  }
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
149
150
151
  /*
   * A thread that wants to hold a reference to a module only while it
   * is running can call this to safely exit.  nfsd and lockd use this.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
156
157
158
   */
  void __module_put_and_exit(struct module *mod, long code)
  {
  	module_put(mod);
  	do_exit(code);
  }
  EXPORT_SYMBOL(__module_put_and_exit);
22a8bdeb5   Daniel Walker   whitespace fixes:...
159

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
  /* Find a module section: 0 means not found. */
49668688d   Rusty Russell   module: pass load...
161
  static unsigned int find_sec(const struct load_info *info, const char *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
163
  {
  	unsigned int i;
49668688d   Rusty Russell   module: pass load...
164
165
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		Elf_Shdr *shdr = &info->sechdrs[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
  		/* Alloc bit cleared means "ignore it." */
49668688d   Rusty Russell   module: pass load...
167
168
  		if ((shdr->sh_flags & SHF_ALLOC)
  		    && strcmp(info->secstrings + shdr->sh_name, name) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
  			return i;
49668688d   Rusty Russell   module: pass load...
170
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
172
  	return 0;
  }
5e458cc0f   Rusty Russell   module: simplify ...
173
  /* Find a module section, or NULL. */
49668688d   Rusty Russell   module: pass load...
174
  static void *section_addr(const struct load_info *info, const char *name)
5e458cc0f   Rusty Russell   module: simplify ...
175
176
  {
  	/* Section 0 has sh_addr 0. */
49668688d   Rusty Russell   module: pass load...
177
  	return (void *)info->sechdrs[find_sec(info, name)].sh_addr;
5e458cc0f   Rusty Russell   module: simplify ...
178
179
180
  }
  
  /* Find a module section, or NULL.  Fill in number of "objects" in section. */
49668688d   Rusty Russell   module: pass load...
181
  static void *section_objs(const struct load_info *info,
5e458cc0f   Rusty Russell   module: simplify ...
182
183
184
185
  			  const char *name,
  			  size_t object_size,
  			  unsigned int *num)
  {
49668688d   Rusty Russell   module: pass load...
186
  	unsigned int sec = find_sec(info, name);
5e458cc0f   Rusty Russell   module: simplify ...
187
188
  
  	/* Section 0 has sh_addr 0 and sh_size 0. */
49668688d   Rusty Russell   module: pass load...
189
190
  	*num = info->sechdrs[sec].sh_size / object_size;
  	return (void *)info->sechdrs[sec].sh_addr;
5e458cc0f   Rusty Russell   module: simplify ...
191
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
193
194
195
196
  /* Provided by the linker */
  extern const struct kernel_symbol __start___ksymtab[];
  extern const struct kernel_symbol __stop___ksymtab[];
  extern const struct kernel_symbol __start___ksymtab_gpl[];
  extern const struct kernel_symbol __stop___ksymtab_gpl[];
9f28bb7e1   Greg Kroah-Hartman   [PATCH] add EXPOR...
197
198
  extern const struct kernel_symbol __start___ksymtab_gpl_future[];
  extern const struct kernel_symbol __stop___ksymtab_gpl_future[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
200
  extern const unsigned long __start___kcrctab[];
  extern const unsigned long __start___kcrctab_gpl[];
9f28bb7e1   Greg Kroah-Hartman   [PATCH] add EXPOR...
201
  extern const unsigned long __start___kcrctab_gpl_future[];
f7f5b6755   Denys Vlasenko   Shrink struct mod...
202
203
204
205
206
  #ifdef CONFIG_UNUSED_SYMBOLS
  extern const struct kernel_symbol __start___ksymtab_unused[];
  extern const struct kernel_symbol __stop___ksymtab_unused[];
  extern const struct kernel_symbol __start___ksymtab_unused_gpl[];
  extern const struct kernel_symbol __stop___ksymtab_unused_gpl[];
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
207
208
  extern const unsigned long __start___kcrctab_unused[];
  extern const unsigned long __start___kcrctab_unused_gpl[];
f7f5b6755   Denys Vlasenko   Shrink struct mod...
209
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
211
212
213
  
  #ifndef CONFIG_MODVERSIONS
  #define symversion(base, idx) NULL
  #else
f83ca9fe3   Andrew Morton   [PATCH] symversio...
214
  #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
  #endif
dafd0940c   Rusty Russell   module: generic e...
216
217
218
219
220
  static bool each_symbol_in_section(const struct symsearch *arr,
  				   unsigned int arrsize,
  				   struct module *owner,
  				   bool (*fn)(const struct symsearch *syms,
  					      struct module *owner,
de4d8d534   Rusty Russell   module: each_symb...
221
  					      void *data),
dafd0940c   Rusty Russell   module: generic e...
222
  				   void *data)
ad9546c99   Rusty Russell   module: neaten __...
223
  {
de4d8d534   Rusty Russell   module: each_symb...
224
  	unsigned int j;
ad9546c99   Rusty Russell   module: neaten __...
225

dafd0940c   Rusty Russell   module: generic e...
226
  	for (j = 0; j < arrsize; j++) {
de4d8d534   Rusty Russell   module: each_symb...
227
228
  		if (fn(&arr[j], owner, data))
  			return true;
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
229
  	}
dafd0940c   Rusty Russell   module: generic e...
230
231
  
  	return false;
ad9546c99   Rusty Russell   module: neaten __...
232
  }
dafd0940c   Rusty Russell   module: generic e...
233
  /* Returns true as soon as fn returns true, otherwise false. */
de4d8d534   Rusty Russell   module: each_symb...
234
235
236
237
  bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
  				    struct module *owner,
  				    void *data),
  			 void *data)
ad9546c99   Rusty Russell   module: neaten __...
238
239
  {
  	struct module *mod;
44032e631   Linus Torvalds   module: reduce st...
240
  	static const struct symsearch arr[] = {
ad9546c99   Rusty Russell   module: neaten __...
241
  		{ __start___ksymtab, __stop___ksymtab, __start___kcrctab,
dafd0940c   Rusty Russell   module: generic e...
242
  		  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
243
  		{ __start___ksymtab_gpl, __stop___ksymtab_gpl,
dafd0940c   Rusty Russell   module: generic e...
244
245
  		  __start___kcrctab_gpl,
  		  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
246
  		{ __start___ksymtab_gpl_future, __stop___ksymtab_gpl_future,
dafd0940c   Rusty Russell   module: generic e...
247
248
  		  __start___kcrctab_gpl_future,
  		  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
249
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
250
  		{ __start___ksymtab_unused, __stop___ksymtab_unused,
dafd0940c   Rusty Russell   module: generic e...
251
252
  		  __start___kcrctab_unused,
  		  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
253
  		{ __start___ksymtab_unused_gpl, __stop___ksymtab_unused_gpl,
dafd0940c   Rusty Russell   module: generic e...
254
255
  		  __start___kcrctab_unused_gpl,
  		  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
256
  #endif
ad9546c99   Rusty Russell   module: neaten __...
257
  	};
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
258

dafd0940c   Rusty Russell   module: generic e...
259
260
  	if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data))
  		return true;
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
261

d72b37513   Andi Kleen   Remove stop_machi...
262
  	list_for_each_entry_rcu(mod, &modules, list) {
ad9546c99   Rusty Russell   module: neaten __...
263
264
  		struct symsearch arr[] = {
  			{ mod->syms, mod->syms + mod->num_syms, mod->crcs,
dafd0940c   Rusty Russell   module: generic e...
265
  			  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
266
  			{ mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
267
268
  			  mod->gpl_crcs,
  			  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
269
270
  			{ mod->gpl_future_syms,
  			  mod->gpl_future_syms + mod->num_gpl_future_syms,
dafd0940c   Rusty Russell   module: generic e...
271
272
  			  mod->gpl_future_crcs,
  			  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
273
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
274
275
  			{ mod->unused_syms,
  			  mod->unused_syms + mod->num_unused_syms,
dafd0940c   Rusty Russell   module: generic e...
276
277
  			  mod->unused_crcs,
  			  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
278
279
  			{ mod->unused_gpl_syms,
  			  mod->unused_gpl_syms + mod->num_unused_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
280
281
  			  mod->unused_gpl_crcs,
  			  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
282
  #endif
ad9546c99   Rusty Russell   module: neaten __...
283
  		};
dafd0940c   Rusty Russell   module: generic e...
284
285
286
287
288
  		if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data))
  			return true;
  	}
  	return false;
  }
de4d8d534   Rusty Russell   module: each_symb...
289
  EXPORT_SYMBOL_GPL(each_symbol_section);
dafd0940c   Rusty Russell   module: generic e...
290
291
292
293
294
295
296
297
298
299
  
  struct find_symbol_arg {
  	/* Input */
  	const char *name;
  	bool gplok;
  	bool warn;
  
  	/* Output */
  	struct module *owner;
  	const unsigned long *crc;
414fd31b2   Tim Abbott   module: Make find...
300
  	const struct kernel_symbol *sym;
dafd0940c   Rusty Russell   module: generic e...
301
  };
de4d8d534   Rusty Russell   module: each_symb...
302
303
304
  static bool check_symbol(const struct symsearch *syms,
  				 struct module *owner,
  				 unsigned int symnum, void *data)
dafd0940c   Rusty Russell   module: generic e...
305
306
  {
  	struct find_symbol_arg *fsa = data;
dafd0940c   Rusty Russell   module: generic e...
307
308
309
310
311
312
313
314
315
316
317
318
  	if (!fsa->gplok) {
  		if (syms->licence == GPL_ONLY)
  			return false;
  		if (syms->licence == WILL_BE_GPL_ONLY && fsa->warn) {
  			printk(KERN_WARNING "Symbol %s is being used "
  			       "by a non-GPL module, which will not "
  			       "be allowed in the future
  ", fsa->name);
  			printk(KERN_WARNING "Please see the file "
  			       "Documentation/feature-removal-schedule.txt "
  			       "in the kernel source tree for more details.
  ");
9f28bb7e1   Greg Kroah-Hartman   [PATCH] add EXPOR...
319
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
  	}
ad9546c99   Rusty Russell   module: neaten __...
321

f7f5b6755   Denys Vlasenko   Shrink struct mod...
322
  #ifdef CONFIG_UNUSED_SYMBOLS
dafd0940c   Rusty Russell   module: generic e...
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  	if (syms->unused && fsa->warn) {
  		printk(KERN_WARNING "Symbol %s is marked as UNUSED, "
  		       "however this module is using it.
  ", fsa->name);
  		printk(KERN_WARNING
  		       "This symbol will go away in the future.
  ");
  		printk(KERN_WARNING
  		       "Please evalute if this is the right api to use and if "
  		       "it really is, submit a report the linux kernel "
  		       "mailinglist together with submitting your code for "
  		       "inclusion.
  ");
  	}
f7f5b6755   Denys Vlasenko   Shrink struct mod...
337
  #endif
dafd0940c   Rusty Russell   module: generic e...
338
339
340
  
  	fsa->owner = owner;
  	fsa->crc = symversion(syms->crcs, symnum);
414fd31b2   Tim Abbott   module: Make find...
341
  	fsa->sym = &syms->start[symnum];
dafd0940c   Rusty Russell   module: generic e...
342
343
  	return true;
  }
403ed2784   Alessio Igor Bogani   module: Use the b...
344
345
346
347
348
349
350
  static int cmp_name(const void *va, const void *vb)
  {
  	const char *a;
  	const struct kernel_symbol *b;
  	a = va; b = vb;
  	return strcmp(a, b->name);
  }
de4d8d534   Rusty Russell   module: each_symb...
351
352
353
354
355
  static bool find_symbol_in_section(const struct symsearch *syms,
  				   struct module *owner,
  				   void *data)
  {
  	struct find_symbol_arg *fsa = data;
403ed2784   Alessio Igor Bogani   module: Use the b...
356
357
358
359
360
361
362
  	struct kernel_symbol *sym;
  
  	sym = bsearch(fsa->name, syms->start, syms->stop - syms->start,
  			sizeof(struct kernel_symbol), cmp_name);
  
  	if (sym != NULL && check_symbol(syms, owner, sym - syms->start, data))
  		return true;
de4d8d534   Rusty Russell   module: each_symb...
363

de4d8d534   Rusty Russell   module: each_symb...
364
365
  	return false;
  }
414fd31b2   Tim Abbott   module: Make find...
366
  /* Find a symbol and return it, along with, (optional) crc and
75676500f   Rusty Russell   module: make lock...
367
   * (optional) module which owns it.  Needs preempt disabled or module_mutex. */
c6b378019   Tim Abbott   module: Export sy...
368
369
370
371
372
  const struct kernel_symbol *find_symbol(const char *name,
  					struct module **owner,
  					const unsigned long **crc,
  					bool gplok,
  					bool warn)
dafd0940c   Rusty Russell   module: generic e...
373
374
375
376
377
378
  {
  	struct find_symbol_arg fsa;
  
  	fsa.name = name;
  	fsa.gplok = gplok;
  	fsa.warn = warn;
de4d8d534   Rusty Russell   module: each_symb...
379
  	if (each_symbol_section(find_symbol_in_section, &fsa)) {
dafd0940c   Rusty Russell   module: generic e...
380
381
382
383
  		if (owner)
  			*owner = fsa.owner;
  		if (crc)
  			*crc = fsa.crc;
414fd31b2   Tim Abbott   module: Make find...
384
  		return fsa.sym;
dafd0940c   Rusty Russell   module: generic e...
385
  	}
5e1241692   Jim Cromie   module: replace D...
386
387
  	pr_debug("Failed to find symbol %s
  ", name);
414fd31b2   Tim Abbott   module: Make find...
388
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
389
  }
c6b378019   Tim Abbott   module: Export sy...
390
  EXPORT_SYMBOL_GPL(find_symbol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392
  /* Search for module by name: must hold module_mutex. */
c6b378019   Tim Abbott   module: Export sy...
393
  struct module *find_module(const char *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394
395
396
397
398
399
400
401
402
  {
  	struct module *mod;
  
  	list_for_each_entry(mod, &modules, list) {
  		if (strcmp(mod->name, name) == 0)
  			return mod;
  	}
  	return NULL;
  }
c6b378019   Tim Abbott   module: Export sy...
403
  EXPORT_SYMBOL_GPL(find_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
405
  
  #ifdef CONFIG_SMP
fbf59bc9d   Tejun Heo   percpu: implement...
406

259354dea   Tejun Heo   module: encapsula...
407
  static inline void __percpu *mod_percpu(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
408
  {
259354dea   Tejun Heo   module: encapsula...
409
410
  	return mod->percpu;
  }
fbf59bc9d   Tejun Heo   percpu: implement...
411

259354dea   Tejun Heo   module: encapsula...
412
413
414
  static int percpu_modalloc(struct module *mod,
  			   unsigned long size, unsigned long align)
  {
fbf59bc9d   Tejun Heo   percpu: implement...
415
416
417
  	if (align > PAGE_SIZE) {
  		printk(KERN_WARNING "%s: per-cpu alignment %li > %li
  ",
259354dea   Tejun Heo   module: encapsula...
418
  		       mod->name, align, PAGE_SIZE);
fbf59bc9d   Tejun Heo   percpu: implement...
419
420
  		align = PAGE_SIZE;
  	}
259354dea   Tejun Heo   module: encapsula...
421
422
  	mod->percpu = __alloc_reserved_percpu(size, align);
  	if (!mod->percpu) {
fbf59bc9d   Tejun Heo   percpu: implement...
423
  		printk(KERN_WARNING
d913188c7   Rusty Russell   module: layout_an...
424
425
426
  		       "%s: Could not allocate %lu bytes percpu data
  ",
  		       mod->name, size);
259354dea   Tejun Heo   module: encapsula...
427
428
429
430
  		return -ENOMEM;
  	}
  	mod->percpu_size = size;
  	return 0;
fbf59bc9d   Tejun Heo   percpu: implement...
431
  }
259354dea   Tejun Heo   module: encapsula...
432
  static void percpu_modfree(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
433
  {
259354dea   Tejun Heo   module: encapsula...
434
  	free_percpu(mod->percpu);
fbf59bc9d   Tejun Heo   percpu: implement...
435
  }
49668688d   Rusty Russell   module: pass load...
436
  static unsigned int find_pcpusec(struct load_info *info)
6b588c18f   Tejun Heo   module: reorder m...
437
  {
49668688d   Rusty Russell   module: pass load...
438
  	return find_sec(info, ".data..percpu");
6b588c18f   Tejun Heo   module: reorder m...
439
  }
259354dea   Tejun Heo   module: encapsula...
440
441
  static void percpu_modcopy(struct module *mod,
  			   const void *from, unsigned long size)
6b588c18f   Tejun Heo   module: reorder m...
442
443
444
445
  {
  	int cpu;
  
  	for_each_possible_cpu(cpu)
259354dea   Tejun Heo   module: encapsula...
446
  		memcpy(per_cpu_ptr(mod->percpu, cpu), from, size);
6b588c18f   Tejun Heo   module: reorder m...
447
  }
10fad5e46   Tejun Heo   percpu, module: i...
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
  /**
   * is_module_percpu_address - test whether address is from module static percpu
   * @addr: address to test
   *
   * Test whether @addr belongs to module static percpu area.
   *
   * RETURNS:
   * %true if @addr is from module static percpu area
   */
  bool is_module_percpu_address(unsigned long addr)
  {
  	struct module *mod;
  	unsigned int cpu;
  
  	preempt_disable();
  
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (!mod->percpu_size)
  			continue;
  		for_each_possible_cpu(cpu) {
  			void *start = per_cpu_ptr(mod->percpu, cpu);
  
  			if ((void *)addr >= start &&
  			    (void *)addr < start + mod->percpu_size) {
  				preempt_enable();
  				return true;
  			}
  		}
  	}
  
  	preempt_enable();
  	return false;
6b588c18f   Tejun Heo   module: reorder m...
480
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
481
  #else /* ... !CONFIG_SMP */
6b588c18f   Tejun Heo   module: reorder m...
482

259354dea   Tejun Heo   module: encapsula...
483
  static inline void __percpu *mod_percpu(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484
485
486
  {
  	return NULL;
  }
259354dea   Tejun Heo   module: encapsula...
487
488
489
490
491
492
  static inline int percpu_modalloc(struct module *mod,
  				  unsigned long size, unsigned long align)
  {
  	return -ENOMEM;
  }
  static inline void percpu_modfree(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
494
  }
49668688d   Rusty Russell   module: pass load...
495
  static unsigned int find_pcpusec(struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
496
497
498
  {
  	return 0;
  }
259354dea   Tejun Heo   module: encapsula...
499
500
  static inline void percpu_modcopy(struct module *mod,
  				  const void *from, unsigned long size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
501
502
503
504
  {
  	/* pcpusec should be 0, and size of that section should be 0. */
  	BUG_ON(size != 0);
  }
10fad5e46   Tejun Heo   percpu, module: i...
505
506
507
508
  bool is_module_percpu_address(unsigned long addr)
  {
  	return false;
  }
6b588c18f   Tejun Heo   module: reorder m...
509

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510
  #endif /* CONFIG_SMP */
c988d2b28   Matt Domsch   [PATCH] modules: ...
511
512
513
514
515
516
  #define MODINFO_ATTR(field)	\
  static void setup_modinfo_##field(struct module *mod, const char *s)  \
  {                                                                     \
  	mod->field = kstrdup(s, GFP_KERNEL);                          \
  }                                                                     \
  static ssize_t show_modinfo_##field(struct module_attribute *mattr,   \
4befb026c   Kay Sievers   module: change at...
517
  			struct module_kobject *mk, char *buffer)      \
c988d2b28   Matt Domsch   [PATCH] modules: ...
518
  {                                                                     \
4befb026c   Kay Sievers   module: change at...
519
520
  	return sprintf(buffer, "%s
  ", mk->mod->field);               \
c988d2b28   Matt Domsch   [PATCH] modules: ...
521
522
523
524
525
526
527
  }                                                                     \
  static int modinfo_##field##_exists(struct module *mod)               \
  {                                                                     \
  	return mod->field != NULL;                                    \
  }                                                                     \
  static void free_modinfo_##field(struct module *mod)                  \
  {                                                                     \
22a8bdeb5   Daniel Walker   whitespace fixes:...
528
529
  	kfree(mod->field);                                            \
  	mod->field = NULL;                                            \
c988d2b28   Matt Domsch   [PATCH] modules: ...
530
531
  }                                                                     \
  static struct module_attribute modinfo_##field = {                    \
7b595756e   Tejun Heo   sysfs: kill unnec...
532
  	.attr = { .name = __stringify(field), .mode = 0444 },         \
c988d2b28   Matt Domsch   [PATCH] modules: ...
533
534
535
536
537
538
539
540
  	.show = show_modinfo_##field,                                 \
  	.setup = setup_modinfo_##field,                               \
  	.test = modinfo_##field##_exists,                             \
  	.free = free_modinfo_##field,                                 \
  };
  
  MODINFO_ATTR(version);
  MODINFO_ATTR(srcversion);
e14af7eeb   Arjan van de Ven   debug: track and ...
541
  static char last_unloaded_module[MODULE_NAME_LEN+1];
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
542
  #ifdef CONFIG_MODULE_UNLOAD
eb0c53771   Steven Rostedt   tracing: Fix comp...
543
544
  
  EXPORT_TRACEPOINT_SYMBOL(module_get);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
545
  /* Init the unload section of the module. */
9f85a4bbb   Rusty Russell   module: refactor ...
546
  static int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
547
  {
9f85a4bbb   Rusty Russell   module: refactor ...
548
549
550
  	mod->refptr = alloc_percpu(struct module_ref);
  	if (!mod->refptr)
  		return -ENOMEM;
2c02dfe7f   Linus Torvalds   module: Make the ...
551
552
  	INIT_LIST_HEAD(&mod->source_list);
  	INIT_LIST_HEAD(&mod->target_list);
e1783a240   Christoph Lameter   module: Use this_...
553

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
  	/* Hold reference count during initialization. */
5fbfb18d7   Nick Piggin   Fix up possibly r...
555
  	__this_cpu_write(mod->refptr->incs, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556
557
  	/* Backwards compatibility macros put refcount during init. */
  	mod->waiter = current;
9f85a4bbb   Rusty Russell   module: refactor ...
558
559
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
560
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
561
562
563
564
  /* Does a already use b? */
  static int already_uses(struct module *a, struct module *b)
  {
  	struct module_use *use;
2c02dfe7f   Linus Torvalds   module: Make the ...
565
566
  	list_for_each_entry(use, &b->source_list, source_list) {
  		if (use->source == a) {
5e1241692   Jim Cromie   module: replace D...
567
568
  			pr_debug("%s uses %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
570
571
  			return 1;
  		}
  	}
5e1241692   Jim Cromie   module: replace D...
572
573
  	pr_debug("%s does not use %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574
575
  	return 0;
  }
2c02dfe7f   Linus Torvalds   module: Make the ...
576
577
578
579
580
581
582
583
584
  /*
   * Module a uses b
   *  - we add 'a' as a "source", 'b' as a "target" of module use
   *  - the module_use is added to the list of 'b' sources (so
   *    'b' can walk the list to see who sourced them), and of 'a'
   *    targets (so 'a' can see what modules it targets).
   */
  static int add_module_usage(struct module *a, struct module *b)
  {
2c02dfe7f   Linus Torvalds   module: Make the ...
585
  	struct module_use *use;
5e1241692   Jim Cromie   module: replace D...
586
587
  	pr_debug("Allocating new usage for %s.
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
588
589
590
591
592
593
594
595
596
597
598
  	use = kmalloc(sizeof(*use), GFP_ATOMIC);
  	if (!use) {
  		printk(KERN_WARNING "%s: out of memory loading
  ", a->name);
  		return -ENOMEM;
  	}
  
  	use->source = a;
  	use->target = b;
  	list_add(&use->source_list, &b->source_list);
  	list_add(&use->target_list, &a->target_list);
2c02dfe7f   Linus Torvalds   module: Make the ...
599
600
  	return 0;
  }
75676500f   Rusty Russell   module: make lock...
601
  /* Module a uses b: caller needs module_mutex() */
9bea7f239   Rusty Russell   module: fix bne2 ...
602
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
  {
c8e21ced0   Rusty Russell   module: fix kdb's...
604
  	int err;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
605

9bea7f239   Rusty Russell   module: fix bne2 ...
606
  	if (b == NULL || already_uses(a, b))
218ce7351   Linus Torvalds   Revert "module: d...
607
  		return 0;
218ce7351   Linus Torvalds   Revert "module: d...
608

9bea7f239   Rusty Russell   module: fix bne2 ...
609
610
  	/* If module isn't available, we fail. */
  	err = strong_try_module_get(b);
c9a3ba55b   Rusty Russell   module: wait for ...
611
  	if (err)
9bea7f239   Rusty Russell   module: fix bne2 ...
612
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613

2c02dfe7f   Linus Torvalds   module: Make the ...
614
615
  	err = add_module_usage(a, b);
  	if (err) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
  		module_put(b);
9bea7f239   Rusty Russell   module: fix bne2 ...
617
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
618
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
619
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
620
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
621
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
622
623
624
625
  
  /* Clear the unload stuff of the module. */
  static void module_unload_free(struct module *mod)
  {
2c02dfe7f   Linus Torvalds   module: Make the ...
626
  	struct module_use *use, *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627

75676500f   Rusty Russell   module: make lock...
628
  	mutex_lock(&module_mutex);
2c02dfe7f   Linus Torvalds   module: Make the ...
629
630
  	list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) {
  		struct module *i = use->target;
5e1241692   Jim Cromie   module: replace D...
631
632
  		pr_debug("%s unusing %s
  ", mod->name, i->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
633
634
635
636
  		module_put(i);
  		list_del(&use->source_list);
  		list_del(&use->target_list);
  		kfree(use);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
637
  	}
75676500f   Rusty Russell   module: make lock...
638
  	mutex_unlock(&module_mutex);
9f85a4bbb   Rusty Russell   module: refactor ...
639
640
  
  	free_percpu(mod->refptr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
642
643
  }
  
  #ifdef CONFIG_MODULE_FORCE_UNLOAD
fb1697933   Akinobu Mita   [PATCH] modules: ...
644
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
645
646
647
  {
  	int ret = (flags & O_TRUNC);
  	if (ret)
fb1697933   Akinobu Mita   [PATCH] modules: ...
648
  		add_taint(TAINT_FORCED_RMMOD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
650
651
  	return ret;
  }
  #else
fb1697933   Akinobu Mita   [PATCH] modules: ...
652
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
  {
  	return 0;
  }
  #endif /* CONFIG_MODULE_FORCE_UNLOAD */
  
  struct stopref
  {
  	struct module *mod;
  	int flags;
  	int *forced;
  };
  
  /* Whole machine is stopped with interrupts off when this runs. */
  static int __try_stop_module(void *_sref)
  {
  	struct stopref *sref = _sref;
da39ba5e1   Rusty Russell   module: don't use...
669
670
  	/* If it's not unused, quit unless we're forcing. */
  	if (module_refcount(sref->mod) != 0) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
671
  		if (!(*sref->forced = try_force_unload(sref->flags)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
673
674
675
676
677
678
679
680
681
  			return -EWOULDBLOCK;
  	}
  
  	/* Mark it as dying. */
  	sref->mod->state = MODULE_STATE_GOING;
  	return 0;
  }
  
  static int try_stop_module(struct module *mod, int flags, int *forced)
  {
da39ba5e1   Rusty Russell   module: don't use...
682
683
  	if (flags & O_NONBLOCK) {
  		struct stopref sref = { mod, flags, forced };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
684

9b1a4d383   Rusty Russell   stop_machine: Wea...
685
  		return stop_machine(__try_stop_module, &sref, NULL);
da39ba5e1   Rusty Russell   module: don't use...
686
687
688
689
690
691
  	} else {
  		/* We don't need to stop the machine for this. */
  		mod->state = MODULE_STATE_GOING;
  		synchronize_sched();
  		return 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
  }
bd77c0477   Eric Dumazet   module: struct mo...
693
  unsigned long module_refcount(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
694
  {
bd77c0477   Eric Dumazet   module: struct mo...
695
  	unsigned long incs = 0, decs = 0;
720eba31f   Eric Dumazet   modules: Use a be...
696
  	int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697

720eba31f   Eric Dumazet   modules: Use a be...
698
  	for_each_possible_cpu(cpu)
5fbfb18d7   Nick Piggin   Fix up possibly r...
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
  		decs += per_cpu_ptr(mod->refptr, cpu)->decs;
  	/*
  	 * ensure the incs are added up after the decs.
  	 * module_put ensures incs are visible before decs with smp_wmb.
  	 *
  	 * This 2-count scheme avoids the situation where the refcount
  	 * for CPU0 is read, then CPU0 increments the module refcount,
  	 * then CPU1 drops that refcount, then the refcount for CPU1 is
  	 * read. We would record a decrement but not its corresponding
  	 * increment so we would see a low count (disaster).
  	 *
  	 * Rare situation? But module_refcount can be preempted, and we
  	 * might be tallying up 4096+ CPUs. So it is not impossible.
  	 */
  	smp_rmb();
  	for_each_possible_cpu(cpu)
  		incs += per_cpu_ptr(mod->refptr, cpu)->incs;
  	return incs - decs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
718
719
720
721
722
723
724
  }
  EXPORT_SYMBOL(module_refcount);
  
  /* This exists whether we can unload or not */
  static void free_module(struct module *mod);
  
  static void wait_for_zero_refcount(struct module *mod)
  {
a65502075   Matthew Wilcox   kernel: Remove un...
725
  	/* Since we might sleep for some time, release the mutex first */
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
726
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
727
  	for (;;) {
5e1241692   Jim Cromie   module: replace D...
728
729
  		pr_debug("Looking at refcount...
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
731
732
733
734
735
  		set_current_state(TASK_UNINTERRUPTIBLE);
  		if (module_refcount(mod) == 0)
  			break;
  		schedule();
  	}
  	current->state = TASK_RUNNING;
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
736
  	mutex_lock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
737
  }
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
738
739
  SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
  		unsigned int, flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
740
741
  {
  	struct module *mod;
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
742
  	char name[MODULE_NAME_LEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
743
  	int ret, forced = 0;
3d43321b7   Kees Cook   modules: sysctl t...
744
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
745
746
747
748
749
  		return -EPERM;
  
  	if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
  		return -EFAULT;
  	name[MODULE_NAME_LEN-1] = '\0';
3fc1f1e27   Tejun Heo   stop_machine: rei...
750
751
  	if (mutex_lock_interruptible(&module_mutex) != 0)
  		return -EINTR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
752
753
754
755
756
757
  
  	mod = find_module(name);
  	if (!mod) {
  		ret = -ENOENT;
  		goto out;
  	}
2c02dfe7f   Linus Torvalds   module: Make the ...
758
  	if (!list_empty(&mod->source_list)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759
760
761
762
763
764
765
766
767
  		/* Other modules depend on us: get rid of them first. */
  		ret = -EWOULDBLOCK;
  		goto out;
  	}
  
  	/* Doing init or already dying? */
  	if (mod->state != MODULE_STATE_LIVE) {
  		/* FIXME: if (force), slam module count and wake up
                     waiter --RR */
5e1241692   Jim Cromie   module: replace D...
768
769
  		pr_debug("%s already dying
  ", mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
770
771
772
773
774
  		ret = -EBUSY;
  		goto out;
  	}
  
  	/* If it has an init func, it must have an exit func to unload */
af49d9248   Rusty Russell   Remove "unsafe" f...
775
  	if (mod->init && !mod->exit) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
776
  		forced = try_force_unload(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
  		if (!forced) {
  			/* This module can't be removed */
  			ret = -EBUSY;
  			goto out;
  		}
  	}
  
  	/* Set this up before setting mod->state */
  	mod->waiter = current;
  
  	/* Stop the machine so refcounts can't move and disable module. */
  	ret = try_stop_module(mod, flags, &forced);
  	if (ret != 0)
  		goto out;
  
  	/* Never wait if forced. */
  	if (!forced && module_refcount(mod) != 0)
  		wait_for_zero_refcount(mod);
df4b565e1   Peter Oberparleiter   module: add MODUL...
795
  	mutex_unlock(&module_mutex);
25985edce   Lucas De Marchi   Fix common misspe...
796
  	/* Final destruction now no one is using it. */
df4b565e1   Peter Oberparleiter   module: add MODUL...
797
  	if (mod->exit != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
798
  		mod->exit();
df4b565e1   Peter Oberparleiter   module: add MODUL...
799
800
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
22a9d6456   Arjan van de Ven   async: Asynchrono...
801
  	async_synchronize_full();
75676500f   Rusty Russell   module: make lock...
802

e14af7eeb   Arjan van de Ven   debug: track and ...
803
  	/* Store the name of the last unloaded module for diagnostic purposes */
efa5345e3   Rusty Russell   module: Fix gratu...
804
  	strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
805

75676500f   Rusty Russell   module: make lock...
806
807
808
  	free_module(mod);
  	return 0;
  out:
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
809
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
810
811
  	return ret;
  }
d1e99d7ae   Jianjun Kong   module: fix warni...
812
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813
814
815
  {
  	struct module_use *use;
  	int printed_something = 0;
bd77c0477   Eric Dumazet   module: struct mo...
816
  	seq_printf(m, " %lu ", module_refcount(mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
817
818
819
  
  	/* Always include a trailing , so userspace can differentiate
             between this and the old multi-field proc format. */
2c02dfe7f   Linus Torvalds   module: Make the ...
820
  	list_for_each_entry(use, &mod->source_list, source_list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
821
  		printed_something = 1;
2c02dfe7f   Linus Torvalds   module: Make the ...
822
  		seq_printf(m, "%s,", use->source->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
823
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
824
825
826
827
828
829
830
831
832
833
834
835
  	if (mod->init != NULL && mod->exit == NULL) {
  		printed_something = 1;
  		seq_printf(m, "[permanent],");
  	}
  
  	if (!printed_something)
  		seq_printf(m, "-");
  }
  
  void __symbol_put(const char *symbol)
  {
  	struct module *owner;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
836

24da1cbff   Rusty Russell   modules: remove m...
837
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
838
  	if (!find_symbol(symbol, &owner, NULL, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
840
  		BUG();
  	module_put(owner);
24da1cbff   Rusty Russell   modules: remove m...
841
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
842
843
  }
  EXPORT_SYMBOL(__symbol_put);
7d1d16e41   Rusty Russell   module: fix BUG_O...
844
  /* Note this assumes addr is a function, which it currently always is. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
845
846
  void symbol_put_addr(void *addr)
  {
5e3766138   Trent Piepho   [PATCH] symbol_pu...
847
  	struct module *modaddr;
7d1d16e41   Rusty Russell   module: fix BUG_O...
848
  	unsigned long a = (unsigned long)dereference_function_descriptor(addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
849

7d1d16e41   Rusty Russell   module: fix BUG_O...
850
  	if (core_kernel_text(a))
5e3766138   Trent Piepho   [PATCH] symbol_pu...
851
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
852

a6e6abd57   Rusty Russell   module: remove mo...
853
854
  	/* module_text_address is safe here: we're supposed to have reference
  	 * to module from symbol_get, so it can't go away. */
7d1d16e41   Rusty Russell   module: fix BUG_O...
855
  	modaddr = __module_text_address(a);
a6e6abd57   Rusty Russell   module: remove mo...
856
  	BUG_ON(!modaddr);
5e3766138   Trent Piepho   [PATCH] symbol_pu...
857
  	module_put(modaddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
858
859
860
861
  }
  EXPORT_SYMBOL_GPL(symbol_put_addr);
  
  static ssize_t show_refcnt(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
862
  			   struct module_kobject *mk, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
863
  {
bd77c0477   Eric Dumazet   module: struct mo...
864
865
  	return sprintf(buffer, "%lu
  ", module_refcount(mk->mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
866
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
867
868
  static struct module_attribute modinfo_refcnt =
  	__ATTR(refcnt, 0444, show_refcnt, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
869

f6a570333   Al Viro   [PATCH] severing ...
870
871
872
  void module_put(struct module *module)
  {
  	if (module) {
e1783a240   Christoph Lameter   module: Use this_...
873
  		preempt_disable();
5fbfb18d7   Nick Piggin   Fix up possibly r...
874
875
  		smp_wmb(); /* see comment in module_refcount */
  		__this_cpu_inc(module->refptr->decs);
e1783a240   Christoph Lameter   module: Use this_...
876

ae832d1e0   Li Zefan   tracing: Remove s...
877
  		trace_module_put(module, _RET_IP_);
f6a570333   Al Viro   [PATCH] severing ...
878
879
880
  		/* Maybe they're waiting for us to drop reference? */
  		if (unlikely(!module_is_live(module)))
  			wake_up_process(module->waiter);
e1783a240   Christoph Lameter   module: Use this_...
881
  		preempt_enable();
f6a570333   Al Viro   [PATCH] severing ...
882
883
884
  	}
  }
  EXPORT_SYMBOL(module_put);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
885
  #else /* !CONFIG_MODULE_UNLOAD */
d1e99d7ae   Jianjun Kong   module: fix warni...
886
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
887
888
889
890
891
892
893
894
  {
  	/* We don't know the usage count, or what modules are using. */
  	seq_printf(m, " - -");
  }
  
  static inline void module_unload_free(struct module *mod)
  {
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
895
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
896
  {
9bea7f239   Rusty Russell   module: fix bne2 ...
897
  	return strong_try_module_get(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
898
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
899
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
900

9f85a4bbb   Rusty Russell   module: refactor ...
901
  static inline int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
902
  {
9f85a4bbb   Rusty Russell   module: refactor ...
903
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
904
905
  }
  #endif /* CONFIG_MODULE_UNLOAD */
53999bf34   Kevin Winchester   error: implicit d...
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
  static size_t module_flags_taint(struct module *mod, char *buf)
  {
  	size_t l = 0;
  
  	if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE))
  		buf[l++] = 'P';
  	if (mod->taints & (1 << TAINT_OOT_MODULE))
  		buf[l++] = 'O';
  	if (mod->taints & (1 << TAINT_FORCED_MODULE))
  		buf[l++] = 'F';
  	if (mod->taints & (1 << TAINT_CRAP))
  		buf[l++] = 'C';
  	/*
  	 * TAINT_FORCED_RMMOD: could be added.
  	 * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
  	 * apply to modules.
  	 */
  	return l;
  }
1f71740ab   Kay Sievers   Driver core: show...
925
  static ssize_t show_initstate(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
926
  			      struct module_kobject *mk, char *buffer)
1f71740ab   Kay Sievers   Driver core: show...
927
928
  {
  	const char *state = "unknown";
4befb026c   Kay Sievers   module: change at...
929
  	switch (mk->mod->state) {
1f71740ab   Kay Sievers   Driver core: show...
930
931
932
933
934
935
936
937
938
939
940
941
942
  	case MODULE_STATE_LIVE:
  		state = "live";
  		break;
  	case MODULE_STATE_COMING:
  		state = "coming";
  		break;
  	case MODULE_STATE_GOING:
  		state = "going";
  		break;
  	}
  	return sprintf(buffer, "%s
  ", state);
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
943
944
  static struct module_attribute modinfo_initstate =
  	__ATTR(initstate, 0444, show_initstate, NULL);
1f71740ab   Kay Sievers   Driver core: show...
945

88bfa3247   Kay Sievers   module: add /sys/...
946
947
948
949
950
951
952
953
954
955
  static ssize_t store_uevent(struct module_attribute *mattr,
  			    struct module_kobject *mk,
  			    const char *buffer, size_t count)
  {
  	enum kobject_action action;
  
  	if (kobject_action_type(buffer, count, &action) == 0)
  		kobject_uevent(&mk->kobj, action);
  	return count;
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
  struct module_attribute module_uevent =
  	__ATTR(uevent, 0200, NULL, store_uevent);
  
  static ssize_t show_coresize(struct module_attribute *mattr,
  			     struct module_kobject *mk, char *buffer)
  {
  	return sprintf(buffer, "%u
  ", mk->mod->core_size);
  }
  
  static struct module_attribute modinfo_coresize =
  	__ATTR(coresize, 0444, show_coresize, NULL);
  
  static ssize_t show_initsize(struct module_attribute *mattr,
  			     struct module_kobject *mk, char *buffer)
  {
  	return sprintf(buffer, "%u
  ", mk->mod->init_size);
  }
  
  static struct module_attribute modinfo_initsize =
  	__ATTR(initsize, 0444, show_initsize, NULL);
  
  static ssize_t show_taint(struct module_attribute *mattr,
  			  struct module_kobject *mk, char *buffer)
  {
  	size_t l;
  
  	l = module_flags_taint(mk->mod, buffer);
  	buffer[l++] = '
  ';
  	return l;
  }
  
  static struct module_attribute modinfo_taint =
  	__ATTR(taint, 0444, show_taint, NULL);
88bfa3247   Kay Sievers   module: add /sys/...
992

03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
993
  static struct module_attribute *modinfo_attrs[] = {
cca3e7073   Kay Sievers   modules: sysfs - ...
994
  	&module_uevent,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
995
996
  	&modinfo_version,
  	&modinfo_srcversion,
cca3e7073   Kay Sievers   modules: sysfs - ...
997
998
999
1000
  	&modinfo_initstate,
  	&modinfo_coresize,
  	&modinfo_initsize,
  	&modinfo_taint,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1001
  #ifdef CONFIG_MODULE_UNLOAD
cca3e7073   Kay Sievers   modules: sysfs - ...
1002
  	&modinfo_refcnt,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1003
1004
1005
  #endif
  	NULL,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
  static const char vermagic[] = VERMAGIC_STRING;
c6e665c8f   Rusty Russell   module: clarify t...
1007
  static int try_to_force_load(struct module *mod, const char *reason)
826e4506a   Linus Torvalds   Make forced modul...
1008
1009
  {
  #ifdef CONFIG_MODULE_FORCE_LOAD
25ddbb18a   Andi Kleen   Make the taint fl...
1010
  	if (!test_taint(TAINT_FORCED_MODULE))
c6e665c8f   Rusty Russell   module: clarify t...
1011
1012
1013
  		printk(KERN_WARNING "%s: %s: kernel tainted.
  ",
  		       mod->name, reason);
826e4506a   Linus Torvalds   Make forced modul...
1014
1015
1016
1017
1018
1019
  	add_taint_module(mod, TAINT_FORCED_MODULE);
  	return 0;
  #else
  	return -ENOEXEC;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020
  #ifdef CONFIG_MODVERSIONS
d4703aefd   Rusty Russell   module: handle pp...
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
  /* If the arch applies (non-zero) relocations to kernel kcrctab, unapply it. */
  static unsigned long maybe_relocated(unsigned long crc,
  				     const struct module *crc_owner)
  {
  #ifdef ARCH_RELOCATES_KCRCTAB
  	if (crc_owner == NULL)
  		return crc - (unsigned long)reloc_start;
  #endif
  	return crc;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
1032
1033
1034
  static int check_version(Elf_Shdr *sechdrs,
  			 unsigned int versindex,
  			 const char *symname,
  			 struct module *mod, 
d4703aefd   Rusty Russell   module: handle pp...
1035
1036
  			 const unsigned long *crc,
  			 const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037
1038
1039
1040
1041
1042
1043
  {
  	unsigned int i, num_versions;
  	struct modversion_info *versions;
  
  	/* Exporting module didn't supply crcs?  OK, we're already tainted. */
  	if (!crc)
  		return 1;
a5dd69707   Rusty Russell   module: be more p...
1044
1045
1046
  	/* No versions at all?  modprobe --force does this. */
  	if (versindex == 0)
  		return try_to_force_load(mod, symname) == 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1047
1048
1049
1050
1051
1052
1053
  	versions = (void *) sechdrs[versindex].sh_addr;
  	num_versions = sechdrs[versindex].sh_size
  		/ sizeof(struct modversion_info);
  
  	for (i = 0; i < num_versions; i++) {
  		if (strcmp(versions[i].name, symname) != 0)
  			continue;
d4703aefd   Rusty Russell   module: handle pp...
1054
  		if (versions[i].crc == maybe_relocated(*crc, crc_owner))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1055
  			return 1;
5e1241692   Jim Cromie   module: replace D...
1056
1057
  		pr_debug("Found checksum %lX vs module %lX
  ",
d4703aefd   Rusty Russell   module: handle pp...
1058
  		       maybe_relocated(*crc, crc_owner), versions[i].crc);
826e4506a   Linus Torvalds   Make forced modul...
1059
  		goto bad_version;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1060
  	}
826e4506a   Linus Torvalds   Make forced modul...
1061

a5dd69707   Rusty Russell   module: be more p...
1062
1063
1064
1065
  	printk(KERN_WARNING "%s: no symbol version for %s
  ",
  	       mod->name, symname);
  	return 0;
826e4506a   Linus Torvalds   Make forced modul...
1066
1067
1068
1069
1070
1071
  
  bad_version:
  	printk("%s: disagrees about version of symbol %s
  ",
  	       mod->name, symname);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1072
1073
1074
1075
1076
1077
1078
  }
  
  static inline int check_modstruct_version(Elf_Shdr *sechdrs,
  					  unsigned int versindex,
  					  struct module *mod)
  {
  	const unsigned long *crc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079

75676500f   Rusty Russell   module: make lock...
1080
1081
  	/* Since this should be found in kernel (which can't be removed),
  	 * no locking is necessary. */
6560dc160   Mike Frysinger   module: use MODUL...
1082
1083
  	if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout", NULL,
  			 &crc, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084
  		BUG();
d4703aefd   Rusty Russell   module: handle pp...
1085
1086
  	return check_version(sechdrs, versindex, "module_layout", mod, crc,
  			     NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1087
  }
91e37a793   Rusty Russell   module: don't ign...
1088
1089
1090
  /* First part is kernel version, which we ignore if module has crcs. */
  static inline int same_magic(const char *amagic, const char *bmagic,
  			     bool has_crcs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
  {
91e37a793   Rusty Russell   module: don't ign...
1092
1093
1094
1095
  	if (has_crcs) {
  		amagic += strcspn(amagic, " ");
  		bmagic += strcspn(bmagic, " ");
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1096
1097
1098
1099
1100
1101
1102
  	return strcmp(amagic, bmagic) == 0;
  }
  #else
  static inline int check_version(Elf_Shdr *sechdrs,
  				unsigned int versindex,
  				const char *symname,
  				struct module *mod, 
d4703aefd   Rusty Russell   module: handle pp...
1103
1104
  				const unsigned long *crc,
  				const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
  {
  	return 1;
  }
  
  static inline int check_modstruct_version(Elf_Shdr *sechdrs,
  					  unsigned int versindex,
  					  struct module *mod)
  {
  	return 1;
  }
91e37a793   Rusty Russell   module: don't ign...
1115
1116
  static inline int same_magic(const char *amagic, const char *bmagic,
  			     bool has_crcs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1117
1118
1119
1120
  {
  	return strcmp(amagic, bmagic) == 0;
  }
  #endif /* CONFIG_MODVERSIONS */
75676500f   Rusty Russell   module: make lock...
1121
  /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
49668688d   Rusty Russell   module: pass load...
1122
1123
  static const struct kernel_symbol *resolve_symbol(struct module *mod,
  						  const struct load_info *info,
414fd31b2   Tim Abbott   module: Make find...
1124
  						  const char *name,
9bea7f239   Rusty Russell   module: fix bne2 ...
1125
  						  char ownername[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1126
1127
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1128
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1129
  	const unsigned long *crc;
9bea7f239   Rusty Russell   module: fix bne2 ...
1130
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1131

75676500f   Rusty Russell   module: make lock...
1132
  	mutex_lock(&module_mutex);
414fd31b2   Tim Abbott   module: Make find...
1133
  	sym = find_symbol(name, &owner, &crc,
25ddbb18a   Andi Kleen   Make the taint fl...
1134
  			  !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
9bea7f239   Rusty Russell   module: fix bne2 ...
1135
1136
  	if (!sym)
  		goto unlock;
49668688d   Rusty Russell   module: pass load...
1137
1138
  	if (!check_version(info->sechdrs, info->index.vers, name, mod, crc,
  			   owner)) {
9bea7f239   Rusty Russell   module: fix bne2 ...
1139
1140
  		sym = ERR_PTR(-EINVAL);
  		goto getname;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1141
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
  
  	err = ref_module(mod, owner);
  	if (err) {
  		sym = ERR_PTR(err);
  		goto getname;
  	}
  
  getname:
  	/* We must make copy under the lock if we failed to get ref. */
  	strncpy(ownername, module_name(owner), MODULE_NAME_LEN);
  unlock:
75676500f   Rusty Russell   module: make lock...
1153
  	mutex_unlock(&module_mutex);
218ce7351   Linus Torvalds   Revert "module: d...
1154
  	return sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
  }
49668688d   Rusty Russell   module: pass load...
1156
1157
1158
1159
  static const struct kernel_symbol *
  resolve_symbol_wait(struct module *mod,
  		    const struct load_info *info,
  		    const char *name)
9bea7f239   Rusty Russell   module: fix bne2 ...
1160
1161
  {
  	const struct kernel_symbol *ksym;
49668688d   Rusty Russell   module: pass load...
1162
  	char owner[MODULE_NAME_LEN];
9bea7f239   Rusty Russell   module: fix bne2 ...
1163
1164
  
  	if (wait_event_interruptible_timeout(module_wq,
49668688d   Rusty Russell   module: pass load...
1165
1166
  			!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
  			|| PTR_ERR(ksym) != -EBUSY,
9bea7f239   Rusty Russell   module: fix bne2 ...
1167
1168
1169
  					     30 * HZ) <= 0) {
  		printk(KERN_WARNING "%s: gave up waiting for init of module %s.
  ",
49668688d   Rusty Russell   module: pass load...
1170
  		       mod->name, owner);
9bea7f239   Rusty Russell   module: fix bne2 ...
1171
1172
1173
  	}
  	return ksym;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1174
1175
1176
1177
  /*
   * /sys/module/foo/sections stuff
   * J. Corbet <corbet@lwn.net>
   */
8f6d03781   Rusty Russell   module: sysfs cle...
1178
  #ifdef CONFIG_SYSFS
10b465aaf   Ben Hutchings   modules: Skip emp...
1179

8f6d03781   Rusty Russell   module: sysfs cle...
1180
  #ifdef CONFIG_KALLSYMS
10b465aaf   Ben Hutchings   modules: Skip emp...
1181
1182
1183
1184
  static inline bool sect_empty(const Elf_Shdr *sect)
  {
  	return !(sect->sh_flags & SHF_ALLOC) || sect->sh_size == 0;
  }
a58730c42   Rusty Russell   module: make modu...
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
  struct module_sect_attr
  {
  	struct module_attribute mattr;
  	char *name;
  	unsigned long address;
  };
  
  struct module_sect_attrs
  {
  	struct attribute_group grp;
  	unsigned int nsections;
  	struct module_sect_attr attrs[0];
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1198
  static ssize_t module_sect_show(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1199
  				struct module_kobject *mk, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1200
1201
1202
  {
  	struct module_sect_attr *sattr =
  		container_of(mattr, struct module_sect_attr, mattr);
9f36e2c44   Kees Cook   printk: use %pK f...
1203
1204
  	return sprintf(buf, "0x%pK
  ", (void *)sattr->address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1205
  }
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1206
1207
  static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
  {
a58730c42   Rusty Russell   module: make modu...
1208
  	unsigned int section;
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1209
1210
1211
1212
1213
  
  	for (section = 0; section < sect_attrs->nsections; section++)
  		kfree(sect_attrs->attrs[section].name);
  	kfree(sect_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1214
  static void add_sect_attrs(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1215
1216
1217
1218
1219
  {
  	unsigned int nloaded = 0, i, size[2];
  	struct module_sect_attrs *sect_attrs;
  	struct module_sect_attr *sattr;
  	struct attribute **gattr;
22a8bdeb5   Daniel Walker   whitespace fixes:...
1220

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1221
  	/* Count loaded sections and allocate structures */
8f6d03781   Rusty Russell   module: sysfs cle...
1222
1223
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		if (!sect_empty(&info->sechdrs[i]))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1224
1225
1226
1227
1228
  			nloaded++;
  	size[0] = ALIGN(sizeof(*sect_attrs)
  			+ nloaded * sizeof(sect_attrs->attrs[0]),
  			sizeof(sect_attrs->grp.attrs[0]));
  	size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]);
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1229
1230
  	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
  	if (sect_attrs == NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1231
1232
1233
1234
1235
  		return;
  
  	/* Setup section attributes. */
  	sect_attrs->grp.name = "sections";
  	sect_attrs->grp.attrs = (void *)sect_attrs + size[0];
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1236
  	sect_attrs->nsections = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1237
1238
  	sattr = &sect_attrs->attrs[0];
  	gattr = &sect_attrs->grp.attrs[0];
8f6d03781   Rusty Russell   module: sysfs cle...
1239
1240
1241
  	for (i = 0; i < info->hdr->e_shnum; i++) {
  		Elf_Shdr *sec = &info->sechdrs[i];
  		if (sect_empty(sec))
35dead423   Helge Deller   modules: don't ex...
1242
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1243
1244
  		sattr->address = sec->sh_addr;
  		sattr->name = kstrdup(info->secstrings + sec->sh_name,
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1245
1246
1247
1248
  					GFP_KERNEL);
  		if (sattr->name == NULL)
  			goto out;
  		sect_attrs->nsections++;
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1249
  		sysfs_attr_init(&sattr->mattr.attr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250
1251
1252
  		sattr->mattr.show = module_sect_show;
  		sattr->mattr.store = NULL;
  		sattr->mattr.attr.name = sattr->name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
  		sattr->mattr.attr.mode = S_IRUGO;
  		*(gattr++) = &(sattr++)->mattr.attr;
  	}
  	*gattr = NULL;
  
  	if (sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp))
  		goto out;
  
  	mod->sect_attrs = sect_attrs;
  	return;
    out:
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1264
  	free_sect_attrs(sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1265
1266
1267
1268
1269
1270
1271
1272
1273
  }
  
  static void remove_sect_attrs(struct module *mod)
  {
  	if (mod->sect_attrs) {
  		sysfs_remove_group(&mod->mkobj.kobj,
  				   &mod->sect_attrs->grp);
  		/* We are positive that no one is using any sect attrs
  		 * at this point.  Deallocate immediately. */
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1274
  		free_sect_attrs(mod->sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1275
1276
1277
  		mod->sect_attrs = NULL;
  	}
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1278
1279
1280
1281
1282
1283
1284
1285
1286
  /*
   * /sys/module/foo/notes/.section.name gives contents of SHT_NOTE sections.
   */
  
  struct module_notes_attrs {
  	struct kobject *dir;
  	unsigned int notes;
  	struct bin_attribute attrs[0];
  };
2c3c8bea6   Chris Wright   sysfs: add struct...
1287
  static ssize_t module_notes_read(struct file *filp, struct kobject *kobj,
6d7601338   Roland McGrath   Add /sys/module/n...
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
  				 struct bin_attribute *bin_attr,
  				 char *buf, loff_t pos, size_t count)
  {
  	/*
  	 * The caller checked the pos and count against our size.
  	 */
  	memcpy(buf, bin_attr->private + pos, count);
  	return count;
  }
  
  static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
  			     unsigned int i)
  {
  	if (notes_attrs->dir) {
  		while (i-- > 0)
  			sysfs_remove_bin_file(notes_attrs->dir,
  					      &notes_attrs->attrs[i]);
e94320939   Alexey Dobriyan   modules: fix modu...
1305
  		kobject_put(notes_attrs->dir);
6d7601338   Roland McGrath   Add /sys/module/n...
1306
1307
1308
  	}
  	kfree(notes_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1309
  static void add_notes_attrs(struct module *mod, const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1310
1311
1312
1313
  {
  	unsigned int notes, loaded, i;
  	struct module_notes_attrs *notes_attrs;
  	struct bin_attribute *nattr;
ea6bff368   Ingo Molnar   modules: Fix buil...
1314
1315
1316
  	/* failed to create section attributes, so can't create notes */
  	if (!mod->sect_attrs)
  		return;
6d7601338   Roland McGrath   Add /sys/module/n...
1317
1318
  	/* Count notes sections and allocate structures.  */
  	notes = 0;
8f6d03781   Rusty Russell   module: sysfs cle...
1319
1320
1321
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		if (!sect_empty(&info->sechdrs[i]) &&
  		    (info->sechdrs[i].sh_type == SHT_NOTE))
6d7601338   Roland McGrath   Add /sys/module/n...
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
  			++notes;
  
  	if (notes == 0)
  		return;
  
  	notes_attrs = kzalloc(sizeof(*notes_attrs)
  			      + notes * sizeof(notes_attrs->attrs[0]),
  			      GFP_KERNEL);
  	if (notes_attrs == NULL)
  		return;
  
  	notes_attrs->notes = notes;
  	nattr = &notes_attrs->attrs[0];
8f6d03781   Rusty Russell   module: sysfs cle...
1335
1336
  	for (loaded = i = 0; i < info->hdr->e_shnum; ++i) {
  		if (sect_empty(&info->sechdrs[i]))
6d7601338   Roland McGrath   Add /sys/module/n...
1337
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1338
  		if (info->sechdrs[i].sh_type == SHT_NOTE) {
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1339
  			sysfs_bin_attr_init(nattr);
6d7601338   Roland McGrath   Add /sys/module/n...
1340
1341
  			nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
  			nattr->attr.mode = S_IRUGO;
8f6d03781   Rusty Russell   module: sysfs cle...
1342
1343
  			nattr->size = info->sechdrs[i].sh_size;
  			nattr->private = (void *) info->sechdrs[i].sh_addr;
6d7601338   Roland McGrath   Add /sys/module/n...
1344
1345
1346
1347
1348
  			nattr->read = module_notes_read;
  			++nattr;
  		}
  		++loaded;
  	}
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1349
  	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
6d7601338   Roland McGrath   Add /sys/module/n...
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
  	if (!notes_attrs->dir)
  		goto out;
  
  	for (i = 0; i < notes; ++i)
  		if (sysfs_create_bin_file(notes_attrs->dir,
  					  &notes_attrs->attrs[i]))
  			goto out;
  
  	mod->notes_attrs = notes_attrs;
  	return;
  
    out:
  	free_notes_attrs(notes_attrs, i);
  }
  
  static void remove_notes_attrs(struct module *mod)
  {
  	if (mod->notes_attrs)
  		free_notes_attrs(mod->notes_attrs, mod->notes_attrs->notes);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1370
  #else
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1371

8f6d03781   Rusty Russell   module: sysfs cle...
1372
1373
  static inline void add_sect_attrs(struct module *mod,
  				  const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1374
1375
1376
1377
1378
1379
  {
  }
  
  static inline void remove_sect_attrs(struct module *mod)
  {
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1380

8f6d03781   Rusty Russell   module: sysfs cle...
1381
1382
  static inline void add_notes_attrs(struct module *mod,
  				   const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1383
1384
1385
1386
1387
1388
  {
  }
  
  static inline void remove_notes_attrs(struct module *mod)
  {
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1389
  #endif /* CONFIG_KALLSYMS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1390

80a3d1bb4   Rusty Russell   module: move sysf...
1391
1392
1393
1394
1395
  static void add_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
  	int nowarn;
75676500f   Rusty Russell   module: make lock...
1396
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1397
1398
1399
1400
  	list_for_each_entry(use, &mod->target_list, target_list) {
  		nowarn = sysfs_create_link(use->target->holders_dir,
  					   &mod->mkobj.kobj, mod->name);
  	}
75676500f   Rusty Russell   module: make lock...
1401
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1402
1403
1404
1405
1406
1407
1408
  #endif
  }
  
  static void del_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
75676500f   Rusty Russell   module: make lock...
1409
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1410
1411
  	list_for_each_entry(use, &mod->target_list, target_list)
  		sysfs_remove_link(use->target->holders_dir, mod->name);
75676500f   Rusty Russell   module: make lock...
1412
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1413
1414
  #endif
  }
6407ebb27   Rusty Russell   module: Make modu...
1415
  static int module_add_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1416
1417
  {
  	struct module_attribute *attr;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1418
  	struct module_attribute *temp_attr;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1419
1420
  	int error = 0;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1421
1422
1423
1424
1425
1426
1427
  	mod->modinfo_attrs = kzalloc((sizeof(struct module_attribute) *
  					(ARRAY_SIZE(modinfo_attrs) + 1)),
  					GFP_KERNEL);
  	if (!mod->modinfo_attrs)
  		return -ENOMEM;
  
  	temp_attr = mod->modinfo_attrs;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1428
1429
  	for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) {
  		if (!attr->test ||
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1430
1431
  		    (attr->test && attr->test(mod))) {
  			memcpy(temp_attr, attr, sizeof(*temp_attr));
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1432
  			sysfs_attr_init(&temp_attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1433
1434
1435
  			error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr);
  			++temp_attr;
  		}
c988d2b28   Matt Domsch   [PATCH] modules: ...
1436
1437
1438
  	}
  	return error;
  }
6407ebb27   Rusty Russell   module: Make modu...
1439
  static void module_remove_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1440
1441
1442
  {
  	struct module_attribute *attr;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1443
1444
1445
1446
  	for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) {
  		/* pick a field to test for end of list */
  		if (!attr->attr.name)
  			break;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1447
  		sysfs_remove_file(&mod->mkobj.kobj,&attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1448
1449
  		if (attr->free)
  			attr->free(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1450
  	}
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1451
  	kfree(mod->modinfo_attrs);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1452
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1453

6407ebb27   Rusty Russell   module: Make modu...
1454
  static int mod_sysfs_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1455
1456
  {
  	int err;
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1457
  	struct kobject *kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1458

823bccfc4   Greg Kroah-Hartman   remove "struct su...
1459
1460
1461
  	if (!module_sysfs_initialized) {
  		printk(KERN_ERR "%s: module sysfs not initialized
  ",
1cc5f7142   Ed Swierk   [PATCH] load_modu...
1462
1463
1464
1465
  		       mod->name);
  		err = -EINVAL;
  		goto out;
  	}
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1466
1467
1468
1469
1470
1471
1472
1473
1474
  
  	kobj = kset_find_obj(module_kset, mod->name);
  	if (kobj) {
  		printk(KERN_ERR "%s: module is already loaded
  ", mod->name);
  		kobject_put(kobj);
  		err = -EINVAL;
  		goto out;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1475
  	mod->mkobj.mod = mod;
e17e0f51a   Kay Sievers   Driver core: show...
1476

ac3c8141f   Greg Kroah-Hartman   Kobject: convert ...
1477
1478
1479
1480
1481
1482
  	memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj));
  	mod->mkobj.kobj.kset = module_kset;
  	err = kobject_init_and_add(&mod->mkobj.kobj, &module_ktype, NULL,
  				   "%s", mod->name);
  	if (err)
  		kobject_put(&mod->mkobj.kobj);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1483

97c146ef0   Kay Sievers   sysfs: fix /sys/m...
1484
  	/* delay uevent until full sysfs population */
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1485
1486
1487
  out:
  	return err;
  }
6407ebb27   Rusty Russell   module: Make modu...
1488
  static int mod_sysfs_setup(struct module *mod,
8f6d03781   Rusty Russell   module: sysfs cle...
1489
  			   const struct load_info *info,
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1490
1491
1492
1493
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	int err;
80a3d1bb4   Rusty Russell   module: move sysf...
1494
1495
1496
  	err = mod_sysfs_init(mod);
  	if (err)
  		goto out;
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1497
  	mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
240936e18   Akinobu Mita   mod_sysfs_setup()...
1498
1499
  	if (!mod->holders_dir) {
  		err = -ENOMEM;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1500
  		goto out_unreg;
240936e18   Akinobu Mita   mod_sysfs_setup()...
1501
  	}
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1502

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1503
1504
  	err = module_param_sysfs_setup(mod, kparam, num_params);
  	if (err)
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1505
  		goto out_unreg_holders;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1506

c988d2b28   Matt Domsch   [PATCH] modules: ...
1507
1508
  	err = module_add_modinfo_attrs(mod);
  	if (err)
e17e0f51a   Kay Sievers   Driver core: show...
1509
  		goto out_unreg_param;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1510

80a3d1bb4   Rusty Russell   module: move sysf...
1511
  	add_usage_links(mod);
8f6d03781   Rusty Russell   module: sysfs cle...
1512
1513
  	add_sect_attrs(mod, info);
  	add_notes_attrs(mod, info);
80a3d1bb4   Rusty Russell   module: move sysf...
1514

e17e0f51a   Kay Sievers   Driver core: show...
1515
  	kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1516
  	return 0;
e17e0f51a   Kay Sievers   Driver core: show...
1517
1518
  out_unreg_param:
  	module_param_sysfs_remove(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1519
  out_unreg_holders:
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1520
  	kobject_put(mod->holders_dir);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1521
  out_unreg:
e17e0f51a   Kay Sievers   Driver core: show...
1522
  	kobject_put(&mod->mkobj.kobj);
80a3d1bb4   Rusty Russell   module: move sysf...
1523
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1524
1525
  	return err;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1526
1527
1528
  
  static void mod_sysfs_fini(struct module *mod)
  {
8f6d03781   Rusty Russell   module: sysfs cle...
1529
1530
  	remove_notes_attrs(mod);
  	remove_sect_attrs(mod);
34e4e2fef   Denis V. Lunev   modules: proper c...
1531
1532
  	kobject_put(&mod->mkobj.kobj);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1533
  #else /* !CONFIG_SYSFS */
34e4e2fef   Denis V. Lunev   modules: proper c...
1534

8f6d03781   Rusty Russell   module: sysfs cle...
1535
1536
  static int mod_sysfs_setup(struct module *mod,
  			   const struct load_info *info,
6407ebb27   Rusty Russell   module: Make modu...
1537
1538
1539
1540
1541
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	return 0;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1542
1543
1544
  static void mod_sysfs_fini(struct module *mod)
  {
  }
36b0360d1   Rusty Russell   module: fix sysfs...
1545
1546
1547
  static void module_remove_modinfo_attrs(struct module *mod)
  {
  }
80a3d1bb4   Rusty Russell   module: move sysf...
1548
1549
1550
  static void del_usage_links(struct module *mod)
  {
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1551
  #endif /* CONFIG_SYSFS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1552

36b0360d1   Rusty Russell   module: fix sysfs...
1553
  static void mod_sysfs_teardown(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1554
  {
80a3d1bb4   Rusty Russell   module: move sysf...
1555
  	del_usage_links(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1556
  	module_remove_modinfo_attrs(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1557
  	module_param_sysfs_remove(mod);
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1558
1559
  	kobject_put(mod->mkobj.drivers_dir);
  	kobject_put(mod->holders_dir);
34e4e2fef   Denis V. Lunev   modules: proper c...
1560
  	mod_sysfs_fini(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
  }
  
  /*
   * unlink the module with the whole machine is stopped with interrupts off
   * - this defends against kallsyms not taking locks
   */
  static int __unlink_module(void *_mod)
  {
  	struct module *mod = _mod;
  	list_del(&mod->list);
5336377d6   Linus Torvalds   modules: Fix modu...
1571
  	module_bug_cleanup(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1572
1573
  	return 0;
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
  #ifdef CONFIG_DEBUG_SET_MODULE_RONX
  /*
   * LKM RO/NX protection: protect module's text/ro-data
   * from modification and any data from execution.
   */
  void set_page_attributes(void *start, void *end, int (*set)(unsigned long start, int num_pages))
  {
  	unsigned long begin_pfn = PFN_DOWN((unsigned long)start);
  	unsigned long end_pfn = PFN_DOWN((unsigned long)end);
  
  	if (end_pfn > begin_pfn)
  		set(begin_pfn << PAGE_SHIFT, end_pfn - begin_pfn);
  }
  
  static void set_section_ro_nx(void *base,
  			unsigned long text_size,
  			unsigned long ro_size,
  			unsigned long total_size)
  {
  	/* begin and end PFNs of the current subsection */
  	unsigned long begin_pfn;
  	unsigned long end_pfn;
  
  	/*
  	 * Set RO for module text and RO-data:
  	 * - Always protect first page.
  	 * - Do not protect last partial page.
  	 */
  	if (ro_size > 0)
  		set_page_attributes(base, base + ro_size, set_memory_ro);
  
  	/*
  	 * Set NX permissions for module data:
  	 * - Do not protect first partial page.
  	 * - Always protect last page.
  	 */
  	if (total_size > text_size) {
  		begin_pfn = PFN_UP((unsigned long)base + text_size);
  		end_pfn = PFN_UP((unsigned long)base + total_size);
  		if (end_pfn > begin_pfn)
  			set_memory_nx(begin_pfn << PAGE_SHIFT, end_pfn - begin_pfn);
  	}
  }
01526ed08   Jan Glauber   module: split uns...
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
  static void unset_module_core_ro_nx(struct module *mod)
  {
  	set_page_attributes(mod->module_core + mod->core_text_size,
  		mod->module_core + mod->core_size,
  		set_memory_x);
  	set_page_attributes(mod->module_core,
  		mod->module_core + mod->core_ro_size,
  		set_memory_rw);
  }
  
  static void unset_module_init_ro_nx(struct module *mod)
  {
  	set_page_attributes(mod->module_init + mod->init_text_size,
  		mod->module_init + mod->init_size,
  		set_memory_x);
  	set_page_attributes(mod->module_init,
  		mod->module_init + mod->init_ro_size,
  		set_memory_rw);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1635
1636
1637
  }
  
  /* Iterate through all modules and set each module's text as RW */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1638
  void set_all_modules_text_rw(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if ((mod->module_core) && (mod->core_text_size)) {
  			set_page_attributes(mod->module_core,
  						mod->module_core + mod->core_text_size,
  						set_memory_rw);
  		}
  		if ((mod->module_init) && (mod->init_text_size)) {
  			set_page_attributes(mod->module_init,
  						mod->module_init + mod->init_text_size,
  						set_memory_rw);
  		}
  	}
  	mutex_unlock(&module_mutex);
  }
  
  /* Iterate through all modules and set each module's text as RO */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1659
  void set_all_modules_text_ro(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if ((mod->module_core) && (mod->core_text_size)) {
  			set_page_attributes(mod->module_core,
  						mod->module_core + mod->core_text_size,
  						set_memory_ro);
  		}
  		if ((mod->module_init) && (mod->init_text_size)) {
  			set_page_attributes(mod->module_init,
  						mod->module_init + mod->init_text_size,
  						set_memory_ro);
  		}
  	}
  	mutex_unlock(&module_mutex);
  }
  #else
  static inline void set_section_ro_nx(void *base, unsigned long text_size, unsigned long ro_size, unsigned long total_size) { }
01526ed08   Jan Glauber   module: split uns...
1680
1681
  static void unset_module_core_ro_nx(struct module *mod) { }
  static void unset_module_init_ro_nx(struct module *mod) { }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1682
  #endif
74e08fcf7   Jonas Bonn   modules: add defa...
1683
1684
1685
1686
1687
1688
1689
1690
  void __weak module_free(struct module *mod, void *module_region)
  {
  	vfree(module_region);
  }
  
  void __weak module_arch_cleanup(struct module *mod)
  {
  }
75676500f   Rusty Russell   module: make lock...
1691
  /* Free a module, remove from lists, etc. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1692
1693
  static void free_module(struct module *mod)
  {
7ead8b831   Li Zefan   tracing/events: A...
1694
  	trace_module_free(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1695
  	/* Delete from various lists */
75676500f   Rusty Russell   module: make lock...
1696
  	mutex_lock(&module_mutex);
9b1a4d383   Rusty Russell   stop_machine: Wea...
1697
  	stop_machine(__unlink_module, mod, NULL);
75676500f   Rusty Russell   module: make lock...
1698
  	mutex_unlock(&module_mutex);
36b0360d1   Rusty Russell   module: fix sysfs...
1699
  	mod_sysfs_teardown(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1700

b82bab4bb   Jason Baron   dynamic debug: mo...
1701
1702
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1703
1704
1705
1706
1707
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
1708
1709
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1710
  	/* This may be NULL, but that's OK */
01526ed08   Jan Glauber   module: split uns...
1711
  	unset_module_init_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1712
1713
  	module_free(mod, mod->module_init);
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
1714
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
1715

fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
1716
1717
  	/* Free lock-classes: */
  	lockdep_free_key_range(mod->module_core, mod->core_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1718
  	/* Finally, free the core (containing the module structure) */
01526ed08   Jan Glauber   module: split uns...
1719
  	unset_module_core_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1720
  	module_free(mod, mod->module_core);
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
1721
1722
1723
1724
  
  #ifdef CONFIG_MPU
  	update_protections(current->mm);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1725
1726
1727
1728
1729
  }
  
  void *__symbol_get(const char *symbol)
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1730
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1731

24da1cbff   Rusty Russell   modules: remove m...
1732
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
1733
1734
1735
  	sym = find_symbol(symbol, &owner, NULL, true, true);
  	if (sym && strong_try_module_get(owner))
  		sym = NULL;
24da1cbff   Rusty Russell   modules: remove m...
1736
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1737

414fd31b2   Tim Abbott   module: Make find...
1738
  	return sym ? (void *)sym->value : NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1739
1740
  }
  EXPORT_SYMBOL_GPL(__symbol_get);
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1741
1742
  /*
   * Ensure that an exported symbol [global namespace] does not already exist
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
1743
   * in the kernel or in some other module's exported symbol table.
be593f4ce   Rusty Russell   module: verify_ex...
1744
1745
   *
   * You must hold the module_mutex.
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1746
1747
1748
   */
  static int verify_export_symbols(struct module *mod)
  {
b211104d1   Rusty Russell   module: Enhance v...
1749
  	unsigned int i;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1750
  	struct module *owner;
b211104d1   Rusty Russell   module: Enhance v...
1751
1752
1753
1754
1755
1756
1757
1758
  	const struct kernel_symbol *s;
  	struct {
  		const struct kernel_symbol *sym;
  		unsigned int num;
  	} arr[] = {
  		{ mod->syms, mod->num_syms },
  		{ mod->gpl_syms, mod->num_gpl_syms },
  		{ mod->gpl_future_syms, mod->num_gpl_future_syms },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
1759
  #ifdef CONFIG_UNUSED_SYMBOLS
b211104d1   Rusty Russell   module: Enhance v...
1760
1761
  		{ mod->unused_syms, mod->num_unused_syms },
  		{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
1762
  #endif
b211104d1   Rusty Russell   module: Enhance v...
1763
  	};
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1764

b211104d1   Rusty Russell   module: Enhance v...
1765
1766
  	for (i = 0; i < ARRAY_SIZE(arr); i++) {
  		for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
be593f4ce   Rusty Russell   module: verify_ex...
1767
  			if (find_symbol(s->name, &owner, NULL, true, false)) {
b211104d1   Rusty Russell   module: Enhance v...
1768
1769
1770
1771
1772
1773
1774
  				printk(KERN_ERR
  				       "%s: exports duplicate symbol %s"
  				       " (owned by %s)
  ",
  				       mod->name, s->name, module_name(owner));
  				return -ENOEXEC;
  			}
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1775
  		}
b211104d1   Rusty Russell   module: Enhance v...
1776
1777
  	}
  	return 0;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1778
  }
9a4b9708f   Matti Linnanvuori   module: fix and e...
1779
  /* Change all symbols so that st_value encodes the pointer directly. */
49668688d   Rusty Russell   module: pass load...
1780
1781
1782
1783
  static int simplify_symbols(struct module *mod, const struct load_info *info)
  {
  	Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
  	Elf_Sym *sym = (void *)symsec->sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1784
  	unsigned long secbase;
49668688d   Rusty Russell   module: pass load...
1785
  	unsigned int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1786
  	int ret = 0;
414fd31b2   Tim Abbott   module: Make find...
1787
  	const struct kernel_symbol *ksym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1788

49668688d   Rusty Russell   module: pass load...
1789
1790
  	for (i = 1; i < symsec->sh_size / sizeof(Elf_Sym); i++) {
  		const char *name = info->strtab + sym[i].st_name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1791
1792
1793
1794
  		switch (sym[i].st_shndx) {
  		case SHN_COMMON:
  			/* We compiled with -fno-common.  These are not
  			   supposed to happen.  */
5e1241692   Jim Cromie   module: replace D...
1795
1796
  			pr_debug("Common symbol: %s
  ", name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1797
1798
1799
1800
1801
1802
1803
1804
  			printk("%s: please compile with -fno-common
  ",
  			       mod->name);
  			ret = -ENOEXEC;
  			break;
  
  		case SHN_ABS:
  			/* Don't need to do anything */
5e1241692   Jim Cromie   module: replace D...
1805
1806
  			pr_debug("Absolute symbol: 0x%08lx
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1807
1808
1809
1810
  			       (long)sym[i].st_value);
  			break;
  
  		case SHN_UNDEF:
49668688d   Rusty Russell   module: pass load...
1811
  			ksym = resolve_symbol_wait(mod, info, name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1812
  			/* Ok if resolved.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
1813
  			if (ksym && !IS_ERR(ksym)) {
414fd31b2   Tim Abbott   module: Make find...
1814
  				sym[i].st_value = ksym->value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1815
  				break;
414fd31b2   Tim Abbott   module: Make find...
1816
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1817
  			/* Ok if weak.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
1818
  			if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1819
  				break;
9bea7f239   Rusty Russell   module: fix bne2 ...
1820
1821
  			printk(KERN_WARNING "%s: Unknown symbol %s (err %li)
  ",
49668688d   Rusty Russell   module: pass load...
1822
  			       mod->name, name, PTR_ERR(ksym));
9bea7f239   Rusty Russell   module: fix bne2 ...
1823
  			ret = PTR_ERR(ksym) ?: -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1824
1825
1826
1827
  			break;
  
  		default:
  			/* Divert to percpu allocation if a percpu var. */
49668688d   Rusty Russell   module: pass load...
1828
  			if (sym[i].st_shndx == info->index.pcpu)
259354dea   Tejun Heo   module: encapsula...
1829
  				secbase = (unsigned long)mod_percpu(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1830
  			else
49668688d   Rusty Russell   module: pass load...
1831
  				secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1832
1833
1834
1835
1836
1837
1838
  			sym[i].st_value += secbase;
  			break;
  		}
  	}
  
  	return ret;
  }
74e08fcf7   Jonas Bonn   modules: add defa...
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
  int __weak apply_relocate(Elf_Shdr *sechdrs,
  			  const char *strtab,
  			  unsigned int symindex,
  			  unsigned int relsec,
  			  struct module *me)
  {
  	pr_err("module %s: REL relocation unsupported
  ", me->name);
  	return -ENOEXEC;
  }
  
  int __weak apply_relocate_add(Elf_Shdr *sechdrs,
  			      const char *strtab,
  			      unsigned int symindex,
  			      unsigned int relsec,
  			      struct module *me)
  {
  	pr_err("module %s: RELA relocation unsupported
  ", me->name);
  	return -ENOEXEC;
  }
49668688d   Rusty Russell   module: pass load...
1860
  static int apply_relocations(struct module *mod, const struct load_info *info)
22e268ebe   Rusty Russell   module: refactor ...
1861
1862
1863
1864
1865
  {
  	unsigned int i;
  	int err = 0;
  
  	/* Now do relocations. */
49668688d   Rusty Russell   module: pass load...
1866
1867
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		unsigned int infosec = info->sechdrs[i].sh_info;
22e268ebe   Rusty Russell   module: refactor ...
1868
1869
  
  		/* Not a valid relocation section? */
49668688d   Rusty Russell   module: pass load...
1870
  		if (infosec >= info->hdr->e_shnum)
22e268ebe   Rusty Russell   module: refactor ...
1871
1872
1873
  			continue;
  
  		/* Don't bother with non-allocated sections */
49668688d   Rusty Russell   module: pass load...
1874
  		if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC))
22e268ebe   Rusty Russell   module: refactor ...
1875
  			continue;
49668688d   Rusty Russell   module: pass load...
1876
1877
1878
1879
1880
1881
  		if (info->sechdrs[i].sh_type == SHT_REL)
  			err = apply_relocate(info->sechdrs, info->strtab,
  					     info->index.sym, i, mod);
  		else if (info->sechdrs[i].sh_type == SHT_RELA)
  			err = apply_relocate_add(info->sechdrs, info->strtab,
  						 info->index.sym, i, mod);
22e268ebe   Rusty Russell   module: refactor ...
1882
1883
1884
1885
1886
  		if (err < 0)
  			break;
  	}
  	return err;
  }
088af9a6e   Helge Deller   module: fix modul...
1887
1888
1889
1890
1891
1892
1893
  /* Additional bytes needed by arch in front of individual sections */
  unsigned int __weak arch_mod_section_prepend(struct module *mod,
  					     unsigned int section)
  {
  	/* default implementation just returns zero */
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1894
  /* Update size with this section: return offset. */
088af9a6e   Helge Deller   module: fix modul...
1895
1896
  static long get_offset(struct module *mod, unsigned int *size,
  		       Elf_Shdr *sechdr, unsigned int section)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1897
1898
  {
  	long ret;
088af9a6e   Helge Deller   module: fix modul...
1899
  	*size += arch_mod_section_prepend(mod, section);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1900
1901
1902
1903
1904
1905
1906
1907
1908
  	ret = ALIGN(*size, sechdr->sh_addralign ?: 1);
  	*size = ret + sechdr->sh_size;
  	return ret;
  }
  
  /* Lay out the SHF_ALLOC sections in a way not dissimilar to how ld
     might -- code, read-only data, read-write data, small data.  Tally
     sizes, and place the offsets into sh_entsize fields: high bit means it
     belongs in init. */
49668688d   Rusty Russell   module: pass load...
1909
  static void layout_sections(struct module *mod, struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
  {
  	static unsigned long const masks[][2] = {
  		/* NOTE: all executable code must be the first section
  		 * in this array; otherwise modify the text_size
  		 * finder in the two loops below */
  		{ SHF_EXECINSTR | SHF_ALLOC, ARCH_SHF_SMALL },
  		{ SHF_ALLOC, SHF_WRITE | ARCH_SHF_SMALL },
  		{ SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL },
  		{ ARCH_SHF_SMALL | SHF_ALLOC, 0 }
  	};
  	unsigned int m, i;
49668688d   Rusty Russell   module: pass load...
1921
1922
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		info->sechdrs[i].sh_entsize = ~0UL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1923

5e1241692   Jim Cromie   module: replace D...
1924
1925
  	pr_debug("Core section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1926
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
1927
1928
1929
  		for (i = 0; i < info->hdr->e_shnum; ++i) {
  			Elf_Shdr *s = &info->sechdrs[i];
  			const char *sname = info->secstrings + s->sh_name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1930
1931
1932
1933
  
  			if ((s->sh_flags & masks[m][0]) != masks[m][0]
  			    || (s->sh_flags & masks[m][1])
  			    || s->sh_entsize != ~0UL
49668688d   Rusty Russell   module: pass load...
1934
  			    || strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1935
  				continue;
088af9a6e   Helge Deller   module: fix modul...
1936
  			s->sh_entsize = get_offset(mod, &mod->core_size, s, i);
5e1241692   Jim Cromie   module: replace D...
1937
1938
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1939
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1940
1941
1942
  		switch (m) {
  		case 0: /* executable */
  			mod->core_size = debug_align(mod->core_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1943
  			mod->core_text_size = mod->core_size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1944
1945
1946
1947
1948
1949
1950
1951
1952
  			break;
  		case 1: /* RO: text and ro-data */
  			mod->core_size = debug_align(mod->core_size);
  			mod->core_ro_size = mod->core_size;
  			break;
  		case 3: /* whole core */
  			mod->core_size = debug_align(mod->core_size);
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1953
  	}
5e1241692   Jim Cromie   module: replace D...
1954
1955
  	pr_debug("Init section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1956
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
1957
1958
1959
  		for (i = 0; i < info->hdr->e_shnum; ++i) {
  			Elf_Shdr *s = &info->sechdrs[i];
  			const char *sname = info->secstrings + s->sh_name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1960
1961
1962
1963
  
  			if ((s->sh_flags & masks[m][0]) != masks[m][0]
  			    || (s->sh_flags & masks[m][1])
  			    || s->sh_entsize != ~0UL
49668688d   Rusty Russell   module: pass load...
1964
  			    || !strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1965
  				continue;
088af9a6e   Helge Deller   module: fix modul...
1966
  			s->sh_entsize = (get_offset(mod, &mod->init_size, s, i)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1967
  					 | INIT_OFFSET_MASK);
5e1241692   Jim Cromie   module: replace D...
1968
1969
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1970
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1971
1972
1973
  		switch (m) {
  		case 0: /* executable */
  			mod->init_size = debug_align(mod->init_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1974
  			mod->init_text_size = mod->init_size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1975
1976
1977
1978
1979
1980
1981
1982
1983
  			break;
  		case 1: /* RO: text and ro-data */
  			mod->init_size = debug_align(mod->init_size);
  			mod->init_ro_size = mod->init_size;
  			break;
  		case 3: /* whole init */
  			mod->init_size = debug_align(mod->init_size);
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1984
1985
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1986
1987
1988
1989
  static void set_license(struct module *mod, const char *license)
  {
  	if (!license)
  		license = "unspecified";
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
1990
  	if (!license_is_gpl_compatible(license)) {
25ddbb18a   Andi Kleen   Make the taint fl...
1991
  		if (!test_taint(TAINT_PROPRIETARY_MODULE))
1d4d26276   Jan Dittmer   [PATCH] Add missi...
1992
  			printk(KERN_WARNING "%s: module license '%s' taints "
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
1993
1994
1995
  				"kernel.
  ", mod->name, license);
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
  	}
  }
  
  /* Parse tag=value strings from .modinfo section */
  static char *next_string(char *string, unsigned long *secsize)
  {
  	/* Skip non-zero chars */
  	while (string[0]) {
  		string++;
  		if ((*secsize)-- <= 1)
  			return NULL;
  	}
  
  	/* Skip any zero padding. */
  	while (!string[0]) {
  		string++;
  		if ((*secsize)-- <= 1)
  			return NULL;
  	}
  	return string;
  }
49668688d   Rusty Russell   module: pass load...
2017
  static char *get_modinfo(struct load_info *info, const char *tag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2018
2019
2020
  {
  	char *p;
  	unsigned int taglen = strlen(tag);
49668688d   Rusty Russell   module: pass load...
2021
2022
  	Elf_Shdr *infosec = &info->sechdrs[info->index.info];
  	unsigned long size = infosec->sh_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2023

49668688d   Rusty Russell   module: pass load...
2024
  	for (p = (char *)infosec->sh_addr; p; p = next_string(p, &size)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2025
2026
2027
2028
2029
  		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
  			return p + taglen + 1;
  	}
  	return NULL;
  }
49668688d   Rusty Russell   module: pass load...
2030
  static void setup_modinfo(struct module *mod, struct load_info *info)
c988d2b28   Matt Domsch   [PATCH] modules: ...
2031
2032
2033
2034
2035
2036
  {
  	struct module_attribute *attr;
  	int i;
  
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
  		if (attr->setup)
49668688d   Rusty Russell   module: pass load...
2037
  			attr->setup(mod, get_modinfo(info, attr->attr.name));
c988d2b28   Matt Domsch   [PATCH] modules: ...
2038
2039
  	}
  }
c988d2b28   Matt Domsch   [PATCH] modules: ...
2040

a263f7763   Rusty Russell   module: fix memor...
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
  static void free_modinfo(struct module *mod)
  {
  	struct module_attribute *attr;
  	int i;
  
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
  		if (attr->free)
  			attr->free(mod);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2051
  #ifdef CONFIG_KALLSYMS
15bba37d6   WANG Cong   module: fix build...
2052
2053
2054
2055
2056
2057
  
  /* lookup symbol in given range of kernel_symbols */
  static const struct kernel_symbol *lookup_symbol(const char *name,
  	const struct kernel_symbol *start,
  	const struct kernel_symbol *stop)
  {
9d63487f8   Alessio Igor Bogani   module: Use binar...
2058
2059
  	return bsearch(name, start, stop - start,
  			sizeof(struct kernel_symbol), cmp_name);
15bba37d6   WANG Cong   module: fix build...
2060
  }
ca4787b77   Tim Abbott   kernel/module.c: ...
2061
2062
  static int is_exported(const char *name, unsigned long value,
  		       const struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2063
  {
ca4787b77   Tim Abbott   kernel/module.c: ...
2064
2065
2066
  	const struct kernel_symbol *ks;
  	if (!mod)
  		ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab);
3fd6805f4   Sam Ravnborg   [PATCH] Clean up ...
2067
  	else
ca4787b77   Tim Abbott   kernel/module.c: ...
2068
2069
  		ks = lookup_symbol(name, mod->syms, mod->syms + mod->num_syms);
  	return ks != NULL && ks->value == value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2070
2071
2072
  }
  
  /* As per nm */
eded41c1c   Rusty Russell   module: kallsyms ...
2073
  static char elf_type(const Elf_Sym *sym, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2074
  {
eded41c1c   Rusty Russell   module: kallsyms ...
2075
  	const Elf_Shdr *sechdrs = info->sechdrs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
  	if (ELF_ST_BIND(sym->st_info) == STB_WEAK) {
  		if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT)
  			return 'v';
  		else
  			return 'w';
  	}
  	if (sym->st_shndx == SHN_UNDEF)
  		return 'U';
  	if (sym->st_shndx == SHN_ABS)
  		return 'a';
  	if (sym->st_shndx >= SHN_LORESERVE)
  		return '?';
  	if (sechdrs[sym->st_shndx].sh_flags & SHF_EXECINSTR)
  		return 't';
  	if (sechdrs[sym->st_shndx].sh_flags & SHF_ALLOC
  	    && sechdrs[sym->st_shndx].sh_type != SHT_NOBITS) {
  		if (!(sechdrs[sym->st_shndx].sh_flags & SHF_WRITE))
  			return 'r';
  		else if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL)
  			return 'g';
  		else
  			return 'd';
  	}
  	if (sechdrs[sym->st_shndx].sh_type == SHT_NOBITS) {
  		if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL)
  			return 's';
  		else
  			return 'b';
  	}
eded41c1c   Rusty Russell   module: kallsyms ...
2105
2106
  	if (strstarts(info->secstrings + sechdrs[sym->st_shndx].sh_name,
  		      ".debug")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2107
  		return 'n';
eded41c1c   Rusty Russell   module: kallsyms ...
2108
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2109
2110
  	return '?';
  }
4a4962263   Jan Beulich   module: reduce sy...
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
  static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs,
                             unsigned int shnum)
  {
  	const Elf_Shdr *sec;
  
  	if (src->st_shndx == SHN_UNDEF
  	    || src->st_shndx >= shnum
  	    || !src->st_name)
  		return false;
  
  	sec = sechdrs + src->st_shndx;
  	if (!(sec->sh_flags & SHF_ALLOC)
  #ifndef CONFIG_KALLSYMS_ALL
  	    || !(sec->sh_flags & SHF_EXECINSTR)
  #endif
  	    || (sec->sh_entsize & INIT_OFFSET_MASK))
  		return false;
  
  	return true;
  }
48fd11880   Kevin Cernekee   module: Fix perfo...
2131
2132
2133
2134
2135
2136
2137
  /*
   * We only allocate and copy the strings needed by the parts of symtab
   * we keep.  This is simple, but has the effect of making multiple
   * copies of duplicates.  We could be more sophisticated, see
   * linux-kernel thread starting with
   * <73defb5e4bca04a6431392cc341112b1@localhost>.
   */
49668688d   Rusty Russell   module: pass load...
2138
  static void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2139
  {
49668688d   Rusty Russell   module: pass load...
2140
2141
  	Elf_Shdr *symsect = info->sechdrs + info->index.sym;
  	Elf_Shdr *strsect = info->sechdrs + info->index.str;
4a4962263   Jan Beulich   module: reduce sy...
2142
  	const Elf_Sym *src;
48fd11880   Kevin Cernekee   module: Fix perfo...
2143
  	unsigned int i, nsrc, ndst, strtab_size;
4a4962263   Jan Beulich   module: reduce sy...
2144
2145
2146
2147
  
  	/* Put symbol section at end of init part of module. */
  	symsect->sh_flags |= SHF_ALLOC;
  	symsect->sh_entsize = get_offset(mod, &mod->init_size, symsect,
49668688d   Rusty Russell   module: pass load...
2148
  					 info->index.sym) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2149
2150
  	pr_debug("\t%s
  ", info->secstrings + symsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2151

49668688d   Rusty Russell   module: pass load...
2152
  	src = (void *)info->hdr + symsect->sh_offset;
4a4962263   Jan Beulich   module: reduce sy...
2153
  	nsrc = symsect->sh_size / sizeof(*src);
70b1e9161   Kevin Cernekee   module: Add comme...
2154

48fd11880   Kevin Cernekee   module: Fix perfo...
2155
2156
  	/* Compute total space required for the core symbols' strtab. */
  	for (ndst = i = strtab_size = 1; i < nsrc; ++i, ++src)
49668688d   Rusty Russell   module: pass load...
2157
  		if (is_core_symbol(src, info->sechdrs, info->hdr->e_shnum)) {
48fd11880   Kevin Cernekee   module: Fix perfo...
2158
2159
  			strtab_size += strlen(&info->strtab[src->st_name]) + 1;
  			ndst++;
554bdfe5a   Jan Beulich   module: reduce st...
2160
  		}
4a4962263   Jan Beulich   module: reduce sy...
2161
2162
  
  	/* Append room for core symbols at end of core part. */
49668688d   Rusty Russell   module: pass load...
2163
  	info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1);
48fd11880   Kevin Cernekee   module: Fix perfo...
2164
2165
  	info->stroffs = mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym);
  	mod->core_size += strtab_size;
4a4962263   Jan Beulich   module: reduce sy...
2166

554bdfe5a   Jan Beulich   module: reduce st...
2167
2168
2169
  	/* Put string table section at end of init part of module. */
  	strsect->sh_flags |= SHF_ALLOC;
  	strsect->sh_entsize = get_offset(mod, &mod->init_size, strsect,
49668688d   Rusty Russell   module: pass load...
2170
  					 info->index.str) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2171
2172
  	pr_debug("\t%s
  ", info->secstrings + strsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2173
  }
811d66a0e   Rusty Russell   module: group pos...
2174
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2175
  {
4a4962263   Jan Beulich   module: reduce sy...
2176
2177
2178
  	unsigned int i, ndst;
  	const Elf_Sym *src;
  	Elf_Sym *dst;
554bdfe5a   Jan Beulich   module: reduce st...
2179
  	char *s;
eded41c1c   Rusty Russell   module: kallsyms ...
2180
  	Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2181

eded41c1c   Rusty Russell   module: kallsyms ...
2182
2183
  	mod->symtab = (void *)symsec->sh_addr;
  	mod->num_symtab = symsec->sh_size / sizeof(Elf_Sym);
511ca6ae4   Rusty Russell   module: fix crash...
2184
2185
  	/* Make sure we get permanent strtab: don't use info->strtab. */
  	mod->strtab = (void *)info->sechdrs[info->index.str].sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2186
2187
2188
  
  	/* Set types up while we still have access to sections. */
  	for (i = 0; i < mod->num_symtab; i++)
eded41c1c   Rusty Russell   module: kallsyms ...
2189
  		mod->symtab[i].st_info = elf_type(&mod->symtab[i], info);
4a4962263   Jan Beulich   module: reduce sy...
2190

d913188c7   Rusty Russell   module: layout_an...
2191
  	mod->core_symtab = dst = mod->module_core + info->symoffs;
48fd11880   Kevin Cernekee   module: Fix perfo...
2192
  	mod->core_strtab = s = mod->module_core + info->stroffs;
4a4962263   Jan Beulich   module: reduce sy...
2193
2194
  	src = mod->symtab;
  	*dst = *src;
48fd11880   Kevin Cernekee   module: Fix perfo...
2195
  	*s++ = 0;
4a4962263   Jan Beulich   module: reduce sy...
2196
  	for (ndst = i = 1; i < mod->num_symtab; ++i, ++src) {
eded41c1c   Rusty Russell   module: kallsyms ...
2197
  		if (!is_core_symbol(src, info->sechdrs, info->hdr->e_shnum))
4a4962263   Jan Beulich   module: reduce sy...
2198
  			continue;
48fd11880   Kevin Cernekee   module: Fix perfo...
2199

4a4962263   Jan Beulich   module: reduce sy...
2200
  		dst[ndst] = *src;
48fd11880   Kevin Cernekee   module: Fix perfo...
2201
2202
  		dst[ndst++].st_name = s - mod->core_strtab;
  		s += strlcpy(s, &mod->strtab[src->st_name], KSYM_NAME_LEN) + 1;
4a4962263   Jan Beulich   module: reduce sy...
2203
2204
  	}
  	mod->core_num_syms = ndst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2205
2206
  }
  #else
49668688d   Rusty Russell   module: pass load...
2207
  static inline void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2208
2209
  {
  }
3ae91c21d   Paul Mundt   module: fix up CO...
2210

abbce906d   MichaÅ‚ MirosÅ‚aw   (trivial) Fix com...
2211
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2212
2213
2214
  {
  }
  #endif /* CONFIG_KALLSYMS */
e9d376f0f   Jason Baron   dynamic debug: co...
2215
  static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num)
346e15beb   Jason Baron   driver core: basi...
2216
  {
811d66a0e   Rusty Russell   module: group pos...
2217
2218
  	if (!debug)
  		return;
e9d376f0f   Jason Baron   dynamic debug: co...
2219
2220
2221
2222
2223
2224
  #ifdef CONFIG_DYNAMIC_DEBUG
  	if (ddebug_add_module(debug, num, debug->modname))
  		printk(KERN_ERR "dynamic debug error adding module: %s
  ",
  					debug->modname);
  #endif
5e458cc0f   Rusty Russell   module: simplify ...
2225
  }
346e15beb   Jason Baron   driver core: basi...
2226

ff49d74ad   Yehuda Sadeh   module: initializ...
2227
2228
2229
2230
2231
  static void dynamic_debug_remove(struct _ddebug *debug)
  {
  	if (debug)
  		ddebug_remove_module(debug->modname);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2232
2233
2234
2235
  void * __weak module_alloc(unsigned long size)
  {
  	return size == 0 ? NULL : vmalloc_exec(size);
  }
3a642e99b   Rusty Russell   modules: Take a s...
2236
2237
2238
2239
2240
  static void *module_alloc_update_bounds(unsigned long size)
  {
  	void *ret = module_alloc(size);
  
  	if (ret) {
75676500f   Rusty Russell   module: make lock...
2241
  		mutex_lock(&module_mutex);
3a642e99b   Rusty Russell   modules: Take a s...
2242
2243
2244
2245
2246
  		/* Update module bounds. */
  		if ((unsigned long)ret < module_addr_min)
  			module_addr_min = (unsigned long)ret;
  		if ((unsigned long)ret + size > module_addr_max)
  			module_addr_max = (unsigned long)ret + size;
75676500f   Rusty Russell   module: make lock...
2247
  		mutex_unlock(&module_mutex);
3a642e99b   Rusty Russell   modules: Take a s...
2248
2249
2250
  	}
  	return ret;
  }
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2251
  #ifdef CONFIG_DEBUG_KMEMLEAK
49668688d   Rusty Russell   module: pass load...
2252
2253
  static void kmemleak_load_module(const struct module *mod,
  				 const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2254
2255
2256
2257
  {
  	unsigned int i;
  
  	/* only scan the sections containing data */
c017b4be3   Catalin Marinas   kmemleak: Simplif...
2258
  	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2259

49668688d   Rusty Russell   module: pass load...
2260
2261
2262
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		const char *name = info->secstrings + info->sechdrs[i].sh_name;
  		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC))
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2263
  			continue;
49668688d   Rusty Russell   module: pass load...
2264
  		if (!strstarts(name, ".data") && !strstarts(name, ".bss"))
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2265
  			continue;
49668688d   Rusty Russell   module: pass load...
2266
2267
  		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
  				   info->sechdrs[i].sh_size, GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2268
2269
2270
  	}
  }
  #else
49668688d   Rusty Russell   module: pass load...
2271
2272
  static inline void kmemleak_load_module(const struct module *mod,
  					const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2273
2274
2275
  {
  }
  #endif
6526c534b   Rusty Russell   module: move modu...
2276
  /* Sets info->hdr and info->len. */
d913188c7   Rusty Russell   module: layout_an...
2277
2278
2279
  static int copy_and_check(struct load_info *info,
  			  const void __user *umod, unsigned long len,
  			  const char __user *uargs)
40dd2560e   Rusty Russell   module: refactor ...
2280
2281
2282
2283
2284
2285
2286
2287
2288
  {
  	int err;
  	Elf_Ehdr *hdr;
  
  	if (len < sizeof(*hdr))
  		return -ENOEXEC;
  
  	/* Suck in entire file: we'll want most of it. */
  	/* vmalloc barfs on "unusual" numbers.  Check here */
3264d3f9d   Linus Torvalds   module: add load_...
2289
  	if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL)
40dd2560e   Rusty Russell   module: refactor ...
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
  		return -ENOMEM;
  
  	if (copy_from_user(hdr, umod, len) != 0) {
  		err = -EFAULT;
  		goto free_hdr;
  	}
  
  	/* Sanity checks against insmoding binaries or wrong arch,
  	   weird elf version */
  	if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0
  	    || hdr->e_type != ET_REL
  	    || !elf_check_arch(hdr)
  	    || hdr->e_shentsize != sizeof(Elf_Shdr)) {
  		err = -ENOEXEC;
  		goto free_hdr;
  	}
  
  	if (len < hdr->e_shoff + hdr->e_shnum * sizeof(Elf_Shdr)) {
  		err = -ENOEXEC;
  		goto free_hdr;
  	}
d913188c7   Rusty Russell   module: layout_an...
2311

3264d3f9d   Linus Torvalds   module: add load_...
2312
2313
  	info->hdr = hdr;
  	info->len = len;
40dd2560e   Rusty Russell   module: refactor ...
2314
2315
2316
2317
2318
2319
  	return 0;
  
  free_hdr:
  	vfree(hdr);
  	return err;
  }
d913188c7   Rusty Russell   module: layout_an...
2320
2321
  static void free_copy(struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2322
2323
  	vfree(info->hdr);
  }
8b5f61a79   Rusty Russell   module: refactor ...
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
  static int rewrite_section_headers(struct load_info *info)
  {
  	unsigned int i;
  
  	/* This should always be true, but let's be sure. */
  	info->sechdrs[0].sh_addr = 0;
  
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		Elf_Shdr *shdr = &info->sechdrs[i];
  		if (shdr->sh_type != SHT_NOBITS
  		    && info->len < shdr->sh_offset + shdr->sh_size) {
  			printk(KERN_ERR "Module len %lu truncated
  ",
  			       info->len);
  			return -ENOEXEC;
  		}
  
  		/* Mark all sections sh_addr with their address in the
  		   temporary image. */
  		shdr->sh_addr = (size_t)info->hdr + shdr->sh_offset;
  
  #ifndef CONFIG_MODULE_UNLOAD
  		/* Don't load .exit sections */
  		if (strstarts(info->secstrings+shdr->sh_name, ".exit"))
  			shdr->sh_flags &= ~(unsigned long)SHF_ALLOC;
  #endif
8b5f61a79   Rusty Russell   module: refactor ...
2350
  	}
d6df72a06   Rusty Russell   module: refactor ...
2351
2352
  
  	/* Track but don't keep modinfo and version sections. */
49668688d   Rusty Russell   module: pass load...
2353
2354
  	info->index.vers = find_sec(info, "__versions");
  	info->index.info = find_sec(info, ".modinfo");
d6df72a06   Rusty Russell   module: refactor ...
2355
2356
  	info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC;
  	info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC;
8b5f61a79   Rusty Russell   module: refactor ...
2357
2358
  	return 0;
  }
3264d3f9d   Linus Torvalds   module: add load_...
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
  /*
   * Set up our basic convenience variables (pointers to section headers,
   * search for module section index etc), and do some basic section
   * verification.
   *
   * Return the temporary module pointer (we'll replace it with the final
   * one when we move the module sections around).
   */
  static struct module *setup_load_info(struct load_info *info)
  {
  	unsigned int i;
8b5f61a79   Rusty Russell   module: refactor ...
2370
  	int err;
3264d3f9d   Linus Torvalds   module: add load_...
2371
2372
2373
2374
  	struct module *mod;
  
  	/* Set up the convenience variables */
  	info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
8b5f61a79   Rusty Russell   module: refactor ...
2375
2376
  	info->secstrings = (void *)info->hdr
  		+ info->sechdrs[info->hdr->e_shstrndx].sh_offset;
3264d3f9d   Linus Torvalds   module: add load_...
2377

8b5f61a79   Rusty Russell   module: refactor ...
2378
2379
2380
  	err = rewrite_section_headers(info);
  	if (err)
  		return ERR_PTR(err);
3264d3f9d   Linus Torvalds   module: add load_...
2381

8b5f61a79   Rusty Russell   module: refactor ...
2382
2383
  	/* Find internal symbols and strings. */
  	for (i = 1; i < info->hdr->e_shnum; i++) {
3264d3f9d   Linus Torvalds   module: add load_...
2384
2385
2386
  		if (info->sechdrs[i].sh_type == SHT_SYMTAB) {
  			info->index.sym = i;
  			info->index.str = info->sechdrs[i].sh_link;
8b5f61a79   Rusty Russell   module: refactor ...
2387
2388
2389
  			info->strtab = (char *)info->hdr
  				+ info->sechdrs[info->index.str].sh_offset;
  			break;
3264d3f9d   Linus Torvalds   module: add load_...
2390
  		}
3264d3f9d   Linus Torvalds   module: add load_...
2391
  	}
49668688d   Rusty Russell   module: pass load...
2392
  	info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
3264d3f9d   Linus Torvalds   module: add load_...
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
  	if (!info->index.mod) {
  		printk(KERN_WARNING "No module found in object
  ");
  		return ERR_PTR(-ENOEXEC);
  	}
  	/* This is temporary: point mod into copy of data. */
  	mod = (void *)info->sechdrs[info->index.mod].sh_addr;
  
  	if (info->index.sym == 0) {
  		printk(KERN_WARNING "%s: module has no symbols (stripped?)
  ",
  		       mod->name);
  		return ERR_PTR(-ENOEXEC);
  	}
49668688d   Rusty Russell   module: pass load...
2407
  	info->index.pcpu = find_pcpusec(info);
3264d3f9d   Linus Torvalds   module: add load_...
2408

3264d3f9d   Linus Torvalds   module: add load_...
2409
2410
2411
2412
2413
  	/* Check module struct version now, before we try to use module. */
  	if (!check_modstruct_version(info->sechdrs, info->index.vers, mod))
  		return ERR_PTR(-ENOEXEC);
  
  	return mod;
3264d3f9d   Linus Torvalds   module: add load_...
2414
  }
49668688d   Rusty Russell   module: pass load...
2415
  static int check_modinfo(struct module *mod, struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2416
  {
49668688d   Rusty Russell   module: pass load...
2417
  	const char *modmagic = get_modinfo(info, "vermagic");
40dd2560e   Rusty Russell   module: refactor ...
2418
2419
2420
2421
2422
2423
2424
  	int err;
  
  	/* This is allowed: modprobe --force will invalidate it. */
  	if (!modmagic) {
  		err = try_to_force_load(mod, "bad vermagic");
  		if (err)
  			return err;
49668688d   Rusty Russell   module: pass load...
2425
  	} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
40dd2560e   Rusty Russell   module: refactor ...
2426
2427
2428
2429
2430
  		printk(KERN_ERR "%s: version magic '%s' should be '%s'
  ",
  		       mod->name, modmagic, vermagic);
  		return -ENOEXEC;
  	}
2449b8ba0   Ben Hutchings   module,bug: Add T...
2431
2432
  	if (!get_modinfo(info, "intree"))
  		add_taint_module(mod, TAINT_OOT_MODULE);
49668688d   Rusty Russell   module: pass load...
2433
  	if (get_modinfo(info, "staging")) {
40dd2560e   Rusty Russell   module: refactor ...
2434
2435
2436
2437
2438
2439
  		add_taint_module(mod, TAINT_CRAP);
  		printk(KERN_WARNING "%s: module is from the staging directory,"
  		       " the quality is unknown, you have been warned.
  ",
  		       mod->name);
  	}
22e268ebe   Rusty Russell   module: refactor ...
2440
2441
  
  	/* Set up license info based on the info section */
49668688d   Rusty Russell   module: pass load...
2442
  	set_license(mod, get_modinfo(info, "license"));
22e268ebe   Rusty Russell   module: refactor ...
2443

40dd2560e   Rusty Russell   module: refactor ...
2444
2445
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
2446
  static void find_module_sections(struct module *mod, struct load_info *info)
f91a13bb9   Linus Torvalds   module: refactor ...
2447
  {
49668688d   Rusty Russell   module: pass load...
2448
  	mod->kp = section_objs(info, "__param",
f91a13bb9   Linus Torvalds   module: refactor ...
2449
  			       sizeof(*mod->kp), &mod->num_kp);
49668688d   Rusty Russell   module: pass load...
2450
  	mod->syms = section_objs(info, "__ksymtab",
f91a13bb9   Linus Torvalds   module: refactor ...
2451
  				 sizeof(*mod->syms), &mod->num_syms);
49668688d   Rusty Russell   module: pass load...
2452
2453
  	mod->crcs = section_addr(info, "__kcrctab");
  	mod->gpl_syms = section_objs(info, "__ksymtab_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2454
2455
  				     sizeof(*mod->gpl_syms),
  				     &mod->num_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2456
2457
  	mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");
  	mod->gpl_future_syms = section_objs(info,
f91a13bb9   Linus Torvalds   module: refactor ...
2458
2459
2460
  					    "__ksymtab_gpl_future",
  					    sizeof(*mod->gpl_future_syms),
  					    &mod->num_gpl_future_syms);
49668688d   Rusty Russell   module: pass load...
2461
  	mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future");
f91a13bb9   Linus Torvalds   module: refactor ...
2462
2463
  
  #ifdef CONFIG_UNUSED_SYMBOLS
49668688d   Rusty Russell   module: pass load...
2464
  	mod->unused_syms = section_objs(info, "__ksymtab_unused",
f91a13bb9   Linus Torvalds   module: refactor ...
2465
2466
  					sizeof(*mod->unused_syms),
  					&mod->num_unused_syms);
49668688d   Rusty Russell   module: pass load...
2467
2468
  	mod->unused_crcs = section_addr(info, "__kcrctab_unused");
  	mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2469
2470
  					    sizeof(*mod->unused_gpl_syms),
  					    &mod->num_unused_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2471
  	mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
f91a13bb9   Linus Torvalds   module: refactor ...
2472
2473
  #endif
  #ifdef CONFIG_CONSTRUCTORS
49668688d   Rusty Russell   module: pass load...
2474
  	mod->ctors = section_objs(info, ".ctors",
f91a13bb9   Linus Torvalds   module: refactor ...
2475
2476
2477
2478
  				  sizeof(*mod->ctors), &mod->num_ctors);
  #endif
  
  #ifdef CONFIG_TRACEPOINTS
654986462   Mathieu Desnoyers   tracepoints: Fix ...
2479
2480
2481
  	mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
  					     sizeof(*mod->tracepoints_ptrs),
  					     &mod->num_tracepoints);
f91a13bb9   Linus Torvalds   module: refactor ...
2482
  #endif
bf5438fca   Jason Baron   jump label: Base ...
2483
2484
2485
2486
2487
  #ifdef HAVE_JUMP_LABEL
  	mod->jump_entries = section_objs(info, "__jump_table",
  					sizeof(*mod->jump_entries),
  					&mod->num_jump_entries);
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
2488
  #ifdef CONFIG_EVENT_TRACING
49668688d   Rusty Russell   module: pass load...
2489
  	mod->trace_events = section_objs(info, "_ftrace_events",
f91a13bb9   Linus Torvalds   module: refactor ...
2490
2491
2492
2493
2494
2495
2496
2497
2498
  					 sizeof(*mod->trace_events),
  					 &mod->num_trace_events);
  	/*
  	 * This section contains pointers to allocated objects in the trace
  	 * code and not scanning it leads to false positives.
  	 */
  	kmemleak_scan_area(mod->trace_events, sizeof(*mod->trace_events) *
  			   mod->num_trace_events, GFP_KERNEL);
  #endif
13b9b6e74   Steven Rostedt   tracing: Fix modu...
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
  #ifdef CONFIG_TRACING
  	mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
  					 sizeof(*mod->trace_bprintk_fmt_start),
  					 &mod->num_trace_bprintk_fmt);
  	/*
  	 * This section contains pointers to allocated objects in the trace
  	 * code and not scanning it leads to false positives.
  	 */
  	kmemleak_scan_area(mod->trace_bprintk_fmt_start,
  			   sizeof(*mod->trace_bprintk_fmt_start) *
  			   mod->num_trace_bprintk_fmt, GFP_KERNEL);
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
2511
2512
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  	/* sechdrs[0].sh_size is always zero */
49668688d   Rusty Russell   module: pass load...
2513
  	mod->ftrace_callsites = section_objs(info, "__mcount_loc",
f91a13bb9   Linus Torvalds   module: refactor ...
2514
2515
2516
  					     sizeof(*mod->ftrace_callsites),
  					     &mod->num_ftrace_callsites);
  #endif
22e268ebe   Rusty Russell   module: refactor ...
2517

811d66a0e   Rusty Russell   module: group pos...
2518
2519
  	mod->extable = section_objs(info, "__ex_table",
  				    sizeof(*mod->extable), &mod->num_exentries);
49668688d   Rusty Russell   module: pass load...
2520
  	if (section_addr(info, "__obsparm"))
22e268ebe   Rusty Russell   module: refactor ...
2521
2522
2523
  		printk(KERN_WARNING "%s: Ignoring obsolete parameters
  ",
  		       mod->name);
811d66a0e   Rusty Russell   module: group pos...
2524
2525
2526
  
  	info->debug = section_objs(info, "__verbose",
  				   sizeof(*info->debug), &info->num_debug);
f91a13bb9   Linus Torvalds   module: refactor ...
2527
  }
49668688d   Rusty Russell   module: pass load...
2528
  static int move_module(struct module *mod, struct load_info *info)
65b8a9b4d   Linus Torvalds   module: refactor ...
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
  {
  	int i;
  	void *ptr;
  
  	/* Do the allocs. */
  	ptr = module_alloc_update_bounds(mod->core_size);
  	/*
  	 * The pointer to this block is stored in the module structure
  	 * which is inside the block. Just mark it as not being a
  	 * leak.
  	 */
  	kmemleak_not_leak(ptr);
  	if (!ptr)
d913188c7   Rusty Russell   module: layout_an...
2542
  		return -ENOMEM;
65b8a9b4d   Linus Torvalds   module: refactor ...
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
  
  	memset(ptr, 0, mod->core_size);
  	mod->module_core = ptr;
  
  	ptr = module_alloc_update_bounds(mod->init_size);
  	/*
  	 * The pointer to this block is stored in the module structure
  	 * which is inside the block. This block doesn't need to be
  	 * scanned as it contains data and code that will be freed
  	 * after the module is initialized.
  	 */
  	kmemleak_ignore(ptr);
  	if (!ptr && mod->init_size) {
  		module_free(mod, mod->module_core);
d913188c7   Rusty Russell   module: layout_an...
2557
  		return -ENOMEM;
65b8a9b4d   Linus Torvalds   module: refactor ...
2558
2559
2560
2561
2562
  	}
  	memset(ptr, 0, mod->init_size);
  	mod->module_init = ptr;
  
  	/* Transfer each section which specifies SHF_ALLOC */
5e1241692   Jim Cromie   module: replace D...
2563
2564
  	pr_debug("final section addresses:
  ");
49668688d   Rusty Russell   module: pass load...
2565
  	for (i = 0; i < info->hdr->e_shnum; i++) {
65b8a9b4d   Linus Torvalds   module: refactor ...
2566
  		void *dest;
49668688d   Rusty Russell   module: pass load...
2567
  		Elf_Shdr *shdr = &info->sechdrs[i];
65b8a9b4d   Linus Torvalds   module: refactor ...
2568

49668688d   Rusty Russell   module: pass load...
2569
  		if (!(shdr->sh_flags & SHF_ALLOC))
65b8a9b4d   Linus Torvalds   module: refactor ...
2570
  			continue;
49668688d   Rusty Russell   module: pass load...
2571
  		if (shdr->sh_entsize & INIT_OFFSET_MASK)
65b8a9b4d   Linus Torvalds   module: refactor ...
2572
  			dest = mod->module_init
49668688d   Rusty Russell   module: pass load...
2573
  				+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);
65b8a9b4d   Linus Torvalds   module: refactor ...
2574
  		else
49668688d   Rusty Russell   module: pass load...
2575
  			dest = mod->module_core + shdr->sh_entsize;
65b8a9b4d   Linus Torvalds   module: refactor ...
2576

49668688d   Rusty Russell   module: pass load...
2577
2578
  		if (shdr->sh_type != SHT_NOBITS)
  			memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
65b8a9b4d   Linus Torvalds   module: refactor ...
2579
  		/* Update sh_addr to point to copy in image. */
49668688d   Rusty Russell   module: pass load...
2580
  		shdr->sh_addr = (unsigned long)dest;
5e1241692   Jim Cromie   module: replace D...
2581
2582
2583
  		pr_debug("\t0x%lx %s
  ",
  			 (long)shdr->sh_addr, info->secstrings + shdr->sh_name);
65b8a9b4d   Linus Torvalds   module: refactor ...
2584
  	}
d913188c7   Rusty Russell   module: layout_an...
2585
2586
  
  	return 0;
65b8a9b4d   Linus Torvalds   module: refactor ...
2587
  }
49668688d   Rusty Russell   module: pass load...
2588
  static int check_module_license_and_versions(struct module *mod)
22e268ebe   Rusty Russell   module: refactor ...
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
  {
  	/*
  	 * ndiswrapper is under GPL by itself, but loads proprietary modules.
  	 * Don't use add_taint_module(), as it would prevent ndiswrapper from
  	 * using GPL-only symbols it needs.
  	 */
  	if (strcmp(mod->name, "ndiswrapper") == 0)
  		add_taint(TAINT_PROPRIETARY_MODULE);
  
  	/* driverloader was caught wrongly pretending to be under GPL */
  	if (strcmp(mod->name, "driverloader") == 0)
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
  
  #ifdef CONFIG_MODVERSIONS
  	if ((mod->num_syms && !mod->crcs)
  	    || (mod->num_gpl_syms && !mod->gpl_crcs)
  	    || (mod->num_gpl_future_syms && !mod->gpl_future_crcs)
  #ifdef CONFIG_UNUSED_SYMBOLS
  	    || (mod->num_unused_syms && !mod->unused_crcs)
  	    || (mod->num_unused_gpl_syms && !mod->unused_gpl_crcs)
  #endif
  		) {
  		return try_to_force_load(mod,
  					 "no versions for exported symbols");
  	}
  #endif
  	return 0;
  }
  
  static void flush_module_icache(const struct module *mod)
  {
  	mm_segment_t old_fs;
  
  	/* flush the icache in correct context */
  	old_fs = get_fs();
  	set_fs(KERNEL_DS);
  
  	/*
  	 * Flush the instruction cache, since we've played with text.
  	 * Do it before processing of module parameters, so the module
  	 * can provide parameter accessor functions of its own.
  	 */
  	if (mod->module_init)
  		flush_icache_range((unsigned long)mod->module_init,
  				   (unsigned long)mod->module_init
  				   + mod->init_size);
  	flush_icache_range((unsigned long)mod->module_core,
  			   (unsigned long)mod->module_core + mod->core_size);
  
  	set_fs(old_fs);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2640
2641
2642
2643
2644
2645
2646
  int __weak module_frob_arch_sections(Elf_Ehdr *hdr,
  				     Elf_Shdr *sechdrs,
  				     char *secstrings,
  				     struct module *mod)
  {
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
2647
  static struct module *layout_and_allocate(struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2648
  {
d913188c7   Rusty Russell   module: layout_an...
2649
  	/* Module within temporary copy. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2650
  	struct module *mod;
49668688d   Rusty Russell   module: pass load...
2651
  	Elf_Shdr *pcpusec;
d913188c7   Rusty Russell   module: layout_an...
2652
  	int err;
3ae91c21d   Paul Mundt   module: fix up CO...
2653

d913188c7   Rusty Russell   module: layout_an...
2654
2655
2656
  	mod = setup_load_info(info);
  	if (IS_ERR(mod))
  		return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2657

49668688d   Rusty Russell   module: pass load...
2658
  	err = check_modinfo(mod, info);
40dd2560e   Rusty Russell   module: refactor ...
2659
2660
  	if (err)
  		return ERR_PTR(err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2661

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2662
  	/* Allow arches to frob section contents and sizes.  */
49668688d   Rusty Russell   module: pass load...
2663
2664
  	err = module_frob_arch_sections(info->hdr, info->sechdrs,
  					info->secstrings, mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2665
  	if (err < 0)
6526c534b   Rusty Russell   module: move modu...
2666
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2667

49668688d   Rusty Russell   module: pass load...
2668
2669
  	pcpusec = &info->sechdrs[info->index.pcpu];
  	if (pcpusec->sh_size) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2670
  		/* We have a special allocation for this section. */
49668688d   Rusty Russell   module: pass load...
2671
2672
  		err = percpu_modalloc(mod,
  				      pcpusec->sh_size, pcpusec->sh_addralign);
259354dea   Tejun Heo   module: encapsula...
2673
  		if (err)
6526c534b   Rusty Russell   module: move modu...
2674
  			goto out;
49668688d   Rusty Russell   module: pass load...
2675
  		pcpusec->sh_flags &= ~(unsigned long)SHF_ALLOC;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2676
2677
2678
2679
2680
  	}
  
  	/* Determine total sizes, and put offsets in sh_entsize.  For now
  	   this is done generically; there doesn't appear to be any
  	   special cases for the architectures. */
49668688d   Rusty Russell   module: pass load...
2681
  	layout_sections(mod, info);
49668688d   Rusty Russell   module: pass load...
2682
  	layout_symtab(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2683

65b8a9b4d   Linus Torvalds   module: refactor ...
2684
  	/* Allocate and move to the final place */
49668688d   Rusty Russell   module: pass load...
2685
  	err = move_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2686
  	if (err)
48fd11880   Kevin Cernekee   module: Fix perfo...
2687
  		goto free_percpu;
d913188c7   Rusty Russell   module: layout_an...
2688
2689
2690
  
  	/* Module has been copied to its final place now: return it. */
  	mod = (void *)info->sechdrs[info->index.mod].sh_addr;
49668688d   Rusty Russell   module: pass load...
2691
  	kmemleak_load_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2692
  	return mod;
d913188c7   Rusty Russell   module: layout_an...
2693
2694
  free_percpu:
  	percpu_modfree(mod);
6526c534b   Rusty Russell   module: move modu...
2695
  out:
d913188c7   Rusty Russell   module: layout_an...
2696
2697
2698
2699
2700
2701
  	return ERR_PTR(err);
  }
  
  /* mod is no longer valid after this! */
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2702
2703
2704
2705
  	percpu_modfree(mod);
  	module_free(mod, mod->module_init);
  	module_free(mod, mod->module_core);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2706
2707
2708
2709
2710
2711
  int __weak module_finalize(const Elf_Ehdr *hdr,
  			   const Elf_Shdr *sechdrs,
  			   struct module *me)
  {
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
2712
2713
  static int post_relocation(struct module *mod, const struct load_info *info)
  {
51f3d0f47   Rusty Russell   module: cleanup c...
2714
  	/* Sort exception table now relocations are done. */
811d66a0e   Rusty Russell   module: group pos...
2715
2716
2717
2718
2719
  	sort_extable(mod->extable, mod->extable + mod->num_exentries);
  
  	/* Copy relocated percpu area over. */
  	percpu_modcopy(mod, (void *)info->sechdrs[info->index.pcpu].sh_addr,
  		       info->sechdrs[info->index.pcpu].sh_size);
51f3d0f47   Rusty Russell   module: cleanup c...
2720
  	/* Setup kallsyms-specific fields. */
811d66a0e   Rusty Russell   module: group pos...
2721
2722
2723
2724
2725
  	add_kallsyms(mod, info);
  
  	/* Arch-specific module finalizing. */
  	return module_finalize(info->hdr, info->sechdrs, mod);
  }
d913188c7   Rusty Russell   module: layout_an...
2726
2727
  /* Allocate and load the module: note that size of section 0 is always
     zero, and we rely on this for optional sections. */
51f3d0f47   Rusty Russell   module: cleanup c...
2728
  static struct module *load_module(void __user *umod,
d913188c7   Rusty Russell   module: layout_an...
2729
2730
2731
2732
2733
2734
  				  unsigned long len,
  				  const char __user *uargs)
  {
  	struct load_info info = { NULL, };
  	struct module *mod;
  	long err;
d913188c7   Rusty Russell   module: layout_an...
2735

5e1241692   Jim Cromie   module: replace D...
2736
2737
  	pr_debug("load_module: umod=%p, len=%lu, uargs=%p
  ",
d913188c7   Rusty Russell   module: layout_an...
2738
2739
2740
2741
2742
2743
2744
2745
2746
  	       umod, len, uargs);
  
  	/* Copy in the blobs from userspace, check they are vaguely sane. */
  	err = copy_and_check(&info, umod, len, uargs);
  	if (err)
  		return ERR_PTR(err);
  
  	/* Figure out module layout, and allocate all the memory. */
  	mod = layout_and_allocate(&info);
65b8a9b4d   Linus Torvalds   module: refactor ...
2747
2748
  	if (IS_ERR(mod)) {
  		err = PTR_ERR(mod);
d913188c7   Rusty Russell   module: layout_an...
2749
  		goto free_copy;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2750
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2751

49668688d   Rusty Russell   module: pass load...
2752
  	/* Now module is in final location, initialize linked lists, etc. */
9f85a4bbb   Rusty Russell   module: refactor ...
2753
2754
  	err = module_unload_init(mod);
  	if (err)
d913188c7   Rusty Russell   module: layout_an...
2755
  		goto free_module;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2756

22e268ebe   Rusty Russell   module: refactor ...
2757
2758
  	/* Now we've got everything in the final locations, we can
  	 * find optional sections. */
49668688d   Rusty Russell   module: pass load...
2759
  	find_module_sections(mod, &info);
9b37ccfc6   Pavel Roskin   module: allow ndi...
2760

49668688d   Rusty Russell   module: pass load...
2761
  	err = check_module_license_and_versions(mod);
22e268ebe   Rusty Russell   module: refactor ...
2762
2763
  	if (err)
  		goto free_unload;
9841d61d7   Dave Jones   [PATCH] Add taint...
2764

c988d2b28   Matt Domsch   [PATCH] modules: ...
2765
  	/* Set up MODINFO_ATTR fields */
49668688d   Rusty Russell   module: pass load...
2766
  	setup_modinfo(mod, &info);
c988d2b28   Matt Domsch   [PATCH] modules: ...
2767

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2768
  	/* Fix up syms, so that st_value is a pointer to location. */
49668688d   Rusty Russell   module: pass load...
2769
  	err = simplify_symbols(mod, &info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2770
  	if (err < 0)
d913188c7   Rusty Russell   module: layout_an...
2771
  		goto free_modinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2772

49668688d   Rusty Russell   module: pass load...
2773
  	err = apply_relocations(mod, &info);
22e268ebe   Rusty Russell   module: refactor ...
2774
  	if (err < 0)
d913188c7   Rusty Russell   module: layout_an...
2775
  		goto free_modinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2776

811d66a0e   Rusty Russell   module: group pos...
2777
  	err = post_relocation(mod, &info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2778
  	if (err < 0)
d913188c7   Rusty Russell   module: layout_an...
2779
  		goto free_modinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2780

22e268ebe   Rusty Russell   module: refactor ...
2781
  	flush_module_icache(mod);
378bac820   Thomas Koeller   [PATCH] flush ica...
2782

6526c534b   Rusty Russell   module: move modu...
2783
2784
2785
2786
2787
2788
  	/* Now copy in args */
  	mod->args = strndup_user(uargs, ~0UL >> 1);
  	if (IS_ERR(mod->args)) {
  		err = PTR_ERR(mod->args);
  		goto free_arch_cleanup;
  	}
8d3b33f67   Rusty Russell   [PATCH] Remove MO...
2789

51f3d0f47   Rusty Russell   module: cleanup c...
2790
  	/* Mark state as coming so strong_try_module_get() ignores us. */
d913188c7   Rusty Russell   module: layout_an...
2791
  	mod->state = MODULE_STATE_COMING;
bb9d3d56e   Rusty Russell   module: better OO...
2792
  	/* Now sew it into the lists so we can get lockdep and oops
25985edce   Lucas De Marchi   Fix common misspe...
2793
  	 * info during argument parsing.  No one should access us, since
d72b37513   Andi Kleen   Remove stop_machi...
2794
2795
2796
2797
2798
  	 * strong_try_module_get() will fail.
  	 * lockdep/oops can run asynchronous, so use the RCU list insertion
  	 * function to insert in a way safe to concurrent readers.
  	 * The mutex protects against concurrent writers.
  	 */
75676500f   Rusty Russell   module: make lock...
2799
  	mutex_lock(&module_mutex);
3bafeb624   Linus Torvalds   module: move find...
2800
2801
  	if (find_module(mod->name)) {
  		err = -EEXIST;
be593f4ce   Rusty Russell   module: verify_ex...
2802
  		goto unlock;
3bafeb624   Linus Torvalds   module: move find...
2803
  	}
811d66a0e   Rusty Russell   module: group pos...
2804
  	/* This has to be done once we're sure module name is unique. */
1cd0d6c30   Ben Hutchings   module: Enable dy...
2805
  	dynamic_debug_setup(info.debug, info.num_debug);
ff49d74ad   Yehuda Sadeh   module: initializ...
2806

be593f4ce   Rusty Russell   module: verify_ex...
2807
2808
2809
  	/* Find duplicate symbols */
  	err = verify_export_symbols(mod);
  	if (err < 0)
ff49d74ad   Yehuda Sadeh   module: initializ...
2810
  		goto ddebug;
be593f4ce   Rusty Russell   module: verify_ex...
2811

5336377d6   Linus Torvalds   modules: Fix modu...
2812
  	module_bug_finalize(info.hdr, info.sechdrs, mod);
d72b37513   Andi Kleen   Remove stop_machi...
2813
  	list_add_rcu(&mod->list, &modules);
75676500f   Rusty Russell   module: make lock...
2814
  	mutex_unlock(&module_mutex);
bb9d3d56e   Rusty Russell   module: better OO...
2815

51f3d0f47   Rusty Russell   module: cleanup c...
2816
  	/* Module is ready to execute: parsing args may do that. */
e180a6b77   Rusty Russell   param: fix charp ...
2817
  	err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2818
  	if (err < 0)
bb9d3d56e   Rusty Russell   module: better OO...
2819
  		goto unlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2820

51f3d0f47   Rusty Russell   module: cleanup c...
2821
  	/* Link in to syfs. */
8f6d03781   Rusty Russell   module: sysfs cle...
2822
  	err = mod_sysfs_setup(mod, &info, mod->kp, mod->num_kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2823
  	if (err < 0)
bb9d3d56e   Rusty Russell   module: better OO...
2824
  		goto unlink;
80a3d1bb4   Rusty Russell   module: move sysf...
2825

48fd11880   Kevin Cernekee   module: Fix perfo...
2826
  	/* Get rid of temporary copy. */
d913188c7   Rusty Russell   module: layout_an...
2827
  	free_copy(&info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2828
2829
  
  	/* Done! */
51f3d0f47   Rusty Russell   module: cleanup c...
2830
  	trace_module_load(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2831
  	return mod;
bb9d3d56e   Rusty Russell   module: better OO...
2832
   unlink:
75676500f   Rusty Russell   module: make lock...
2833
  	mutex_lock(&module_mutex);
e91defa26   Rusty Russell   module: don't use...
2834
2835
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
5336377d6   Linus Torvalds   modules: Fix modu...
2836
  	module_bug_cleanup(mod);
ff49d74ad   Yehuda Sadeh   module: initializ...
2837
   ddebug:
1cd0d6c30   Ben Hutchings   module: Enable dy...
2838
  	dynamic_debug_remove(info.debug);
be593f4ce   Rusty Russell   module: verify_ex...
2839
   unlock:
75676500f   Rusty Russell   module: make lock...
2840
  	mutex_unlock(&module_mutex);
e91defa26   Rusty Russell   module: don't use...
2841
  	synchronize_sched();
6526c534b   Rusty Russell   module: move modu...
2842
2843
  	kfree(mod->args);
   free_arch_cleanup:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2844
  	module_arch_cleanup(mod);
d913188c7   Rusty Russell   module: layout_an...
2845
   free_modinfo:
a263f7763   Rusty Russell   module: fix memor...
2846
  	free_modinfo(mod);
22e268ebe   Rusty Russell   module: refactor ...
2847
   free_unload:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2848
  	module_unload_free(mod);
d913188c7   Rusty Russell   module: layout_an...
2849
2850
2851
2852
   free_module:
  	module_deallocate(mod, &info);
   free_copy:
  	free_copy(&info);
6fe2e70bb   Jayachandran C   [PATCH] kernel/mo...
2853
  	return ERR_PTR(err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2854
  }
b99b87f70   Peter Oberparleiter   kernel: construct...
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
  /* Call module constructors. */
  static void do_mod_ctors(struct module *mod)
  {
  #ifdef CONFIG_CONSTRUCTORS
  	unsigned long i;
  
  	for (i = 0; i < mod->num_ctors; i++)
  		mod->ctors[i]();
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2865
  /* This is where the real work happens */
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
2866
2867
  SYSCALL_DEFINE3(init_module, void __user *, umod,
  		unsigned long, len, const char __user *, uargs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2868
2869
2870
2871
2872
  {
  	struct module *mod;
  	int ret = 0;
  
  	/* Must have permission */
3d43321b7   Kees Cook   modules: sysctl t...
2873
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2874
  		return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2875
2876
  	/* Do all the hard work */
  	mod = load_module(umod, len, uargs);
75676500f   Rusty Russell   module: make lock...
2877
  	if (IS_ERR(mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2878
  		return PTR_ERR(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2879

e041c6834   Alan Stern   [PATCH] Notifier ...
2880
2881
  	blocking_notifier_call_chain(&module_notify_list,
  			MODULE_STATE_COMING, mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2882

94462ad3b   Steven Rostedt   module: Move RO/N...
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
  	/* Set RO and NX regions for core */
  	set_section_ro_nx(mod->module_core,
  				mod->core_text_size,
  				mod->core_ro_size,
  				mod->core_size);
  
  	/* Set RO and NX regions for init */
  	set_section_ro_nx(mod->module_init,
  				mod->init_text_size,
  				mod->init_ro_size,
  				mod->init_size);
b99b87f70   Peter Oberparleiter   kernel: construct...
2894
  	do_mod_ctors(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2895
2896
  	/* Start the module */
  	if (mod->init != NULL)
59f9415ff   Arjan van de Ven   modules: extend i...
2897
  		ret = do_one_initcall(mod->init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2898
2899
2900
2901
  	if (ret < 0) {
  		/* Init routine failed: abort.  Try to protect us from
                     buggy refcounters. */
  		mod->state = MODULE_STATE_GOING;
fbd568a3e   Paul E. McKenney   [PATCH] Change sy...
2902
  		synchronize_sched();
af49d9248   Rusty Russell   Remove "unsafe" f...
2903
  		module_put(mod);
df4b565e1   Peter Oberparleiter   module: add MODUL...
2904
2905
  		blocking_notifier_call_chain(&module_notify_list,
  					     MODULE_STATE_GOING, mod);
af49d9248   Rusty Russell   Remove "unsafe" f...
2906
  		free_module(mod);
c9a3ba55b   Rusty Russell   module: wait for ...
2907
  		wake_up(&module_wq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2908
2909
  		return ret;
  	}
e24e2e64c   Alexey Dobriyan   modules: warn abo...
2910
  	if (ret > 0) {
ad361c988   Joe Perches   Remove multiple K...
2911
2912
2913
2914
2915
  		printk(KERN_WARNING
  "%s: '%s'->init suspiciously returned %d, it should follow 0/-E convention
  "
  "%s: loading module anyway...
  ",
e24e2e64c   Alexey Dobriyan   modules: warn abo...
2916
2917
2918
2919
  		       __func__, mod->name, ret,
  		       __func__);
  		dump_stack();
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2920

6c5db22d2   Rusty Russell   modules: fix modu...
2921
  	/* Now it's a first class citizen!  Wake up anyone waiting for it. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2922
  	mod->state = MODULE_STATE_LIVE;
6c5db22d2   Rusty Russell   modules: fix modu...
2923
  	wake_up(&module_wq);
0deddf436   Masami Hiramatsu   module: add MODUL...
2924
2925
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_LIVE, mod);
6c5db22d2   Rusty Russell   modules: fix modu...
2926

d6de2c80e   Linus Torvalds   async: Fix module...
2927
2928
  	/* We need to finish all async code before the module init sequence is done */
  	async_synchronize_full();
6c5db22d2   Rusty Russell   modules: fix modu...
2929
  	mutex_lock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2930
2931
  	/* Drop initial reference. */
  	module_put(mod);
ad6561dff   Rusty Russell   module: trim exce...
2932
  	trim_init_extable(mod);
4a4962263   Jan Beulich   module: reduce sy...
2933
2934
2935
  #ifdef CONFIG_KALLSYMS
  	mod->num_symtab = mod->core_num_syms;
  	mod->symtab = mod->core_symtab;
554bdfe5a   Jan Beulich   module: reduce st...
2936
  	mod->strtab = mod->core_strtab;
4a4962263   Jan Beulich   module: reduce sy...
2937
  #endif
01526ed08   Jan Glauber   module: split uns...
2938
  	unset_module_init_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2939
2940
2941
  	module_free(mod, mod->module_init);
  	mod->module_init = NULL;
  	mod->init_size = 0;
4d10380e7   Jan Glauber   module: zero mod-...
2942
  	mod->init_ro_size = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2943
  	mod->init_text_size = 0;
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
2944
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
  
  	return 0;
  }
  
  static inline int within(unsigned long addr, void *start, unsigned long size)
  {
  	return ((void *)addr >= start && (void *)addr < start + size);
  }
  
  #ifdef CONFIG_KALLSYMS
  /*
   * This ignores the intensely annoying "mapping symbols" found
   * in ARM ELF files: $a, $t and $d.
   */
  static inline int is_arm_mapping_symbol(const char *str)
  {
22a8bdeb5   Daniel Walker   whitespace fixes:...
2961
  	return str[0] == '$' && strchr("atd", str[1])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
  	       && (str[2] == '\0' || str[2] == '.');
  }
  
  static const char *get_ksymbol(struct module *mod,
  			       unsigned long addr,
  			       unsigned long *size,
  			       unsigned long *offset)
  {
  	unsigned int i, best = 0;
  	unsigned long nextval;
  
  	/* At worse, next value is at end of module */
a06f6211e   Masami Hiramatsu   module: add withi...
2974
  	if (within_module_init(addr, mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2975
  		nextval = (unsigned long)mod->module_init+mod->init_text_size;
22a8bdeb5   Daniel Walker   whitespace fixes:...
2976
  	else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2977
  		nextval = (unsigned long)mod->module_core+mod->core_text_size;
25985edce   Lucas De Marchi   Fix common misspe...
2978
  	/* Scan for closest preceding symbol, and next symbol. (ELF
22a8bdeb5   Daniel Walker   whitespace fixes:...
2979
  	   starts real symbols at 1). */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
  	for (i = 1; i < mod->num_symtab; i++) {
  		if (mod->symtab[i].st_shndx == SHN_UNDEF)
  			continue;
  
  		/* We ignore unnamed symbols: they're uninformative
  		 * and inserted at a whim. */
  		if (mod->symtab[i].st_value <= addr
  		    && mod->symtab[i].st_value > mod->symtab[best].st_value
  		    && *(mod->strtab + mod->symtab[i].st_name) != '\0'
  		    && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name))
  			best = i;
  		if (mod->symtab[i].st_value > addr
  		    && mod->symtab[i].st_value < nextval
  		    && *(mod->strtab + mod->symtab[i].st_name) != '\0'
  		    && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name))
  			nextval = mod->symtab[i].st_value;
  	}
  
  	if (!best)
  		return NULL;
ffb451227   Alexey Dobriyan   Simplify kallsyms...
3000
3001
3002
3003
  	if (size)
  		*size = nextval - mod->symtab[best].st_value;
  	if (offset)
  		*offset = addr - mod->symtab[best].st_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3004
3005
  	return mod->strtab + mod->symtab[best].st_name;
  }
6dd06c9fb   Rusty Russell   module: make modu...
3006
3007
  /* For kallsyms to ask for address resolution.  NULL means not found.  Careful
   * not to lock to avoid deadlock on oopses, simply disable preemption. */
92dfc9dc7   Andrew Morton   fix "modules: mak...
3008
  const char *module_address_lookup(unsigned long addr,
6dd06c9fb   Rusty Russell   module: make modu...
3009
3010
3011
3012
  			    unsigned long *size,
  			    unsigned long *offset,
  			    char **modname,
  			    char *namebuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3013
3014
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3015
  	const char *ret = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3016

cb2a52052   Rusty Russell   modules: de-mutex...
3017
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3018
  	list_for_each_entry_rcu(mod, &modules, list) {
a06f6211e   Masami Hiramatsu   module: add withi...
3019
3020
  		if (within_module_init(addr, mod) ||
  		    within_module_core(addr, mod)) {
ffc508919   Franck Bui-Huu   [PATCH] Create ka...
3021
3022
  			if (modname)
  				*modname = mod->name;
cb2a52052   Rusty Russell   modules: de-mutex...
3023
3024
  			ret = get_ksymbol(mod, addr, size, offset);
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3025
3026
  		}
  	}
6dd06c9fb   Rusty Russell   module: make modu...
3027
3028
3029
3030
3031
  	/* Make a copy in here where it's safe */
  	if (ret) {
  		strncpy(namebuf, ret, KSYM_NAME_LEN - 1);
  		ret = namebuf;
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3032
  	preempt_enable();
92dfc9dc7   Andrew Morton   fix "modules: mak...
3033
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3034
  }
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3035
3036
3037
  int lookup_module_symbol_name(unsigned long addr, char *symname)
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3038
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3039
  	list_for_each_entry_rcu(mod, &modules, list) {
a06f6211e   Masami Hiramatsu   module: add withi...
3040
3041
  		if (within_module_init(addr, mod) ||
  		    within_module_core(addr, mod)) {
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3042
3043
3044
3045
3046
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, NULL, NULL);
  			if (!sym)
  				goto out;
9281acea6   Tejun Heo   kallsyms: make KS...
3047
  			strlcpy(symname, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3048
  			preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3049
3050
3051
3052
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3053
  	preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3054
3055
  	return -ERANGE;
  }
a5c43dae7   Alexey Dobriyan   Fix race between ...
3056
3057
3058
3059
  int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size,
  			unsigned long *offset, char *modname, char *name)
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3060
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3061
  	list_for_each_entry_rcu(mod, &modules, list) {
a06f6211e   Masami Hiramatsu   module: add withi...
3062
3063
  		if (within_module_init(addr, mod) ||
  		    within_module_core(addr, mod)) {
a5c43dae7   Alexey Dobriyan   Fix race between ...
3064
3065
3066
3067
3068
3069
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, size, offset);
  			if (!sym)
  				goto out;
  			if (modname)
9281acea6   Tejun Heo   kallsyms: make KS...
3070
  				strlcpy(modname, mod->name, MODULE_NAME_LEN);
a5c43dae7   Alexey Dobriyan   Fix race between ...
3071
  			if (name)
9281acea6   Tejun Heo   kallsyms: make KS...
3072
  				strlcpy(name, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3073
  			preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3074
3075
3076
3077
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3078
  	preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3079
3080
  	return -ERANGE;
  }
ea07890a6   Alexey Dobriyan   Fix race between ...
3081
3082
  int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
  			char *name, char *module_name, int *exported)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3083
3084
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3085
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3086
  	list_for_each_entry_rcu(mod, &modules, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3087
3088
3089
  		if (symnum < mod->num_symtab) {
  			*value = mod->symtab[symnum].st_value;
  			*type = mod->symtab[symnum].st_info;
098c5eea0   Andreas Gruenbacher   [PATCH] null-term...
3090
  			strlcpy(name, mod->strtab + mod->symtab[symnum].st_name,
9281acea6   Tejun Heo   kallsyms: make KS...
3091
3092
  				KSYM_NAME_LEN);
  			strlcpy(module_name, mod->name, MODULE_NAME_LEN);
ca4787b77   Tim Abbott   kernel/module.c: ...
3093
  			*exported = is_exported(name, *value, mod);
cb2a52052   Rusty Russell   modules: de-mutex...
3094
  			preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3095
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3096
3097
3098
  		}
  		symnum -= mod->num_symtab;
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3099
  	preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3100
  	return -ERANGE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3101
3102
3103
3104
3105
3106
3107
  }
  
  static unsigned long mod_find_symname(struct module *mod, const char *name)
  {
  	unsigned int i;
  
  	for (i = 0; i < mod->num_symtab; i++)
54e8ce463   Keith Owens   [PATCH] Tell kall...
3108
3109
  		if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0 &&
  		    mod->symtab[i].st_info != 'U')
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
  			return mod->symtab[i].st_value;
  	return 0;
  }
  
  /* Look for this name: can be of form module:name. */
  unsigned long module_kallsyms_lookup_name(const char *name)
  {
  	struct module *mod;
  	char *colon;
  	unsigned long ret = 0;
  
  	/* Don't lock: we're in enough trouble already. */
cb2a52052   Rusty Russell   modules: de-mutex...
3122
  	preempt_disable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3123
3124
3125
3126
3127
3128
  	if ((colon = strchr(name, ':')) != NULL) {
  		*colon = '\0';
  		if ((mod = find_module(name)) != NULL)
  			ret = mod_find_symname(mod, colon+1);
  		*colon = ':';
  	} else {
d72b37513   Andi Kleen   Remove stop_machi...
3129
  		list_for_each_entry_rcu(mod, &modules, list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3130
3131
3132
  			if ((ret = mod_find_symname(mod, name)) != 0)
  				break;
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3133
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3134
3135
  	return ret;
  }
75a66614d   Anders Kaseorg   Ksplice: Add func...
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
  
  int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
  					     struct module *, unsigned long),
  				   void *data)
  {
  	struct module *mod;
  	unsigned int i;
  	int ret;
  
  	list_for_each_entry(mod, &modules, list) {
  		for (i = 0; i < mod->num_symtab; i++) {
  			ret = fn(data, mod->strtab + mod->symtab[i].st_name,
  				 mod, mod->symtab[i].st_value);
  			if (ret != 0)
  				return ret;
  		}
  	}
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3155
  #endif /* CONFIG_KALLSYMS */
21aa9280b   Arjan van de Ven   debug: show being...
3156
  static char *module_flags(struct module *mod, char *buf)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3157
3158
  {
  	int bx = 0;
21aa9280b   Arjan van de Ven   debug: show being...
3159
3160
3161
  	if (mod->taints ||
  	    mod->state == MODULE_STATE_GOING ||
  	    mod->state == MODULE_STATE_COMING) {
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3162
  		buf[bx++] = '(';
cca3e7073   Kay Sievers   modules: sysfs - ...
3163
  		bx += module_flags_taint(mod, buf + bx);
21aa9280b   Arjan van de Ven   debug: show being...
3164
3165
3166
3167
3168
3169
  		/* Show a - for module-is-being-unloaded */
  		if (mod->state == MODULE_STATE_GOING)
  			buf[bx++] = '-';
  		/* Show a + for module-is-being-loaded */
  		if (mod->state == MODULE_STATE_COMING)
  			buf[bx++] = '+';
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3170
3171
3172
3173
3174
3175
  		buf[bx++] = ')';
  	}
  	buf[bx] = '\0';
  
  	return buf;
  }
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
  #ifdef CONFIG_PROC_FS
  /* Called by the /proc file system to return a list of modules. */
  static void *m_start(struct seq_file *m, loff_t *pos)
  {
  	mutex_lock(&module_mutex);
  	return seq_list_start(&modules, *pos);
  }
  
  static void *m_next(struct seq_file *m, void *p, loff_t *pos)
  {
  	return seq_list_next(p, &modules, pos);
  }
  
  static void m_stop(struct seq_file *m, void *p)
  {
  	mutex_unlock(&module_mutex);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3193
3194
3195
  static int m_show(struct seq_file *m, void *p)
  {
  	struct module *mod = list_entry(p, struct module, list);
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3196
  	char buf[8];
2f0f2a334   Denys Vlasenko   module: turn long...
3197
  	seq_printf(m, "%s %u",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3198
3199
3200
3201
3202
3203
3204
3205
3206
  		   mod->name, mod->init_size + mod->core_size);
  	print_unload_info(m, mod);
  
  	/* Informative for users. */
  	seq_printf(m, " %s",
  		   mod->state == MODULE_STATE_GOING ? "Unloading":
  		   mod->state == MODULE_STATE_COMING ? "Loading":
  		   "Live");
  	/* Used by oprofile and other similar tools. */
9f36e2c44   Kees Cook   printk: use %pK f...
3207
  	seq_printf(m, " 0x%pK", mod->module_core);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3208

fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3209
3210
  	/* Taints info */
  	if (mod->taints)
21aa9280b   Arjan van de Ven   debug: show being...
3211
  		seq_printf(m, " %s", module_flags(mod, buf));
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3212

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
  	seq_printf(m, "
  ");
  	return 0;
  }
  
  /* Format: modulename size refcount deps address
  
     Where refcount is a number or -, and deps is a comma-separated list
     of depends or -.
  */
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3223
  static const struct seq_operations modules_op = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3224
3225
3226
3227
3228
  	.start	= m_start,
  	.next	= m_next,
  	.stop	= m_stop,
  	.show	= m_show
  };
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
  static int modules_open(struct inode *inode, struct file *file)
  {
  	return seq_open(file, &modules_op);
  }
  
  static const struct file_operations proc_modules_operations = {
  	.open		= modules_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= seq_release,
  };
  
  static int __init proc_modules_init(void)
  {
  	proc_create("modules", 0, NULL, &proc_modules_operations);
  	return 0;
  }
  module_init(proc_modules_init);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3248
3249
3250
  /* Given an address, look for it in the module exception tables. */
  const struct exception_table_entry *search_module_extables(unsigned long addr)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3251
3252
  	const struct exception_table_entry *e = NULL;
  	struct module *mod;
24da1cbff   Rusty Russell   modules: remove m...
3253
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3254
  	list_for_each_entry_rcu(mod, &modules, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3255
3256
  		if (mod->num_exentries == 0)
  			continue;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3257

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3258
3259
3260
3261
3262
3263
  		e = search_extable(mod->extable,
  				   mod->extable + mod->num_exentries - 1,
  				   addr);
  		if (e)
  			break;
  	}
24da1cbff   Rusty Russell   modules: remove m...
3264
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3265
3266
  
  	/* Now, if we found one, we are running inside it now, hence
22a8bdeb5   Daniel Walker   whitespace fixes:...
3267
  	   we cannot unload the module, hence no refcnt needed. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3268
3269
  	return e;
  }
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3270
  /*
e610499e2   Rusty Russell   module: __module_...
3271
3272
3273
3274
3275
   * is_module_address - is this address inside a module?
   * @addr: the address to check.
   *
   * See is_module_text_address() if you simply want to see if the address
   * is code (not data).
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3276
   */
e610499e2   Rusty Russell   module: __module_...
3277
  bool is_module_address(unsigned long addr)
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3278
  {
e610499e2   Rusty Russell   module: __module_...
3279
  	bool ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3280

24da1cbff   Rusty Russell   modules: remove m...
3281
  	preempt_disable();
e610499e2   Rusty Russell   module: __module_...
3282
  	ret = __module_address(addr) != NULL;
24da1cbff   Rusty Russell   modules: remove m...
3283
  	preempt_enable();
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3284

e610499e2   Rusty Russell   module: __module_...
3285
  	return ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3286
  }
e610499e2   Rusty Russell   module: __module_...
3287
3288
3289
3290
3291
3292
3293
  /*
   * __module_address - get the module which contains an address.
   * @addr: the address.
   *
   * Must be called with preempt disabled or module mutex held so that
   * module doesn't get freed during this.
   */
714f83d5d   Linus Torvalds   Merge branch 'tra...
3294
  struct module *__module_address(unsigned long addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3295
3296
  {
  	struct module *mod;
3a642e99b   Rusty Russell   modules: Take a s...
3297
3298
  	if (addr < module_addr_min || addr > module_addr_max)
  		return NULL;
d72b37513   Andi Kleen   Remove stop_machi...
3299
  	list_for_each_entry_rcu(mod, &modules, list)
e610499e2   Rusty Russell   module: __module_...
3300
3301
  		if (within_module_core(addr, mod)
  		    || within_module_init(addr, mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3302
3303
3304
  			return mod;
  	return NULL;
  }
c6b378019   Tim Abbott   module: Export sy...
3305
  EXPORT_SYMBOL_GPL(__module_address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3306

e610499e2   Rusty Russell   module: __module_...
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
  /*
   * is_module_text_address - is this address inside module code?
   * @addr: the address to check.
   *
   * See is_module_address() if you simply want to see if the address is
   * anywhere in a module.  See kernel_text_address() for testing if an
   * address corresponds to kernel or module code.
   */
  bool is_module_text_address(unsigned long addr)
  {
  	bool ret;
  
  	preempt_disable();
  	ret = __module_text_address(addr) != NULL;
  	preempt_enable();
  
  	return ret;
  }
  
  /*
   * __module_text_address - get the module whose code contains an address.
   * @addr: the address.
   *
   * Must be called with preempt disabled or module mutex held so that
   * module doesn't get freed during this.
   */
  struct module *__module_text_address(unsigned long addr)
  {
  	struct module *mod = __module_address(addr);
  	if (mod) {
  		/* Make sure it's within the text section. */
  		if (!within(addr, mod->module_init, mod->init_text_size)
  		    && !within(addr, mod->module_core, mod->core_text_size))
  			mod = NULL;
  	}
  	return mod;
  }
c6b378019   Tim Abbott   module: Export sy...
3344
  EXPORT_SYMBOL_GPL(__module_text_address);
e610499e2   Rusty Russell   module: __module_...
3345

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3346
3347
3348
3349
  /* Don't grab lock, we're oopsing. */
  void print_modules(void)
  {
  	struct module *mod;
2bc2d61a9   Randy Dunlap   [PATCH] list modu...
3350
  	char buf[8];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3351

b231125af   Linus Torvalds   printk: add KERN_...
3352
  	printk(KERN_DEFAULT "Modules linked in:");
d72b37513   Andi Kleen   Remove stop_machi...
3353
3354
3355
  	/* Most callers should already have preempt disabled, but make sure */
  	preempt_disable();
  	list_for_each_entry_rcu(mod, &modules, list)
21aa9280b   Arjan van de Ven   debug: show being...
3356
  		printk(" %s%s", mod->name, module_flags(mod, buf));
d72b37513   Andi Kleen   Remove stop_machi...
3357
  	preempt_enable();
e14af7eeb   Arjan van de Ven   debug: track and ...
3358
3359
  	if (last_unloaded_module[0])
  		printk(" [last unloaded: %s]", last_unloaded_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3360
3361
3362
  	printk("
  ");
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3363
  #ifdef CONFIG_MODVERSIONS
8c8ef42ae   Rusty Russell   module: include o...
3364
3365
3366
3367
3368
3369
  /* Generate the signature for all relevant module structures here.
   * If these change, we don't want to try to parse the module. */
  void module_layout(struct module *mod,
  		   struct modversion_info *ver,
  		   struct kernel_param *kp,
  		   struct kernel_symbol *ks,
654986462   Mathieu Desnoyers   tracepoints: Fix ...
3370
  		   struct tracepoint * const *tp)
8c8ef42ae   Rusty Russell   module: include o...
3371
3372
3373
  {
  }
  EXPORT_SYMBOL(module_layout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3374
  #endif