Blame view

kernel/module.c 96.5 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';
22e669568   Tetsuo Handa   module: Add missi...
784
785
786
  	if (!(flags & O_NONBLOCK))
  		pr_warn("waiting module removal not supported: please upgrade
  ");
3f2b9c9cd   Rusty Russell   module: remove rm...
787

3fc1f1e27   Tejun Heo   stop_machine: rei...
788
789
  	if (mutex_lock_interruptible(&module_mutex) != 0)
  		return -EINTR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
790
791
792
793
794
795
  
  	mod = find_module(name);
  	if (!mod) {
  		ret = -ENOENT;
  		goto out;
  	}
2c02dfe7f   Linus Torvalds   module: Make the ...
796
  	if (!list_empty(&mod->source_list)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
798
799
800
801
802
803
  		/* 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...
804
  		/* FIXME: if (force), slam module count damn the torpedoes */
5e1241692   Jim Cromie   module: replace D...
805
806
  		pr_debug("%s already dying
  ", mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807
808
809
810
811
  		ret = -EBUSY;
  		goto out;
  	}
  
  	/* If it has an init func, it must have an exit func to unload */
af49d9248   Rusty Russell   Remove "unsafe" f...
812
  	if (mod->init && !mod->exit) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
813
  		forced = try_force_unload(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814
815
816
817
818
819
  		if (!forced) {
  			/* This module can't be removed */
  			ret = -EBUSY;
  			goto out;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
820
821
822
823
  	/* 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...
824
  	mutex_unlock(&module_mutex);
25985edce   Lucas De Marchi   Fix common misspe...
825
  	/* Final destruction now no one is using it. */
df4b565e1   Peter Oberparleiter   module: add MODUL...
826
  	if (mod->exit != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
827
  		mod->exit();
df4b565e1   Peter Oberparleiter   module: add MODUL...
828
829
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
22a9d6456   Arjan van de Ven   async: Asynchrono...
830
  	async_synchronize_full();
75676500f   Rusty Russell   module: make lock...
831

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

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

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

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

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

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

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

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

88bfa3247   Kay Sievers   module: add /sys/...
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
  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 - ...
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
1047
1048
1049
1050
  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/...
1051

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

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

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

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

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

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

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

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

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

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1567
1568
  	err = module_param_sysfs_setup(mod, kparam, num_params);
  	if (err)
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1569
  		goto out_unreg_holders;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1570

c988d2b28   Matt Domsch   [PATCH] modules: ...
1571
1572
  	err = module_add_modinfo_attrs(mod);
  	if (err)
e17e0f51a   Kay Sievers   Driver core: show...
1573
  		goto out_unreg_param;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1574

80a3d1bb4   Rusty Russell   module: move sysf...
1575
  	add_usage_links(mod);
8f6d03781   Rusty Russell   module: sysfs cle...
1576
1577
  	add_sect_attrs(mod, info);
  	add_notes_attrs(mod, info);
80a3d1bb4   Rusty Russell   module: move sysf...
1578

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

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

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

944a1fa01   Rusty Russell   module: don't unl...
1765
1766
1767
  	/* 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...
1768
1769
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1770
1771
1772
1773
1774
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
1775
1776
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
944a1fa01   Rusty Russell   module: don't unl...
1777
1778
1779
1780
  	/* 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
1781
  	/* This may be NULL, but that's OK */
01526ed08   Jan Glauber   module: split uns...
1782
  	unset_module_init_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1783
1784
  	module_free(mod, mod->module_init);
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
1785
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
1786

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

34e1169d9   Kees Cook   module: add sysca...
2382
2383
2384
2385
2386
2387
  	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 ...
2388
2389
  {
  	int err;
40dd2560e   Rusty Russell   module: refactor ...
2390

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

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

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

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

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

2f3238aeb   Rusty Russell   module: add flags...
2521
  	err = rewrite_section_headers(info, flags);
8b5f61a79   Rusty Russell   module: refactor ...
2522
2523
  	if (err)
  		return ERR_PTR(err);
3264d3f9d   Linus Torvalds   module: add load_...
2524

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

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

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

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

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

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

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

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

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

2f3238aeb   Rusty Russell   module: add flags...
2805
  	mod = setup_load_info(info, flags);
d913188c7   Rusty Russell   module: layout_an...
2806
2807
  	if (IS_ERR(mod))
  		return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2808

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6526c534b   Rusty Russell   module: move modu...
3137
3138
3139
3140
3141
3142
  	/* 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...
3143

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

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

51f3d0f47   Rusty Russell   module: cleanup c...
3153
  	/* Module is ready to execute: parsing args may do that. */
026cee008   Pawel Moll   params: <level>_i...
3154
  	err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
54041d8a7   Rusty Russell   modules: don't fa...
3155
  			 -32768, 32767, unknown_module_param_cb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3156
  	if (err < 0)
1fb9341ac   Rusty Russell   module: put modul...
3157
  		goto bug_cleanup;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3158

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

e610499e2   Rusty Russell   module: __module_...
3621
3622
3623
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
  /*
   * 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...
3658
  EXPORT_SYMBOL_GPL(__module_text_address);
e610499e2   Rusty Russell   module: __module_...
3659

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

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