Blame view

kernel/module.c 96.7 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
134
135
136
137
138
139
140
141
  #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 = {
  	.set = param_set_bool_enable_only,
  	.get = param_get_bool,
  };
  #define param_check_bool_enable_only param_check_bool
  
  module_param(sig_enforce, bool_enable_only, 0644);
  #endif /* !CONFIG_MODULE_SIG_FORCE */
  #endif /* CONFIG_MODULE_SIG */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9b1a4d383   Rusty Russell   stop_machine: Wea...
740
  		return stop_machine(__try_stop_module, &sref, NULL);
da39ba5e1   Rusty Russell   module: don't use...
741
742
743
744
745
746
  	} else {
  		/* We don't need to stop the machine for this. */
  		mod->state = MODULE_STATE_GOING;
  		synchronize_sched();
  		return 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
747
  }
bd77c0477   Eric Dumazet   module: struct mo...
748
  unsigned long module_refcount(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
749
  {
bd77c0477   Eric Dumazet   module: struct mo...
750
  	unsigned long incs = 0, decs = 0;
720eba31f   Eric Dumazet   modules: Use a be...
751
  	int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
752

720eba31f   Eric Dumazet   modules: Use a be...
753
  	for_each_possible_cpu(cpu)
5fbfb18d7   Nick Piggin   Fix up possibly r...
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
  		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
772
773
774
775
776
777
778
779
  }
  EXPORT_SYMBOL(module_refcount);
  
  /* This exists whether we can unload or not */
  static void free_module(struct module *mod);
  
  static void wait_for_zero_refcount(struct module *mod)
  {
a65502075   Matthew Wilcox   kernel: Remove un...
780
  	/* Since we might sleep for some time, release the mutex first */
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
781
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
782
  	for (;;) {
5e1241692   Jim Cromie   module: replace D...
783
784
  		pr_debug("Looking at refcount...
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
785
786
787
788
789
790
  		set_current_state(TASK_UNINTERRUPTIBLE);
  		if (module_refcount(mod) == 0)
  			break;
  		schedule();
  	}
  	current->state = TASK_RUNNING;
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
791
  	mutex_lock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792
  }
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
793
794
  SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
  		unsigned int, flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
795
796
  {
  	struct module *mod;
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
797
  	char name[MODULE_NAME_LEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
798
  	int ret, forced = 0;
3d43321b7   Kees Cook   modules: sysctl t...
799
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
800
801
802
803
804
  		return -EPERM;
  
  	if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
  		return -EFAULT;
  	name[MODULE_NAME_LEN-1] = '\0';
3fc1f1e27   Tejun Heo   stop_machine: rei...
805
806
  	if (mutex_lock_interruptible(&module_mutex) != 0)
  		return -EINTR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807
808
809
810
811
812
  
  	mod = find_module(name);
  	if (!mod) {
  		ret = -ENOENT;
  		goto out;
  	}
2c02dfe7f   Linus Torvalds   module: Make the ...
813
  	if (!list_empty(&mod->source_list)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814
815
816
817
818
819
820
821
822
  		/* Other modules depend on us: get rid of them first. */
  		ret = -EWOULDBLOCK;
  		goto out;
  	}
  
  	/* Doing init or already dying? */
  	if (mod->state != MODULE_STATE_LIVE) {
  		/* FIXME: if (force), slam module count and wake up
                     waiter --RR */
5e1241692   Jim Cromie   module: replace D...
823
824
  		pr_debug("%s already dying
  ", mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
825
826
827
828
829
  		ret = -EBUSY;
  		goto out;
  	}
  
  	/* If it has an init func, it must have an exit func to unload */
af49d9248   Rusty Russell   Remove "unsafe" f...
830
  	if (mod->init && !mod->exit) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
831
  		forced = try_force_unload(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
  		if (!forced) {
  			/* This module can't be removed */
  			ret = -EBUSY;
  			goto out;
  		}
  	}
  
  	/* Set this up before setting mod->state */
  	mod->waiter = current;
  
  	/* Stop the machine so refcounts can't move and disable module. */
  	ret = try_stop_module(mod, flags, &forced);
  	if (ret != 0)
  		goto out;
  
  	/* Never wait if forced. */
  	if (!forced && module_refcount(mod) != 0)
  		wait_for_zero_refcount(mod);
df4b565e1   Peter Oberparleiter   module: add MODUL...
850
  	mutex_unlock(&module_mutex);
25985edce   Lucas De Marchi   Fix common misspe...
851
  	/* Final destruction now no one is using it. */
df4b565e1   Peter Oberparleiter   module: add MODUL...
852
  	if (mod->exit != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853
  		mod->exit();
df4b565e1   Peter Oberparleiter   module: add MODUL...
854
855
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
22a9d6456   Arjan van de Ven   async: Asynchrono...
856
  	async_synchronize_full();
75676500f   Rusty Russell   module: make lock...
857

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

75676500f   Rusty Russell   module: make lock...
861
862
863
  	free_module(mod);
  	return 0;
  out:
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
864
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
865
866
  	return ret;
  }
d1e99d7ae   Jianjun Kong   module: fix warni...
867
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
868
869
870
  {
  	struct module_use *use;
  	int printed_something = 0;
bd77c0477   Eric Dumazet   module: struct mo...
871
  	seq_printf(m, " %lu ", module_refcount(mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
872
873
874
  
  	/* Always include a trailing , so userspace can differentiate
             between this and the old multi-field proc format. */
2c02dfe7f   Linus Torvalds   module: Make the ...
875
  	list_for_each_entry(use, &mod->source_list, source_list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
876
  		printed_something = 1;
2c02dfe7f   Linus Torvalds   module: Make the ...
877
  		seq_printf(m, "%s,", use->source->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
878
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
879
880
881
882
883
884
885
886
887
888
889
890
  	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
891

24da1cbff   Rusty Russell   modules: remove m...
892
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
893
  	if (!find_symbol(symbol, &owner, NULL, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
894
895
  		BUG();
  	module_put(owner);
24da1cbff   Rusty Russell   modules: remove m...
896
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
897
898
  }
  EXPORT_SYMBOL(__symbol_put);
7d1d16e41   Rusty Russell   module: fix BUG_O...
899
  /* Note this assumes addr is a function, which it currently always is. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
900
901
  void symbol_put_addr(void *addr)
  {
5e3766138   Trent Piepho   [PATCH] symbol_pu...
902
  	struct module *modaddr;
7d1d16e41   Rusty Russell   module: fix BUG_O...
903
  	unsigned long a = (unsigned long)dereference_function_descriptor(addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
904

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

a6e6abd57   Rusty Russell   module: remove mo...
908
909
  	/* 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...
910
  	modaddr = __module_text_address(a);
a6e6abd57   Rusty Russell   module: remove mo...
911
  	BUG_ON(!modaddr);
5e3766138   Trent Piepho   [PATCH] symbol_pu...
912
  	module_put(modaddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
913
914
915
916
  }
  EXPORT_SYMBOL_GPL(symbol_put_addr);
  
  static ssize_t show_refcnt(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
917
  			   struct module_kobject *mk, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
918
  {
bd77c0477   Eric Dumazet   module: struct mo...
919
920
  	return sprintf(buffer, "%lu
  ", module_refcount(mk->mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
921
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
922
923
  static struct module_attribute modinfo_refcnt =
  	__ATTR(refcnt, 0444, show_refcnt, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924

d53799be6   Steven Rostedt   module: move __mo...
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
  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 ...
954
955
956
  void module_put(struct module *module)
  {
  	if (module) {
e1783a240   Christoph Lameter   module: Use this_...
957
  		preempt_disable();
5fbfb18d7   Nick Piggin   Fix up possibly r...
958
959
  		smp_wmb(); /* see comment in module_refcount */
  		__this_cpu_inc(module->refptr->decs);
e1783a240   Christoph Lameter   module: Use this_...
960

ae832d1e0   Li Zefan   tracing: Remove s...
961
  		trace_module_put(module, _RET_IP_);
f6a570333   Al Viro   [PATCH] severing ...
962
963
964
  		/* Maybe they're waiting for us to drop reference? */
  		if (unlikely(!module_is_live(module)))
  			wake_up_process(module->waiter);
e1783a240   Christoph Lameter   module: Use this_...
965
  		preempt_enable();
f6a570333   Al Viro   [PATCH] severing ...
966
967
968
  	}
  }
  EXPORT_SYMBOL(module_put);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
969
  #else /* !CONFIG_MODULE_UNLOAD */
d1e99d7ae   Jianjun Kong   module: fix warni...
970
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971
972
973
974
975
976
977
978
  {
  	/* 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 ...
979
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
980
  {
9bea7f239   Rusty Russell   module: fix bne2 ...
981
  	return strong_try_module_get(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
982
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
983
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984

9f85a4bbb   Rusty Russell   module: refactor ...
985
  static inline int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
  {
9f85a4bbb   Rusty Russell   module: refactor ...
987
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
988
989
  }
  #endif /* CONFIG_MODULE_UNLOAD */
53999bf34   Kevin Winchester   error: implicit d...
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
  static size_t module_flags_taint(struct module *mod, char *buf)
  {
  	size_t l = 0;
  
  	if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE))
  		buf[l++] = 'P';
  	if (mod->taints & (1 << TAINT_OOT_MODULE))
  		buf[l++] = 'O';
  	if (mod->taints & (1 << TAINT_FORCED_MODULE))
  		buf[l++] = 'F';
  	if (mod->taints & (1 << TAINT_CRAP))
  		buf[l++] = 'C';
  	/*
  	 * TAINT_FORCED_RMMOD: could be added.
  	 * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
  	 * apply to modules.
  	 */
  	return l;
  }
1f71740ab   Kay Sievers   Driver core: show...
1009
  static ssize_t show_initstate(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1010
  			      struct module_kobject *mk, char *buffer)
1f71740ab   Kay Sievers   Driver core: show...
1011
1012
  {
  	const char *state = "unknown";
4befb026c   Kay Sievers   module: change at...
1013
  	switch (mk->mod->state) {
1f71740ab   Kay Sievers   Driver core: show...
1014
1015
1016
1017
1018
1019
1020
1021
1022
  	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...
1023
1024
  	default:
  		BUG();
1f71740ab   Kay Sievers   Driver core: show...
1025
1026
1027
1028
  	}
  	return sprintf(buffer, "%s
  ", state);
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1029
1030
  static struct module_attribute modinfo_initstate =
  	__ATTR(initstate, 0444, show_initstate, NULL);
1f71740ab   Kay Sievers   Driver core: show...
1031

88bfa3247   Kay Sievers   module: add /sys/...
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
  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 - ...
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
  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/...
1078

03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1079
  static struct module_attribute *modinfo_attrs[] = {
cca3e7073   Kay Sievers   modules: sysfs - ...
1080
  	&module_uevent,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1081
1082
  	&modinfo_version,
  	&modinfo_srcversion,
cca3e7073   Kay Sievers   modules: sysfs - ...
1083
1084
1085
1086
  	&modinfo_initstate,
  	&modinfo_coresize,
  	&modinfo_initsize,
  	&modinfo_taint,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1087
  #ifdef CONFIG_MODULE_UNLOAD
cca3e7073   Kay Sievers   modules: sysfs - ...
1088
  	&modinfo_refcnt,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1089
1090
1091
  #endif
  	NULL,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1092
  static const char vermagic[] = VERMAGIC_STRING;
c6e665c8f   Rusty Russell   module: clarify t...
1093
  static int try_to_force_load(struct module *mod, const char *reason)
826e4506a   Linus Torvalds   Make forced modul...
1094
1095
  {
  #ifdef CONFIG_MODULE_FORCE_LOAD
25ddbb18a   Andi Kleen   Make the taint fl...
1096
  	if (!test_taint(TAINT_FORCED_MODULE))
c6e665c8f   Rusty Russell   module: clarify t...
1097
1098
1099
  		printk(KERN_WARNING "%s: %s: kernel tainted.
  ",
  		       mod->name, reason);
373d4d099   Rusty Russell   taint: add explic...
1100
  	add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
826e4506a   Linus Torvalds   Make forced modul...
1101
1102
1103
1104
1105
  	return 0;
  #else
  	return -ENOEXEC;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
  #ifdef CONFIG_MODVERSIONS
d4703aefd   Rusty Russell   module: handle pp...
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
  /* 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
1117
1118
1119
1120
  static int check_version(Elf_Shdr *sechdrs,
  			 unsigned int versindex,
  			 const char *symname,
  			 struct module *mod, 
d4703aefd   Rusty Russell   module: handle pp...
1121
1122
  			 const unsigned long *crc,
  			 const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123
1124
1125
1126
1127
1128
1129
  {
  	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...
1130
1131
1132
  	/* 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
1133
1134
1135
1136
1137
1138
1139
  	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...
1140
  		if (versions[i].crc == maybe_relocated(*crc, crc_owner))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1141
  			return 1;
5e1241692   Jim Cromie   module: replace D...
1142
1143
  		pr_debug("Found checksum %lX vs module %lX
  ",
d4703aefd   Rusty Russell   module: handle pp...
1144
  		       maybe_relocated(*crc, crc_owner), versions[i].crc);
826e4506a   Linus Torvalds   Make forced modul...
1145
  		goto bad_version;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1146
  	}
826e4506a   Linus Torvalds   Make forced modul...
1147

a5dd69707   Rusty Russell   module: be more p...
1148
1149
1150
1151
  	printk(KERN_WARNING "%s: no symbol version for %s
  ",
  	       mod->name, symname);
  	return 0;
826e4506a   Linus Torvalds   Make forced modul...
1152
1153
1154
1155
1156
1157
  
  bad_version:
  	printk("%s: disagrees about version of symbol %s
  ",
  	       mod->name, symname);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1158
1159
1160
1161
1162
1163
1164
  }
  
  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
1165

75676500f   Rusty Russell   module: make lock...
1166
1167
  	/* Since this should be found in kernel (which can't be removed),
  	 * no locking is necessary. */
6560dc160   Mike Frysinger   module: use MODUL...
1168
1169
  	if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout", NULL,
  			 &crc, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
  		BUG();
d4703aefd   Rusty Russell   module: handle pp...
1171
1172
  	return check_version(sechdrs, versindex, "module_layout", mod, crc,
  			     NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1173
  }
91e37a793   Rusty Russell   module: don't ign...
1174
1175
1176
  /* 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
1177
  {
91e37a793   Rusty Russell   module: don't ign...
1178
1179
1180
1181
  	if (has_crcs) {
  		amagic += strcspn(amagic, " ");
  		bmagic += strcspn(bmagic, " ");
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1182
1183
1184
1185
1186
1187
1188
  	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...
1189
1190
  				const unsigned long *crc,
  				const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
  {
  	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...
1201
1202
  static inline int same_magic(const char *amagic, const char *bmagic,
  			     bool has_crcs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1203
1204
1205
1206
  {
  	return strcmp(amagic, bmagic) == 0;
  }
  #endif /* CONFIG_MODVERSIONS */
75676500f   Rusty Russell   module: make lock...
1207
  /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
49668688d   Rusty Russell   module: pass load...
1208
1209
  static const struct kernel_symbol *resolve_symbol(struct module *mod,
  						  const struct load_info *info,
414fd31b2   Tim Abbott   module: Make find...
1210
  						  const char *name,
9bea7f239   Rusty Russell   module: fix bne2 ...
1211
  						  char ownername[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1212
1213
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1214
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1215
  	const unsigned long *crc;
9bea7f239   Rusty Russell   module: fix bne2 ...
1216
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1217

75676500f   Rusty Russell   module: make lock...
1218
  	mutex_lock(&module_mutex);
414fd31b2   Tim Abbott   module: Make find...
1219
  	sym = find_symbol(name, &owner, &crc,
25ddbb18a   Andi Kleen   Make the taint fl...
1220
  			  !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
9bea7f239   Rusty Russell   module: fix bne2 ...
1221
1222
  	if (!sym)
  		goto unlock;
49668688d   Rusty Russell   module: pass load...
1223
1224
  	if (!check_version(info->sechdrs, info->index.vers, name, mod, crc,
  			   owner)) {
9bea7f239   Rusty Russell   module: fix bne2 ...
1225
1226
  		sym = ERR_PTR(-EINVAL);
  		goto getname;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1227
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
  
  	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...
1239
  	mutex_unlock(&module_mutex);
218ce7351   Linus Torvalds   Revert "module: d...
1240
  	return sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1241
  }
49668688d   Rusty Russell   module: pass load...
1242
1243
1244
1245
  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 ...
1246
1247
  {
  	const struct kernel_symbol *ksym;
49668688d   Rusty Russell   module: pass load...
1248
  	char owner[MODULE_NAME_LEN];
9bea7f239   Rusty Russell   module: fix bne2 ...
1249
1250
  
  	if (wait_event_interruptible_timeout(module_wq,
49668688d   Rusty Russell   module: pass load...
1251
1252
  			!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
  			|| PTR_ERR(ksym) != -EBUSY,
9bea7f239   Rusty Russell   module: fix bne2 ...
1253
1254
1255
  					     30 * HZ) <= 0) {
  		printk(KERN_WARNING "%s: gave up waiting for init of module %s.
  ",
49668688d   Rusty Russell   module: pass load...
1256
  		       mod->name, owner);
9bea7f239   Rusty Russell   module: fix bne2 ...
1257
1258
1259
  	}
  	return ksym;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1260
1261
1262
1263
  /*
   * /sys/module/foo/sections stuff
   * J. Corbet <corbet@lwn.net>
   */
8f6d03781   Rusty Russell   module: sysfs cle...
1264
  #ifdef CONFIG_SYSFS
10b465aaf   Ben Hutchings   modules: Skip emp...
1265

8f6d03781   Rusty Russell   module: sysfs cle...
1266
  #ifdef CONFIG_KALLSYMS
10b465aaf   Ben Hutchings   modules: Skip emp...
1267
1268
1269
1270
  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...
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
  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
1284
  static ssize_t module_sect_show(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1285
  				struct module_kobject *mk, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1286
1287
1288
  {
  	struct module_sect_attr *sattr =
  		container_of(mattr, struct module_sect_attr, mattr);
9f36e2c44   Kees Cook   printk: use %pK f...
1289
1290
  	return sprintf(buf, "0x%pK
  ", (void *)sattr->address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1291
  }
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1292
1293
  static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
  {
a58730c42   Rusty Russell   module: make modu...
1294
  	unsigned int section;
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1295
1296
1297
1298
1299
  
  	for (section = 0; section < sect_attrs->nsections; section++)
  		kfree(sect_attrs->attrs[section].name);
  	kfree(sect_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1300
  static void add_sect_attrs(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1301
1302
1303
1304
1305
  {
  	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:...
1306

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

8f6d03781   Rusty Russell   module: sysfs cle...
1458
1459
  static inline void add_sect_attrs(struct module *mod,
  				  const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1460
1461
1462
1463
1464
1465
  {
  }
  
  static inline void remove_sect_attrs(struct module *mod)
  {
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1466

8f6d03781   Rusty Russell   module: sysfs cle...
1467
1468
  static inline void add_notes_attrs(struct module *mod,
  				   const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1469
1470
1471
1472
1473
1474
  {
  }
  
  static inline void remove_notes_attrs(struct module *mod)
  {
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1475
  #endif /* CONFIG_KALLSYMS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476

80a3d1bb4   Rusty Russell   module: move sysf...
1477
1478
1479
1480
1481
  static void add_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
  	int nowarn;
75676500f   Rusty Russell   module: make lock...
1482
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1483
1484
1485
1486
  	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...
1487
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1488
1489
1490
1491
1492
1493
1494
  #endif
  }
  
  static void del_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
75676500f   Rusty Russell   module: make lock...
1495
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1496
1497
  	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...
1498
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1499
1500
  #endif
  }
6407ebb27   Rusty Russell   module: Make modu...
1501
  static int module_add_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1502
1503
  {
  	struct module_attribute *attr;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1504
  	struct module_attribute *temp_attr;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1505
1506
  	int error = 0;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1507
1508
1509
1510
1511
1512
1513
  	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: ...
1514
1515
  	for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) {
  		if (!attr->test ||
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1516
1517
  		    (attr->test && attr->test(mod))) {
  			memcpy(temp_attr, attr, sizeof(*temp_attr));
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1518
  			sysfs_attr_init(&temp_attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1519
1520
1521
  			error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr);
  			++temp_attr;
  		}
c988d2b28   Matt Domsch   [PATCH] modules: ...
1522
1523
1524
  	}
  	return error;
  }
6407ebb27   Rusty Russell   module: Make modu...
1525
  static void module_remove_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1526
1527
1528
  {
  	struct module_attribute *attr;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1529
1530
1531
1532
  	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: ...
1533
  		sysfs_remove_file(&mod->mkobj.kobj,&attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1534
1535
  		if (attr->free)
  			attr->free(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1536
  	}
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1537
  	kfree(mod->modinfo_attrs);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1538
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1539

6407ebb27   Rusty Russell   module: Make modu...
1540
  static int mod_sysfs_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1541
1542
  {
  	int err;
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1543
  	struct kobject *kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1544

823bccfc4   Greg Kroah-Hartman   remove "struct su...
1545
1546
1547
  	if (!module_sysfs_initialized) {
  		printk(KERN_ERR "%s: module sysfs not initialized
  ",
1cc5f7142   Ed Swierk   [PATCH] load_modu...
1548
1549
1550
1551
  		       mod->name);
  		err = -EINVAL;
  		goto out;
  	}
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1552
1553
1554
1555
1556
1557
1558
1559
1560
  
  	kobj = kset_find_obj(module_kset, mod->name);
  	if (kobj) {
  		printk(KERN_ERR "%s: module is already loaded
  ", mod->name);
  		kobject_put(kobj);
  		err = -EINVAL;
  		goto out;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1561
  	mod->mkobj.mod = mod;
e17e0f51a   Kay Sievers   Driver core: show...
1562

ac3c8141f   Greg Kroah-Hartman   Kobject: convert ...
1563
1564
1565
1566
1567
1568
  	memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj));
  	mod->mkobj.kobj.kset = module_kset;
  	err = kobject_init_and_add(&mod->mkobj.kobj, &module_ktype, NULL,
  				   "%s", mod->name);
  	if (err)
  		kobject_put(&mod->mkobj.kobj);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1569

97c146ef0   Kay Sievers   sysfs: fix /sys/m...
1570
  	/* delay uevent until full sysfs population */
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1571
1572
1573
  out:
  	return err;
  }
6407ebb27   Rusty Russell   module: Make modu...
1574
  static int mod_sysfs_setup(struct module *mod,
8f6d03781   Rusty Russell   module: sysfs cle...
1575
  			   const struct load_info *info,
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1576
1577
1578
1579
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	int err;
80a3d1bb4   Rusty Russell   module: move sysf...
1580
1581
1582
  	err = mod_sysfs_init(mod);
  	if (err)
  		goto out;
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1583
  	mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
240936e18   Akinobu Mita   mod_sysfs_setup()...
1584
1585
  	if (!mod->holders_dir) {
  		err = -ENOMEM;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1586
  		goto out_unreg;
240936e18   Akinobu Mita   mod_sysfs_setup()...
1587
  	}
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1588

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1589
1590
  	err = module_param_sysfs_setup(mod, kparam, num_params);
  	if (err)
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1591
  		goto out_unreg_holders;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1592

c988d2b28   Matt Domsch   [PATCH] modules: ...
1593
1594
  	err = module_add_modinfo_attrs(mod);
  	if (err)
e17e0f51a   Kay Sievers   Driver core: show...
1595
  		goto out_unreg_param;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1596

80a3d1bb4   Rusty Russell   module: move sysf...
1597
  	add_usage_links(mod);
8f6d03781   Rusty Russell   module: sysfs cle...
1598
1599
  	add_sect_attrs(mod, info);
  	add_notes_attrs(mod, info);
80a3d1bb4   Rusty Russell   module: move sysf...
1600

e17e0f51a   Kay Sievers   Driver core: show...
1601
  	kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1602
  	return 0;
e17e0f51a   Kay Sievers   Driver core: show...
1603
1604
  out_unreg_param:
  	module_param_sysfs_remove(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1605
  out_unreg_holders:
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1606
  	kobject_put(mod->holders_dir);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1607
  out_unreg:
e17e0f51a   Kay Sievers   Driver core: show...
1608
  	kobject_put(&mod->mkobj.kobj);
80a3d1bb4   Rusty Russell   module: move sysf...
1609
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1610
1611
  	return err;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1612
1613
1614
  
  static void mod_sysfs_fini(struct module *mod)
  {
8f6d03781   Rusty Russell   module: sysfs cle...
1615
1616
  	remove_notes_attrs(mod);
  	remove_sect_attrs(mod);
34e4e2fef   Denis V. Lunev   modules: proper c...
1617
1618
  	kobject_put(&mod->mkobj.kobj);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1619
  #else /* !CONFIG_SYSFS */
34e4e2fef   Denis V. Lunev   modules: proper c...
1620

8f6d03781   Rusty Russell   module: sysfs cle...
1621
1622
  static int mod_sysfs_setup(struct module *mod,
  			   const struct load_info *info,
6407ebb27   Rusty Russell   module: Make modu...
1623
1624
1625
1626
1627
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	return 0;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1628
1629
1630
  static void mod_sysfs_fini(struct module *mod)
  {
  }
36b0360d1   Rusty Russell   module: fix sysfs...
1631
1632
1633
  static void module_remove_modinfo_attrs(struct module *mod)
  {
  }
80a3d1bb4   Rusty Russell   module: move sysf...
1634
1635
1636
  static void del_usage_links(struct module *mod)
  {
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1637
  #endif /* CONFIG_SYSFS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1638

36b0360d1   Rusty Russell   module: fix sysfs...
1639
  static void mod_sysfs_teardown(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1640
  {
80a3d1bb4   Rusty Russell   module: move sysf...
1641
  	del_usage_links(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1642
  	module_remove_modinfo_attrs(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1643
  	module_param_sysfs_remove(mod);
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1644
1645
  	kobject_put(mod->mkobj.drivers_dir);
  	kobject_put(mod->holders_dir);
34e4e2fef   Denis V. Lunev   modules: proper c...
1646
  	mod_sysfs_fini(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
  }
  
  /*
   * 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...
1657
  	module_bug_cleanup(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1658
1659
  	return 0;
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
  #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...
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
  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...
1721
1722
1723
  }
  
  /* Iterate through all modules and set each module's text as RW */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1724
  void set_all_modules_text_rw(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1725
1726
1727
1728
1729
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1730
1731
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
  		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...
1747
  void set_all_modules_text_ro(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1748
1749
1750
1751
1752
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1753
1754
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
  		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...
1770
1771
  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...
1772
  #endif
74e08fcf7   Jonas Bonn   modules: add defa...
1773
1774
1775
1776
1777
1778
1779
1780
  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...
1781
  /* Free a module, remove from lists, etc. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1782
1783
  static void free_module(struct module *mod)
  {
7ead8b831   Li Zefan   tracing/events: A...
1784
  	trace_module_free(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1785
  	/* Delete from various lists */
75676500f   Rusty Russell   module: make lock...
1786
  	mutex_lock(&module_mutex);
9b1a4d383   Rusty Russell   stop_machine: Wea...
1787
  	stop_machine(__unlink_module, mod, NULL);
75676500f   Rusty Russell   module: make lock...
1788
  	mutex_unlock(&module_mutex);
36b0360d1   Rusty Russell   module: fix sysfs...
1789
  	mod_sysfs_teardown(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1790

b82bab4bb   Jason Baron   dynamic debug: mo...
1791
1792
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1793
1794
1795
1796
1797
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
1798
1799
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1800
  	/* This may be NULL, but that's OK */
01526ed08   Jan Glauber   module: split uns...
1801
  	unset_module_init_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1802
1803
  	module_free(mod, mod->module_init);
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
1804
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
1805

fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
1806
1807
  	/* Free lock-classes: */
  	lockdep_free_key_range(mod->module_core, mod->core_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1808
  	/* Finally, free the core (containing the module structure) */
01526ed08   Jan Glauber   module: split uns...
1809
  	unset_module_core_ro_nx(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1810
  	module_free(mod, mod->module_core);
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
1811
1812
1813
1814
  
  #ifdef CONFIG_MPU
  	update_protections(current->mm);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1815
1816
1817
1818
1819
  }
  
  void *__symbol_get(const char *symbol)
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1820
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1821

24da1cbff   Rusty Russell   modules: remove m...
1822
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
1823
1824
1825
  	sym = find_symbol(symbol, &owner, NULL, true, true);
  	if (sym && strong_try_module_get(owner))
  		sym = NULL;
24da1cbff   Rusty Russell   modules: remove m...
1826
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1827

414fd31b2   Tim Abbott   module: Make find...
1828
  	return sym ? (void *)sym->value : NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1829
1830
  }
  EXPORT_SYMBOL_GPL(__symbol_get);
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1831
1832
  /*
   * Ensure that an exported symbol [global namespace] does not already exist
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
1833
   * in the kernel or in some other module's exported symbol table.
be593f4ce   Rusty Russell   module: verify_ex...
1834
1835
   *
   * You must hold the module_mutex.
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1836
1837
1838
   */
  static int verify_export_symbols(struct module *mod)
  {
b211104d1   Rusty Russell   module: Enhance v...
1839
  	unsigned int i;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1840
  	struct module *owner;
b211104d1   Rusty Russell   module: Enhance v...
1841
1842
1843
1844
1845
1846
1847
1848
  	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...
1849
  #ifdef CONFIG_UNUSED_SYMBOLS
b211104d1   Rusty Russell   module: Enhance v...
1850
1851
  		{ mod->unused_syms, mod->num_unused_syms },
  		{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
1852
  #endif
b211104d1   Rusty Russell   module: Enhance v...
1853
  	};
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1854

b211104d1   Rusty Russell   module: Enhance v...
1855
1856
  	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...
1857
  			if (find_symbol(s->name, &owner, NULL, true, false)) {
b211104d1   Rusty Russell   module: Enhance v...
1858
1859
1860
1861
1862
1863
1864
  				printk(KERN_ERR
  				       "%s: exports duplicate symbol %s"
  				       " (owned by %s)
  ",
  				       mod->name, s->name, module_name(owner));
  				return -ENOEXEC;
  			}
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1865
  		}
b211104d1   Rusty Russell   module: Enhance v...
1866
1867
  	}
  	return 0;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1868
  }
9a4b9708f   Matti Linnanvuori   module: fix and e...
1869
  /* Change all symbols so that st_value encodes the pointer directly. */
49668688d   Rusty Russell   module: pass load...
1870
1871
1872
1873
  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
1874
  	unsigned long secbase;
49668688d   Rusty Russell   module: pass load...
1875
  	unsigned int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1876
  	int ret = 0;
414fd31b2   Tim Abbott   module: Make find...
1877
  	const struct kernel_symbol *ksym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1878

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

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

49668688d   Rusty Russell   module: pass load...
2094
  	for (p = (char *)infosec->sh_addr; p; p = next_string(p, &size)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2095
2096
2097
2098
2099
  		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
  			return p + taglen + 1;
  	}
  	return NULL;
  }
49668688d   Rusty Russell   module: pass load...
2100
  static void setup_modinfo(struct module *mod, struct load_info *info)
c988d2b28   Matt Domsch   [PATCH] modules: ...
2101
2102
2103
2104
2105
2106
  {
  	struct module_attribute *attr;
  	int i;
  
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
  		if (attr->setup)
49668688d   Rusty Russell   module: pass load...
2107
  			attr->setup(mod, get_modinfo(info, attr->attr.name));
c988d2b28   Matt Domsch   [PATCH] modules: ...
2108
2109
  	}
  }
c988d2b28   Matt Domsch   [PATCH] modules: ...
2110

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

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

48fd11880   Kevin Cernekee   module: Fix perfo...
2225
  	/* Compute total space required for the core symbols' strtab. */
59ef28b1f   Rusty Russell   module: fix out-b...
2226
2227
2228
2229
  	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...
2230
  			ndst++;
554bdfe5a   Jan Beulich   module: reduce st...
2231
  		}
59ef28b1f   Rusty Russell   module: fix out-b...
2232
  	}
4a4962263   Jan Beulich   module: reduce sy...
2233
2234
  
  	/* Append room for core symbols at end of core part. */
49668688d   Rusty Russell   module: pass load...
2235
  	info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1);
48fd11880   Kevin Cernekee   module: Fix perfo...
2236
2237
  	info->stroffs = mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym);
  	mod->core_size += strtab_size;
4a4962263   Jan Beulich   module: reduce sy...
2238

554bdfe5a   Jan Beulich   module: reduce st...
2239
2240
2241
  	/* 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...
2242
  					 info->index.str) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2243
2244
  	pr_debug("\t%s
  ", info->secstrings + strsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2245
  }
811d66a0e   Rusty Russell   module: group pos...
2246
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2247
  {
4a4962263   Jan Beulich   module: reduce sy...
2248
2249
2250
  	unsigned int i, ndst;
  	const Elf_Sym *src;
  	Elf_Sym *dst;
554bdfe5a   Jan Beulich   module: reduce st...
2251
  	char *s;
eded41c1c   Rusty Russell   module: kallsyms ...
2252
  	Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2253

eded41c1c   Rusty Russell   module: kallsyms ...
2254
2255
  	mod->symtab = (void *)symsec->sh_addr;
  	mod->num_symtab = symsec->sh_size / sizeof(Elf_Sym);
511ca6ae4   Rusty Russell   module: fix crash...
2256
2257
  	/* 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
2258
2259
2260
  
  	/* Set types up while we still have access to sections. */
  	for (i = 0; i < mod->num_symtab; i++)
eded41c1c   Rusty Russell   module: kallsyms ...
2261
  		mod->symtab[i].st_info = elf_type(&mod->symtab[i], info);
4a4962263   Jan Beulich   module: reduce sy...
2262

d913188c7   Rusty Russell   module: layout_an...
2263
  	mod->core_symtab = dst = mod->module_core + info->symoffs;
48fd11880   Kevin Cernekee   module: Fix perfo...
2264
  	mod->core_strtab = s = mod->module_core + info->stroffs;
4a4962263   Jan Beulich   module: reduce sy...
2265
  	src = mod->symtab;
59ef28b1f   Rusty Russell   module: fix out-b...
2266
2267
2268
2269
2270
2271
2272
2273
  	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...
2274
2275
  	}
  	mod->core_num_syms = ndst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2276
2277
  }
  #else
49668688d   Rusty Russell   module: pass load...
2278
  static inline void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2279
2280
  {
  }
3ae91c21d   Paul Mundt   module: fix up CO...
2281

abbce906d   MichaÅ‚ MirosÅ‚aw   (trivial) Fix com...
2282
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2283
2284
2285
  {
  }
  #endif /* CONFIG_KALLSYMS */
e9d376f0f   Jason Baron   dynamic debug: co...
2286
  static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num)
346e15beb   Jason Baron   driver core: basi...
2287
  {
811d66a0e   Rusty Russell   module: group pos...
2288
2289
  	if (!debug)
  		return;
e9d376f0f   Jason Baron   dynamic debug: co...
2290
2291
2292
2293
2294
2295
  #ifdef CONFIG_DYNAMIC_DEBUG
  	if (ddebug_add_module(debug, num, debug->modname))
  		printk(KERN_ERR "dynamic debug error adding module: %s
  ",
  					debug->modname);
  #endif
5e458cc0f   Rusty Russell   module: simplify ...
2296
  }
346e15beb   Jason Baron   driver core: basi...
2297

ff49d74ad   Yehuda Sadeh   module: initializ...
2298
2299
2300
2301
2302
  static void dynamic_debug_remove(struct _ddebug *debug)
  {
  	if (debug)
  		ddebug_remove_module(debug->modname);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2303
2304
  void * __weak module_alloc(unsigned long size)
  {
82fab442f   Rusty Russell   modules: don't ha...
2305
  	return vmalloc_exec(size);
74e08fcf7   Jonas Bonn   modules: add defa...
2306
  }
3a642e99b   Rusty Russell   modules: Take a s...
2307
2308
2309
2310
2311
  static void *module_alloc_update_bounds(unsigned long size)
  {
  	void *ret = module_alloc(size);
  
  	if (ret) {
75676500f   Rusty Russell   module: make lock...
2312
  		mutex_lock(&module_mutex);
3a642e99b   Rusty Russell   modules: Take a s...
2313
2314
2315
2316
2317
  		/* 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...
2318
  		mutex_unlock(&module_mutex);
3a642e99b   Rusty Russell   modules: Take a s...
2319
2320
2321
  	}
  	return ret;
  }
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2322
  #ifdef CONFIG_DEBUG_KMEMLEAK
49668688d   Rusty Russell   module: pass load...
2323
2324
  static void kmemleak_load_module(const struct module *mod,
  				 const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2325
2326
2327
2328
  {
  	unsigned int i;
  
  	/* only scan the sections containing data */
c017b4be3   Catalin Marinas   kmemleak: Simplif...
2329
  	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2330

49668688d   Rusty Russell   module: pass load...
2331
2332
2333
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		const char *name = info->secstrings + info->sechdrs[i].sh_name;
  		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC))
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2334
  			continue;
49668688d   Rusty Russell   module: pass load...
2335
  		if (!strstarts(name, ".data") && !strstarts(name, ".bss"))
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2336
  			continue;
49668688d   Rusty Russell   module: pass load...
2337
2338
  		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
  				   info->sechdrs[i].sh_size, GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2339
2340
2341
  	}
  }
  #else
49668688d   Rusty Russell   module: pass load...
2342
2343
  static inline void kmemleak_load_module(const struct module *mod,
  					const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2344
2345
2346
  {
  }
  #endif
106a4ee25   Rusty Russell   module: signature...
2347
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
2348
  static int module_sig_check(struct load_info *info)
106a4ee25   Rusty Russell   module: signature...
2349
2350
  {
  	int err = -ENOKEY;
34e1169d9   Kees Cook   module: add sysca...
2351
2352
  	const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1;
  	const void *mod = info->hdr;
caabe2405   David Howells   MODSIGN: Move the...
2353

34e1169d9   Kees Cook   module: add sysca...
2354
2355
  	if (info->len > markerlen &&
  	    memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) {
caabe2405   David Howells   MODSIGN: Move the...
2356
  		/* We truncate the module to discard the signature */
34e1169d9   Kees Cook   module: add sysca...
2357
2358
  		info->len -= markerlen;
  		err = mod_verify_sig(mod, &info->len);
106a4ee25   Rusty Russell   module: signature...
2359
2360
2361
2362
2363
2364
2365
2366
  	}
  
  	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...
2367
2368
2369
2370
  	if (err < 0 && fips_enabled)
  		panic("Module verification failed with error %d in FIPS mode
  ",
  		      err);
106a4ee25   Rusty Russell   module: signature...
2371
2372
2373
2374
2375
2376
  	if (err == -ENOKEY && !sig_enforce)
  		err = 0;
  
  	return err;
  }
  #else /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2377
  static int module_sig_check(struct load_info *info)
106a4ee25   Rusty Russell   module: signature...
2378
2379
2380
2381
  {
  	return 0;
  }
  #endif /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2382
2383
  /* Sanity checks against invalid binaries, wrong arch, weird elf version. */
  static int elf_header_check(struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2384
  {
34e1169d9   Kees Cook   module: add sysca...
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
  	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 ...
2398

34e1169d9   Kees Cook   module: add sysca...
2399
2400
2401
2402
2403
2404
  	return 0;
  }
  
  /* Sets info->hdr and info->len. */
  static int copy_module_from_user(const void __user *umod, unsigned long len,
  				  struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2405
2406
  {
  	int err;
40dd2560e   Rusty Russell   module: refactor ...
2407

34e1169d9   Kees Cook   module: add sysca...
2408
2409
  	info->len = len;
  	if (info->len < sizeof(*(info->hdr)))
40dd2560e   Rusty Russell   module: refactor ...
2410
  		return -ENOEXEC;
2e72d51b4   Kees Cook   security: introdu...
2411
2412
2413
  	err = security_kernel_module_from_file(NULL);
  	if (err)
  		return err;
40dd2560e   Rusty Russell   module: refactor ...
2414
  	/* Suck in entire file: we'll want most of it. */
34e1169d9   Kees Cook   module: add sysca...
2415
2416
  	info->hdr = vmalloc(info->len);
  	if (!info->hdr)
40dd2560e   Rusty Russell   module: refactor ...
2417
  		return -ENOMEM;
34e1169d9   Kees Cook   module: add sysca...
2418
2419
2420
  	if (copy_from_user(info->hdr, umod, info->len) != 0) {
  		vfree(info->hdr);
  		return -EFAULT;
40dd2560e   Rusty Russell   module: refactor ...
2421
  	}
34e1169d9   Kees Cook   module: add sysca...
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
  	return 0;
  }
  
  /* Sets info->hdr and info->len. */
  static int copy_module_from_fd(int fd, struct load_info *info)
  {
  	struct file *file;
  	int err;
  	struct kstat stat;
  	loff_t pos;
  	ssize_t bytes = 0;
  
  	file = fget(fd);
  	if (!file)
  		return -ENOEXEC;
2e72d51b4   Kees Cook   security: introdu...
2437
  	err = security_kernel_module_from_file(file);
106a4ee25   Rusty Russell   module: signature...
2438
  	if (err)
2e72d51b4   Kees Cook   security: introdu...
2439
  		goto out;
106a4ee25   Rusty Russell   module: signature...
2440

3dadecce2   Al Viro   switch vfs_getatt...
2441
  	err = vfs_getattr(&file->f_path, &stat);
106a4ee25   Rusty Russell   module: signature...
2442
  	if (err)
34e1169d9   Kees Cook   module: add sysca...
2443
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2444

34e1169d9   Kees Cook   module: add sysca...
2445
2446
2447
  	if (stat.size > INT_MAX) {
  		err = -EFBIG;
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2448
  	}
52441fa8f   Sasha Levin   module: prevent w...
2449
2450
2451
2452
2453
2454
  
  	/* Don't hand 0 to vmalloc, it whines. */
  	if (stat.size == 0) {
  		err = -EINVAL;
  		goto out;
  	}
34e1169d9   Kees Cook   module: add sysca...
2455
2456
2457
2458
  	info->hdr = vmalloc(stat.size);
  	if (!info->hdr) {
  		err = -ENOMEM;
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2459
  	}
d913188c7   Rusty Russell   module: layout_an...
2460

34e1169d9   Kees Cook   module: add sysca...
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
  	pos = 0;
  	while (pos < stat.size) {
  		bytes = kernel_read(file, pos, (char *)(info->hdr) + pos,
  				    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 ...
2475

34e1169d9   Kees Cook   module: add sysca...
2476
2477
  out:
  	fput(file);
40dd2560e   Rusty Russell   module: refactor ...
2478
2479
  	return err;
  }
d913188c7   Rusty Russell   module: layout_an...
2480
2481
  static void free_copy(struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2482
2483
  	vfree(info->hdr);
  }
2f3238aeb   Rusty Russell   module: add flags...
2484
  static int rewrite_section_headers(struct load_info *info, int flags)
8b5f61a79   Rusty Russell   module: refactor ...
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
  {
  	unsigned int i;
  
  	/* This should always be true, but let's be sure. */
  	info->sechdrs[0].sh_addr = 0;
  
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		Elf_Shdr *shdr = &info->sechdrs[i];
  		if (shdr->sh_type != SHT_NOBITS
  		    && info->len < shdr->sh_offset + shdr->sh_size) {
  			printk(KERN_ERR "Module len %lu truncated
  ",
  			       info->len);
  			return -ENOEXEC;
  		}
  
  		/* Mark all sections sh_addr with their address in the
  		   temporary image. */
  		shdr->sh_addr = (size_t)info->hdr + shdr->sh_offset;
  
  #ifndef CONFIG_MODULE_UNLOAD
  		/* Don't load .exit sections */
  		if (strstarts(info->secstrings+shdr->sh_name, ".exit"))
  			shdr->sh_flags &= ~(unsigned long)SHF_ALLOC;
  #endif
8b5f61a79   Rusty Russell   module: refactor ...
2510
  	}
d6df72a06   Rusty Russell   module: refactor ...
2511
2512
  
  	/* Track but don't keep modinfo and version sections. */
2f3238aeb   Rusty Russell   module: add flags...
2513
2514
2515
2516
  	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...
2517
  	info->index.info = find_sec(info, ".modinfo");
d6df72a06   Rusty Russell   module: refactor ...
2518
2519
  	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 ...
2520
2521
  	return 0;
  }
3264d3f9d   Linus Torvalds   module: add load_...
2522
2523
2524
2525
2526
2527
2528
2529
  /*
   * 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...
2530
  static struct module *setup_load_info(struct load_info *info, int flags)
3264d3f9d   Linus Torvalds   module: add load_...
2531
2532
  {
  	unsigned int i;
8b5f61a79   Rusty Russell   module: refactor ...
2533
  	int err;
3264d3f9d   Linus Torvalds   module: add load_...
2534
2535
2536
2537
  	struct module *mod;
  
  	/* Set up the convenience variables */
  	info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
8b5f61a79   Rusty Russell   module: refactor ...
2538
2539
  	info->secstrings = (void *)info->hdr
  		+ info->sechdrs[info->hdr->e_shstrndx].sh_offset;
3264d3f9d   Linus Torvalds   module: add load_...
2540

2f3238aeb   Rusty Russell   module: add flags...
2541
  	err = rewrite_section_headers(info, flags);
8b5f61a79   Rusty Russell   module: refactor ...
2542
2543
  	if (err)
  		return ERR_PTR(err);
3264d3f9d   Linus Torvalds   module: add load_...
2544

8b5f61a79   Rusty Russell   module: refactor ...
2545
2546
  	/* Find internal symbols and strings. */
  	for (i = 1; i < info->hdr->e_shnum; i++) {
3264d3f9d   Linus Torvalds   module: add load_...
2547
2548
2549
  		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 ...
2550
2551
2552
  			info->strtab = (char *)info->hdr
  				+ info->sechdrs[info->index.str].sh_offset;
  			break;
3264d3f9d   Linus Torvalds   module: add load_...
2553
  		}
3264d3f9d   Linus Torvalds   module: add load_...
2554
  	}
49668688d   Rusty Russell   module: pass load...
2555
  	info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
3264d3f9d   Linus Torvalds   module: add load_...
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
  	if (!info->index.mod) {
  		printk(KERN_WARNING "No module found in object
  ");
  		return ERR_PTR(-ENOEXEC);
  	}
  	/* This is temporary: point mod into copy of data. */
  	mod = (void *)info->sechdrs[info->index.mod].sh_addr;
  
  	if (info->index.sym == 0) {
  		printk(KERN_WARNING "%s: module has no symbols (stripped?)
  ",
  		       mod->name);
  		return ERR_PTR(-ENOEXEC);
  	}
49668688d   Rusty Russell   module: pass load...
2570
  	info->index.pcpu = find_pcpusec(info);
3264d3f9d   Linus Torvalds   module: add load_...
2571

3264d3f9d   Linus Torvalds   module: add load_...
2572
2573
2574
2575
2576
  	/* 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_...
2577
  }
2f3238aeb   Rusty Russell   module: add flags...
2578
  static int check_modinfo(struct module *mod, struct load_info *info, int flags)
40dd2560e   Rusty Russell   module: refactor ...
2579
  {
49668688d   Rusty Russell   module: pass load...
2580
  	const char *modmagic = get_modinfo(info, "vermagic");
40dd2560e   Rusty Russell   module: refactor ...
2581
  	int err;
2f3238aeb   Rusty Russell   module: add flags...
2582
2583
  	if (flags & MODULE_INIT_IGNORE_VERMAGIC)
  		modmagic = NULL;
40dd2560e   Rusty Russell   module: refactor ...
2584
2585
2586
2587
2588
  	/* 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...
2589
  	} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
40dd2560e   Rusty Russell   module: refactor ...
2590
2591
2592
2593
2594
  		printk(KERN_ERR "%s: version magic '%s' should be '%s'
  ",
  		       mod->name, modmagic, vermagic);
  		return -ENOEXEC;
  	}
2449b8ba0   Ben Hutchings   module,bug: Add T...
2595
  	if (!get_modinfo(info, "intree"))
373d4d099   Rusty Russell   taint: add explic...
2596
  		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
2449b8ba0   Ben Hutchings   module,bug: Add T...
2597

49668688d   Rusty Russell   module: pass load...
2598
  	if (get_modinfo(info, "staging")) {
373d4d099   Rusty Russell   taint: add explic...
2599
  		add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
40dd2560e   Rusty Russell   module: refactor ...
2600
2601
2602
2603
2604
  		printk(KERN_WARNING "%s: module is from the staging directory,"
  		       " the quality is unknown, you have been warned.
  ",
  		       mod->name);
  	}
22e268ebe   Rusty Russell   module: refactor ...
2605
2606
  
  	/* Set up license info based on the info section */
49668688d   Rusty Russell   module: pass load...
2607
  	set_license(mod, get_modinfo(info, "license"));
22e268ebe   Rusty Russell   module: refactor ...
2608

40dd2560e   Rusty Russell   module: refactor ...
2609
2610
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
2611
  static void find_module_sections(struct module *mod, struct load_info *info)
f91a13bb9   Linus Torvalds   module: refactor ...
2612
  {
49668688d   Rusty Russell   module: pass load...
2613
  	mod->kp = section_objs(info, "__param",
f91a13bb9   Linus Torvalds   module: refactor ...
2614
  			       sizeof(*mod->kp), &mod->num_kp);
49668688d   Rusty Russell   module: pass load...
2615
  	mod->syms = section_objs(info, "__ksymtab",
f91a13bb9   Linus Torvalds   module: refactor ...
2616
  				 sizeof(*mod->syms), &mod->num_syms);
49668688d   Rusty Russell   module: pass load...
2617
2618
  	mod->crcs = section_addr(info, "__kcrctab");
  	mod->gpl_syms = section_objs(info, "__ksymtab_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2619
2620
  				     sizeof(*mod->gpl_syms),
  				     &mod->num_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2621
2622
  	mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");
  	mod->gpl_future_syms = section_objs(info,
f91a13bb9   Linus Torvalds   module: refactor ...
2623
2624
2625
  					    "__ksymtab_gpl_future",
  					    sizeof(*mod->gpl_future_syms),
  					    &mod->num_gpl_future_syms);
49668688d   Rusty Russell   module: pass load...
2626
  	mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future");
f91a13bb9   Linus Torvalds   module: refactor ...
2627
2628
  
  #ifdef CONFIG_UNUSED_SYMBOLS
49668688d   Rusty Russell   module: pass load...
2629
  	mod->unused_syms = section_objs(info, "__ksymtab_unused",
f91a13bb9   Linus Torvalds   module: refactor ...
2630
2631
  					sizeof(*mod->unused_syms),
  					&mod->num_unused_syms);
49668688d   Rusty Russell   module: pass load...
2632
2633
  	mod->unused_crcs = section_addr(info, "__kcrctab_unused");
  	mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2634
2635
  					    sizeof(*mod->unused_gpl_syms),
  					    &mod->num_unused_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2636
  	mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
f91a13bb9   Linus Torvalds   module: refactor ...
2637
2638
  #endif
  #ifdef CONFIG_CONSTRUCTORS
49668688d   Rusty Russell   module: pass load...
2639
  	mod->ctors = section_objs(info, ".ctors",
f91a13bb9   Linus Torvalds   module: refactor ...
2640
2641
2642
2643
  				  sizeof(*mod->ctors), &mod->num_ctors);
  #endif
  
  #ifdef CONFIG_TRACEPOINTS
654986462   Mathieu Desnoyers   tracepoints: Fix ...
2644
2645
2646
  	mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
  					     sizeof(*mod->tracepoints_ptrs),
  					     &mod->num_tracepoints);
f91a13bb9   Linus Torvalds   module: refactor ...
2647
  #endif
bf5438fca   Jason Baron   jump label: Base ...
2648
2649
2650
2651
2652
  #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 ...
2653
  #ifdef CONFIG_EVENT_TRACING
49668688d   Rusty Russell   module: pass load...
2654
  	mod->trace_events = section_objs(info, "_ftrace_events",
f91a13bb9   Linus Torvalds   module: refactor ...
2655
2656
2657
2658
2659
2660
2661
2662
2663
  					 sizeof(*mod->trace_events),
  					 &mod->num_trace_events);
  	/*
  	 * This section contains pointers to allocated objects in the trace
  	 * code and not scanning it leads to false positives.
  	 */
  	kmemleak_scan_area(mod->trace_events, sizeof(*mod->trace_events) *
  			   mod->num_trace_events, GFP_KERNEL);
  #endif
13b9b6e74   Steven Rostedt   tracing: Fix modu...
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
  #ifdef CONFIG_TRACING
  	mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
  					 sizeof(*mod->trace_bprintk_fmt_start),
  					 &mod->num_trace_bprintk_fmt);
  	/*
  	 * This section contains pointers to allocated objects in the trace
  	 * code and not scanning it leads to false positives.
  	 */
  	kmemleak_scan_area(mod->trace_bprintk_fmt_start,
  			   sizeof(*mod->trace_bprintk_fmt_start) *
  			   mod->num_trace_bprintk_fmt, GFP_KERNEL);
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
2676
2677
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  	/* sechdrs[0].sh_size is always zero */
49668688d   Rusty Russell   module: pass load...
2678
  	mod->ftrace_callsites = section_objs(info, "__mcount_loc",
f91a13bb9   Linus Torvalds   module: refactor ...
2679
2680
2681
  					     sizeof(*mod->ftrace_callsites),
  					     &mod->num_ftrace_callsites);
  #endif
22e268ebe   Rusty Russell   module: refactor ...
2682

811d66a0e   Rusty Russell   module: group pos...
2683
2684
  	mod->extable = section_objs(info, "__ex_table",
  				    sizeof(*mod->extable), &mod->num_exentries);
49668688d   Rusty Russell   module: pass load...
2685
  	if (section_addr(info, "__obsparm"))
22e268ebe   Rusty Russell   module: refactor ...
2686
2687
2688
  		printk(KERN_WARNING "%s: Ignoring obsolete parameters
  ",
  		       mod->name);
811d66a0e   Rusty Russell   module: group pos...
2689
2690
2691
  
  	info->debug = section_objs(info, "__verbose",
  				   sizeof(*info->debug), &info->num_debug);
f91a13bb9   Linus Torvalds   module: refactor ...
2692
  }
49668688d   Rusty Russell   module: pass load...
2693
  static int move_module(struct module *mod, struct load_info *info)
65b8a9b4d   Linus Torvalds   module: refactor ...
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
  {
  	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...
2707
  		return -ENOMEM;
65b8a9b4d   Linus Torvalds   module: refactor ...
2708
2709
2710
  
  	memset(ptr, 0, mod->core_size);
  	mod->module_core = ptr;
82fab442f   Rusty Russell   modules: don't ha...
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
  	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 ...
2728
2729
  
  	/* Transfer each section which specifies SHF_ALLOC */
5e1241692   Jim Cromie   module: replace D...
2730
2731
  	pr_debug("final section addresses:
  ");
49668688d   Rusty Russell   module: pass load...
2732
  	for (i = 0; i < info->hdr->e_shnum; i++) {
65b8a9b4d   Linus Torvalds   module: refactor ...
2733
  		void *dest;
49668688d   Rusty Russell   module: pass load...
2734
  		Elf_Shdr *shdr = &info->sechdrs[i];
65b8a9b4d   Linus Torvalds   module: refactor ...
2735

49668688d   Rusty Russell   module: pass load...
2736
  		if (!(shdr->sh_flags & SHF_ALLOC))
65b8a9b4d   Linus Torvalds   module: refactor ...
2737
  			continue;
49668688d   Rusty Russell   module: pass load...
2738
  		if (shdr->sh_entsize & INIT_OFFSET_MASK)
65b8a9b4d   Linus Torvalds   module: refactor ...
2739
  			dest = mod->module_init
49668688d   Rusty Russell   module: pass load...
2740
  				+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);
65b8a9b4d   Linus Torvalds   module: refactor ...
2741
  		else
49668688d   Rusty Russell   module: pass load...
2742
  			dest = mod->module_core + shdr->sh_entsize;
65b8a9b4d   Linus Torvalds   module: refactor ...
2743

49668688d   Rusty Russell   module: pass load...
2744
2745
  		if (shdr->sh_type != SHT_NOBITS)
  			memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
65b8a9b4d   Linus Torvalds   module: refactor ...
2746
  		/* Update sh_addr to point to copy in image. */
49668688d   Rusty Russell   module: pass load...
2747
  		shdr->sh_addr = (unsigned long)dest;
5e1241692   Jim Cromie   module: replace D...
2748
2749
2750
  		pr_debug("\t0x%lx %s
  ",
  			 (long)shdr->sh_addr, info->secstrings + shdr->sh_name);
65b8a9b4d   Linus Torvalds   module: refactor ...
2751
  	}
d913188c7   Rusty Russell   module: layout_an...
2752
2753
  
  	return 0;
65b8a9b4d   Linus Torvalds   module: refactor ...
2754
  }
49668688d   Rusty Russell   module: pass load...
2755
  static int check_module_license_and_versions(struct module *mod)
22e268ebe   Rusty Russell   module: refactor ...
2756
2757
2758
2759
2760
2761
2762
  {
  	/*
  	 * 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...
2763
  		add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
2764
2765
2766
  
  	/* driverloader was caught wrongly pretending to be under GPL */
  	if (strcmp(mod->name, "driverloader") == 0)
373d4d099   Rusty Russell   taint: add explic...
2767
2768
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
2769

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

22e268ebe   Rusty Russell   module: refactor ...
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
  #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...
2813
2814
2815
2816
2817
2818
2819
  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...
2820
  static struct module *layout_and_allocate(struct load_info *info, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2821
  {
d913188c7   Rusty Russell   module: layout_an...
2822
  	/* Module within temporary copy. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2823
  	struct module *mod;
49668688d   Rusty Russell   module: pass load...
2824
  	Elf_Shdr *pcpusec;
d913188c7   Rusty Russell   module: layout_an...
2825
  	int err;
3ae91c21d   Paul Mundt   module: fix up CO...
2826

2f3238aeb   Rusty Russell   module: add flags...
2827
  	mod = setup_load_info(info, flags);
d913188c7   Rusty Russell   module: layout_an...
2828
2829
  	if (IS_ERR(mod))
  		return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2830

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

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

49668688d   Rusty Russell   module: pass load...
2841
2842
  	pcpusec = &info->sechdrs[info->index.pcpu];
  	if (pcpusec->sh_size) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2843
  		/* We have a special allocation for this section. */
49668688d   Rusty Russell   module: pass load...
2844
2845
  		err = percpu_modalloc(mod,
  				      pcpusec->sh_size, pcpusec->sh_addralign);
259354dea   Tejun Heo   module: encapsula...
2846
  		if (err)
6526c534b   Rusty Russell   module: move modu...
2847
  			goto out;
49668688d   Rusty Russell   module: pass load...
2848
  		pcpusec->sh_flags &= ~(unsigned long)SHF_ALLOC;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2849
2850
2851
2852
2853
  	}
  
  	/* 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...
2854
  	layout_sections(mod, info);
49668688d   Rusty Russell   module: pass load...
2855
  	layout_symtab(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2856

65b8a9b4d   Linus Torvalds   module: refactor ...
2857
  	/* Allocate and move to the final place */
49668688d   Rusty Russell   module: pass load...
2858
  	err = move_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2859
  	if (err)
48fd11880   Kevin Cernekee   module: Fix perfo...
2860
  		goto free_percpu;
d913188c7   Rusty Russell   module: layout_an...
2861
2862
2863
  
  	/* 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...
2864
  	kmemleak_load_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2865
  	return mod;
d913188c7   Rusty Russell   module: layout_an...
2866
2867
  free_percpu:
  	percpu_modfree(mod);
6526c534b   Rusty Russell   module: move modu...
2868
  out:
d913188c7   Rusty Russell   module: layout_an...
2869
2870
2871
2872
2873
2874
  	return ERR_PTR(err);
  }
  
  /* mod is no longer valid after this! */
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2875
2876
2877
2878
  	percpu_modfree(mod);
  	module_free(mod, mod->module_init);
  	module_free(mod, mod->module_core);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2879
2880
2881
2882
2883
2884
  int __weak module_finalize(const Elf_Ehdr *hdr,
  			   const Elf_Shdr *sechdrs,
  			   struct module *me)
  {
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
2885
2886
  static int post_relocation(struct module *mod, const struct load_info *info)
  {
51f3d0f47   Rusty Russell   module: cleanup c...
2887
  	/* Sort exception table now relocations are done. */
811d66a0e   Rusty Russell   module: group pos...
2888
2889
2890
2891
2892
  	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...
2893
  	/* Setup kallsyms-specific fields. */
811d66a0e   Rusty Russell   module: group pos...
2894
2895
2896
2897
2898
  	add_kallsyms(mod, info);
  
  	/* Arch-specific module finalizing. */
  	return module_finalize(info->hdr, info->sechdrs, mod);
  }
9bb9c3be5   Rusty Russell   module: wait when...
2899
2900
2901
2902
2903
2904
2905
  /* 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);
1fb9341ac   Rusty Russell   module: put modul...
2906
  	mod = find_module_all(name, true);
0d21b0e34   Rusty Russell   module: add new s...
2907
2908
  	ret = !mod || mod->state == MODULE_STATE_LIVE
  		|| mod->state == MODULE_STATE_GOING;
9bb9c3be5   Rusty Russell   module: wait when...
2909
2910
2911
2912
  	mutex_unlock(&module_mutex);
  
  	return ret;
  }
34e1169d9   Kees Cook   module: add sysca...
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
  /* 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...
2928
2929
2930
2931
2932
  	/*
  	 * 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...
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
  	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) {
  		printk(KERN_WARNING
  "%s: '%s'->init suspiciously returned %d, it should follow 0/-E convention
  "
  "%s: loading module anyway...
  ",
  		       __func__, mod->name, ret,
  		       __func__);
  		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...
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
  	/*
  	 * 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...
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
  
  	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 ...
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
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
  /*
   * 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);
  	if ((old = find_module_all(mod->name, true)) != NULL) {
  		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;
  }
d913188c7   Rusty Russell   module: layout_an...
3086
3087
  /* 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...
3088
3089
  static int load_module(struct load_info *info, const char __user *uargs,
  		       int flags)
d913188c7   Rusty Russell   module: layout_an...
3090
  {
a3535c7e4   Rusty Russell   module: clean up ...
3091
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
3092
  	long err;
d913188c7   Rusty Russell   module: layout_an...
3093

34e1169d9   Kees Cook   module: add sysca...
3094
3095
3096
  	err = module_sig_check(info);
  	if (err)
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3097

34e1169d9   Kees Cook   module: add sysca...
3098
  	err = elf_header_check(info);
d913188c7   Rusty Russell   module: layout_an...
3099
  	if (err)
34e1169d9   Kees Cook   module: add sysca...
3100
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3101
3102
  
  	/* Figure out module layout, and allocate all the memory. */
2f3238aeb   Rusty Russell   module: add flags...
3103
  	mod = layout_and_allocate(info, flags);
65b8a9b4d   Linus Torvalds   module: refactor ...
3104
3105
  	if (IS_ERR(mod)) {
  		err = PTR_ERR(mod);
d913188c7   Rusty Russell   module: layout_an...
3106
  		goto free_copy;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3107
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3108

a3535c7e4   Rusty Russell   module: clean up ...
3109
3110
3111
  	/* Reserve our place in the list. */
  	err = add_unformed_module(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3112
  		goto free_module;
1fb9341ac   Rusty Russell   module: put modul...
3113

106a4ee25   Rusty Russell   module: signature...
3114
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
3115
  	mod->sig_ok = info->sig_ok;
64748a2c9   Rusty Russell   module: printk me...
3116
3117
3118
3119
3120
3121
  	if (!mod->sig_ok) {
  		printk_once(KERN_NOTICE
  			    "%s: module verification failed: signature and/or"
  			    " required key missing - tainting kernel
  ",
  			    mod->name);
373d4d099   Rusty Russell   taint: add explic...
3122
  		add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_STILL_OK);
64748a2c9   Rusty Russell   module: printk me...
3123
  	}
106a4ee25   Rusty Russell   module: signature...
3124
  #endif
49668688d   Rusty Russell   module: pass load...
3125
  	/* Now module is in final location, initialize linked lists, etc. */
9f85a4bbb   Rusty Russell   module: refactor ...
3126
3127
  	err = module_unload_init(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3128
  		goto unlink_mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3129

22e268ebe   Rusty Russell   module: refactor ...
3130
3131
  	/* Now we've got everything in the final locations, we can
  	 * find optional sections. */
34e1169d9   Kees Cook   module: add sysca...
3132
  	find_module_sections(mod, info);
9b37ccfc6   Pavel Roskin   module: allow ndi...
3133

49668688d   Rusty Russell   module: pass load...
3134
  	err = check_module_license_and_versions(mod);
22e268ebe   Rusty Russell   module: refactor ...
3135
3136
  	if (err)
  		goto free_unload;
9841d61d7   Dave Jones   [PATCH] Add taint...
3137

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

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

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

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

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

6526c534b   Rusty Russell   module: move modu...
3156
3157
3158
3159
3160
3161
  	/* 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...
3162

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

a3535c7e4   Rusty Russell   module: clean up ...
3165
3166
3167
  	/* Finally it's fully formed, ready to start executing. */
  	err = complete_formation(mod, info);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3168
  		goto ddebug_cleanup;
be593f4ce   Rusty Russell   module: verify_ex...
3169

51f3d0f47   Rusty Russell   module: cleanup c...
3170
  	/* Module is ready to execute: parsing args may do that. */
026cee008   Pawel Moll   params: <level>_i...
3171
  	err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
b48420c1d   Jim Cromie   dynamic_debug: ma...
3172
  			 -32768, 32767, &ddebug_dyndbg_module_param_cb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3173
  	if (err < 0)
1fb9341ac   Rusty Russell   module: put modul...
3174
  		goto bug_cleanup;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3175

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

48fd11880   Kevin Cernekee   module: Fix perfo...
3181
  	/* Get rid of temporary copy. */
34e1169d9   Kees Cook   module: add sysca...
3182
  	free_copy(info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3183
3184
  
  	/* Done! */
51f3d0f47   Rusty Russell   module: cleanup c...
3185
  	trace_module_load(mod);
34e1169d9   Kees Cook   module: add sysca...
3186
3187
  
  	return do_init_module(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3188

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

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

34e1169d9   Kees Cook   module: add sysca...
3226
3227
3228
  	pr_debug("init_module: umod=%p, len=%lu, uargs=%p
  ",
  	       umod, len, uargs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3229

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

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

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

34e1169d9   Kees Cook   module: add sysca...
3242
3243
3244
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3245

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

2f3238aeb   Rusty Russell   module: add flags...
3249
3250
3251
  	if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
  		      |MODULE_INIT_IGNORE_VERMAGIC))
  		return -EINVAL;
d6de2c80e   Linus Torvalds   async: Fix module...
3252

34e1169d9   Kees Cook   module: add sysca...
3253
3254
3255
  	err = copy_module_from_fd(fd, &info);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3256

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
  	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/...
3551
  static const struct seq_operations modules_op = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3552
3553
3554
3555
3556
  	.start	= m_start,
  	.next	= m_next,
  	.stop	= m_stop,
  	.show	= m_show
  };
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
  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
3576
3577
3578
  /* 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
3579
3580
  	const struct exception_table_entry *e = NULL;
  	struct module *mod;
24da1cbff   Rusty Russell   modules: remove m...
3581
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3582
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3583
3584
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3585
3586
  		if (mod->num_exentries == 0)
  			continue;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3587

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3588
3589
3590
3591
3592
3593
  		e = search_extable(mod->extable,
  				   mod->extable + mod->num_exentries - 1,
  				   addr);
  		if (e)
  			break;
  	}
24da1cbff   Rusty Russell   modules: remove m...
3594
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3595
3596
  
  	/* Now, if we found one, we are running inside it now, hence
22a8bdeb5   Daniel Walker   whitespace fixes:...
3597
  	   we cannot unload the module, hence no refcnt needed. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3598
3599
  	return e;
  }
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3600
  /*
e610499e2   Rusty Russell   module: __module_...
3601
3602
3603
3604
3605
   * 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: ...
3606
   */
e610499e2   Rusty Russell   module: __module_...
3607
  bool is_module_address(unsigned long addr)
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3608
  {
e610499e2   Rusty Russell   module: __module_...
3609
  	bool ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3610

24da1cbff   Rusty Russell   modules: remove m...
3611
  	preempt_disable();
e610499e2   Rusty Russell   module: __module_...
3612
  	ret = __module_address(addr) != NULL;
24da1cbff   Rusty Russell   modules: remove m...
3613
  	preempt_enable();
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3614

e610499e2   Rusty Russell   module: __module_...
3615
  	return ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3616
  }
e610499e2   Rusty Russell   module: __module_...
3617
3618
3619
3620
3621
3622
3623
  /*
   * __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...
3624
  struct module *__module_address(unsigned long addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3625
3626
  {
  	struct module *mod;
3a642e99b   Rusty Russell   modules: Take a s...
3627
3628
  	if (addr < module_addr_min || addr > module_addr_max)
  		return NULL;
0d21b0e34   Rusty Russell   module: add new s...
3629
3630
3631
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
e610499e2   Rusty Russell   module: __module_...
3632
3633
  		if (within_module_core(addr, mod)
  		    || within_module_init(addr, mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3634
  			return mod;
0d21b0e34   Rusty Russell   module: add new s...
3635
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3636
3637
  	return NULL;
  }
c6b378019   Tim Abbott   module: Export sy...
3638
  EXPORT_SYMBOL_GPL(__module_address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3639

e610499e2   Rusty Russell   module: __module_...
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
  /*
   * 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...
3677
  EXPORT_SYMBOL_GPL(__module_text_address);
e610499e2   Rusty Russell   module: __module_...
3678

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3679
3680
3681
3682
  /* Don't grab lock, we're oopsing. */
  void print_modules(void)
  {
  	struct module *mod;
2bc2d61a9   Randy Dunlap   [PATCH] list modu...
3683
  	char buf[8];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3684

b231125af   Linus Torvalds   printk: add KERN_...
3685
  	printk(KERN_DEFAULT "Modules linked in:");
d72b37513   Andi Kleen   Remove stop_machi...
3686
3687
  	/* Most callers should already have preempt disabled, but make sure */
  	preempt_disable();
0d21b0e34   Rusty Russell   module: add new s...
3688
3689
3690
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
21aa9280b   Arjan van de Ven   debug: show being...
3691
  		printk(" %s%s", mod->name, module_flags(mod, buf));
0d21b0e34   Rusty Russell   module: add new s...
3692
  	}
d72b37513   Andi Kleen   Remove stop_machi...
3693
  	preempt_enable();
e14af7eeb   Arjan van de Ven   debug: track and ...
3694
3695
  	if (last_unloaded_module[0])
  		printk(" [last unloaded: %s]", last_unloaded_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3696
3697
3698
  	printk("
  ");
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3699
  #ifdef CONFIG_MODVERSIONS
8c8ef42ae   Rusty Russell   module: include o...
3700
3701
3702
3703
3704
3705
  /* 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 ...
3706
  		   struct tracepoint * const *tp)
8c8ef42ae   Rusty Russell   module: include o...
3707
3708
3709
  {
  }
  EXPORT_SYMBOL(module_layout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3710
  #endif