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>
1d0059f3a   David Howells   MODSIGN: Add FIPS...
63
  #include <linux/fips.h>
2f3238aeb   Rusty Russell   module: add flags...
64
  #include <uapi/linux/module.h>
106a4ee25   Rusty Russell   module: signature...
65
  #include "module-internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66

7ead8b831   Li Zefan   tracing/events: A...
67
68
  #define CREATE_TRACE_POINTS
  #include <trace/events/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
  #ifndef ARCH_SHF_SMALL
  #define ARCH_SHF_SMALL 0
  #endif
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  /*
   * 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
91
92
  /* 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...
93
94
95
96
97
  /*
   * 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...
98
   * (delete uses stop_machine/add uses RCU list operations). */
c6b378019   Tim Abbott   module: Export sy...
99
100
  DEFINE_MUTEX(module_mutex);
  EXPORT_SYMBOL_GPL(module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
  static LIST_HEAD(modules);
67fc4e0cb   Jason Wessel   kdb: core for kgd...
102
103
104
  #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...
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
133
  #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 = {
0ce814096   Steven Rostedt   module: Add NOARG...
134
  	.flags = KERNEL_PARAM_FL_NOARG,
106a4ee25   Rusty Russell   module: signature...
135
136
137
138
139
140
141
142
  	.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
143

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

d53799be6   Steven Rostedt   module: move __mo...
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
923
  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 ...
924
925
926
  void module_put(struct module *module)
  {
  	if (module) {
e1783a240   Christoph Lameter   module: Use this_...
927
  		preempt_disable();
5fbfb18d7   Nick Piggin   Fix up possibly r...
928
929
  		smp_wmb(); /* see comment in module_refcount */
  		__this_cpu_inc(module->refptr->decs);
e1783a240   Christoph Lameter   module: Use this_...
930

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

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

88bfa3247   Kay Sievers   module: add /sys/...
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
  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 - ...
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
1046
  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/...
1047

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

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

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

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

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

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

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

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

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

942e44312   Li Zhong   module: Fix mod->...
1508
1509
1510
1511
1512
1513
1514
  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...
1515
  static int mod_sysfs_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1516
1517
  {
  	int err;
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1518
  	struct kobject *kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1519

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

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

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

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

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

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

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

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

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

944a1fa01   Rusty Russell   module: don't unl...
1761
1762
1763
  	/* We leave it in list to prevent duplicate loads, but make sure
  	 * that noone uses it while it's being deconstructed. */
  	mod->state = MODULE_STATE_UNFORMED;
b82bab4bb   Jason Baron   dynamic debug: mo...
1764
1765
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1766
1767
1768
1769
1770
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
1771
1772
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
944a1fa01   Rusty Russell   module: don't unl...
1773
1774
1775
1776
  	/* 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
1777
  	/* This may be NULL, but that's OK */
01526ed08   Jan Glauber   module: split uns...
1778
  	unset_module_init_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1779
1780
  	module_free(mod, mod->module_init);
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
1781
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
1782

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

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

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

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

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

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

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

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

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

48fd11880   Kevin Cernekee   module: Fix perfo...
2204
  	/* Compute total space required for the core symbols' strtab. */
59ef28b1f   Rusty Russell   module: fix out-b...
2205
2206
2207
2208
  	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...
2209
  			ndst++;
554bdfe5a   Jan Beulich   module: reduce st...
2210
  		}
59ef28b1f   Rusty Russell   module: fix out-b...
2211
  	}
4a4962263   Jan Beulich   module: reduce sy...
2212
2213
  
  	/* Append room for core symbols at end of core part. */
49668688d   Rusty Russell   module: pass load...
2214
  	info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1);
48fd11880   Kevin Cernekee   module: Fix perfo...
2215
2216
  	info->stroffs = mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym);
  	mod->core_size += strtab_size;
4a4962263   Jan Beulich   module: reduce sy...
2217

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

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

d913188c7   Rusty Russell   module: layout_an...
2242
  	mod->core_symtab = dst = mod->module_core + info->symoffs;
48fd11880   Kevin Cernekee   module: Fix perfo...
2243
  	mod->core_strtab = s = mod->module_core + info->stroffs;
4a4962263   Jan Beulich   module: reduce sy...
2244
  	src = mod->symtab;
59ef28b1f   Rusty Russell   module: fix out-b...
2245
2246
2247
2248
2249
2250
2251
2252
  	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...
2253
2254
  	}
  	mod->core_num_syms = ndst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2255
2256
  }
  #else
49668688d   Rusty Russell   module: pass load...
2257
  static inline void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2258
2259
  {
  }
3ae91c21d   Paul Mundt   module: fix up CO...
2260

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

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

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

34e1169d9   Kees Cook   module: add sysca...
2333
2334
  	if (info->len > markerlen &&
  	    memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) {
caabe2405   David Howells   MODSIGN: Move the...
2335
  		/* We truncate the module to discard the signature */
34e1169d9   Kees Cook   module: add sysca...
2336
2337
  		info->len -= markerlen;
  		err = mod_verify_sig(mod, &info->len);
106a4ee25   Rusty Russell   module: signature...
2338
2339
2340
2341
2342
2343
2344
2345
  	}
  
  	if (!err) {
  		info->sig_ok = true;
  		return 0;
  	}
  
  	/* Not having a signature is only an error if we're strict. */
1d0059f3a   David Howells   MODSIGN: Add FIPS...
2346
2347
2348
2349
  	if (err < 0 && fips_enabled)
  		panic("Module verification failed with error %d in FIPS mode
  ",
  		      err);
106a4ee25   Rusty Russell   module: signature...
2350
2351
2352
2353
2354
2355
  	if (err == -ENOKEY && !sig_enforce)
  		err = 0;
  
  	return err;
  }
  #else /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2356
  static int module_sig_check(struct load_info *info)
106a4ee25   Rusty Russell   module: signature...
2357
2358
2359
2360
  {
  	return 0;
  }
  #endif /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2361
2362
  /* Sanity checks against invalid binaries, wrong arch, weird elf version. */
  static int elf_header_check(struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2363
  {
34e1169d9   Kees Cook   module: add sysca...
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
  	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 ...
2377

34e1169d9   Kees Cook   module: add sysca...
2378
2379
2380
2381
2382
2383
  	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 ...
2384
2385
  {
  	int err;
40dd2560e   Rusty Russell   module: refactor ...
2386

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

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

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

34e1169d9   Kees Cook   module: add sysca...
2438
2439
  	pos = 0;
  	while (pos < stat.size) {
a2e0578be   Al Viro   switch copy_modul...
2440
  		bytes = kernel_read(f.file, pos, (char *)(info->hdr) + pos,
34e1169d9   Kees Cook   module: add sysca...
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
  				    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 ...
2452

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

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

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

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

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

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

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

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

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

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

22e268ebe   Rusty Russell   module: refactor ...
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
2786
2787
  #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...
2788
2789
2790
2791
2792
2793
2794
  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...
2795
  static struct module *layout_and_allocate(struct load_info *info, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2796
  {
d913188c7   Rusty Russell   module: layout_an...
2797
  	/* Module within temporary copy. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2798
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
2799
  	int err;
3ae91c21d   Paul Mundt   module: fix up CO...
2800

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

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

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

8d8022e8a   Rusty Russell   module: do percpu...
2815
2816
  	/* 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
2817
2818
2819
2820
  
  	/* 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...
2821
  	layout_sections(mod, info);
49668688d   Rusty Russell   module: pass load...
2822
  	layout_symtab(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2823

65b8a9b4d   Linus Torvalds   module: refactor ...
2824
  	/* Allocate and move to the final place */
49668688d   Rusty Russell   module: pass load...
2825
  	err = move_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2826
  	if (err)
8d8022e8a   Rusty Russell   module: do percpu...
2827
  		return ERR_PTR(err);
d913188c7   Rusty Russell   module: layout_an...
2828
2829
2830
  
  	/* 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...
2831
  	kmemleak_load_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2832
  	return mod;
d913188c7   Rusty Russell   module: layout_an...
2833
2834
2835
2836
2837
  }
  
  /* mod is no longer valid after this! */
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2838
2839
2840
2841
  	percpu_modfree(mod);
  	module_free(mod, mod->module_init);
  	module_free(mod, mod->module_core);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2842
2843
2844
2845
2846
2847
  int __weak module_finalize(const Elf_Ehdr *hdr,
  			   const Elf_Shdr *sechdrs,
  			   struct module *me)
  {
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
2848
2849
  static int post_relocation(struct module *mod, const struct load_info *info)
  {
51f3d0f47   Rusty Russell   module: cleanup c...
2850
  	/* Sort exception table now relocations are done. */
811d66a0e   Rusty Russell   module: group pos...
2851
2852
2853
2854
2855
  	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...
2856
  	/* Setup kallsyms-specific fields. */
811d66a0e   Rusty Russell   module: group pos...
2857
2858
2859
2860
2861
  	add_kallsyms(mod, info);
  
  	/* Arch-specific module finalizing. */
  	return module_finalize(info->hdr, info->sechdrs, mod);
  }
9bb9c3be5   Rusty Russell   module: wait when...
2862
2863
2864
2865
2866
2867
2868
  /* 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...
2869
  	mod = find_module_all(name, strlen(name), true);
0d21b0e34   Rusty Russell   module: add new s...
2870
2871
  	ret = !mod || mod->state == MODULE_STATE_LIVE
  		|| mod->state == MODULE_STATE_GOING;
9bb9c3be5   Rusty Russell   module: wait when...
2872
2873
2874
2875
  	mutex_unlock(&module_mutex);
  
  	return ret;
  }
34e1169d9   Kees Cook   module: add sysca...
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
  /* 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...
2891
2892
2893
2894
2895
  	/*
  	 * 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...
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
  	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: ...
2913
2914
2915
2916
2917
2918
  		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...
2919
2920
2921
2922
2923
2924
2925
  		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...
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
  	/*
  	 * 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...
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
2972
2973
  
  	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 ...
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
  /*
   * 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...
2988
2989
  	old = find_module_all(mod->name, strlen(mod->name), true);
  	if (old != NULL) {
a3535c7e4   Rusty Russell   module: clean up ...
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
3023
3024
  		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...
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
  	/* 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 ...
3036
3037
3038
  	/* 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...
3039
3040
3041
3042
3043
  	mutex_unlock(&module_mutex);
  
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_COMING, mod);
  	return 0;
a3535c7e4   Rusty Russell   module: clean up ...
3044
3045
3046
3047
3048
  
  out:
  	mutex_unlock(&module_mutex);
  	return err;
  }
54041d8a7   Rusty Russell   modules: don't fa...
3049
3050
3051
3052
  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: ...
3053
3054
3055
  	if (ret != 0)
  		pr_warn("%s: unknown parameter '%s' ignored
  ", modname, param);
54041d8a7   Rusty Russell   modules: don't fa...
3056
3057
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
3058
3059
  /* 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...
3060
3061
  static int load_module(struct load_info *info, const char __user *uargs,
  		       int flags)
d913188c7   Rusty Russell   module: layout_an...
3062
  {
a3535c7e4   Rusty Russell   module: clean up ...
3063
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
3064
  	long err;
51e158c12   Rusty Russell   param: hand argum...
3065
  	char *after_dashes;
d913188c7   Rusty Russell   module: layout_an...
3066

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

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

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

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

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

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

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

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

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

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

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

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

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

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

51f3d0f47   Rusty Russell   module: cleanup c...
3150
  	/* Module is ready to execute: parsing args may do that. */
51e158c12   Rusty Russell   param: hand argum...
3151
3152
3153
3154
  	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...
3155
  		goto bug_cleanup;
51e158c12   Rusty Russell   param: hand argum...
3156
3157
3158
3159
3160
  	} else if (after_dashes) {
  		pr_warn("%s: parameters '%s' after `--' ignored
  ",
  		       mod->name, after_dashes);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3161

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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