Blame view

kernel/module.c 96.6 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>
34e1169d9   Kees Cook   module: add sysca...
24
  #include <linux/file.h>
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
25
  #include <linux/fs.h>
6d7601338   Roland McGrath   Add /sys/module/n...
26
  #include <linux/sysfs.h>
9f1583339   Randy Dunlap   [PATCH] use add_t...
27
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
  #include <linux/slab.h>
  #include <linux/vmalloc.h>
  #include <linux/elf.h>
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
31
  #include <linux/proc_fs.h>
2e72d51b4   Kees Cook   security: introdu...
32
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
36
  #include <linux/seq_file.h>
  #include <linux/syscalls.h>
  #include <linux/fcntl.h>
  #include <linux/rcupdate.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
37
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
41
42
43
  #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 ...
44
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
  #include <linux/stop_machine.h>
  #include <linux/device.h>
c988d2b28   Matt Domsch   [PATCH] modules: ...
47
  #include <linux/string.h>
97d1f15b7   Arjan van de Ven   [PATCH] sem2mutex...
48
  #include <linux/mutex.h>
d72b37513   Andi Kleen   Remove stop_machi...
49
  #include <linux/rculist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  #include <asm/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  #include <asm/cacheflush.h>
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
52
  #include <asm/mmu_context.h>
b817f6fef   Sam Ravnborg   kbuild: check lic...
53
  #include <linux/license.h>
6d7623943   Christoph Lameter   modules: include ...
54
  #include <asm/sections.h>
97e1c18e8   Mathieu Desnoyers   tracing: Kernel T...
55
  #include <linux/tracepoint.h>
90d595fe5   Steven Rostedt   ftrace: enable mc...
56
  #include <linux/ftrace.h>
22a9d6456   Arjan van de Ven   async: Asynchrono...
57
  #include <linux/async.h>
fbf59bc9d   Tejun Heo   percpu: implement...
58
  #include <linux/percpu.h>
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
59
  #include <linux/kmemleak.h>
bf5438fca   Jason Baron   jump label: Base ...
60
  #include <linux/jump_label.h>
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
61
  #include <linux/pfn.h>
403ed2784   Alessio Igor Bogani   module: Use the b...
62
  #include <linux/bsearch.h>
2f3238aeb   Rusty Russell   module: add flags...
63
  #include <uapi/linux/module.h>
106a4ee25   Rusty Russell   module: signature...
64
  #include "module-internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65

7ead8b831   Li Zefan   tracing/events: A...
66
67
  #define CREATE_TRACE_POINTS
  #include <trace/events/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
  #ifndef ARCH_SHF_SMALL
  #define ARCH_SHF_SMALL 0
  #endif
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  /*
   * 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
90
91
  /* 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...
92
93
94
95
96
  /*
   * 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...
97
   * (delete uses stop_machine/add uses RCU list operations). */
c6b378019   Tim Abbott   module: Export sy...
98
99
  DEFINE_MUTEX(module_mutex);
  EXPORT_SYMBOL_GPL(module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
  static LIST_HEAD(modules);
67fc4e0cb   Jason Wessel   kdb: core for kgd...
101
102
103
  #ifdef CONFIG_KGDB_KDB
  struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
  #endif /* CONFIG_KGDB_KDB */
106a4ee25   Rusty Russell   module: signature...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  #ifdef CONFIG_MODULE_SIG
  #ifdef CONFIG_MODULE_SIG_FORCE
  static bool sig_enforce = true;
  #else
  static bool sig_enforce = false;
  
  static int param_set_bool_enable_only(const char *val,
  				      const struct kernel_param *kp)
  {
  	int err;
  	bool test;
  	struct kernel_param dummy_kp = *kp;
  
  	dummy_kp.arg = &test;
  
  	err = param_set_bool(val, &dummy_kp);
  	if (err)
  		return err;
  
  	/* Don't let them unset it once it's set! */
  	if (!test && sig_enforce)
  		return -EROFS;
  
  	if (test)
  		sig_enforce = true;
  	return 0;
  }
  
  static const struct kernel_param_ops param_ops_bool_enable_only = {
6a4c26431   Jani Nikula   module: rename KE...
133
  	.flags = KERNEL_PARAM_OPS_FL_NOARG,
106a4ee25   Rusty Russell   module: signature...
134
135
136
137
138
139
140
141
  	.set = param_set_bool_enable_only,
  	.get = param_get_bool,
  };
  #define param_check_bool_enable_only param_check_bool
  
  module_param(sig_enforce, bool_enable_only, 0644);
  #endif /* !CONFIG_MODULE_SIG_FORCE */
  #endif /* CONFIG_MODULE_SIG */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142

19e4529ee   Stephen Rothwell   modules: Fix up b...
143
144
  /* Block module loading/unloading? */
  int modules_disabled = 0;
02608bef8   Dave Young   module: add kerne...
145
  core_param(nomodule, modules_disabled, bint, 0);
19e4529ee   Stephen Rothwell   modules: Fix up b...
146

c9a3ba55b   Rusty Russell   module: wait for ...
147
148
  /* Waiting for a module to finish initializing? */
  static DECLARE_WAIT_QUEUE_HEAD(module_wq);
e041c6834   Alan Stern   [PATCH] Notifier ...
149
  static BLOCKING_NOTIFIER_HEAD(module_notify_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150

75676500f   Rusty Russell   module: make lock...
151
152
  /* Bounds of module allocation, for speeding __module_address.
   * Protected by module_mutex. */
3a642e99b   Rusty Russell   modules: Take a s...
153
  static unsigned long module_addr_min = -1UL, module_addr_max = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
  int register_module_notifier(struct notifier_block * nb)
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
156
  	return blocking_notifier_chain_register(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
160
161
  }
  EXPORT_SYMBOL(register_module_notifier);
  
  int unregister_module_notifier(struct notifier_block * nb)
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
162
  	return blocking_notifier_chain_unregister(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
164
  }
  EXPORT_SYMBOL(unregister_module_notifier);
eded41c1c   Rusty Russell   module: kallsyms ...
165
166
167
168
  struct load_info {
  	Elf_Ehdr *hdr;
  	unsigned long len;
  	Elf_Shdr *sechdrs;
6526c534b   Rusty Russell   module: move modu...
169
  	char *secstrings, *strtab;
d913188c7   Rusty Russell   module: layout_an...
170
  	unsigned long symoffs, stroffs;
811d66a0e   Rusty Russell   module: group pos...
171
172
  	struct _ddebug *debug;
  	unsigned int num_debug;
106a4ee25   Rusty Russell   module: signature...
173
  	bool sig_ok;
eded41c1c   Rusty Russell   module: kallsyms ...
174
175
176
177
  	struct {
  		unsigned int sym, str, mod, vers, info, pcpu;
  	} index;
  };
9a4b9708f   Matti Linnanvuori   module: fix and e...
178
179
  /* 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
180
181
  static inline int strong_try_module_get(struct module *mod)
  {
0d21b0e34   Rusty Russell   module: add new s...
182
  	BUG_ON(mod && mod->state == MODULE_STATE_UNFORMED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  	if (mod && mod->state == MODULE_STATE_COMING)
c9a3ba55b   Rusty Russell   module: wait for ...
184
185
  		return -EBUSY;
  	if (try_module_get(mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
  		return 0;
c9a3ba55b   Rusty Russell   module: wait for ...
187
188
  	else
  		return -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
  }
373d4d099   Rusty Russell   taint: add explic...
190
191
  static inline void add_taint_module(struct module *mod, unsigned flag,
  				    enum lockdep_ok lockdep_ok)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
192
  {
373d4d099   Rusty Russell   taint: add explic...
193
  	add_taint(flag, lockdep_ok);
25ddbb18a   Andi Kleen   Make the taint fl...
194
  	mod->taints |= (1U << flag);
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
195
  }
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
196
197
198
  /*
   * 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
199
200
201
202
203
204
205
   */
  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:...
206

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  /* Find a module section: 0 means not found. */
49668688d   Rusty Russell   module: pass load...
208
  static unsigned int find_sec(const struct load_info *info, const char *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
210
  {
  	unsigned int i;
49668688d   Rusty Russell   module: pass load...
211
212
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		Elf_Shdr *shdr = &info->sechdrs[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
  		/* Alloc bit cleared means "ignore it." */
49668688d   Rusty Russell   module: pass load...
214
215
  		if ((shdr->sh_flags & SHF_ALLOC)
  		    && strcmp(info->secstrings + shdr->sh_name, name) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
  			return i;
49668688d   Rusty Russell   module: pass load...
217
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
219
  	return 0;
  }
5e458cc0f   Rusty Russell   module: simplify ...
220
  /* Find a module section, or NULL. */
49668688d   Rusty Russell   module: pass load...
221
  static void *section_addr(const struct load_info *info, const char *name)
5e458cc0f   Rusty Russell   module: simplify ...
222
223
  {
  	/* Section 0 has sh_addr 0. */
49668688d   Rusty Russell   module: pass load...
224
  	return (void *)info->sechdrs[find_sec(info, name)].sh_addr;
5e458cc0f   Rusty Russell   module: simplify ...
225
226
227
  }
  
  /* Find a module section, or NULL.  Fill in number of "objects" in section. */
49668688d   Rusty Russell   module: pass load...
228
  static void *section_objs(const struct load_info *info,
5e458cc0f   Rusty Russell   module: simplify ...
229
230
231
232
  			  const char *name,
  			  size_t object_size,
  			  unsigned int *num)
  {
49668688d   Rusty Russell   module: pass load...
233
  	unsigned int sec = find_sec(info, name);
5e458cc0f   Rusty Russell   module: simplify ...
234
235
  
  	/* Section 0 has sh_addr 0 and sh_size 0. */
49668688d   Rusty Russell   module: pass load...
236
237
  	*num = info->sechdrs[sec].sh_size / object_size;
  	return (void *)info->sechdrs[sec].sh_addr;
5e458cc0f   Rusty Russell   module: simplify ...
238
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
240
241
242
243
  /* 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...
244
245
  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
246
247
  extern const unsigned long __start___kcrctab[];
  extern const unsigned long __start___kcrctab_gpl[];
9f28bb7e1   Greg Kroah-Hartman   [PATCH] add EXPOR...
248
  extern const unsigned long __start___kcrctab_gpl_future[];
f7f5b6755   Denys Vlasenko   Shrink struct mod...
249
250
251
252
253
  #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...
254
255
  extern const unsigned long __start___kcrctab_unused[];
  extern const unsigned long __start___kcrctab_unused_gpl[];
f7f5b6755   Denys Vlasenko   Shrink struct mod...
256
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
258
259
260
  
  #ifndef CONFIG_MODVERSIONS
  #define symversion(base, idx) NULL
  #else
f83ca9fe3   Andrew Morton   [PATCH] symversio...
261
  #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262
  #endif
dafd0940c   Rusty Russell   module: generic e...
263
264
265
266
267
  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...
268
  					      void *data),
dafd0940c   Rusty Russell   module: generic e...
269
  				   void *data)
ad9546c99   Rusty Russell   module: neaten __...
270
  {
de4d8d534   Rusty Russell   module: each_symb...
271
  	unsigned int j;
ad9546c99   Rusty Russell   module: neaten __...
272

dafd0940c   Rusty Russell   module: generic e...
273
  	for (j = 0; j < arrsize; j++) {
de4d8d534   Rusty Russell   module: each_symb...
274
275
  		if (fn(&arr[j], owner, data))
  			return true;
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
276
  	}
dafd0940c   Rusty Russell   module: generic e...
277
278
  
  	return false;
ad9546c99   Rusty Russell   module: neaten __...
279
  }
dafd0940c   Rusty Russell   module: generic e...
280
  /* Returns true as soon as fn returns true, otherwise false. */
de4d8d534   Rusty Russell   module: each_symb...
281
282
283
284
  bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
  				    struct module *owner,
  				    void *data),
  			 void *data)
ad9546c99   Rusty Russell   module: neaten __...
285
286
  {
  	struct module *mod;
44032e631   Linus Torvalds   module: reduce st...
287
  	static const struct symsearch arr[] = {
ad9546c99   Rusty Russell   module: neaten __...
288
  		{ __start___ksymtab, __stop___ksymtab, __start___kcrctab,
dafd0940c   Rusty Russell   module: generic e...
289
  		  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
290
  		{ __start___ksymtab_gpl, __stop___ksymtab_gpl,
dafd0940c   Rusty Russell   module: generic e...
291
292
  		  __start___kcrctab_gpl,
  		  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
293
  		{ __start___ksymtab_gpl_future, __stop___ksymtab_gpl_future,
dafd0940c   Rusty Russell   module: generic e...
294
295
  		  __start___kcrctab_gpl_future,
  		  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
296
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
297
  		{ __start___ksymtab_unused, __stop___ksymtab_unused,
dafd0940c   Rusty Russell   module: generic e...
298
299
  		  __start___kcrctab_unused,
  		  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
300
  		{ __start___ksymtab_unused_gpl, __stop___ksymtab_unused_gpl,
dafd0940c   Rusty Russell   module: generic e...
301
302
  		  __start___kcrctab_unused_gpl,
  		  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
303
  #endif
ad9546c99   Rusty Russell   module: neaten __...
304
  	};
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
305

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

d72b37513   Andi Kleen   Remove stop_machi...
309
  	list_for_each_entry_rcu(mod, &modules, list) {
ad9546c99   Rusty Russell   module: neaten __...
310
311
  		struct symsearch arr[] = {
  			{ mod->syms, mod->syms + mod->num_syms, mod->crcs,
dafd0940c   Rusty Russell   module: generic e...
312
  			  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
313
  			{ mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
314
315
  			  mod->gpl_crcs,
  			  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
316
317
  			{ mod->gpl_future_syms,
  			  mod->gpl_future_syms + mod->num_gpl_future_syms,
dafd0940c   Rusty Russell   module: generic e...
318
319
  			  mod->gpl_future_crcs,
  			  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
320
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
321
322
  			{ mod->unused_syms,
  			  mod->unused_syms + mod->num_unused_syms,
dafd0940c   Rusty Russell   module: generic e...
323
324
  			  mod->unused_crcs,
  			  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
325
326
  			{ mod->unused_gpl_syms,
  			  mod->unused_gpl_syms + mod->num_unused_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
327
328
  			  mod->unused_gpl_crcs,
  			  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
329
  #endif
ad9546c99   Rusty Russell   module: neaten __...
330
  		};
0d21b0e34   Rusty Russell   module: add new s...
331
332
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
dafd0940c   Rusty Russell   module: generic e...
333
334
335
336
337
  		if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data))
  			return true;
  	}
  	return false;
  }
de4d8d534   Rusty Russell   module: each_symb...
338
  EXPORT_SYMBOL_GPL(each_symbol_section);
dafd0940c   Rusty Russell   module: generic e...
339
340
341
342
343
344
345
346
347
348
  
  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...
349
  	const struct kernel_symbol *sym;
dafd0940c   Rusty Russell   module: generic e...
350
  };
de4d8d534   Rusty Russell   module: each_symb...
351
352
353
  static bool check_symbol(const struct symsearch *syms,
  				 struct module *owner,
  				 unsigned int symnum, void *data)
dafd0940c   Rusty Russell   module: generic e...
354
355
  {
  	struct find_symbol_arg *fsa = data;
dafd0940c   Rusty Russell   module: generic e...
356
357
358
359
  	if (!fsa->gplok) {
  		if (syms->licence == GPL_ONLY)
  			return false;
  		if (syms->licence == WILL_BE_GPL_ONLY && fsa->warn) {
bddb12b32   Andrew Morton   kernel/module.c: ...
360
361
362
363
  			pr_warn("Symbol %s is being used by a non-GPL module, "
  				"which will not be allowed in the future
  ",
  				fsa->name);
9f28bb7e1   Greg Kroah-Hartman   [PATCH] add EXPOR...
364
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
  	}
ad9546c99   Rusty Russell   module: neaten __...
366

f7f5b6755   Denys Vlasenko   Shrink struct mod...
367
  #ifdef CONFIG_UNUSED_SYMBOLS
dafd0940c   Rusty Russell   module: generic e...
368
  	if (syms->unused && fsa->warn) {
bddb12b32   Andrew Morton   kernel/module.c: ...
369
370
371
372
373
374
375
376
377
378
  		pr_warn("Symbol %s is marked as UNUSED, however this module is "
  			"using it.
  ", fsa->name);
  		pr_warn("This symbol will go away in the future.
  ");
  		pr_warn("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.
  ");
dafd0940c   Rusty Russell   module: generic e...
379
  	}
f7f5b6755   Denys Vlasenko   Shrink struct mod...
380
  #endif
dafd0940c   Rusty Russell   module: generic e...
381
382
383
  
  	fsa->owner = owner;
  	fsa->crc = symversion(syms->crcs, symnum);
414fd31b2   Tim Abbott   module: Make find...
384
  	fsa->sym = &syms->start[symnum];
dafd0940c   Rusty Russell   module: generic e...
385
386
  	return true;
  }
403ed2784   Alessio Igor Bogani   module: Use the b...
387
388
389
390
391
392
393
  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...
394
395
396
397
398
  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...
399
400
401
402
403
404
405
  	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...
406

de4d8d534   Rusty Russell   module: each_symb...
407
408
  	return false;
  }
414fd31b2   Tim Abbott   module: Make find...
409
  /* Find a symbol and return it, along with, (optional) crc and
75676500f   Rusty Russell   module: make lock...
410
   * (optional) module which owns it.  Needs preempt disabled or module_mutex. */
c6b378019   Tim Abbott   module: Export sy...
411
412
413
414
415
  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...
416
417
418
419
420
421
  {
  	struct find_symbol_arg fsa;
  
  	fsa.name = name;
  	fsa.gplok = gplok;
  	fsa.warn = warn;
de4d8d534   Rusty Russell   module: each_symb...
422
  	if (each_symbol_section(find_symbol_in_section, &fsa)) {
dafd0940c   Rusty Russell   module: generic e...
423
424
425
426
  		if (owner)
  			*owner = fsa.owner;
  		if (crc)
  			*crc = fsa.crc;
414fd31b2   Tim Abbott   module: Make find...
427
  		return fsa.sym;
dafd0940c   Rusty Russell   module: generic e...
428
  	}
5e1241692   Jim Cromie   module: replace D...
429
430
  	pr_debug("Failed to find symbol %s
  ", name);
414fd31b2   Tim Abbott   module: Make find...
431
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432
  }
c6b378019   Tim Abbott   module: Export sy...
433
  EXPORT_SYMBOL_GPL(find_symbol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435
  /* Search for module by name: must hold module_mutex. */
4f6de4d51   Mathias Krause   module: don't mod...
436
  static struct module *find_module_all(const char *name, size_t len,
0d21b0e34   Rusty Russell   module: add new s...
437
  				      bool even_unformed)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
440
441
  {
  	struct module *mod;
  
  	list_for_each_entry(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
442
443
  		if (!even_unformed && mod->state == MODULE_STATE_UNFORMED)
  			continue;
4f6de4d51   Mathias Krause   module: don't mod...
444
  		if (strlen(mod->name) == len && !memcmp(mod->name, name, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
446
447
448
  			return mod;
  	}
  	return NULL;
  }
0d21b0e34   Rusty Russell   module: add new s...
449
450
451
  
  struct module *find_module(const char *name)
  {
4f6de4d51   Mathias Krause   module: don't mod...
452
  	return find_module_all(name, strlen(name), false);
0d21b0e34   Rusty Russell   module: add new s...
453
  }
c6b378019   Tim Abbott   module: Export sy...
454
  EXPORT_SYMBOL_GPL(find_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
455
456
  
  #ifdef CONFIG_SMP
fbf59bc9d   Tejun Heo   percpu: implement...
457

259354dea   Tejun Heo   module: encapsula...
458
  static inline void __percpu *mod_percpu(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
459
  {
259354dea   Tejun Heo   module: encapsula...
460
461
  	return mod->percpu;
  }
fbf59bc9d   Tejun Heo   percpu: implement...
462

9eb76d779   Rusty Russell   module: cleanup c...
463
  static int percpu_modalloc(struct module *mod, struct load_info *info)
259354dea   Tejun Heo   module: encapsula...
464
  {
9eb76d779   Rusty Russell   module: cleanup c...
465
466
467
468
469
  	Elf_Shdr *pcpusec = &info->sechdrs[info->index.pcpu];
  	unsigned long align = pcpusec->sh_addralign;
  
  	if (!pcpusec->sh_size)
  		return 0;
fbf59bc9d   Tejun Heo   percpu: implement...
470
  	if (align > PAGE_SIZE) {
bddb12b32   Andrew Morton   kernel/module.c: ...
471
472
473
  		pr_warn("%s: per-cpu alignment %li > %li
  ",
  			mod->name, align, PAGE_SIZE);
fbf59bc9d   Tejun Heo   percpu: implement...
474
475
  		align = PAGE_SIZE;
  	}
9eb76d779   Rusty Russell   module: cleanup c...
476
  	mod->percpu = __alloc_reserved_percpu(pcpusec->sh_size, align);
259354dea   Tejun Heo   module: encapsula...
477
  	if (!mod->percpu) {
bddb12b32   Andrew Morton   kernel/module.c: ...
478
479
480
  		pr_warn("%s: Could not allocate %lu bytes percpu data
  ",
  			mod->name, (unsigned long)pcpusec->sh_size);
259354dea   Tejun Heo   module: encapsula...
481
482
  		return -ENOMEM;
  	}
9eb76d779   Rusty Russell   module: cleanup c...
483
  	mod->percpu_size = pcpusec->sh_size;
259354dea   Tejun Heo   module: encapsula...
484
  	return 0;
fbf59bc9d   Tejun Heo   percpu: implement...
485
  }
259354dea   Tejun Heo   module: encapsula...
486
  static void percpu_modfree(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
487
  {
259354dea   Tejun Heo   module: encapsula...
488
  	free_percpu(mod->percpu);
fbf59bc9d   Tejun Heo   percpu: implement...
489
  }
49668688d   Rusty Russell   module: pass load...
490
  static unsigned int find_pcpusec(struct load_info *info)
6b588c18f   Tejun Heo   module: reorder m...
491
  {
49668688d   Rusty Russell   module: pass load...
492
  	return find_sec(info, ".data..percpu");
6b588c18f   Tejun Heo   module: reorder m...
493
  }
259354dea   Tejun Heo   module: encapsula...
494
495
  static void percpu_modcopy(struct module *mod,
  			   const void *from, unsigned long size)
6b588c18f   Tejun Heo   module: reorder m...
496
497
498
499
  {
  	int cpu;
  
  	for_each_possible_cpu(cpu)
259354dea   Tejun Heo   module: encapsula...
500
  		memcpy(per_cpu_ptr(mod->percpu, cpu), from, size);
6b588c18f   Tejun Heo   module: reorder m...
501
  }
10fad5e46   Tejun Heo   percpu, module: i...
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
  /**
   * 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) {
0d21b0e34   Rusty Russell   module: add new s...
519
520
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
10fad5e46   Tejun Heo   percpu, module: i...
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
  		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...
536
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
537
  #else /* ... !CONFIG_SMP */
6b588c18f   Tejun Heo   module: reorder m...
538

259354dea   Tejun Heo   module: encapsula...
539
  static inline void __percpu *mod_percpu(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
540
541
542
  {
  	return NULL;
  }
9eb76d779   Rusty Russell   module: cleanup c...
543
  static int percpu_modalloc(struct module *mod, struct load_info *info)
259354dea   Tejun Heo   module: encapsula...
544
  {
9eb76d779   Rusty Russell   module: cleanup c...
545
546
547
548
  	/* UP modules shouldn't have this section: ENOMEM isn't quite right */
  	if (info->sechdrs[info->index.pcpu].sh_size != 0)
  		return -ENOMEM;
  	return 0;
259354dea   Tejun Heo   module: encapsula...
549
550
  }
  static inline void percpu_modfree(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552
  }
49668688d   Rusty Russell   module: pass load...
553
  static unsigned int find_pcpusec(struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
555
556
  {
  	return 0;
  }
259354dea   Tejun Heo   module: encapsula...
557
558
  static inline void percpu_modcopy(struct module *mod,
  				  const void *from, unsigned long size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559
560
561
562
  {
  	/* pcpusec should be 0, and size of that section should be 0. */
  	BUG_ON(size != 0);
  }
10fad5e46   Tejun Heo   percpu, module: i...
563
564
565
566
  bool is_module_percpu_address(unsigned long addr)
  {
  	return false;
  }
6b588c18f   Tejun Heo   module: reorder m...
567

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
  #endif /* CONFIG_SMP */
c988d2b28   Matt Domsch   [PATCH] modules: ...
569
570
571
572
573
574
  #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...
575
  			struct module_kobject *mk, char *buffer)      \
c988d2b28   Matt Domsch   [PATCH] modules: ...
576
  {                                                                     \
cc56ded3f   Chen Gang   kernel/module.c: ...
577
578
  	return scnprintf(buffer, PAGE_SIZE, "%s
  ", mk->mod->field);  \
c988d2b28   Matt Domsch   [PATCH] modules: ...
579
580
581
582
583
584
585
  }                                                                     \
  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:...
586
587
  	kfree(mod->field);                                            \
  	mod->field = NULL;                                            \
c988d2b28   Matt Domsch   [PATCH] modules: ...
588
589
  }                                                                     \
  static struct module_attribute modinfo_##field = {                    \
7b595756e   Tejun Heo   sysfs: kill unnec...
590
  	.attr = { .name = __stringify(field), .mode = 0444 },         \
c988d2b28   Matt Domsch   [PATCH] modules: ...
591
592
593
594
595
596
597
598
  	.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 ...
599
  static char last_unloaded_module[MODULE_NAME_LEN+1];
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
600
  #ifdef CONFIG_MODULE_UNLOAD
eb0c53771   Steven Rostedt   tracing: Fix comp...
601
602
  
  EXPORT_TRACEPOINT_SYMBOL(module_get);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
  /* Init the unload section of the module. */
9f85a4bbb   Rusty Russell   module: refactor ...
604
  static int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
605
  {
9f85a4bbb   Rusty Russell   module: refactor ...
606
607
608
  	mod->refptr = alloc_percpu(struct module_ref);
  	if (!mod->refptr)
  		return -ENOMEM;
2c02dfe7f   Linus Torvalds   module: Make the ...
609
610
  	INIT_LIST_HEAD(&mod->source_list);
  	INIT_LIST_HEAD(&mod->target_list);
e1783a240   Christoph Lameter   module: Use this_...
611

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
612
  	/* Hold reference count during initialization. */
08f141d3d   Christoph Lameter   modules: use raw_...
613
  	raw_cpu_write(mod->refptr->incs, 1);
9f85a4bbb   Rusty Russell   module: refactor ...
614
615
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
617
618
619
620
  /* 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 ...
621
622
  	list_for_each_entry(use, &b->source_list, source_list) {
  		if (use->source == a) {
5e1241692   Jim Cromie   module: replace D...
623
624
  			pr_debug("%s uses %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
625
626
627
  			return 1;
  		}
  	}
5e1241692   Jim Cromie   module: replace D...
628
629
  	pr_debug("%s does not use %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630
631
  	return 0;
  }
2c02dfe7f   Linus Torvalds   module: Make the ...
632
633
634
635
636
637
638
639
640
  /*
   * 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 ...
641
  	struct module_use *use;
5e1241692   Jim Cromie   module: replace D...
642
643
  	pr_debug("Allocating new usage for %s.
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
644
645
  	use = kmalloc(sizeof(*use), GFP_ATOMIC);
  	if (!use) {
bddb12b32   Andrew Morton   kernel/module.c: ...
646
647
  		pr_warn("%s: out of memory loading
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
648
649
650
651
652
653
654
  		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 ...
655
656
  	return 0;
  }
75676500f   Rusty Russell   module: make lock...
657
  /* Module a uses b: caller needs module_mutex() */
9bea7f239   Rusty Russell   module: fix bne2 ...
658
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659
  {
c8e21ced0   Rusty Russell   module: fix kdb's...
660
  	int err;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
661

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

9bea7f239   Rusty Russell   module: fix bne2 ...
665
666
  	/* If module isn't available, we fail. */
  	err = strong_try_module_get(b);
c9a3ba55b   Rusty Russell   module: wait for ...
667
  	if (err)
9bea7f239   Rusty Russell   module: fix bne2 ...
668
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
669

2c02dfe7f   Linus Torvalds   module: Make the ...
670
671
  	err = add_module_usage(a, b);
  	if (err) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
  		module_put(b);
9bea7f239   Rusty Russell   module: fix bne2 ...
673
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
675
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
676
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
677
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
678
679
680
681
  
  /* Clear the unload stuff of the module. */
  static void module_unload_free(struct module *mod)
  {
2c02dfe7f   Linus Torvalds   module: Make the ...
682
  	struct module_use *use, *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
683

75676500f   Rusty Russell   module: make lock...
684
  	mutex_lock(&module_mutex);
2c02dfe7f   Linus Torvalds   module: Make the ...
685
686
  	list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) {
  		struct module *i = use->target;
5e1241692   Jim Cromie   module: replace D...
687
688
  		pr_debug("%s unusing %s
  ", mod->name, i->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
689
690
691
692
  		module_put(i);
  		list_del(&use->source_list);
  		list_del(&use->target_list);
  		kfree(use);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
  	}
75676500f   Rusty Russell   module: make lock...
694
  	mutex_unlock(&module_mutex);
9f85a4bbb   Rusty Russell   module: refactor ...
695
696
  
  	free_percpu(mod->refptr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697
698
699
  }
  
  #ifdef CONFIG_MODULE_FORCE_UNLOAD
fb1697933   Akinobu Mita   [PATCH] modules: ...
700
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
702
703
  {
  	int ret = (flags & O_TRUNC);
  	if (ret)
373d4d099   Rusty Russell   taint: add explic...
704
  		add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
705
706
707
  	return ret;
  }
  #else
fb1697933   Akinobu Mita   [PATCH] modules: ...
708
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
  {
  	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...
725
726
  	/* If it's not unused, quit unless we're forcing. */
  	if (module_refcount(sref->mod) != 0) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
727
  		if (!(*sref->forced = try_force_unload(sref->flags)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
728
729
730
731
732
733
734
735
736
737
  			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)
  {
3f2b9c9cd   Rusty Russell   module: remove rm...
738
  	struct stopref sref = { mod, flags, forced };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739

3f2b9c9cd   Rusty Russell   module: remove rm...
740
  	return stop_machine(__try_stop_module, &sref, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
  }
bd77c0477   Eric Dumazet   module: struct mo...
742
  unsigned long module_refcount(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
743
  {
bd77c0477   Eric Dumazet   module: struct mo...
744
  	unsigned long incs = 0, decs = 0;
720eba31f   Eric Dumazet   modules: Use a be...
745
  	int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
746

720eba31f   Eric Dumazet   modules: Use a be...
747
  	for_each_possible_cpu(cpu)
5fbfb18d7   Nick Piggin   Fix up possibly r...
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
  		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
766
767
768
769
770
  }
  EXPORT_SYMBOL(module_refcount);
  
  /* This exists whether we can unload or not */
  static void free_module(struct module *mod);
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
771
772
  SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
  		unsigned int, flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
773
774
  {
  	struct module *mod;
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
775
  	char name[MODULE_NAME_LEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
776
  	int ret, forced = 0;
3d43321b7   Kees Cook   modules: sysctl t...
777
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
778
779
780
781
782
  		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...
783
784
  	if (mutex_lock_interruptible(&module_mutex) != 0)
  		return -EINTR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
785
786
787
788
789
790
  
  	mod = find_module(name);
  	if (!mod) {
  		ret = -ENOENT;
  		goto out;
  	}
2c02dfe7f   Linus Torvalds   module: Make the ...
791
  	if (!list_empty(&mod->source_list)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792
793
794
795
796
797
798
  		/* 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) {
3f2b9c9cd   Rusty Russell   module: remove rm...
799
  		/* FIXME: if (force), slam module count damn the torpedoes */
5e1241692   Jim Cromie   module: replace D...
800
801
  		pr_debug("%s already dying
  ", mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
802
803
804
805
806
  		ret = -EBUSY;
  		goto out;
  	}
  
  	/* If it has an init func, it must have an exit func to unload */
af49d9248   Rusty Russell   Remove "unsafe" f...
807
  	if (mod->init && !mod->exit) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
808
  		forced = try_force_unload(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
809
810
811
812
813
814
  		if (!forced) {
  			/* This module can't be removed */
  			ret = -EBUSY;
  			goto out;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
815
816
817
818
  	/* Stop the machine so refcounts can't move and disable module. */
  	ret = try_stop_module(mod, flags, &forced);
  	if (ret != 0)
  		goto out;
df4b565e1   Peter Oberparleiter   module: add MODUL...
819
  	mutex_unlock(&module_mutex);
25985edce   Lucas De Marchi   Fix common misspe...
820
  	/* Final destruction now no one is using it. */
df4b565e1   Peter Oberparleiter   module: add MODUL...
821
  	if (mod->exit != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
822
  		mod->exit();
df4b565e1   Peter Oberparleiter   module: add MODUL...
823
824
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
22a9d6456   Arjan van de Ven   async: Asynchrono...
825
  	async_synchronize_full();
75676500f   Rusty Russell   module: make lock...
826

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

75676500f   Rusty Russell   module: make lock...
830
831
832
  	free_module(mod);
  	return 0;
  out:
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
833
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
834
835
  	return ret;
  }
d1e99d7ae   Jianjun Kong   module: fix warni...
836
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
837
838
839
  {
  	struct module_use *use;
  	int printed_something = 0;
bd77c0477   Eric Dumazet   module: struct mo...
840
  	seq_printf(m, " %lu ", module_refcount(mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
841
842
843
  
  	/* Always include a trailing , so userspace can differentiate
             between this and the old multi-field proc format. */
2c02dfe7f   Linus Torvalds   module: Make the ...
844
  	list_for_each_entry(use, &mod->source_list, source_list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
845
  		printed_something = 1;
2c02dfe7f   Linus Torvalds   module: Make the ...
846
  		seq_printf(m, "%s,", use->source->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
847
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
848
849
850
851
852
853
854
855
856
857
858
859
  	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
860

24da1cbff   Rusty Russell   modules: remove m...
861
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
862
  	if (!find_symbol(symbol, &owner, NULL, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
863
864
  		BUG();
  	module_put(owner);
24da1cbff   Rusty Russell   modules: remove m...
865
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
866
867
  }
  EXPORT_SYMBOL(__symbol_put);
7d1d16e41   Rusty Russell   module: fix BUG_O...
868
  /* Note this assumes addr is a function, which it currently always is. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
869
870
  void symbol_put_addr(void *addr)
  {
5e3766138   Trent Piepho   [PATCH] symbol_pu...
871
  	struct module *modaddr;
7d1d16e41   Rusty Russell   module: fix BUG_O...
872
  	unsigned long a = (unsigned long)dereference_function_descriptor(addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
873

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

a6e6abd57   Rusty Russell   module: remove mo...
877
878
  	/* 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...
879
  	modaddr = __module_text_address(a);
a6e6abd57   Rusty Russell   module: remove mo...
880
  	BUG_ON(!modaddr);
5e3766138   Trent Piepho   [PATCH] symbol_pu...
881
  	module_put(modaddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882
883
884
885
  }
  EXPORT_SYMBOL_GPL(symbol_put_addr);
  
  static ssize_t show_refcnt(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
886
  			   struct module_kobject *mk, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
887
  {
bd77c0477   Eric Dumazet   module: struct mo...
888
889
  	return sprintf(buffer, "%lu
  ", module_refcount(mk->mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
891
892
  static struct module_attribute modinfo_refcnt =
  	__ATTR(refcnt, 0444, show_refcnt, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893

d53799be6   Steven Rostedt   module: move __mo...
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
  void __module_get(struct module *module)
  {
  	if (module) {
  		preempt_disable();
  		__this_cpu_inc(module->refptr->incs);
  		trace_module_get(module, _RET_IP_);
  		preempt_enable();
  	}
  }
  EXPORT_SYMBOL(__module_get);
  
  bool try_module_get(struct module *module)
  {
  	bool ret = true;
  
  	if (module) {
  		preempt_disable();
  
  		if (likely(module_is_live(module))) {
  			__this_cpu_inc(module->refptr->incs);
  			trace_module_get(module, _RET_IP_);
  		} else
  			ret = false;
  
  		preempt_enable();
  	}
  	return ret;
  }
  EXPORT_SYMBOL(try_module_get);
f6a570333   Al Viro   [PATCH] severing ...
923
924
925
  void module_put(struct module *module)
  {
  	if (module) {
e1783a240   Christoph Lameter   module: Use this_...
926
  		preempt_disable();
5fbfb18d7   Nick Piggin   Fix up possibly r...
927
928
  		smp_wmb(); /* see comment in module_refcount */
  		__this_cpu_inc(module->refptr->decs);
e1783a240   Christoph Lameter   module: Use this_...
929

ae832d1e0   Li Zefan   tracing: Remove s...
930
  		trace_module_put(module, _RET_IP_);
e1783a240   Christoph Lameter   module: Use this_...
931
  		preempt_enable();
f6a570333   Al Viro   [PATCH] severing ...
932
933
934
  	}
  }
  EXPORT_SYMBOL(module_put);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
935
  #else /* !CONFIG_MODULE_UNLOAD */
d1e99d7ae   Jianjun Kong   module: fix warni...
936
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
937
938
939
940
941
942
943
944
  {
  	/* 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 ...
945
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
  {
9bea7f239   Rusty Russell   module: fix bne2 ...
947
  	return strong_try_module_get(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
949
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
950

9f85a4bbb   Rusty Russell   module: refactor ...
951
  static inline int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952
  {
9f85a4bbb   Rusty Russell   module: refactor ...
953
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
954
955
  }
  #endif /* CONFIG_MODULE_UNLOAD */
53999bf34   Kevin Winchester   error: implicit d...
956
957
958
959
960
961
962
963
964
965
966
967
  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';
66cc69e34   Mathieu Desnoyers   Fix: module signa...
968
  	if (mod->taints & (1 << TAINT_UNSIGNED_MODULE))
57673c2b0   Rusty Russell   Use 'E' instead o...
969
  		buf[l++] = 'E';
53999bf34   Kevin Winchester   error: implicit d...
970
971
  	/*
  	 * TAINT_FORCED_RMMOD: could be added.
8c90487cd   Dave Jones   Rename TAINT_UNSA...
972
  	 * TAINT_CPU_OUT_OF_SPEC, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
53999bf34   Kevin Winchester   error: implicit d...
973
974
975
976
  	 * apply to modules.
  	 */
  	return l;
  }
1f71740ab   Kay Sievers   Driver core: show...
977
  static ssize_t show_initstate(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
978
  			      struct module_kobject *mk, char *buffer)
1f71740ab   Kay Sievers   Driver core: show...
979
980
  {
  	const char *state = "unknown";
4befb026c   Kay Sievers   module: change at...
981
  	switch (mk->mod->state) {
1f71740ab   Kay Sievers   Driver core: show...
982
983
984
985
986
987
988
989
990
  	case MODULE_STATE_LIVE:
  		state = "live";
  		break;
  	case MODULE_STATE_COMING:
  		state = "coming";
  		break;
  	case MODULE_STATE_GOING:
  		state = "going";
  		break;
0d21b0e34   Rusty Russell   module: add new s...
991
992
  	default:
  		BUG();
1f71740ab   Kay Sievers   Driver core: show...
993
994
995
996
  	}
  	return sprintf(buffer, "%s
  ", state);
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
997
998
  static struct module_attribute modinfo_initstate =
  	__ATTR(initstate, 0444, show_initstate, NULL);
1f71740ab   Kay Sievers   Driver core: show...
999

88bfa3247   Kay Sievers   module: add /sys/...
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
  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 - ...
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
  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/...
1046

03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1047
  static struct module_attribute *modinfo_attrs[] = {
cca3e7073   Kay Sievers   modules: sysfs - ...
1048
  	&module_uevent,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1049
1050
  	&modinfo_version,
  	&modinfo_srcversion,
cca3e7073   Kay Sievers   modules: sysfs - ...
1051
1052
1053
1054
  	&modinfo_initstate,
  	&modinfo_coresize,
  	&modinfo_initsize,
  	&modinfo_taint,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1055
  #ifdef CONFIG_MODULE_UNLOAD
cca3e7073   Kay Sievers   modules: sysfs - ...
1056
  	&modinfo_refcnt,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1057
1058
1059
  #endif
  	NULL,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1060
  static const char vermagic[] = VERMAGIC_STRING;
c6e665c8f   Rusty Russell   module: clarify t...
1061
  static int try_to_force_load(struct module *mod, const char *reason)
826e4506a   Linus Torvalds   Make forced modul...
1062
1063
  {
  #ifdef CONFIG_MODULE_FORCE_LOAD
25ddbb18a   Andi Kleen   Make the taint fl...
1064
  	if (!test_taint(TAINT_FORCED_MODULE))
bddb12b32   Andrew Morton   kernel/module.c: ...
1065
1066
  		pr_warn("%s: %s: kernel tainted.
  ", mod->name, reason);
373d4d099   Rusty Russell   taint: add explic...
1067
  	add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
826e4506a   Linus Torvalds   Make forced modul...
1068
1069
1070
1071
1072
  	return 0;
  #else
  	return -ENOEXEC;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1073
  #ifdef CONFIG_MODVERSIONS
d4703aefd   Rusty Russell   module: handle pp...
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
  /* 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
1084
1085
1086
1087
  static int check_version(Elf_Shdr *sechdrs,
  			 unsigned int versindex,
  			 const char *symname,
  			 struct module *mod, 
d4703aefd   Rusty Russell   module: handle pp...
1088
1089
  			 const unsigned long *crc,
  			 const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1090
1091
1092
1093
1094
1095
1096
  {
  	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...
1097
1098
1099
  	/* 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
1100
1101
1102
1103
1104
1105
1106
  	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...
1107
  		if (versions[i].crc == maybe_relocated(*crc, crc_owner))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1108
  			return 1;
5e1241692   Jim Cromie   module: replace D...
1109
1110
  		pr_debug("Found checksum %lX vs module %lX
  ",
d4703aefd   Rusty Russell   module: handle pp...
1111
  		       maybe_relocated(*crc, crc_owner), versions[i].crc);
826e4506a   Linus Torvalds   Make forced modul...
1112
  		goto bad_version;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1113
  	}
826e4506a   Linus Torvalds   Make forced modul...
1114

bddb12b32   Andrew Morton   kernel/module.c: ...
1115
1116
  	pr_warn("%s: no symbol version for %s
  ", mod->name, symname);
a5dd69707   Rusty Russell   module: be more p...
1117
  	return 0;
826e4506a   Linus Torvalds   Make forced modul...
1118
1119
1120
1121
1122
1123
  
  bad_version:
  	printk("%s: disagrees about version of symbol %s
  ",
  	       mod->name, symname);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1124
1125
1126
1127
1128
1129
1130
  }
  
  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
1131

75676500f   Rusty Russell   module: make lock...
1132
1133
  	/* Since this should be found in kernel (which can't be removed),
  	 * no locking is necessary. */
b92021b09   Rusty Russell   CONFIG_SYMBOL_PRE...
1134
  	if (!find_symbol(VMLINUX_SYMBOL_STR(module_layout), NULL,
6560dc160   Mike Frysinger   module: use MODUL...
1135
  			 &crc, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1136
  		BUG();
a4b6a77b7   James Hogan   module: fix symbo...
1137
1138
  	return check_version(sechdrs, versindex,
  			     VMLINUX_SYMBOL_STR(module_layout), mod, crc,
d4703aefd   Rusty Russell   module: handle pp...
1139
  			     NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1140
  }
91e37a793   Rusty Russell   module: don't ign...
1141
1142
1143
  /* 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
1144
  {
91e37a793   Rusty Russell   module: don't ign...
1145
1146
1147
1148
  	if (has_crcs) {
  		amagic += strcspn(amagic, " ");
  		bmagic += strcspn(bmagic, " ");
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1149
1150
1151
1152
1153
1154
1155
  	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...
1156
1157
  				const unsigned long *crc,
  				const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
  {
  	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...
1168
1169
  static inline int same_magic(const char *amagic, const char *bmagic,
  			     bool has_crcs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
1171
1172
1173
  {
  	return strcmp(amagic, bmagic) == 0;
  }
  #endif /* CONFIG_MODVERSIONS */
75676500f   Rusty Russell   module: make lock...
1174
  /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
49668688d   Rusty Russell   module: pass load...
1175
1176
  static const struct kernel_symbol *resolve_symbol(struct module *mod,
  						  const struct load_info *info,
414fd31b2   Tim Abbott   module: Make find...
1177
  						  const char *name,
9bea7f239   Rusty Russell   module: fix bne2 ...
1178
  						  char ownername[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1179
1180
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1181
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1182
  	const unsigned long *crc;
9bea7f239   Rusty Russell   module: fix bne2 ...
1183
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1184

75676500f   Rusty Russell   module: make lock...
1185
  	mutex_lock(&module_mutex);
414fd31b2   Tim Abbott   module: Make find...
1186
  	sym = find_symbol(name, &owner, &crc,
25ddbb18a   Andi Kleen   Make the taint fl...
1187
  			  !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
9bea7f239   Rusty Russell   module: fix bne2 ...
1188
1189
  	if (!sym)
  		goto unlock;
49668688d   Rusty Russell   module: pass load...
1190
1191
  	if (!check_version(info->sechdrs, info->index.vers, name, mod, crc,
  			   owner)) {
9bea7f239   Rusty Russell   module: fix bne2 ...
1192
1193
  		sym = ERR_PTR(-EINVAL);
  		goto getname;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1194
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
  
  	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...
1206
  	mutex_unlock(&module_mutex);
218ce7351   Linus Torvalds   Revert "module: d...
1207
  	return sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1208
  }
49668688d   Rusty Russell   module: pass load...
1209
1210
1211
1212
  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 ...
1213
1214
  {
  	const struct kernel_symbol *ksym;
49668688d   Rusty Russell   module: pass load...
1215
  	char owner[MODULE_NAME_LEN];
9bea7f239   Rusty Russell   module: fix bne2 ...
1216
1217
  
  	if (wait_event_interruptible_timeout(module_wq,
49668688d   Rusty Russell   module: pass load...
1218
1219
  			!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
  			|| PTR_ERR(ksym) != -EBUSY,
9bea7f239   Rusty Russell   module: fix bne2 ...
1220
  					     30 * HZ) <= 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1221
1222
1223
  		pr_warn("%s: gave up waiting for init of module %s.
  ",
  			mod->name, owner);
9bea7f239   Rusty Russell   module: fix bne2 ...
1224
1225
1226
  	}
  	return ksym;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1227
1228
1229
1230
  /*
   * /sys/module/foo/sections stuff
   * J. Corbet <corbet@lwn.net>
   */
8f6d03781   Rusty Russell   module: sysfs cle...
1231
  #ifdef CONFIG_SYSFS
10b465aaf   Ben Hutchings   modules: Skip emp...
1232

8f6d03781   Rusty Russell   module: sysfs cle...
1233
  #ifdef CONFIG_KALLSYMS
10b465aaf   Ben Hutchings   modules: Skip emp...
1234
1235
1236
1237
  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...
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
  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
1251
  static ssize_t module_sect_show(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1252
  				struct module_kobject *mk, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1253
1254
1255
  {
  	struct module_sect_attr *sattr =
  		container_of(mattr, struct module_sect_attr, mattr);
9f36e2c44   Kees Cook   printk: use %pK f...
1256
1257
  	return sprintf(buf, "0x%pK
  ", (void *)sattr->address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1258
  }
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1259
1260
  static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
  {
a58730c42   Rusty Russell   module: make modu...
1261
  	unsigned int section;
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1262
1263
1264
1265
1266
  
  	for (section = 0; section < sect_attrs->nsections; section++)
  		kfree(sect_attrs->attrs[section].name);
  	kfree(sect_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1267
  static void add_sect_attrs(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1268
1269
1270
1271
1272
  {
  	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:...
1273

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1274
  	/* Count loaded sections and allocate structures */
8f6d03781   Rusty Russell   module: sysfs cle...
1275
1276
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		if (!sect_empty(&info->sechdrs[i]))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1277
1278
1279
1280
1281
  			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...
1282
1283
  	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
  	if (sect_attrs == NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1284
1285
1286
1287
1288
  		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...
1289
  	sect_attrs->nsections = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1290
1291
  	sattr = &sect_attrs->attrs[0];
  	gattr = &sect_attrs->grp.attrs[0];
8f6d03781   Rusty Russell   module: sysfs cle...
1292
1293
1294
  	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...
1295
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1296
1297
  		sattr->address = sec->sh_addr;
  		sattr->name = kstrdup(info->secstrings + sec->sh_name,
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1298
1299
1300
1301
  					GFP_KERNEL);
  		if (sattr->name == NULL)
  			goto out;
  		sect_attrs->nsections++;
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1302
  		sysfs_attr_init(&sattr->mattr.attr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1303
1304
1305
  		sattr->mattr.show = module_sect_show;
  		sattr->mattr.store = NULL;
  		sattr->mattr.attr.name = sattr->name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
  		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...
1317
  	free_sect_attrs(sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1318
1319
1320
1321
1322
1323
1324
1325
1326
  }
  
  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...
1327
  		free_sect_attrs(mod->sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1328
1329
1330
  		mod->sect_attrs = NULL;
  	}
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1331
1332
1333
1334
1335
1336
1337
1338
1339
  /*
   * /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...
1340
  static ssize_t module_notes_read(struct file *filp, struct kobject *kobj,
6d7601338   Roland McGrath   Add /sys/module/n...
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
  				 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...
1358
  		kobject_put(notes_attrs->dir);
6d7601338   Roland McGrath   Add /sys/module/n...
1359
1360
1361
  	}
  	kfree(notes_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1362
  static void add_notes_attrs(struct module *mod, const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1363
1364
1365
1366
  {
  	unsigned int notes, loaded, i;
  	struct module_notes_attrs *notes_attrs;
  	struct bin_attribute *nattr;
ea6bff368   Ingo Molnar   modules: Fix buil...
1367
1368
1369
  	/* failed to create section attributes, so can't create notes */
  	if (!mod->sect_attrs)
  		return;
6d7601338   Roland McGrath   Add /sys/module/n...
1370
1371
  	/* Count notes sections and allocate structures.  */
  	notes = 0;
8f6d03781   Rusty Russell   module: sysfs cle...
1372
1373
1374
  	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...
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
  			++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...
1388
1389
  	for (loaded = i = 0; i < info->hdr->e_shnum; ++i) {
  		if (sect_empty(&info->sechdrs[i]))
6d7601338   Roland McGrath   Add /sys/module/n...
1390
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1391
  		if (info->sechdrs[i].sh_type == SHT_NOTE) {
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1392
  			sysfs_bin_attr_init(nattr);
6d7601338   Roland McGrath   Add /sys/module/n...
1393
1394
  			nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
  			nattr->attr.mode = S_IRUGO;
8f6d03781   Rusty Russell   module: sysfs cle...
1395
1396
  			nattr->size = info->sechdrs[i].sh_size;
  			nattr->private = (void *) info->sechdrs[i].sh_addr;
6d7601338   Roland McGrath   Add /sys/module/n...
1397
1398
1399
1400
1401
  			nattr->read = module_notes_read;
  			++nattr;
  		}
  		++loaded;
  	}
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1402
  	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
6d7601338   Roland McGrath   Add /sys/module/n...
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
  	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
1423
  #else
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1424

8f6d03781   Rusty Russell   module: sysfs cle...
1425
1426
  static inline void add_sect_attrs(struct module *mod,
  				  const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1427
1428
1429
1430
1431
1432
  {
  }
  
  static inline void remove_sect_attrs(struct module *mod)
  {
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1433

8f6d03781   Rusty Russell   module: sysfs cle...
1434
1435
  static inline void add_notes_attrs(struct module *mod,
  				   const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1436
1437
1438
1439
1440
1441
  {
  }
  
  static inline void remove_notes_attrs(struct module *mod)
  {
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1442
  #endif /* CONFIG_KALLSYMS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443

80a3d1bb4   Rusty Russell   module: move sysf...
1444
1445
1446
1447
1448
  static void add_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
  	int nowarn;
75676500f   Rusty Russell   module: make lock...
1449
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1450
1451
1452
1453
  	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...
1454
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1455
1456
1457
1458
1459
1460
1461
  #endif
  }
  
  static void del_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
75676500f   Rusty Russell   module: make lock...
1462
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1463
1464
  	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...
1465
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1466
1467
  #endif
  }
6407ebb27   Rusty Russell   module: Make modu...
1468
  static int module_add_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1469
1470
  {
  	struct module_attribute *attr;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1471
  	struct module_attribute *temp_attr;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1472
1473
  	int error = 0;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1474
1475
1476
1477
1478
1479
1480
  	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: ...
1481
1482
  	for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) {
  		if (!attr->test ||
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1483
1484
  		    (attr->test && attr->test(mod))) {
  			memcpy(temp_attr, attr, sizeof(*temp_attr));
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1485
  			sysfs_attr_init(&temp_attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1486
1487
1488
  			error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr);
  			++temp_attr;
  		}
c988d2b28   Matt Domsch   [PATCH] modules: ...
1489
1490
1491
  	}
  	return error;
  }
6407ebb27   Rusty Russell   module: Make modu...
1492
  static void module_remove_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1493
1494
1495
  {
  	struct module_attribute *attr;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1496
1497
1498
1499
  	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: ...
1500
  		sysfs_remove_file(&mod->mkobj.kobj,&attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1501
1502
  		if (attr->free)
  			attr->free(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1503
  	}
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1504
  	kfree(mod->modinfo_attrs);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1505
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1506

942e44312   Li Zhong   module: Fix mod->...
1507
1508
1509
1510
1511
1512
1513
  static void mod_kobject_put(struct module *mod)
  {
  	DECLARE_COMPLETION_ONSTACK(c);
  	mod->mkobj.kobj_completion = &c;
  	kobject_put(&mod->mkobj.kobj);
  	wait_for_completion(&c);
  }
6407ebb27   Rusty Russell   module: Make modu...
1514
  static int mod_sysfs_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1515
1516
  {
  	int err;
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1517
  	struct kobject *kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1518

823bccfc4   Greg Kroah-Hartman   remove "struct su...
1519
  	if (!module_sysfs_initialized) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1520
1521
  		pr_err("%s: module sysfs not initialized
  ", mod->name);
1cc5f7142   Ed Swierk   [PATCH] load_modu...
1522
1523
1524
  		err = -EINVAL;
  		goto out;
  	}
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1525
1526
1527
  
  	kobj = kset_find_obj(module_kset, mod->name);
  	if (kobj) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1528
1529
  		pr_err("%s: module is already loaded
  ", mod->name);
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1530
1531
1532
1533
  		kobject_put(kobj);
  		err = -EINVAL;
  		goto out;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1534
  	mod->mkobj.mod = mod;
e17e0f51a   Kay Sievers   Driver core: show...
1535

ac3c8141f   Greg Kroah-Hartman   Kobject: convert ...
1536
1537
1538
1539
1540
  	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)
942e44312   Li Zhong   module: Fix mod->...
1541
  		mod_kobject_put(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1542

97c146ef0   Kay Sievers   sysfs: fix /sys/m...
1543
  	/* delay uevent until full sysfs population */
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1544
1545
1546
  out:
  	return err;
  }
6407ebb27   Rusty Russell   module: Make modu...
1547
  static int mod_sysfs_setup(struct module *mod,
8f6d03781   Rusty Russell   module: sysfs cle...
1548
  			   const struct load_info *info,
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1549
1550
1551
1552
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	int err;
80a3d1bb4   Rusty Russell   module: move sysf...
1553
1554
1555
  	err = mod_sysfs_init(mod);
  	if (err)
  		goto out;
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1556
  	mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
240936e18   Akinobu Mita   mod_sysfs_setup()...
1557
1558
  	if (!mod->holders_dir) {
  		err = -ENOMEM;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1559
  		goto out_unreg;
240936e18   Akinobu Mita   mod_sysfs_setup()...
1560
  	}
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1561

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1562
1563
  	err = module_param_sysfs_setup(mod, kparam, num_params);
  	if (err)
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1564
  		goto out_unreg_holders;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1565

c988d2b28   Matt Domsch   [PATCH] modules: ...
1566
1567
  	err = module_add_modinfo_attrs(mod);
  	if (err)
e17e0f51a   Kay Sievers   Driver core: show...
1568
  		goto out_unreg_param;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1569

80a3d1bb4   Rusty Russell   module: move sysf...
1570
  	add_usage_links(mod);
8f6d03781   Rusty Russell   module: sysfs cle...
1571
1572
  	add_sect_attrs(mod, info);
  	add_notes_attrs(mod, info);
80a3d1bb4   Rusty Russell   module: move sysf...
1573

e17e0f51a   Kay Sievers   Driver core: show...
1574
  	kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1575
  	return 0;
e17e0f51a   Kay Sievers   Driver core: show...
1576
1577
  out_unreg_param:
  	module_param_sysfs_remove(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1578
  out_unreg_holders:
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1579
  	kobject_put(mod->holders_dir);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1580
  out_unreg:
942e44312   Li Zhong   module: Fix mod->...
1581
  	mod_kobject_put(mod);
80a3d1bb4   Rusty Russell   module: move sysf...
1582
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1583
1584
  	return err;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1585
1586
1587
  
  static void mod_sysfs_fini(struct module *mod)
  {
8f6d03781   Rusty Russell   module: sysfs cle...
1588
1589
  	remove_notes_attrs(mod);
  	remove_sect_attrs(mod);
942e44312   Li Zhong   module: Fix mod->...
1590
  	mod_kobject_put(mod);
34e4e2fef   Denis V. Lunev   modules: proper c...
1591
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1592
  #else /* !CONFIG_SYSFS */
34e4e2fef   Denis V. Lunev   modules: proper c...
1593

8f6d03781   Rusty Russell   module: sysfs cle...
1594
1595
  static int mod_sysfs_setup(struct module *mod,
  			   const struct load_info *info,
6407ebb27   Rusty Russell   module: Make modu...
1596
1597
1598
1599
1600
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	return 0;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1601
1602
1603
  static void mod_sysfs_fini(struct module *mod)
  {
  }
36b0360d1   Rusty Russell   module: fix sysfs...
1604
1605
1606
  static void module_remove_modinfo_attrs(struct module *mod)
  {
  }
80a3d1bb4   Rusty Russell   module: move sysf...
1607
1608
1609
  static void del_usage_links(struct module *mod)
  {
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1610
  #endif /* CONFIG_SYSFS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1611

36b0360d1   Rusty Russell   module: fix sysfs...
1612
  static void mod_sysfs_teardown(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1613
  {
80a3d1bb4   Rusty Russell   module: move sysf...
1614
  	del_usage_links(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1615
  	module_remove_modinfo_attrs(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1616
  	module_param_sysfs_remove(mod);
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1617
1618
  	kobject_put(mod->mkobj.drivers_dir);
  	kobject_put(mod->holders_dir);
34e4e2fef   Denis V. Lunev   modules: proper c...
1619
  	mod_sysfs_fini(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
  }
  
  /*
   * 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...
1630
  	module_bug_cleanup(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1631
1632
  	return 0;
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
  #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...
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
  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...
1694
1695
1696
  }
  
  /* Iterate through all modules and set each module's text as RW */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1697
  void set_all_modules_text_rw(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1698
1699
1700
1701
1702
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1703
1704
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
  		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...
1720
  void set_all_modules_text_ro(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1721
1722
1723
1724
1725
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1726
1727
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
  		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...
1743
1744
  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...
1745
  #endif
74e08fcf7   Jonas Bonn   modules: add defa...
1746
1747
1748
1749
1750
1751
1752
1753
  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...
1754
  /* Free a module, remove from lists, etc. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1755
1756
  static void free_module(struct module *mod)
  {
7ead8b831   Li Zefan   tracing/events: A...
1757
  	trace_module_free(mod);
36b0360d1   Rusty Russell   module: fix sysfs...
1758
  	mod_sysfs_teardown(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1759

944a1fa01   Rusty Russell   module: don't unl...
1760
1761
  	/* We leave it in list to prevent duplicate loads, but make sure
  	 * that noone uses it while it's being deconstructed. */
d3051b489   Prarit Bhargava   modules, lock aro...
1762
  	mutex_lock(&module_mutex);
944a1fa01   Rusty Russell   module: don't unl...
1763
  	mod->state = MODULE_STATE_UNFORMED;
d3051b489   Prarit Bhargava   modules, lock aro...
1764
  	mutex_unlock(&module_mutex);
944a1fa01   Rusty Russell   module: don't unl...
1765

b82bab4bb   Jason Baron   dynamic debug: mo...
1766
1767
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1768
1769
1770
1771
1772
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
1773
1774
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
944a1fa01   Rusty Russell   module: don't unl...
1775
1776
1777
1778
  	/* Now we can delete it from the lists */
  	mutex_lock(&module_mutex);
  	stop_machine(__unlink_module, mod, NULL);
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1779
  	/* This may be NULL, but that's OK */
01526ed08   Jan Glauber   module: split uns...
1780
  	unset_module_init_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1781
1782
  	module_free(mod, mod->module_init);
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
1783
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
1784

fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
1785
1786
  	/* Free lock-classes: */
  	lockdep_free_key_range(mod->module_core, mod->core_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1787
  	/* Finally, free the core (containing the module structure) */
01526ed08   Jan Glauber   module: split uns...
1788
  	unset_module_core_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1789
  	module_free(mod, mod->module_core);
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
1790
1791
1792
1793
  
  #ifdef CONFIG_MPU
  	update_protections(current->mm);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1794
1795
1796
1797
1798
  }
  
  void *__symbol_get(const char *symbol)
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1799
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1800

24da1cbff   Rusty Russell   modules: remove m...
1801
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
1802
1803
1804
  	sym = find_symbol(symbol, &owner, NULL, true, true);
  	if (sym && strong_try_module_get(owner))
  		sym = NULL;
24da1cbff   Rusty Russell   modules: remove m...
1805
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1806

414fd31b2   Tim Abbott   module: Make find...
1807
  	return sym ? (void *)sym->value : NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1808
1809
  }
  EXPORT_SYMBOL_GPL(__symbol_get);
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1810
1811
  /*
   * Ensure that an exported symbol [global namespace] does not already exist
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
1812
   * in the kernel or in some other module's exported symbol table.
be593f4ce   Rusty Russell   module: verify_ex...
1813
1814
   *
   * You must hold the module_mutex.
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1815
1816
1817
   */
  static int verify_export_symbols(struct module *mod)
  {
b211104d1   Rusty Russell   module: Enhance v...
1818
  	unsigned int i;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1819
  	struct module *owner;
b211104d1   Rusty Russell   module: Enhance v...
1820
1821
1822
1823
1824
1825
1826
1827
  	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...
1828
  #ifdef CONFIG_UNUSED_SYMBOLS
b211104d1   Rusty Russell   module: Enhance v...
1829
1830
  		{ mod->unused_syms, mod->num_unused_syms },
  		{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
1831
  #endif
b211104d1   Rusty Russell   module: Enhance v...
1832
  	};
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1833

b211104d1   Rusty Russell   module: Enhance v...
1834
1835
  	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...
1836
  			if (find_symbol(s->name, &owner, NULL, true, false)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1837
  				pr_err("%s: exports duplicate symbol %s"
b211104d1   Rusty Russell   module: Enhance v...
1838
1839
1840
1841
1842
  				       " (owned by %s)
  ",
  				       mod->name, s->name, module_name(owner));
  				return -ENOEXEC;
  			}
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1843
  		}
b211104d1   Rusty Russell   module: Enhance v...
1844
1845
  	}
  	return 0;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1846
  }
9a4b9708f   Matti Linnanvuori   module: fix and e...
1847
  /* Change all symbols so that st_value encodes the pointer directly. */
49668688d   Rusty Russell   module: pass load...
1848
1849
1850
1851
  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
1852
  	unsigned long secbase;
49668688d   Rusty Russell   module: pass load...
1853
  	unsigned int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1854
  	int ret = 0;
414fd31b2   Tim Abbott   module: Make find...
1855
  	const struct kernel_symbol *ksym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1856

49668688d   Rusty Russell   module: pass load...
1857
1858
  	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
1859
1860
  		switch (sym[i].st_shndx) {
  		case SHN_COMMON:
80375980f   Joe Mario   lto: Handle LTO c...
1861
1862
1863
  			/* Ignore common symbols */
  			if (!strncmp(name, "__gnu_lto", 9))
  				break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1864
1865
  			/* We compiled with -fno-common.  These are not
  			   supposed to happen.  */
5e1241692   Jim Cromie   module: replace D...
1866
1867
  			pr_debug("Common symbol: %s
  ", name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1868
1869
1870
1871
1872
1873
1874
1875
  			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...
1876
1877
  			pr_debug("Absolute symbol: 0x%08lx
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1878
1879
1880
1881
  			       (long)sym[i].st_value);
  			break;
  
  		case SHN_UNDEF:
49668688d   Rusty Russell   module: pass load...
1882
  			ksym = resolve_symbol_wait(mod, info, name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1883
  			/* Ok if resolved.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
1884
  			if (ksym && !IS_ERR(ksym)) {
414fd31b2   Tim Abbott   module: Make find...
1885
  				sym[i].st_value = ksym->value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1886
  				break;
414fd31b2   Tim Abbott   module: Make find...
1887
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1888
  			/* Ok if weak.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
1889
  			if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1890
  				break;
bddb12b32   Andrew Morton   kernel/module.c: ...
1891
1892
1893
  			pr_warn("%s: Unknown symbol %s (err %li)
  ",
  				mod->name, name, PTR_ERR(ksym));
9bea7f239   Rusty Russell   module: fix bne2 ...
1894
  			ret = PTR_ERR(ksym) ?: -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1895
1896
1897
1898
  			break;
  
  		default:
  			/* Divert to percpu allocation if a percpu var. */
49668688d   Rusty Russell   module: pass load...
1899
  			if (sym[i].st_shndx == info->index.pcpu)
259354dea   Tejun Heo   module: encapsula...
1900
  				secbase = (unsigned long)mod_percpu(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1901
  			else
49668688d   Rusty Russell   module: pass load...
1902
  				secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1903
1904
1905
1906
1907
1908
1909
  			sym[i].st_value += secbase;
  			break;
  		}
  	}
  
  	return ret;
  }
49668688d   Rusty Russell   module: pass load...
1910
  static int apply_relocations(struct module *mod, const struct load_info *info)
22e268ebe   Rusty Russell   module: refactor ...
1911
1912
1913
1914
1915
  {
  	unsigned int i;
  	int err = 0;
  
  	/* Now do relocations. */
49668688d   Rusty Russell   module: pass load...
1916
1917
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		unsigned int infosec = info->sechdrs[i].sh_info;
22e268ebe   Rusty Russell   module: refactor ...
1918
1919
  
  		/* Not a valid relocation section? */
49668688d   Rusty Russell   module: pass load...
1920
  		if (infosec >= info->hdr->e_shnum)
22e268ebe   Rusty Russell   module: refactor ...
1921
1922
1923
  			continue;
  
  		/* Don't bother with non-allocated sections */
49668688d   Rusty Russell   module: pass load...
1924
  		if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC))
22e268ebe   Rusty Russell   module: refactor ...
1925
  			continue;
49668688d   Rusty Russell   module: pass load...
1926
1927
1928
1929
1930
1931
  		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 ...
1932
1933
1934
1935
1936
  		if (err < 0)
  			break;
  	}
  	return err;
  }
088af9a6e   Helge Deller   module: fix modul...
1937
1938
1939
1940
1941
1942
1943
  /* 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
1944
  /* Update size with this section: return offset. */
088af9a6e   Helge Deller   module: fix modul...
1945
1946
  static long get_offset(struct module *mod, unsigned int *size,
  		       Elf_Shdr *sechdr, unsigned int section)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1947
1948
  {
  	long ret;
088af9a6e   Helge Deller   module: fix modul...
1949
  	*size += arch_mod_section_prepend(mod, section);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1950
1951
1952
1953
1954
1955
1956
1957
1958
  	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...
1959
  static void layout_sections(struct module *mod, struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
  {
  	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...
1971
1972
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		info->sechdrs[i].sh_entsize = ~0UL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1973

5e1241692   Jim Cromie   module: replace D...
1974
1975
  	pr_debug("Core section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1976
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
1977
1978
1979
  		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
1980
1981
1982
1983
  
  			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...
1984
  			    || strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1985
  				continue;
088af9a6e   Helge Deller   module: fix modul...
1986
  			s->sh_entsize = get_offset(mod, &mod->core_size, s, i);
5e1241692   Jim Cromie   module: replace D...
1987
1988
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1989
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1990
1991
1992
  		switch (m) {
  		case 0: /* executable */
  			mod->core_size = debug_align(mod->core_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1993
  			mod->core_text_size = mod->core_size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1994
1995
1996
1997
1998
1999
2000
2001
2002
  			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
2003
  	}
5e1241692   Jim Cromie   module: replace D...
2004
2005
  	pr_debug("Init section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2006
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
2007
2008
2009
  		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
2010
2011
2012
2013
  
  			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...
2014
  			    || !strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2015
  				continue;
088af9a6e   Helge Deller   module: fix modul...
2016
  			s->sh_entsize = (get_offset(mod, &mod->init_size, s, i)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2017
  					 | INIT_OFFSET_MASK);
5e1241692   Jim Cromie   module: replace D...
2018
2019
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2020
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2021
2022
2023
  		switch (m) {
  		case 0: /* executable */
  			mod->init_size = debug_align(mod->init_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2024
  			mod->init_text_size = mod->init_size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2025
2026
2027
2028
2029
2030
2031
2032
2033
  			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
2034
2035
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2036
2037
2038
2039
  static void set_license(struct module *mod, const char *license)
  {
  	if (!license)
  		license = "unspecified";
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
2040
  	if (!license_is_gpl_compatible(license)) {
25ddbb18a   Andi Kleen   Make the taint fl...
2041
  		if (!test_taint(TAINT_PROPRIETARY_MODULE))
bddb12b32   Andrew Morton   kernel/module.c: ...
2042
2043
2044
  			pr_warn("%s: module license '%s' taints kernel.
  ",
  				mod->name, license);
373d4d099   Rusty Russell   taint: add explic...
2045
2046
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
  	}
  }
  
  /* 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...
2068
  static char *get_modinfo(struct load_info *info, const char *tag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2069
2070
2071
  {
  	char *p;
  	unsigned int taglen = strlen(tag);
49668688d   Rusty Russell   module: pass load...
2072
2073
  	Elf_Shdr *infosec = &info->sechdrs[info->index.info];
  	unsigned long size = infosec->sh_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2074

49668688d   Rusty Russell   module: pass load...
2075
  	for (p = (char *)infosec->sh_addr; p; p = next_string(p, &size)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2076
2077
2078
2079
2080
  		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
  			return p + taglen + 1;
  	}
  	return NULL;
  }
49668688d   Rusty Russell   module: pass load...
2081
  static void setup_modinfo(struct module *mod, struct load_info *info)
c988d2b28   Matt Domsch   [PATCH] modules: ...
2082
2083
2084
2085
2086
2087
  {
  	struct module_attribute *attr;
  	int i;
  
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
  		if (attr->setup)
49668688d   Rusty Russell   module: pass load...
2088
  			attr->setup(mod, get_modinfo(info, attr->attr.name));
c988d2b28   Matt Domsch   [PATCH] modules: ...
2089
2090
  	}
  }
c988d2b28   Matt Domsch   [PATCH] modules: ...
2091

a263f7763   Rusty Russell   module: fix memor...
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
  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
2102
  #ifdef CONFIG_KALLSYMS
15bba37d6   WANG Cong   module: fix build...
2103
2104
2105
2106
2107
2108
  
  /* 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...
2109
2110
  	return bsearch(name, start, stop - start,
  			sizeof(struct kernel_symbol), cmp_name);
15bba37d6   WANG Cong   module: fix build...
2111
  }
ca4787b77   Tim Abbott   kernel/module.c: ...
2112
2113
  static int is_exported(const char *name, unsigned long value,
  		       const struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2114
  {
ca4787b77   Tim Abbott   kernel/module.c: ...
2115
2116
2117
  	const struct kernel_symbol *ks;
  	if (!mod)
  		ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab);
3fd6805f4   Sam Ravnborg   [PATCH] Clean up ...
2118
  	else
ca4787b77   Tim Abbott   kernel/module.c: ...
2119
2120
  		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
2121
2122
2123
  }
  
  /* As per nm */
eded41c1c   Rusty Russell   module: kallsyms ...
2124
  static char elf_type(const Elf_Sym *sym, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2125
  {
eded41c1c   Rusty Russell   module: kallsyms ...
2126
  	const Elf_Shdr *sechdrs = info->sechdrs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
  	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 ...
2156
2157
  	if (strstarts(info->secstrings + sechdrs[sym->st_shndx].sh_name,
  		      ".debug")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2158
  		return 'n';
eded41c1c   Rusty Russell   module: kallsyms ...
2159
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2160
2161
  	return '?';
  }
4a4962263   Jan Beulich   module: reduce sy...
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
  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...
2182
2183
2184
2185
2186
2187
2188
  /*
   * 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...
2189
  static void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2190
  {
49668688d   Rusty Russell   module: pass load...
2191
2192
  	Elf_Shdr *symsect = info->sechdrs + info->index.sym;
  	Elf_Shdr *strsect = info->sechdrs + info->index.str;
4a4962263   Jan Beulich   module: reduce sy...
2193
  	const Elf_Sym *src;
54523ec71   Satoru Takeuchi   module: Remove a ...
2194
  	unsigned int i, nsrc, ndst, strtab_size = 0;
4a4962263   Jan Beulich   module: reduce sy...
2195
2196
2197
2198
  
  	/* 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...
2199
  					 info->index.sym) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2200
2201
  	pr_debug("\t%s
  ", info->secstrings + symsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2202

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

48fd11880   Kevin Cernekee   module: Fix perfo...
2206
  	/* Compute total space required for the core symbols' strtab. */
59ef28b1f   Rusty Russell   module: fix out-b...
2207
2208
2209
2210
  	for (ndst = i = 0; i < nsrc; i++) {
  		if (i == 0 ||
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum)) {
  			strtab_size += strlen(&info->strtab[src[i].st_name])+1;
48fd11880   Kevin Cernekee   module: Fix perfo...
2211
  			ndst++;
554bdfe5a   Jan Beulich   module: reduce st...
2212
  		}
59ef28b1f   Rusty Russell   module: fix out-b...
2213
  	}
4a4962263   Jan Beulich   module: reduce sy...
2214
2215
  
  	/* Append room for core symbols at end of core part. */
49668688d   Rusty Russell   module: pass load...
2216
  	info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1);
48fd11880   Kevin Cernekee   module: Fix perfo...
2217
2218
  	info->stroffs = mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym);
  	mod->core_size += strtab_size;
4a4962263   Jan Beulich   module: reduce sy...
2219

554bdfe5a   Jan Beulich   module: reduce st...
2220
2221
2222
  	/* 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...
2223
  					 info->index.str) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2224
2225
  	pr_debug("\t%s
  ", info->secstrings + strsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2226
  }
811d66a0e   Rusty Russell   module: group pos...
2227
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2228
  {
4a4962263   Jan Beulich   module: reduce sy...
2229
2230
2231
  	unsigned int i, ndst;
  	const Elf_Sym *src;
  	Elf_Sym *dst;
554bdfe5a   Jan Beulich   module: reduce st...
2232
  	char *s;
eded41c1c   Rusty Russell   module: kallsyms ...
2233
  	Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2234

eded41c1c   Rusty Russell   module: kallsyms ...
2235
2236
  	mod->symtab = (void *)symsec->sh_addr;
  	mod->num_symtab = symsec->sh_size / sizeof(Elf_Sym);
511ca6ae4   Rusty Russell   module: fix crash...
2237
2238
  	/* 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
2239
2240
2241
  
  	/* Set types up while we still have access to sections. */
  	for (i = 0; i < mod->num_symtab; i++)
eded41c1c   Rusty Russell   module: kallsyms ...
2242
  		mod->symtab[i].st_info = elf_type(&mod->symtab[i], info);
4a4962263   Jan Beulich   module: reduce sy...
2243

d913188c7   Rusty Russell   module: layout_an...
2244
  	mod->core_symtab = dst = mod->module_core + info->symoffs;
48fd11880   Kevin Cernekee   module: Fix perfo...
2245
  	mod->core_strtab = s = mod->module_core + info->stroffs;
4a4962263   Jan Beulich   module: reduce sy...
2246
  	src = mod->symtab;
59ef28b1f   Rusty Russell   module: fix out-b...
2247
2248
2249
2250
2251
2252
2253
2254
  	for (ndst = i = 0; i < mod->num_symtab; i++) {
  		if (i == 0 ||
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum)) {
  			dst[ndst] = src[i];
  			dst[ndst++].st_name = s - mod->core_strtab;
  			s += strlcpy(s, &mod->strtab[src[i].st_name],
  				     KSYM_NAME_LEN) + 1;
  		}
4a4962263   Jan Beulich   module: reduce sy...
2255
2256
  	}
  	mod->core_num_syms = ndst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2257
2258
  }
  #else
49668688d   Rusty Russell   module: pass load...
2259
  static inline void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2260
2261
  {
  }
3ae91c21d   Paul Mundt   module: fix up CO...
2262

abbce906d   MichaÅ‚ MirosÅ‚aw   (trivial) Fix com...
2263
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2264
2265
2266
  {
  }
  #endif /* CONFIG_KALLSYMS */
e9d376f0f   Jason Baron   dynamic debug: co...
2267
  static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num)
346e15beb   Jason Baron   driver core: basi...
2268
  {
811d66a0e   Rusty Russell   module: group pos...
2269
2270
  	if (!debug)
  		return;
e9d376f0f   Jason Baron   dynamic debug: co...
2271
2272
  #ifdef CONFIG_DYNAMIC_DEBUG
  	if (ddebug_add_module(debug, num, debug->modname))
bddb12b32   Andrew Morton   kernel/module.c: ...
2273
2274
2275
  		pr_err("dynamic debug error adding module: %s
  ",
  			debug->modname);
e9d376f0f   Jason Baron   dynamic debug: co...
2276
  #endif
5e458cc0f   Rusty Russell   module: simplify ...
2277
  }
346e15beb   Jason Baron   driver core: basi...
2278

ff49d74ad   Yehuda Sadeh   module: initializ...
2279
2280
2281
2282
2283
  static void dynamic_debug_remove(struct _ddebug *debug)
  {
  	if (debug)
  		ddebug_remove_module(debug->modname);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2284
2285
  void * __weak module_alloc(unsigned long size)
  {
82fab442f   Rusty Russell   modules: don't ha...
2286
  	return vmalloc_exec(size);
74e08fcf7   Jonas Bonn   modules: add defa...
2287
  }
3a642e99b   Rusty Russell   modules: Take a s...
2288
2289
2290
2291
2292
  static void *module_alloc_update_bounds(unsigned long size)
  {
  	void *ret = module_alloc(size);
  
  	if (ret) {
75676500f   Rusty Russell   module: make lock...
2293
  		mutex_lock(&module_mutex);
3a642e99b   Rusty Russell   modules: Take a s...
2294
2295
2296
2297
2298
  		/* 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...
2299
  		mutex_unlock(&module_mutex);
3a642e99b   Rusty Russell   modules: Take a s...
2300
2301
2302
  	}
  	return ret;
  }
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2303
  #ifdef CONFIG_DEBUG_KMEMLEAK
49668688d   Rusty Russell   module: pass load...
2304
2305
  static void kmemleak_load_module(const struct module *mod,
  				 const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2306
2307
2308
2309
  {
  	unsigned int i;
  
  	/* only scan the sections containing data */
c017b4be3   Catalin Marinas   kmemleak: Simplif...
2310
  	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2311

49668688d   Rusty Russell   module: pass load...
2312
  	for (i = 1; i < info->hdr->e_shnum; i++) {
06c9494c0   Steven Rostedt   kmemleak: Scan al...
2313
2314
2315
2316
  		/* Scan all writable sections that's not executable */
  		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) ||
  		    !(info->sechdrs[i].sh_flags & SHF_WRITE) ||
  		    (info->sechdrs[i].sh_flags & SHF_EXECINSTR))
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2317
  			continue;
49668688d   Rusty Russell   module: pass load...
2318
2319
  		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
  				   info->sechdrs[i].sh_size, GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2320
2321
2322
  	}
  }
  #else
49668688d   Rusty Russell   module: pass load...
2323
2324
  static inline void kmemleak_load_module(const struct module *mod,
  					const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2325
2326
2327
  {
  }
  #endif
106a4ee25   Rusty Russell   module: signature...
2328
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
2329
  static int module_sig_check(struct load_info *info)
106a4ee25   Rusty Russell   module: signature...
2330
2331
  {
  	int err = -ENOKEY;
34e1169d9   Kees Cook   module: add sysca...
2332
2333
  	const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1;
  	const void *mod = info->hdr;
caabe2405   David Howells   MODSIGN: Move the...
2334

34e1169d9   Kees Cook   module: add sysca...
2335
2336
  	if (info->len > markerlen &&
  	    memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) {
caabe2405   David Howells   MODSIGN: Move the...
2337
  		/* We truncate the module to discard the signature */
34e1169d9   Kees Cook   module: add sysca...
2338
2339
  		info->len -= markerlen;
  		err = mod_verify_sig(mod, &info->len);
106a4ee25   Rusty Russell   module: signature...
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
  	}
  
  	if (!err) {
  		info->sig_ok = true;
  		return 0;
  	}
  
  	/* Not having a signature is only an error if we're strict. */
  	if (err == -ENOKEY && !sig_enforce)
  		err = 0;
  
  	return err;
  }
  #else /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2354
  static int module_sig_check(struct load_info *info)
106a4ee25   Rusty Russell   module: signature...
2355
2356
2357
2358
  {
  	return 0;
  }
  #endif /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2359
2360
  /* Sanity checks against invalid binaries, wrong arch, weird elf version. */
  static int elf_header_check(struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2361
  {
34e1169d9   Kees Cook   module: add sysca...
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
  	if (info->len < sizeof(*(info->hdr)))
  		return -ENOEXEC;
  
  	if (memcmp(info->hdr->e_ident, ELFMAG, SELFMAG) != 0
  	    || info->hdr->e_type != ET_REL
  	    || !elf_check_arch(info->hdr)
  	    || info->hdr->e_shentsize != sizeof(Elf_Shdr))
  		return -ENOEXEC;
  
  	if (info->hdr->e_shoff >= info->len
  	    || (info->hdr->e_shnum * sizeof(Elf_Shdr) >
  		info->len - info->hdr->e_shoff))
  		return -ENOEXEC;
40dd2560e   Rusty Russell   module: refactor ...
2375

34e1169d9   Kees Cook   module: add sysca...
2376
2377
2378
2379
2380
2381
  	return 0;
  }
  
  /* Sets info->hdr and info->len. */
  static int copy_module_from_user(const void __user *umod, unsigned long len,
  				  struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2382
2383
  {
  	int err;
40dd2560e   Rusty Russell   module: refactor ...
2384

34e1169d9   Kees Cook   module: add sysca...
2385
2386
  	info->len = len;
  	if (info->len < sizeof(*(info->hdr)))
40dd2560e   Rusty Russell   module: refactor ...
2387
  		return -ENOEXEC;
2e72d51b4   Kees Cook   security: introdu...
2388
2389
2390
  	err = security_kernel_module_from_file(NULL);
  	if (err)
  		return err;
40dd2560e   Rusty Russell   module: refactor ...
2391
  	/* Suck in entire file: we'll want most of it. */
34e1169d9   Kees Cook   module: add sysca...
2392
2393
  	info->hdr = vmalloc(info->len);
  	if (!info->hdr)
40dd2560e   Rusty Russell   module: refactor ...
2394
  		return -ENOMEM;
34e1169d9   Kees Cook   module: add sysca...
2395
2396
2397
  	if (copy_from_user(info->hdr, umod, info->len) != 0) {
  		vfree(info->hdr);
  		return -EFAULT;
40dd2560e   Rusty Russell   module: refactor ...
2398
  	}
34e1169d9   Kees Cook   module: add sysca...
2399
2400
2401
2402
2403
2404
  	return 0;
  }
  
  /* Sets info->hdr and info->len. */
  static int copy_module_from_fd(int fd, struct load_info *info)
  {
a2e0578be   Al Viro   switch copy_modul...
2405
  	struct fd f = fdget(fd);
34e1169d9   Kees Cook   module: add sysca...
2406
2407
2408
2409
  	int err;
  	struct kstat stat;
  	loff_t pos;
  	ssize_t bytes = 0;
a2e0578be   Al Viro   switch copy_modul...
2410
  	if (!f.file)
34e1169d9   Kees Cook   module: add sysca...
2411
  		return -ENOEXEC;
a2e0578be   Al Viro   switch copy_modul...
2412
  	err = security_kernel_module_from_file(f.file);
106a4ee25   Rusty Russell   module: signature...
2413
  	if (err)
2e72d51b4   Kees Cook   security: introdu...
2414
  		goto out;
106a4ee25   Rusty Russell   module: signature...
2415

a2e0578be   Al Viro   switch copy_modul...
2416
  	err = vfs_getattr(&f.file->f_path, &stat);
106a4ee25   Rusty Russell   module: signature...
2417
  	if (err)
34e1169d9   Kees Cook   module: add sysca...
2418
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2419

34e1169d9   Kees Cook   module: add sysca...
2420
2421
2422
  	if (stat.size > INT_MAX) {
  		err = -EFBIG;
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2423
  	}
52441fa8f   Sasha Levin   module: prevent w...
2424
2425
2426
2427
2428
2429
  
  	/* Don't hand 0 to vmalloc, it whines. */
  	if (stat.size == 0) {
  		err = -EINVAL;
  		goto out;
  	}
34e1169d9   Kees Cook   module: add sysca...
2430
2431
2432
2433
  	info->hdr = vmalloc(stat.size);
  	if (!info->hdr) {
  		err = -ENOMEM;
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2434
  	}
d913188c7   Rusty Russell   module: layout_an...
2435

34e1169d9   Kees Cook   module: add sysca...
2436
2437
  	pos = 0;
  	while (pos < stat.size) {
a2e0578be   Al Viro   switch copy_modul...
2438
  		bytes = kernel_read(f.file, pos, (char *)(info->hdr) + pos,
34e1169d9   Kees Cook   module: add sysca...
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
  				    stat.size - pos);
  		if (bytes < 0) {
  			vfree(info->hdr);
  			err = bytes;
  			goto out;
  		}
  		if (bytes == 0)
  			break;
  		pos += bytes;
  	}
  	info->len = pos;
40dd2560e   Rusty Russell   module: refactor ...
2450

34e1169d9   Kees Cook   module: add sysca...
2451
  out:
a2e0578be   Al Viro   switch copy_modul...
2452
  	fdput(f);
40dd2560e   Rusty Russell   module: refactor ...
2453
2454
  	return err;
  }
d913188c7   Rusty Russell   module: layout_an...
2455
2456
  static void free_copy(struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2457
2458
  	vfree(info->hdr);
  }
2f3238aeb   Rusty Russell   module: add flags...
2459
  static int rewrite_section_headers(struct load_info *info, int flags)
8b5f61a79   Rusty Russell   module: refactor ...
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
  {
  	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) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2470
2471
  			pr_err("Module len %lu truncated
  ", info->len);
8b5f61a79   Rusty Russell   module: refactor ...
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
  			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 ...
2484
  	}
d6df72a06   Rusty Russell   module: refactor ...
2485
2486
  
  	/* Track but don't keep modinfo and version sections. */
2f3238aeb   Rusty Russell   module: add flags...
2487
2488
2489
2490
  	if (flags & MODULE_INIT_IGNORE_MODVERSIONS)
  		info->index.vers = 0; /* Pretend no __versions section! */
  	else
  		info->index.vers = find_sec(info, "__versions");
49668688d   Rusty Russell   module: pass load...
2491
  	info->index.info = find_sec(info, ".modinfo");
d6df72a06   Rusty Russell   module: refactor ...
2492
2493
  	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 ...
2494
2495
  	return 0;
  }
3264d3f9d   Linus Torvalds   module: add load_...
2496
2497
2498
2499
2500
2501
2502
2503
  /*
   * 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).
   */
2f3238aeb   Rusty Russell   module: add flags...
2504
  static struct module *setup_load_info(struct load_info *info, int flags)
3264d3f9d   Linus Torvalds   module: add load_...
2505
2506
  {
  	unsigned int i;
8b5f61a79   Rusty Russell   module: refactor ...
2507
  	int err;
3264d3f9d   Linus Torvalds   module: add load_...
2508
2509
2510
2511
  	struct module *mod;
  
  	/* Set up the convenience variables */
  	info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
8b5f61a79   Rusty Russell   module: refactor ...
2512
2513
  	info->secstrings = (void *)info->hdr
  		+ info->sechdrs[info->hdr->e_shstrndx].sh_offset;
3264d3f9d   Linus Torvalds   module: add load_...
2514

2f3238aeb   Rusty Russell   module: add flags...
2515
  	err = rewrite_section_headers(info, flags);
8b5f61a79   Rusty Russell   module: refactor ...
2516
2517
  	if (err)
  		return ERR_PTR(err);
3264d3f9d   Linus Torvalds   module: add load_...
2518

8b5f61a79   Rusty Russell   module: refactor ...
2519
2520
  	/* Find internal symbols and strings. */
  	for (i = 1; i < info->hdr->e_shnum; i++) {
3264d3f9d   Linus Torvalds   module: add load_...
2521
2522
2523
  		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 ...
2524
2525
2526
  			info->strtab = (char *)info->hdr
  				+ info->sechdrs[info->index.str].sh_offset;
  			break;
3264d3f9d   Linus Torvalds   module: add load_...
2527
  		}
3264d3f9d   Linus Torvalds   module: add load_...
2528
  	}
49668688d   Rusty Russell   module: pass load...
2529
  	info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
3264d3f9d   Linus Torvalds   module: add load_...
2530
  	if (!info->index.mod) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2531
2532
  		pr_warn("No module found in object
  ");
3264d3f9d   Linus Torvalds   module: add load_...
2533
2534
2535
2536
2537
2538
  		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) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2539
2540
  		pr_warn("%s: module has no symbols (stripped?)
  ", mod->name);
3264d3f9d   Linus Torvalds   module: add load_...
2541
2542
  		return ERR_PTR(-ENOEXEC);
  	}
49668688d   Rusty Russell   module: pass load...
2543
  	info->index.pcpu = find_pcpusec(info);
3264d3f9d   Linus Torvalds   module: add load_...
2544

3264d3f9d   Linus Torvalds   module: add load_...
2545
2546
2547
2548
2549
  	/* 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_...
2550
  }
2f3238aeb   Rusty Russell   module: add flags...
2551
  static int check_modinfo(struct module *mod, struct load_info *info, int flags)
40dd2560e   Rusty Russell   module: refactor ...
2552
  {
49668688d   Rusty Russell   module: pass load...
2553
  	const char *modmagic = get_modinfo(info, "vermagic");
40dd2560e   Rusty Russell   module: refactor ...
2554
  	int err;
2f3238aeb   Rusty Russell   module: add flags...
2555
2556
  	if (flags & MODULE_INIT_IGNORE_VERMAGIC)
  		modmagic = NULL;
40dd2560e   Rusty Russell   module: refactor ...
2557
2558
2559
2560
2561
  	/* 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...
2562
  	} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2563
2564
  		pr_err("%s: version magic '%s' should be '%s'
  ",
40dd2560e   Rusty Russell   module: refactor ...
2565
2566
2567
  		       mod->name, modmagic, vermagic);
  		return -ENOEXEC;
  	}
2449b8ba0   Ben Hutchings   module,bug: Add T...
2568
  	if (!get_modinfo(info, "intree"))
373d4d099   Rusty Russell   taint: add explic...
2569
  		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
2449b8ba0   Ben Hutchings   module,bug: Add T...
2570

49668688d   Rusty Russell   module: pass load...
2571
  	if (get_modinfo(info, "staging")) {
373d4d099   Rusty Russell   taint: add explic...
2572
  		add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
bddb12b32   Andrew Morton   kernel/module.c: ...
2573
2574
2575
  		pr_warn("%s: module is from the staging directory, the quality "
  			"is unknown, you have been warned.
  ", mod->name);
40dd2560e   Rusty Russell   module: refactor ...
2576
  	}
22e268ebe   Rusty Russell   module: refactor ...
2577
2578
  
  	/* Set up license info based on the info section */
49668688d   Rusty Russell   module: pass load...
2579
  	set_license(mod, get_modinfo(info, "license"));
22e268ebe   Rusty Russell   module: refactor ...
2580

40dd2560e   Rusty Russell   module: refactor ...
2581
2582
  	return 0;
  }
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2583
  static int find_module_sections(struct module *mod, struct load_info *info)
f91a13bb9   Linus Torvalds   module: refactor ...
2584
  {
49668688d   Rusty Russell   module: pass load...
2585
  	mod->kp = section_objs(info, "__param",
f91a13bb9   Linus Torvalds   module: refactor ...
2586
  			       sizeof(*mod->kp), &mod->num_kp);
49668688d   Rusty Russell   module: pass load...
2587
  	mod->syms = section_objs(info, "__ksymtab",
f91a13bb9   Linus Torvalds   module: refactor ...
2588
  				 sizeof(*mod->syms), &mod->num_syms);
49668688d   Rusty Russell   module: pass load...
2589
2590
  	mod->crcs = section_addr(info, "__kcrctab");
  	mod->gpl_syms = section_objs(info, "__ksymtab_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2591
2592
  				     sizeof(*mod->gpl_syms),
  				     &mod->num_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2593
2594
  	mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");
  	mod->gpl_future_syms = section_objs(info,
f91a13bb9   Linus Torvalds   module: refactor ...
2595
2596
2597
  					    "__ksymtab_gpl_future",
  					    sizeof(*mod->gpl_future_syms),
  					    &mod->num_gpl_future_syms);
49668688d   Rusty Russell   module: pass load...
2598
  	mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future");
f91a13bb9   Linus Torvalds   module: refactor ...
2599
2600
  
  #ifdef CONFIG_UNUSED_SYMBOLS
49668688d   Rusty Russell   module: pass load...
2601
  	mod->unused_syms = section_objs(info, "__ksymtab_unused",
f91a13bb9   Linus Torvalds   module: refactor ...
2602
2603
  					sizeof(*mod->unused_syms),
  					&mod->num_unused_syms);
49668688d   Rusty Russell   module: pass load...
2604
2605
  	mod->unused_crcs = section_addr(info, "__kcrctab_unused");
  	mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2606
2607
  					    sizeof(*mod->unused_gpl_syms),
  					    &mod->num_unused_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2608
  	mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
f91a13bb9   Linus Torvalds   module: refactor ...
2609
2610
  #endif
  #ifdef CONFIG_CONSTRUCTORS
49668688d   Rusty Russell   module: pass load...
2611
  	mod->ctors = section_objs(info, ".ctors",
f91a13bb9   Linus Torvalds   module: refactor ...
2612
  				  sizeof(*mod->ctors), &mod->num_ctors);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
  	if (!mod->ctors)
  		mod->ctors = section_objs(info, ".init_array",
  				sizeof(*mod->ctors), &mod->num_ctors);
  	else if (find_sec(info, ".init_array")) {
  		/*
  		 * This shouldn't happen with same compiler and binutils
  		 * building all parts of the module.
  		 */
  		printk(KERN_WARNING "%s: has both .ctors and .init_array.
  ",
  		       mod->name);
  		return -EINVAL;
  	}
f91a13bb9   Linus Torvalds   module: refactor ...
2626
2627
2628
  #endif
  
  #ifdef CONFIG_TRACEPOINTS
654986462   Mathieu Desnoyers   tracepoints: Fix ...
2629
2630
2631
  	mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
  					     sizeof(*mod->tracepoints_ptrs),
  					     &mod->num_tracepoints);
f91a13bb9   Linus Torvalds   module: refactor ...
2632
  #endif
bf5438fca   Jason Baron   jump label: Base ...
2633
2634
2635
2636
2637
  #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 ...
2638
  #ifdef CONFIG_EVENT_TRACING
49668688d   Rusty Russell   module: pass load...
2639
  	mod->trace_events = section_objs(info, "_ftrace_events",
f91a13bb9   Linus Torvalds   module: refactor ...
2640
2641
  					 sizeof(*mod->trace_events),
  					 &mod->num_trace_events);
f91a13bb9   Linus Torvalds   module: refactor ...
2642
  #endif
13b9b6e74   Steven Rostedt   tracing: Fix modu...
2643
2644
2645
2646
  #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);
13b9b6e74   Steven Rostedt   tracing: Fix modu...
2647
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
2648
2649
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  	/* sechdrs[0].sh_size is always zero */
49668688d   Rusty Russell   module: pass load...
2650
  	mod->ftrace_callsites = section_objs(info, "__mcount_loc",
f91a13bb9   Linus Torvalds   module: refactor ...
2651
2652
2653
  					     sizeof(*mod->ftrace_callsites),
  					     &mod->num_ftrace_callsites);
  #endif
22e268ebe   Rusty Russell   module: refactor ...
2654

811d66a0e   Rusty Russell   module: group pos...
2655
2656
  	mod->extable = section_objs(info, "__ex_table",
  				    sizeof(*mod->extable), &mod->num_exentries);
49668688d   Rusty Russell   module: pass load...
2657
  	if (section_addr(info, "__obsparm"))
bddb12b32   Andrew Morton   kernel/module.c: ...
2658
2659
  		pr_warn("%s: Ignoring obsolete parameters
  ", mod->name);
811d66a0e   Rusty Russell   module: group pos...
2660
2661
2662
  
  	info->debug = section_objs(info, "__verbose",
  				   sizeof(*info->debug), &info->num_debug);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2663
2664
  
  	return 0;
f91a13bb9   Linus Torvalds   module: refactor ...
2665
  }
49668688d   Rusty Russell   module: pass load...
2666
  static int move_module(struct module *mod, struct load_info *info)
65b8a9b4d   Linus Torvalds   module: refactor ...
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
  {
  	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...
2680
  		return -ENOMEM;
65b8a9b4d   Linus Torvalds   module: refactor ...
2681
2682
2683
  
  	memset(ptr, 0, mod->core_size);
  	mod->module_core = ptr;
82fab442f   Rusty Russell   modules: don't ha...
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
  	if (mod->init_size) {
  		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) {
  			module_free(mod, mod->module_core);
  			return -ENOMEM;
  		}
  		memset(ptr, 0, mod->init_size);
  		mod->module_init = ptr;
  	} else
  		mod->module_init = NULL;
65b8a9b4d   Linus Torvalds   module: refactor ...
2701
2702
  
  	/* Transfer each section which specifies SHF_ALLOC */
5e1241692   Jim Cromie   module: replace D...
2703
2704
  	pr_debug("final section addresses:
  ");
49668688d   Rusty Russell   module: pass load...
2705
  	for (i = 0; i < info->hdr->e_shnum; i++) {
65b8a9b4d   Linus Torvalds   module: refactor ...
2706
  		void *dest;
49668688d   Rusty Russell   module: pass load...
2707
  		Elf_Shdr *shdr = &info->sechdrs[i];
65b8a9b4d   Linus Torvalds   module: refactor ...
2708

49668688d   Rusty Russell   module: pass load...
2709
  		if (!(shdr->sh_flags & SHF_ALLOC))
65b8a9b4d   Linus Torvalds   module: refactor ...
2710
  			continue;
49668688d   Rusty Russell   module: pass load...
2711
  		if (shdr->sh_entsize & INIT_OFFSET_MASK)
65b8a9b4d   Linus Torvalds   module: refactor ...
2712
  			dest = mod->module_init
49668688d   Rusty Russell   module: pass load...
2713
  				+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);
65b8a9b4d   Linus Torvalds   module: refactor ...
2714
  		else
49668688d   Rusty Russell   module: pass load...
2715
  			dest = mod->module_core + shdr->sh_entsize;
65b8a9b4d   Linus Torvalds   module: refactor ...
2716

49668688d   Rusty Russell   module: pass load...
2717
2718
  		if (shdr->sh_type != SHT_NOBITS)
  			memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
65b8a9b4d   Linus Torvalds   module: refactor ...
2719
  		/* Update sh_addr to point to copy in image. */
49668688d   Rusty Russell   module: pass load...
2720
  		shdr->sh_addr = (unsigned long)dest;
5e1241692   Jim Cromie   module: replace D...
2721
2722
2723
  		pr_debug("\t0x%lx %s
  ",
  			 (long)shdr->sh_addr, info->secstrings + shdr->sh_name);
65b8a9b4d   Linus Torvalds   module: refactor ...
2724
  	}
d913188c7   Rusty Russell   module: layout_an...
2725
2726
  
  	return 0;
65b8a9b4d   Linus Torvalds   module: refactor ...
2727
  }
49668688d   Rusty Russell   module: pass load...
2728
  static int check_module_license_and_versions(struct module *mod)
22e268ebe   Rusty Russell   module: refactor ...
2729
2730
2731
2732
2733
2734
2735
  {
  	/*
  	 * 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)
373d4d099   Rusty Russell   taint: add explic...
2736
  		add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
2737
2738
2739
  
  	/* driverloader was caught wrongly pretending to be under GPL */
  	if (strcmp(mod->name, "driverloader") == 0)
373d4d099   Rusty Russell   taint: add explic...
2740
2741
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
2742

c99af3752   Matthew Garrett   module: taint ker...
2743
2744
  	/* lve claims to be GPL but upstream won't provide source */
  	if (strcmp(mod->name, "lve") == 0)
373d4d099   Rusty Russell   taint: add explic...
2745
2746
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
c99af3752   Matthew Garrett   module: taint ker...
2747

22e268ebe   Rusty Russell   module: refactor ...
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
  #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...
2786
2787
2788
2789
2790
2791
2792
  int __weak module_frob_arch_sections(Elf_Ehdr *hdr,
  				     Elf_Shdr *sechdrs,
  				     char *secstrings,
  				     struct module *mod)
  {
  	return 0;
  }
2f3238aeb   Rusty Russell   module: add flags...
2793
  static struct module *layout_and_allocate(struct load_info *info, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2794
  {
d913188c7   Rusty Russell   module: layout_an...
2795
  	/* Module within temporary copy. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2796
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
2797
  	int err;
3ae91c21d   Paul Mundt   module: fix up CO...
2798

2f3238aeb   Rusty Russell   module: add flags...
2799
  	mod = setup_load_info(info, flags);
d913188c7   Rusty Russell   module: layout_an...
2800
2801
  	if (IS_ERR(mod))
  		return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2802

2f3238aeb   Rusty Russell   module: add flags...
2803
  	err = check_modinfo(mod, info, flags);
40dd2560e   Rusty Russell   module: refactor ...
2804
2805
  	if (err)
  		return ERR_PTR(err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2806

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2807
  	/* Allow arches to frob section contents and sizes.  */
49668688d   Rusty Russell   module: pass load...
2808
2809
  	err = module_frob_arch_sections(info->hdr, info->sechdrs,
  					info->secstrings, mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2810
  	if (err < 0)
8d8022e8a   Rusty Russell   module: do percpu...
2811
  		return ERR_PTR(err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2812

8d8022e8a   Rusty Russell   module: do percpu...
2813
2814
  	/* We will do a special allocation for per-cpu sections later. */
  	info->sechdrs[info->index.pcpu].sh_flags &= ~(unsigned long)SHF_ALLOC;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2815
2816
2817
2818
  
  	/* 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...
2819
  	layout_sections(mod, info);
49668688d   Rusty Russell   module: pass load...
2820
  	layout_symtab(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2821

65b8a9b4d   Linus Torvalds   module: refactor ...
2822
  	/* Allocate and move to the final place */
49668688d   Rusty Russell   module: pass load...
2823
  	err = move_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2824
  	if (err)
8d8022e8a   Rusty Russell   module: do percpu...
2825
  		return ERR_PTR(err);
d913188c7   Rusty Russell   module: layout_an...
2826
2827
2828
  
  	/* 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...
2829
  	kmemleak_load_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2830
  	return mod;
d913188c7   Rusty Russell   module: layout_an...
2831
2832
2833
2834
2835
  }
  
  /* mod is no longer valid after this! */
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2836
2837
2838
2839
  	percpu_modfree(mod);
  	module_free(mod, mod->module_init);
  	module_free(mod, mod->module_core);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2840
2841
2842
2843
2844
2845
  int __weak module_finalize(const Elf_Ehdr *hdr,
  			   const Elf_Shdr *sechdrs,
  			   struct module *me)
  {
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
2846
2847
  static int post_relocation(struct module *mod, const struct load_info *info)
  {
51f3d0f47   Rusty Russell   module: cleanup c...
2848
  	/* Sort exception table now relocations are done. */
811d66a0e   Rusty Russell   module: group pos...
2849
2850
2851
2852
2853
  	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...
2854
  	/* Setup kallsyms-specific fields. */
811d66a0e   Rusty Russell   module: group pos...
2855
2856
2857
2858
2859
  	add_kallsyms(mod, info);
  
  	/* Arch-specific module finalizing. */
  	return module_finalize(info->hdr, info->sechdrs, mod);
  }
9bb9c3be5   Rusty Russell   module: wait when...
2860
2861
2862
2863
2864
2865
2866
  /* Is this module of this name done loading?  No locks held. */
  static bool finished_loading(const char *name)
  {
  	struct module *mod;
  	bool ret;
  
  	mutex_lock(&module_mutex);
4f6de4d51   Mathias Krause   module: don't mod...
2867
  	mod = find_module_all(name, strlen(name), true);
0d21b0e34   Rusty Russell   module: add new s...
2868
2869
  	ret = !mod || mod->state == MODULE_STATE_LIVE
  		|| mod->state == MODULE_STATE_GOING;
9bb9c3be5   Rusty Russell   module: wait when...
2870
2871
2872
2873
  	mutex_unlock(&module_mutex);
  
  	return ret;
  }
34e1169d9   Kees Cook   module: add sysca...
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
  /* 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
  }
  
  /* This is where the real work happens */
  static int do_init_module(struct module *mod)
  {
  	int ret = 0;
774a1221e   Tejun Heo   module, async: as...
2889
2890
2891
2892
2893
  	/*
  	 * We want to find out whether @mod uses async during init.  Clear
  	 * PF_USED_ASYNC.  async_schedule*() will set it.
  	 */
  	current->flags &= ~PF_USED_ASYNC;
34e1169d9   Kees Cook   module: add sysca...
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
  	do_mod_ctors(mod);
  	/* Start the module */
  	if (mod->init != NULL)
  		ret = do_one_initcall(mod->init);
  	if (ret < 0) {
  		/* Init routine failed: abort.  Try to protect us from
                     buggy refcounters. */
  		mod->state = MODULE_STATE_GOING;
  		synchronize_sched();
  		module_put(mod);
  		blocking_notifier_call_chain(&module_notify_list,
  					     MODULE_STATE_GOING, mod);
  		free_module(mod);
  		wake_up_all(&module_wq);
  		return ret;
  	}
  	if (ret > 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2911
2912
2913
2914
2915
2916
  		pr_warn("%s: '%s'->init suspiciously returned %d, it should "
  			"follow 0/-E convention
  "
  			"%s: loading module anyway...
  ",
  			__func__, mod->name, ret, __func__);
34e1169d9   Kees Cook   module: add sysca...
2917
2918
2919
2920
2921
2922
2923
  		dump_stack();
  	}
  
  	/* Now it's a first class citizen! */
  	mod->state = MODULE_STATE_LIVE;
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_LIVE, mod);
774a1221e   Tejun Heo   module, async: as...
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
  	/*
  	 * We need to finish all async code before the module init sequence
  	 * is done.  This has potential to deadlock.  For example, a newly
  	 * detected block device can trigger request_module() of the
  	 * default iosched from async probing task.  Once userland helper
  	 * reaches here, async_synchronize_full() will wait on the async
  	 * task waiting on request_module() and deadlock.
  	 *
  	 * This deadlock is avoided by perfomring async_synchronize_full()
  	 * iff module init queued any async jobs.  This isn't a full
  	 * solution as it will deadlock the same if module loading from
  	 * async jobs nests more than once; however, due to the various
  	 * constraints, this hack seems to be the best option for now.
  	 * Please refer to the following thread for details.
  	 *
  	 * http://thread.gmane.org/gmane.linux.kernel/1420814
  	 */
  	if (current->flags & PF_USED_ASYNC)
  		async_synchronize_full();
34e1169d9   Kees Cook   module: add sysca...
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
  
  	mutex_lock(&module_mutex);
  	/* Drop initial reference. */
  	module_put(mod);
  	trim_init_extable(mod);
  #ifdef CONFIG_KALLSYMS
  	mod->num_symtab = mod->core_num_syms;
  	mod->symtab = mod->core_symtab;
  	mod->strtab = mod->core_strtab;
  #endif
  	unset_module_init_ro_nx(mod);
  	module_free(mod, mod->module_init);
  	mod->module_init = NULL;
  	mod->init_size = 0;
  	mod->init_ro_size = 0;
  	mod->init_text_size = 0;
  	mutex_unlock(&module_mutex);
  	wake_up_all(&module_wq);
  
  	return 0;
  }
  
  static int may_init_module(void)
  {
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
  		return -EPERM;
  
  	return 0;
  }
a3535c7e4   Rusty Russell   module: clean up ...
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
  /*
   * We try to place it in the list now to make sure it's unique before
   * we dedicate too many resources.  In particular, temporary percpu
   * memory exhaustion.
   */
  static int add_unformed_module(struct module *mod)
  {
  	int err;
  	struct module *old;
  
  	mod->state = MODULE_STATE_UNFORMED;
  
  again:
  	mutex_lock(&module_mutex);
4f6de4d51   Mathias Krause   module: don't mod...
2986
2987
  	old = find_module_all(mod->name, strlen(mod->name), true);
  	if (old != NULL) {
a3535c7e4   Rusty Russell   module: clean up ...
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
  		if (old->state == MODULE_STATE_COMING
  		    || old->state == MODULE_STATE_UNFORMED) {
  			/* Wait in case it fails to load. */
  			mutex_unlock(&module_mutex);
  			err = wait_event_interruptible(module_wq,
  					       finished_loading(mod->name));
  			if (err)
  				goto out_unlocked;
  			goto again;
  		}
  		err = -EEXIST;
  		goto out;
  	}
  	list_add_rcu(&mod->list, &modules);
  	err = 0;
  
  out:
  	mutex_unlock(&module_mutex);
  out_unlocked:
  	return err;
  }
  
  static int complete_formation(struct module *mod, struct load_info *info)
  {
  	int err;
  
  	mutex_lock(&module_mutex);
  
  	/* Find duplicate symbols (must be called under lock). */
  	err = verify_export_symbols(mod);
  	if (err < 0)
  		goto out;
  
  	/* This relies on module_mutex for list integrity. */
  	module_bug_finalize(info->hdr, info->sechdrs, mod);
4982223e5   Rusty Russell   module: set nx be...
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
  	/* 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);
a3535c7e4   Rusty Russell   module: clean up ...
3034
3035
3036
  	/* Mark state as coming so strong_try_module_get() ignores us,
  	 * but kallsyms etc. can see us. */
  	mod->state = MODULE_STATE_COMING;
4982223e5   Rusty Russell   module: set nx be...
3037
3038
3039
3040
3041
  	mutex_unlock(&module_mutex);
  
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_COMING, mod);
  	return 0;
a3535c7e4   Rusty Russell   module: clean up ...
3042
3043
3044
3045
3046
  
  out:
  	mutex_unlock(&module_mutex);
  	return err;
  }
54041d8a7   Rusty Russell   modules: don't fa...
3047
3048
3049
3050
  static int unknown_module_param_cb(char *param, char *val, const char *modname)
  {
  	/* Check for magic 'dyndbg' arg */ 
  	int ret = ddebug_dyndbg_module_param_cb(param, val, modname);
bddb12b32   Andrew Morton   kernel/module.c: ...
3051
3052
3053
  	if (ret != 0)
  		pr_warn("%s: unknown parameter '%s' ignored
  ", modname, param);
54041d8a7   Rusty Russell   modules: don't fa...
3054
3055
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
3056
3057
  /* Allocate and load the module: note that size of section 0 is always
     zero, and we rely on this for optional sections. */
2f3238aeb   Rusty Russell   module: add flags...
3058
3059
  static int load_module(struct load_info *info, const char __user *uargs,
  		       int flags)
d913188c7   Rusty Russell   module: layout_an...
3060
  {
a3535c7e4   Rusty Russell   module: clean up ...
3061
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
3062
  	long err;
51e158c12   Rusty Russell   param: hand argum...
3063
  	char *after_dashes;
d913188c7   Rusty Russell   module: layout_an...
3064

34e1169d9   Kees Cook   module: add sysca...
3065
3066
3067
  	err = module_sig_check(info);
  	if (err)
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3068

34e1169d9   Kees Cook   module: add sysca...
3069
  	err = elf_header_check(info);
d913188c7   Rusty Russell   module: layout_an...
3070
  	if (err)
34e1169d9   Kees Cook   module: add sysca...
3071
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3072
3073
  
  	/* Figure out module layout, and allocate all the memory. */
2f3238aeb   Rusty Russell   module: add flags...
3074
  	mod = layout_and_allocate(info, flags);
65b8a9b4d   Linus Torvalds   module: refactor ...
3075
3076
  	if (IS_ERR(mod)) {
  		err = PTR_ERR(mod);
d913188c7   Rusty Russell   module: layout_an...
3077
  		goto free_copy;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3078
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3079

a3535c7e4   Rusty Russell   module: clean up ...
3080
3081
3082
  	/* Reserve our place in the list. */
  	err = add_unformed_module(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3083
  		goto free_module;
1fb9341ac   Rusty Russell   module: put modul...
3084

106a4ee25   Rusty Russell   module: signature...
3085
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
3086
  	mod->sig_ok = info->sig_ok;
64748a2c9   Rusty Russell   module: printk me...
3087
  	if (!mod->sig_ok) {
bddb12b32   Andrew Morton   kernel/module.c: ...
3088
3089
3090
3091
  		pr_notice_once("%s: module verification failed: signature "
  			       "and/or  required key missing - tainting "
  			       "kernel
  ", mod->name);
66cc69e34   Mathieu Desnoyers   Fix: module signa...
3092
  		add_taint_module(mod, TAINT_UNSIGNED_MODULE, LOCKDEP_STILL_OK);
64748a2c9   Rusty Russell   module: printk me...
3093
  	}
106a4ee25   Rusty Russell   module: signature...
3094
  #endif
8d8022e8a   Rusty Russell   module: do percpu...
3095
  	/* To avoid stressing percpu allocator, do this once we're unique. */
9eb76d779   Rusty Russell   module: cleanup c...
3096
  	err = percpu_modalloc(mod, info);
8d8022e8a   Rusty Russell   module: do percpu...
3097
3098
  	if (err)
  		goto unlink_mod;
49668688d   Rusty Russell   module: pass load...
3099
  	/* Now module is in final location, initialize linked lists, etc. */
9f85a4bbb   Rusty Russell   module: refactor ...
3100
3101
  	err = module_unload_init(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3102
  		goto unlink_mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3103

22e268ebe   Rusty Russell   module: refactor ...
3104
3105
  	/* Now we've got everything in the final locations, we can
  	 * find optional sections. */
eb3057df7   Frantisek Hrbata   kernel: add suppo...
3106
3107
3108
  	err = find_module_sections(mod, info);
  	if (err)
  		goto free_unload;
9b37ccfc6   Pavel Roskin   module: allow ndi...
3109

49668688d   Rusty Russell   module: pass load...
3110
  	err = check_module_license_and_versions(mod);
22e268ebe   Rusty Russell   module: refactor ...
3111
3112
  	if (err)
  		goto free_unload;
9841d61d7   Dave Jones   [PATCH] Add taint...
3113

c988d2b28   Matt Domsch   [PATCH] modules: ...
3114
  	/* Set up MODINFO_ATTR fields */
34e1169d9   Kees Cook   module: add sysca...
3115
  	setup_modinfo(mod, info);
c988d2b28   Matt Domsch   [PATCH] modules: ...
3116

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3117
  	/* Fix up syms, so that st_value is a pointer to location. */
34e1169d9   Kees Cook   module: add sysca...
3118
  	err = simplify_symbols(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3119
  	if (err < 0)
d913188c7   Rusty Russell   module: layout_an...
3120
  		goto free_modinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3121

34e1169d9   Kees Cook   module: add sysca...
3122
  	err = apply_relocations(mod, info);
22e268ebe   Rusty Russell   module: refactor ...
3123
  	if (err < 0)
d913188c7   Rusty Russell   module: layout_an...
3124
  		goto free_modinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3125

34e1169d9   Kees Cook   module: add sysca...
3126
  	err = post_relocation(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3127
  	if (err < 0)
d913188c7   Rusty Russell   module: layout_an...
3128
  		goto free_modinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3129

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

6526c534b   Rusty Russell   module: move modu...
3132
3133
3134
3135
3136
3137
  	/* 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...
3138

34e1169d9   Kees Cook   module: add sysca...
3139
  	dynamic_debug_setup(info->debug, info->num_debug);
ff49d74ad   Yehuda Sadeh   module: initializ...
3140

a949ae560   Steven Rostedt (Red Hat)   ftrace/module: Ha...
3141
3142
  	/* Ftrace init must be called in the MODULE_STATE_UNFORMED state */
  	ftrace_module_init(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3143
3144
3145
  	/* Finally it's fully formed, ready to start executing. */
  	err = complete_formation(mod, info);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3146
  		goto ddebug_cleanup;
be593f4ce   Rusty Russell   module: verify_ex...
3147

51f3d0f47   Rusty Russell   module: cleanup c...
3148
  	/* Module is ready to execute: parsing args may do that. */
51e158c12   Rusty Russell   param: hand argum...
3149
3150
3151
3152
  	after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
  				  -32768, 32767, unknown_module_param_cb);
  	if (IS_ERR(after_dashes)) {
  		err = PTR_ERR(after_dashes);
1fb9341ac   Rusty Russell   module: put modul...
3153
  		goto bug_cleanup;
51e158c12   Rusty Russell   param: hand argum...
3154
3155
3156
3157
3158
  	} else if (after_dashes) {
  		pr_warn("%s: parameters '%s' after `--' ignored
  ",
  		       mod->name, after_dashes);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3159

51f3d0f47   Rusty Russell   module: cleanup c...
3160
  	/* Link in to syfs. */
34e1169d9   Kees Cook   module: add sysca...
3161
  	err = mod_sysfs_setup(mod, info, mod->kp, mod->num_kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3162
  	if (err < 0)
1fb9341ac   Rusty Russell   module: put modul...
3163
  		goto bug_cleanup;
80a3d1bb4   Rusty Russell   module: move sysf...
3164

48fd11880   Kevin Cernekee   module: Fix perfo...
3165
  	/* Get rid of temporary copy. */
34e1169d9   Kees Cook   module: add sysca...
3166
  	free_copy(info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3167
3168
  
  	/* Done! */
51f3d0f47   Rusty Russell   module: cleanup c...
3169
  	trace_module_load(mod);
34e1169d9   Kees Cook   module: add sysca...
3170
3171
  
  	return do_init_module(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3172

1fb9341ac   Rusty Russell   module: put modul...
3173
3174
   bug_cleanup:
  	/* module_bug_cleanup needs module_mutex protection */
75676500f   Rusty Russell   module: make lock...
3175
  	mutex_lock(&module_mutex);
5336377d6   Linus Torvalds   modules: Fix modu...
3176
  	module_bug_cleanup(mod);
ee61abb32   Linus Torvalds   module: fix missi...
3177
  	mutex_unlock(&module_mutex);
ff7e0055b   Andy Lutomirski   module: Clean up ...
3178
3179
3180
3181
  
  	/* we can't deallocate the module until we clear memory protection */
  	unset_module_init_ro_nx(mod);
  	unset_module_core_ro_nx(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3182
   ddebug_cleanup:
1fb9341ac   Rusty Russell   module: put modul...
3183
  	dynamic_debug_remove(info->debug);
e91defa26   Rusty Russell   module: don't use...
3184
  	synchronize_sched();
6526c534b   Rusty Russell   module: move modu...
3185
3186
  	kfree(mod->args);
   free_arch_cleanup:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3187
  	module_arch_cleanup(mod);
d913188c7   Rusty Russell   module: layout_an...
3188
   free_modinfo:
a263f7763   Rusty Russell   module: fix memor...
3189
  	free_modinfo(mod);
22e268ebe   Rusty Russell   module: refactor ...
3190
   free_unload:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3191
  	module_unload_free(mod);
1fb9341ac   Rusty Russell   module: put modul...
3192
3193
3194
3195
3196
3197
   unlink_mod:
  	mutex_lock(&module_mutex);
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
  	wake_up_all(&module_wq);
  	mutex_unlock(&module_mutex);
d913188c7   Rusty Russell   module: layout_an...
3198
   free_module:
34e1169d9   Kees Cook   module: add sysca...
3199
  	module_deallocate(mod, info);
d913188c7   Rusty Russell   module: layout_an...
3200
   free_copy:
34e1169d9   Kees Cook   module: add sysca...
3201
3202
  	free_copy(info);
  	return err;
b99b87f70   Peter Oberparleiter   kernel: construct...
3203
  }
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
3204
3205
  SYSCALL_DEFINE3(init_module, void __user *, umod,
  		unsigned long, len, const char __user *, uargs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3206
  {
34e1169d9   Kees Cook   module: add sysca...
3207
3208
  	int err;
  	struct load_info info = { };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3209

34e1169d9   Kees Cook   module: add sysca...
3210
3211
3212
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3213

34e1169d9   Kees Cook   module: add sysca...
3214
3215
3216
  	pr_debug("init_module: umod=%p, len=%lu, uargs=%p
  ",
  	       umod, len, uargs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3217

34e1169d9   Kees Cook   module: add sysca...
3218
3219
3220
  	err = copy_module_from_user(umod, len, &info);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3221

2f3238aeb   Rusty Russell   module: add flags...
3222
  	return load_module(&info, uargs, 0);
34e1169d9   Kees Cook   module: add sysca...
3223
  }
94462ad3b   Steven Rostedt   module: Move RO/N...
3224

2f3238aeb   Rusty Russell   module: add flags...
3225
  SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)
34e1169d9   Kees Cook   module: add sysca...
3226
3227
3228
  {
  	int err;
  	struct load_info info = { };
94462ad3b   Steven Rostedt   module: Move RO/N...
3229

34e1169d9   Kees Cook   module: add sysca...
3230
3231
3232
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3233

2f3238aeb   Rusty Russell   module: add flags...
3234
3235
  	pr_debug("finit_module: fd=%d, uargs=%p, flags=%i
  ", fd, uargs, flags);
6c5db22d2   Rusty Russell   modules: fix modu...
3236

2f3238aeb   Rusty Russell   module: add flags...
3237
3238
3239
  	if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
  		      |MODULE_INIT_IGNORE_VERMAGIC))
  		return -EINVAL;
d6de2c80e   Linus Torvalds   async: Fix module...
3240

34e1169d9   Kees Cook   module: add sysca...
3241
3242
3243
  	err = copy_module_from_fd(fd, &info);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3244

2f3238aeb   Rusty Russell   module: add flags...
3245
  	return load_module(&info, uargs, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
  }
  
  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)
  {
2e3a10a15   Russell King   ARM: avoid ARM bi...
3260
3261
  	if (str[0] == '.' && str[1] == 'L')
  		return true;
6c34f1f54   Kyle McMartin   aarch64: filter $...
3262
  	return str[0] == '$' && strchr("axtd", str[1])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
  	       && (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...
3275
  	if (within_module_init(addr, mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3276
  		nextval = (unsigned long)mod->module_init+mod->init_text_size;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3277
  	else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3278
  		nextval = (unsigned long)mod->module_core+mod->core_text_size;
25985edce   Lucas De Marchi   Fix common misspe...
3279
  	/* Scan for closest preceding symbol, and next symbol. (ELF
22a8bdeb5   Daniel Walker   whitespace fixes:...
3280
  	   starts real symbols at 1). */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
  	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...
3301
3302
3303
3304
  	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
3305
3306
  	return mod->strtab + mod->symtab[best].st_name;
  }
6dd06c9fb   Rusty Russell   module: make modu...
3307
3308
  /* 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...
3309
  const char *module_address_lookup(unsigned long addr,
6dd06c9fb   Rusty Russell   module: make modu...
3310
3311
3312
3313
  			    unsigned long *size,
  			    unsigned long *offset,
  			    char **modname,
  			    char *namebuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3314
3315
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3316
  	const char *ret = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3317

cb2a52052   Rusty Russell   modules: de-mutex...
3318
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3319
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3320
3321
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3322
  		if (within_module(addr, mod)) {
ffc508919   Franck Bui-Huu   [PATCH] Create ka...
3323
3324
  			if (modname)
  				*modname = mod->name;
cb2a52052   Rusty Russell   modules: de-mutex...
3325
3326
  			ret = get_ksymbol(mod, addr, size, offset);
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3327
3328
  		}
  	}
6dd06c9fb   Rusty Russell   module: make modu...
3329
3330
3331
3332
3333
  	/* 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...
3334
  	preempt_enable();
92dfc9dc7   Andrew Morton   fix "modules: mak...
3335
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3336
  }
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3337
3338
3339
  int lookup_module_symbol_name(unsigned long addr, char *symname)
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3340
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3341
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3342
3343
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3344
  		if (within_module(addr, mod)) {
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3345
3346
3347
3348
3349
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, NULL, NULL);
  			if (!sym)
  				goto out;
9281acea6   Tejun Heo   kallsyms: make KS...
3350
  			strlcpy(symname, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3351
  			preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3352
3353
3354
3355
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3356
  	preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3357
3358
  	return -ERANGE;
  }
a5c43dae7   Alexey Dobriyan   Fix race between ...
3359
3360
3361
3362
  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...
3363
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3364
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3365
3366
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3367
  		if (within_module(addr, mod)) {
a5c43dae7   Alexey Dobriyan   Fix race between ...
3368
3369
3370
3371
3372
3373
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, size, offset);
  			if (!sym)
  				goto out;
  			if (modname)
9281acea6   Tejun Heo   kallsyms: make KS...
3374
  				strlcpy(modname, mod->name, MODULE_NAME_LEN);
a5c43dae7   Alexey Dobriyan   Fix race between ...
3375
  			if (name)
9281acea6   Tejun Heo   kallsyms: make KS...
3376
  				strlcpy(name, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3377
  			preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3378
3379
3380
3381
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3382
  	preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3383
3384
  	return -ERANGE;
  }
ea07890a6   Alexey Dobriyan   Fix race between ...
3385
3386
  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
3387
3388
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3389
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3390
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3391
3392
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3393
3394
3395
  		if (symnum < mod->num_symtab) {
  			*value = mod->symtab[symnum].st_value;
  			*type = mod->symtab[symnum].st_info;
098c5eea0   Andreas Gruenbacher   [PATCH] null-term...
3396
  			strlcpy(name, mod->strtab + mod->symtab[symnum].st_name,
9281acea6   Tejun Heo   kallsyms: make KS...
3397
3398
  				KSYM_NAME_LEN);
  			strlcpy(module_name, mod->name, MODULE_NAME_LEN);
ca4787b77   Tim Abbott   kernel/module.c: ...
3399
  			*exported = is_exported(name, *value, mod);
cb2a52052   Rusty Russell   modules: de-mutex...
3400
  			preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3401
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3402
3403
3404
  		}
  		symnum -= mod->num_symtab;
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3405
  	preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3406
  	return -ERANGE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3407
3408
3409
3410
3411
3412
3413
  }
  
  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...
3414
3415
  		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
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
  			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...
3428
  	preempt_disable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3429
  	if ((colon = strchr(name, ':')) != NULL) {
4f6de4d51   Mathias Krause   module: don't mod...
3430
  		if ((mod = find_module_all(name, colon - name, false)) != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3431
  			ret = mod_find_symname(mod, colon+1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3432
  	} else {
0d21b0e34   Rusty Russell   module: add new s...
3433
3434
3435
  		list_for_each_entry_rcu(mod, &modules, list) {
  			if (mod->state == MODULE_STATE_UNFORMED)
  				continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3436
3437
  			if ((ret = mod_find_symname(mod, name)) != 0)
  				break;
0d21b0e34   Rusty Russell   module: add new s...
3438
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3439
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3440
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3441
3442
  	return ret;
  }
75a66614d   Anders Kaseorg   Ksplice: Add func...
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
  
  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) {
0d21b0e34   Rusty Russell   module: add new s...
3453
3454
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
75a66614d   Anders Kaseorg   Ksplice: Add func...
3455
3456
3457
3458
3459
3460
3461
3462
3463
  		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
3464
  #endif /* CONFIG_KALLSYMS */
21aa9280b   Arjan van de Ven   debug: show being...
3465
  static char *module_flags(struct module *mod, char *buf)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3466
3467
  {
  	int bx = 0;
0d21b0e34   Rusty Russell   module: add new s...
3468
  	BUG_ON(mod->state == MODULE_STATE_UNFORMED);
21aa9280b   Arjan van de Ven   debug: show being...
3469
3470
3471
  	if (mod->taints ||
  	    mod->state == MODULE_STATE_GOING ||
  	    mod->state == MODULE_STATE_COMING) {
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3472
  		buf[bx++] = '(';
cca3e7073   Kay Sievers   modules: sysfs - ...
3473
  		bx += module_flags_taint(mod, buf + bx);
21aa9280b   Arjan van de Ven   debug: show being...
3474
3475
3476
3477
3478
3479
  		/* 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...
3480
3481
3482
3483
3484
3485
  		buf[bx++] = ')';
  	}
  	buf[bx] = '\0';
  
  	return buf;
  }
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
  #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
3503
3504
3505
  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...
3506
  	char buf[8];
0d21b0e34   Rusty Russell   module: add new s...
3507
3508
3509
  	/* We always ignore unformed modules. */
  	if (mod->state == MODULE_STATE_UNFORMED)
  		return 0;
2f0f2a334   Denys Vlasenko   module: turn long...
3510
  	seq_printf(m, "%s %u",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3511
3512
3513
3514
3515
3516
3517
3518
3519
  		   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...
3520
  	seq_printf(m, " 0x%pK", mod->module_core);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3521

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
  	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/...
3536
  static const struct seq_operations modules_op = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3537
3538
3539
3540
3541
  	.start	= m_start,
  	.next	= m_next,
  	.stop	= m_stop,
  	.show	= m_show
  };
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
  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
3561
3562
3563
  /* 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
3564
3565
  	const struct exception_table_entry *e = NULL;
  	struct module *mod;
24da1cbff   Rusty Russell   modules: remove m...
3566
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3567
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3568
3569
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3570
3571
  		if (mod->num_exentries == 0)
  			continue;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3572

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3573
3574
3575
3576
3577
3578
  		e = search_extable(mod->extable,
  				   mod->extable + mod->num_exentries - 1,
  				   addr);
  		if (e)
  			break;
  	}
24da1cbff   Rusty Russell   modules: remove m...
3579
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3580
3581
  
  	/* Now, if we found one, we are running inside it now, hence
22a8bdeb5   Daniel Walker   whitespace fixes:...
3582
  	   we cannot unload the module, hence no refcnt needed. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3583
3584
  	return e;
  }
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3585
  /*
e610499e2   Rusty Russell   module: __module_...
3586
3587
3588
3589
3590
   * 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: ...
3591
   */
e610499e2   Rusty Russell   module: __module_...
3592
  bool is_module_address(unsigned long addr)
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3593
  {
e610499e2   Rusty Russell   module: __module_...
3594
  	bool ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3595

24da1cbff   Rusty Russell   modules: remove m...
3596
  	preempt_disable();
e610499e2   Rusty Russell   module: __module_...
3597
  	ret = __module_address(addr) != NULL;
24da1cbff   Rusty Russell   modules: remove m...
3598
  	preempt_enable();
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3599

e610499e2   Rusty Russell   module: __module_...
3600
  	return ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3601
  }
e610499e2   Rusty Russell   module: __module_...
3602
3603
3604
3605
3606
3607
3608
  /*
   * __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...
3609
  struct module *__module_address(unsigned long addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3610
3611
  {
  	struct module *mod;
3a642e99b   Rusty Russell   modules: Take a s...
3612
3613
  	if (addr < module_addr_min || addr > module_addr_max)
  		return NULL;
0d21b0e34   Rusty Russell   module: add new s...
3614
3615
3616
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3617
  		if (within_module(addr, mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3618
  			return mod;
0d21b0e34   Rusty Russell   module: add new s...
3619
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3620
3621
  	return NULL;
  }
c6b378019   Tim Abbott   module: Export sy...
3622
  EXPORT_SYMBOL_GPL(__module_address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3623

e610499e2   Rusty Russell   module: __module_...
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
  /*
   * 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...
3661
  EXPORT_SYMBOL_GPL(__module_text_address);
e610499e2   Rusty Russell   module: __module_...
3662

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3663
3664
3665
3666
  /* Don't grab lock, we're oopsing. */
  void print_modules(void)
  {
  	struct module *mod;
2bc2d61a9   Randy Dunlap   [PATCH] list modu...
3667
  	char buf[8];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3668

b231125af   Linus Torvalds   printk: add KERN_...
3669
  	printk(KERN_DEFAULT "Modules linked in:");
d72b37513   Andi Kleen   Remove stop_machi...
3670
3671
  	/* Most callers should already have preempt disabled, but make sure */
  	preempt_disable();
0d21b0e34   Rusty Russell   module: add new s...
3672
3673
3674
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
27bba4d6b   Jiri Slaby   module: use pr_cont
3675
  		pr_cont(" %s%s", mod->name, module_flags(mod, buf));
0d21b0e34   Rusty Russell   module: add new s...
3676
  	}
d72b37513   Andi Kleen   Remove stop_machi...
3677
  	preempt_enable();
e14af7eeb   Arjan van de Ven   debug: track and ...
3678
  	if (last_unloaded_module[0])
27bba4d6b   Jiri Slaby   module: use pr_cont
3679
3680
3681
  		pr_cont(" [last unloaded: %s]", last_unloaded_module);
  	pr_cont("
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3682
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3683
  #ifdef CONFIG_MODVERSIONS
8c8ef42ae   Rusty Russell   module: include o...
3684
3685
3686
3687
3688
3689
  /* 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 ...
3690
  		   struct tracepoint * const *tp)
8c8ef42ae   Rusty Russell   module: include o...
3691
3692
3693
  {
  }
  EXPORT_SYMBOL(module_layout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3694
  #endif