Blame view

kernel/module.c 103 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>
af658dca2   Steven Rostedt (Red Hat)   tracing: Rename f...
21
  #include <linux/trace_events.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
  #include <linux/device.h>
c988d2b28   Matt Domsch   [PATCH] modules: ...
46
  #include <linux/string.h>
97d1f15b7   Arjan van de Ven   [PATCH] sem2mutex...
47
  #include <linux/mutex.h>
d72b37513   Andi Kleen   Remove stop_machi...
48
  #include <linux/rculist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  #include <asm/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  #include <asm/cacheflush.h>
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
51
  #include <asm/mmu_context.h>
b817f6fef   Sam Ravnborg   kbuild: check lic...
52
  #include <linux/license.h>
6d7623943   Christoph Lameter   modules: include ...
53
  #include <asm/sections.h>
97e1c18e8   Mathieu Desnoyers   tracing: Kernel T...
54
  #include <linux/tracepoint.h>
90d595fe5   Steven Rostedt   ftrace: enable mc...
55
  #include <linux/ftrace.h>
22a9d6456   Arjan van de Ven   async: Asynchrono...
56
  #include <linux/async.h>
fbf59bc9d   Tejun Heo   percpu: implement...
57
  #include <linux/percpu.h>
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
58
  #include <linux/kmemleak.h>
bf5438fca   Jason Baron   jump label: Base ...
59
  #include <linux/jump_label.h>
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
60
  #include <linux/pfn.h>
403ed2784   Alessio Igor Bogani   module: Use the b...
61
  #include <linux/bsearch.h>
2f3238aeb   Rusty Russell   module: add flags...
62
  #include <uapi/linux/module.h>
106a4ee25   Rusty Russell   module: signature...
63
  #include "module-internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64

7ead8b831   Li Zefan   tracing/events: A...
65
66
  #define CREATE_TRACE_POINTS
  #include <trace/events/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
68
69
  #ifndef ARCH_SHF_SMALL
  #define ARCH_SHF_SMALL 0
  #endif
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
70
71
72
73
74
75
76
77
78
79
  /*
   * 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
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
  /* 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...
82
83
84
85
86
  /*
   * Mutex protects:
   * 1) List of modules (also safely readable with preempt_disable),
   * 2) module_use links,
   * 3) module_addr_min/module_addr_max.
e513cc1c0   Masami Hiramatsu   module: Remove st...
87
   * (delete and add uses RCU list operations). */
c6b378019   Tim Abbott   module: Export sy...
88
89
  DEFINE_MUTEX(module_mutex);
  EXPORT_SYMBOL_GPL(module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
  static LIST_HEAD(modules);
67fc4e0cb   Jason Wessel   kdb: core for kgd...
91

6c9692e2d   Peter Zijlstra   module: Make the ...
92
  #ifdef CONFIG_MODULES_TREE_LOOKUP
106a4ee25   Rusty Russell   module: signature...
93

93c2e105f   Peter Zijlstra   module: Optimize ...
94
95
96
97
  /*
   * Use a latched RB-tree for __module_address(); this allows us to use
   * RCU-sched lookups of the address from any context.
   *
6c9692e2d   Peter Zijlstra   module: Make the ...
98
99
100
   * This is conditional on PERF_EVENTS || TRACING because those can really hit
   * __module_address() hard by doing a lot of stack unwinding; potentially from
   * NMI context.
93c2e105f   Peter Zijlstra   module: Optimize ...
101
102
103
   */
  
  static __always_inline unsigned long __mod_tree_val(struct latch_tree_node *n)
106a4ee25   Rusty Russell   module: signature...
104
  {
7523e4dc5   Rusty Russell   module: use a str...
105
  	struct module_layout *layout = container_of(n, struct module_layout, mtn.node);
106a4ee25   Rusty Russell   module: signature...
106

7523e4dc5   Rusty Russell   module: use a str...
107
  	return (unsigned long)layout->base;
93c2e105f   Peter Zijlstra   module: Optimize ...
108
109
110
111
  }
  
  static __always_inline unsigned long __mod_tree_size(struct latch_tree_node *n)
  {
7523e4dc5   Rusty Russell   module: use a str...
112
  	struct module_layout *layout = container_of(n, struct module_layout, mtn.node);
93c2e105f   Peter Zijlstra   module: Optimize ...
113

7523e4dc5   Rusty Russell   module: use a str...
114
  	return (unsigned long)layout->size;
93c2e105f   Peter Zijlstra   module: Optimize ...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
  }
  
  static __always_inline bool
  mod_tree_less(struct latch_tree_node *a, struct latch_tree_node *b)
  {
  	return __mod_tree_val(a) < __mod_tree_val(b);
  }
  
  static __always_inline int
  mod_tree_comp(void *key, struct latch_tree_node *n)
  {
  	unsigned long val = (unsigned long)key;
  	unsigned long start, end;
  
  	start = __mod_tree_val(n);
  	if (val < start)
  		return -1;
  
  	end = start + __mod_tree_size(n);
  	if (val >= end)
  		return 1;
106a4ee25   Rusty Russell   module: signature...
136

106a4ee25   Rusty Russell   module: signature...
137
138
  	return 0;
  }
93c2e105f   Peter Zijlstra   module: Optimize ...
139
140
141
142
  static const struct latch_tree_ops mod_tree_ops = {
  	.less = mod_tree_less,
  	.comp = mod_tree_comp,
  };
4f666546d   Peter Zijlstra   module: Rework mo...
143
144
145
146
147
148
  static struct mod_tree_root {
  	struct latch_tree_root root;
  	unsigned long addr_min;
  	unsigned long addr_max;
  } mod_tree __cacheline_aligned = {
  	.addr_min = -1UL,
106a4ee25   Rusty Russell   module: signature...
149
  };
106a4ee25   Rusty Russell   module: signature...
150

4f666546d   Peter Zijlstra   module: Rework mo...
151
152
153
154
155
156
157
158
159
160
161
162
  #define module_addr_min mod_tree.addr_min
  #define module_addr_max mod_tree.addr_max
  
  static noinline void __mod_tree_insert(struct mod_tree_node *node)
  {
  	latch_tree_insert(&node->node, &mod_tree.root, &mod_tree_ops);
  }
  
  static void __mod_tree_remove(struct mod_tree_node *node)
  {
  	latch_tree_erase(&node->node, &mod_tree.root, &mod_tree_ops);
  }
93c2e105f   Peter Zijlstra   module: Optimize ...
163
164
165
166
167
168
169
  
  /*
   * These modifications: insert, remove_init and remove; are serialized by the
   * module_mutex.
   */
  static void mod_tree_insert(struct module *mod)
  {
7523e4dc5   Rusty Russell   module: use a str...
170
171
  	mod->core_layout.mtn.mod = mod;
  	mod->init_layout.mtn.mod = mod;
93c2e105f   Peter Zijlstra   module: Optimize ...
172

7523e4dc5   Rusty Russell   module: use a str...
173
174
175
  	__mod_tree_insert(&mod->core_layout.mtn);
  	if (mod->init_layout.size)
  		__mod_tree_insert(&mod->init_layout.mtn);
93c2e105f   Peter Zijlstra   module: Optimize ...
176
177
178
179
  }
  
  static void mod_tree_remove_init(struct module *mod)
  {
7523e4dc5   Rusty Russell   module: use a str...
180
181
  	if (mod->init_layout.size)
  		__mod_tree_remove(&mod->init_layout.mtn);
93c2e105f   Peter Zijlstra   module: Optimize ...
182
183
184
185
  }
  
  static void mod_tree_remove(struct module *mod)
  {
7523e4dc5   Rusty Russell   module: use a str...
186
  	__mod_tree_remove(&mod->core_layout.mtn);
93c2e105f   Peter Zijlstra   module: Optimize ...
187
188
  	mod_tree_remove_init(mod);
  }
6c9692e2d   Peter Zijlstra   module: Make the ...
189
  static struct module *mod_find(unsigned long addr)
93c2e105f   Peter Zijlstra   module: Optimize ...
190
191
  {
  	struct latch_tree_node *ltn;
4f666546d   Peter Zijlstra   module: Rework mo...
192
  	ltn = latch_tree_find((void *)addr, &mod_tree.root, &mod_tree_ops);
93c2e105f   Peter Zijlstra   module: Optimize ...
193
194
195
196
197
  	if (!ltn)
  		return NULL;
  
  	return container_of(ltn, struct mod_tree_node, node)->mod;
  }
6c9692e2d   Peter Zijlstra   module: Make the ...
198
  #else /* MODULES_TREE_LOOKUP */
4f666546d   Peter Zijlstra   module: Rework mo...
199
  static unsigned long module_addr_min = -1UL, module_addr_max = 0;
6c9692e2d   Peter Zijlstra   module: Make the ...
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
  static void mod_tree_insert(struct module *mod) { }
  static void mod_tree_remove_init(struct module *mod) { }
  static void mod_tree_remove(struct module *mod) { }
  
  static struct module *mod_find(unsigned long addr)
  {
  	struct module *mod;
  
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (within_module(addr, mod))
  			return mod;
  	}
  
  	return NULL;
  }
  
  #endif /* MODULES_TREE_LOOKUP */
4f666546d   Peter Zijlstra   module: Rework mo...
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  /*
   * Bounds of module text, for speeding up __module_address.
   * Protected by module_mutex.
   */
  static void __mod_update_bounds(void *base, unsigned int size)
  {
  	unsigned long min = (unsigned long)base;
  	unsigned long max = min + size;
  
  	if (min < module_addr_min)
  		module_addr_min = min;
  	if (max > module_addr_max)
  		module_addr_max = max;
  }
  
  static void mod_update_bounds(struct module *mod)
  {
7523e4dc5   Rusty Russell   module: use a str...
234
235
236
  	__mod_update_bounds(mod->core_layout.base, mod->core_layout.size);
  	if (mod->init_layout.size)
  		__mod_update_bounds(mod->init_layout.base, mod->init_layout.size);
4f666546d   Peter Zijlstra   module: Rework mo...
237
  }
67fc4e0cb   Jason Wessel   kdb: core for kgd...
238
239
240
  #ifdef CONFIG_KGDB_KDB
  struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
  #endif /* CONFIG_KGDB_KDB */
0be964be0   Peter Zijlstra   module: Sanitize ...
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
  static void module_assert_mutex(void)
  {
  	lockdep_assert_held(&module_mutex);
  }
  
  static void module_assert_mutex_or_preempt(void)
  {
  #ifdef CONFIG_LOCKDEP
  	if (unlikely(!debug_locks))
  		return;
  
  	WARN_ON(!rcu_read_lock_sched_held() &&
  		!lockdep_is_held(&module_mutex));
  #endif
  }
6727bb9c6   Luis R. Rodriguez   kernel/module.c: ...
256
257
  static bool sig_enforce = IS_ENABLED(CONFIG_MODULE_SIG_FORCE);
  #ifndef CONFIG_MODULE_SIG_FORCE
106a4ee25   Rusty Russell   module: signature...
258
259
  module_param(sig_enforce, bool_enable_only, 0644);
  #endif /* !CONFIG_MODULE_SIG_FORCE */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260

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

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

6da0b5651   Ionut Alexa   kernel:module Fix...
269
  int register_module_notifier(struct notifier_block *nb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
271
  	return blocking_notifier_chain_register(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
273
  }
  EXPORT_SYMBOL(register_module_notifier);
6da0b5651   Ionut Alexa   kernel:module Fix...
274
  int unregister_module_notifier(struct notifier_block *nb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
276
  	return blocking_notifier_chain_unregister(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
  }
  EXPORT_SYMBOL(unregister_module_notifier);
eded41c1c   Rusty Russell   module: kallsyms ...
279
280
281
282
  struct load_info {
  	Elf_Ehdr *hdr;
  	unsigned long len;
  	Elf_Shdr *sechdrs;
6526c534b   Rusty Russell   module: move modu...
283
  	char *secstrings, *strtab;
d913188c7   Rusty Russell   module: layout_an...
284
  	unsigned long symoffs, stroffs;
811d66a0e   Rusty Russell   module: group pos...
285
286
  	struct _ddebug *debug;
  	unsigned int num_debug;
106a4ee25   Rusty Russell   module: signature...
287
  	bool sig_ok;
eded41c1c   Rusty Russell   module: kallsyms ...
288
289
290
291
  	struct {
  		unsigned int sym, str, mod, vers, info, pcpu;
  	} index;
  };
9a4b9708f   Matti Linnanvuori   module: fix and e...
292
293
  /* 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
294
295
  static inline int strong_try_module_get(struct module *mod)
  {
0d21b0e34   Rusty Russell   module: add new s...
296
  	BUG_ON(mod && mod->state == MODULE_STATE_UNFORMED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
  	if (mod && mod->state == MODULE_STATE_COMING)
c9a3ba55b   Rusty Russell   module: wait for ...
298
299
  		return -EBUSY;
  	if (try_module_get(mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
  		return 0;
c9a3ba55b   Rusty Russell   module: wait for ...
301
302
  	else
  		return -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
  }
373d4d099   Rusty Russell   taint: add explic...
304
305
  static inline void add_taint_module(struct module *mod, unsigned flag,
  				    enum lockdep_ok lockdep_ok)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
306
  {
373d4d099   Rusty Russell   taint: add explic...
307
  	add_taint(flag, lockdep_ok);
25ddbb18a   Andi Kleen   Make the taint fl...
308
  	mod->taints |= (1U << flag);
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
309
  }
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
310
311
312
  /*
   * 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
313
314
315
316
317
318
319
   */
  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:...
320

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
  /* Find a module section: 0 means not found. */
49668688d   Rusty Russell   module: pass load...
322
  static unsigned int find_sec(const struct load_info *info, const char *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
324
  {
  	unsigned int i;
49668688d   Rusty Russell   module: pass load...
325
326
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		Elf_Shdr *shdr = &info->sechdrs[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  		/* Alloc bit cleared means "ignore it." */
49668688d   Rusty Russell   module: pass load...
328
329
  		if ((shdr->sh_flags & SHF_ALLOC)
  		    && strcmp(info->secstrings + shdr->sh_name, name) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330
  			return i;
49668688d   Rusty Russell   module: pass load...
331
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
333
  	return 0;
  }
5e458cc0f   Rusty Russell   module: simplify ...
334
  /* Find a module section, or NULL. */
49668688d   Rusty Russell   module: pass load...
335
  static void *section_addr(const struct load_info *info, const char *name)
5e458cc0f   Rusty Russell   module: simplify ...
336
337
  {
  	/* Section 0 has sh_addr 0. */
49668688d   Rusty Russell   module: pass load...
338
  	return (void *)info->sechdrs[find_sec(info, name)].sh_addr;
5e458cc0f   Rusty Russell   module: simplify ...
339
340
341
  }
  
  /* Find a module section, or NULL.  Fill in number of "objects" in section. */
49668688d   Rusty Russell   module: pass load...
342
  static void *section_objs(const struct load_info *info,
5e458cc0f   Rusty Russell   module: simplify ...
343
344
345
346
  			  const char *name,
  			  size_t object_size,
  			  unsigned int *num)
  {
49668688d   Rusty Russell   module: pass load...
347
  	unsigned int sec = find_sec(info, name);
5e458cc0f   Rusty Russell   module: simplify ...
348
349
  
  	/* Section 0 has sh_addr 0 and sh_size 0. */
49668688d   Rusty Russell   module: pass load...
350
351
  	*num = info->sechdrs[sec].sh_size / object_size;
  	return (void *)info->sechdrs[sec].sh_addr;
5e458cc0f   Rusty Russell   module: simplify ...
352
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
354
355
356
357
  /* 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...
358
359
  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
360
361
  extern const unsigned long __start___kcrctab[];
  extern const unsigned long __start___kcrctab_gpl[];
9f28bb7e1   Greg Kroah-Hartman   [PATCH] add EXPOR...
362
  extern const unsigned long __start___kcrctab_gpl_future[];
f7f5b6755   Denys Vlasenko   Shrink struct mod...
363
364
365
366
367
  #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...
368
369
  extern const unsigned long __start___kcrctab_unused[];
  extern const unsigned long __start___kcrctab_unused_gpl[];
f7f5b6755   Denys Vlasenko   Shrink struct mod...
370
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
372
373
374
  
  #ifndef CONFIG_MODVERSIONS
  #define symversion(base, idx) NULL
  #else
f83ca9fe3   Andrew Morton   [PATCH] symversio...
375
  #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
  #endif
dafd0940c   Rusty Russell   module: generic e...
377
378
379
380
381
  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...
382
  					      void *data),
dafd0940c   Rusty Russell   module: generic e...
383
  				   void *data)
ad9546c99   Rusty Russell   module: neaten __...
384
  {
de4d8d534   Rusty Russell   module: each_symb...
385
  	unsigned int j;
ad9546c99   Rusty Russell   module: neaten __...
386

dafd0940c   Rusty Russell   module: generic e...
387
  	for (j = 0; j < arrsize; j++) {
de4d8d534   Rusty Russell   module: each_symb...
388
389
  		if (fn(&arr[j], owner, data))
  			return true;
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
390
  	}
dafd0940c   Rusty Russell   module: generic e...
391
392
  
  	return false;
ad9546c99   Rusty Russell   module: neaten __...
393
  }
dafd0940c   Rusty Russell   module: generic e...
394
  /* Returns true as soon as fn returns true, otherwise false. */
de4d8d534   Rusty Russell   module: each_symb...
395
396
397
398
  bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
  				    struct module *owner,
  				    void *data),
  			 void *data)
ad9546c99   Rusty Russell   module: neaten __...
399
400
  {
  	struct module *mod;
44032e631   Linus Torvalds   module: reduce st...
401
  	static const struct symsearch arr[] = {
ad9546c99   Rusty Russell   module: neaten __...
402
  		{ __start___ksymtab, __stop___ksymtab, __start___kcrctab,
dafd0940c   Rusty Russell   module: generic e...
403
  		  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
404
  		{ __start___ksymtab_gpl, __stop___ksymtab_gpl,
dafd0940c   Rusty Russell   module: generic e...
405
406
  		  __start___kcrctab_gpl,
  		  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
407
  		{ __start___ksymtab_gpl_future, __stop___ksymtab_gpl_future,
dafd0940c   Rusty Russell   module: generic e...
408
409
  		  __start___kcrctab_gpl_future,
  		  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
410
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
411
  		{ __start___ksymtab_unused, __stop___ksymtab_unused,
dafd0940c   Rusty Russell   module: generic e...
412
413
  		  __start___kcrctab_unused,
  		  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
414
  		{ __start___ksymtab_unused_gpl, __stop___ksymtab_unused_gpl,
dafd0940c   Rusty Russell   module: generic e...
415
416
  		  __start___kcrctab_unused_gpl,
  		  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
417
  #endif
ad9546c99   Rusty Russell   module: neaten __...
418
  	};
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
419

0be964be0   Peter Zijlstra   module: Sanitize ...
420
  	module_assert_mutex_or_preempt();
dafd0940c   Rusty Russell   module: generic e...
421
422
  	if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data))
  		return true;
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
423

d72b37513   Andi Kleen   Remove stop_machi...
424
  	list_for_each_entry_rcu(mod, &modules, list) {
ad9546c99   Rusty Russell   module: neaten __...
425
426
  		struct symsearch arr[] = {
  			{ mod->syms, mod->syms + mod->num_syms, mod->crcs,
dafd0940c   Rusty Russell   module: generic e...
427
  			  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
428
  			{ mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
429
430
  			  mod->gpl_crcs,
  			  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
431
432
  			{ mod->gpl_future_syms,
  			  mod->gpl_future_syms + mod->num_gpl_future_syms,
dafd0940c   Rusty Russell   module: generic e...
433
434
  			  mod->gpl_future_crcs,
  			  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
435
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
436
437
  			{ mod->unused_syms,
  			  mod->unused_syms + mod->num_unused_syms,
dafd0940c   Rusty Russell   module: generic e...
438
439
  			  mod->unused_crcs,
  			  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
440
441
  			{ mod->unused_gpl_syms,
  			  mod->unused_gpl_syms + mod->num_unused_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
442
443
  			  mod->unused_gpl_crcs,
  			  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
444
  #endif
ad9546c99   Rusty Russell   module: neaten __...
445
  		};
0d21b0e34   Rusty Russell   module: add new s...
446
447
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
dafd0940c   Rusty Russell   module: generic e...
448
449
450
451
452
  		if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data))
  			return true;
  	}
  	return false;
  }
de4d8d534   Rusty Russell   module: each_symb...
453
  EXPORT_SYMBOL_GPL(each_symbol_section);
dafd0940c   Rusty Russell   module: generic e...
454
455
456
457
458
459
460
461
462
463
  
  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...
464
  	const struct kernel_symbol *sym;
dafd0940c   Rusty Russell   module: generic e...
465
  };
de4d8d534   Rusty Russell   module: each_symb...
466
467
468
  static bool check_symbol(const struct symsearch *syms,
  				 struct module *owner,
  				 unsigned int symnum, void *data)
dafd0940c   Rusty Russell   module: generic e...
469
470
  {
  	struct find_symbol_arg *fsa = data;
dafd0940c   Rusty Russell   module: generic e...
471
472
473
474
  	if (!fsa->gplok) {
  		if (syms->licence == GPL_ONLY)
  			return false;
  		if (syms->licence == WILL_BE_GPL_ONLY && fsa->warn) {
bddb12b32   Andrew Morton   kernel/module.c: ...
475
476
477
478
  			pr_warn("Symbol %s is being used by a non-GPL module, "
  				"which will not be allowed in the future
  ",
  				fsa->name);
9f28bb7e1   Greg Kroah-Hartman   [PATCH] add EXPOR...
479
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480
  	}
ad9546c99   Rusty Russell   module: neaten __...
481

f7f5b6755   Denys Vlasenko   Shrink struct mod...
482
  #ifdef CONFIG_UNUSED_SYMBOLS
dafd0940c   Rusty Russell   module: generic e...
483
  	if (syms->unused && fsa->warn) {
bddb12b32   Andrew Morton   kernel/module.c: ...
484
485
486
487
488
  		pr_warn("Symbol %s is marked as UNUSED, however this module is "
  			"using it.
  ", fsa->name);
  		pr_warn("This symbol will go away in the future.
  ");
7b63c3ab9   Yannick Guerrini   kernel/module.c: ...
489
490
491
  		pr_warn("Please evaluate if this is the right api to use and "
  			"if it really is, submit a report to the linux kernel "
  			"mailing list together with submitting your code for "
bddb12b32   Andrew Morton   kernel/module.c: ...
492
493
  			"inclusion.
  ");
dafd0940c   Rusty Russell   module: generic e...
494
  	}
f7f5b6755   Denys Vlasenko   Shrink struct mod...
495
  #endif
dafd0940c   Rusty Russell   module: generic e...
496
497
498
  
  	fsa->owner = owner;
  	fsa->crc = symversion(syms->crcs, symnum);
414fd31b2   Tim Abbott   module: Make find...
499
  	fsa->sym = &syms->start[symnum];
dafd0940c   Rusty Russell   module: generic e...
500
501
  	return true;
  }
403ed2784   Alessio Igor Bogani   module: Use the b...
502
503
504
505
506
507
508
  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...
509
510
511
512
513
  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...
514
515
516
517
518
519
520
  	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...
521

de4d8d534   Rusty Russell   module: each_symb...
522
523
  	return false;
  }
414fd31b2   Tim Abbott   module: Make find...
524
  /* Find a symbol and return it, along with, (optional) crc and
75676500f   Rusty Russell   module: make lock...
525
   * (optional) module which owns it.  Needs preempt disabled or module_mutex. */
c6b378019   Tim Abbott   module: Export sy...
526
527
528
529
530
  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...
531
532
533
534
535
536
  {
  	struct find_symbol_arg fsa;
  
  	fsa.name = name;
  	fsa.gplok = gplok;
  	fsa.warn = warn;
de4d8d534   Rusty Russell   module: each_symb...
537
  	if (each_symbol_section(find_symbol_in_section, &fsa)) {
dafd0940c   Rusty Russell   module: generic e...
538
539
540
541
  		if (owner)
  			*owner = fsa.owner;
  		if (crc)
  			*crc = fsa.crc;
414fd31b2   Tim Abbott   module: Make find...
542
  		return fsa.sym;
dafd0940c   Rusty Russell   module: generic e...
543
  	}
5e1241692   Jim Cromie   module: replace D...
544
545
  	pr_debug("Failed to find symbol %s
  ", name);
414fd31b2   Tim Abbott   module: Make find...
546
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
547
  }
c6b378019   Tim Abbott   module: Export sy...
548
  EXPORT_SYMBOL_GPL(find_symbol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549

fe0d34d24   Rusty Russell   module: weaken lo...
550
551
552
553
  /*
   * Search for module by name: must hold module_mutex (or preempt disabled
   * for read-only access).
   */
4f6de4d51   Mathias Krause   module: don't mod...
554
  static struct module *find_module_all(const char *name, size_t len,
0d21b0e34   Rusty Russell   module: add new s...
555
  				      bool even_unformed)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556
557
  {
  	struct module *mod;
fe0d34d24   Rusty Russell   module: weaken lo...
558
  	module_assert_mutex_or_preempt();
0be964be0   Peter Zijlstra   module: Sanitize ...
559

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
560
  	list_for_each_entry(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
561
562
  		if (!even_unformed && mod->state == MODULE_STATE_UNFORMED)
  			continue;
4f6de4d51   Mathias Krause   module: don't mod...
563
  		if (strlen(mod->name) == len && !memcmp(mod->name, name, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564
565
566
567
  			return mod;
  	}
  	return NULL;
  }
0d21b0e34   Rusty Russell   module: add new s...
568
569
570
  
  struct module *find_module(const char *name)
  {
fe0d34d24   Rusty Russell   module: weaken lo...
571
  	module_assert_mutex();
4f6de4d51   Mathias Krause   module: don't mod...
572
  	return find_module_all(name, strlen(name), false);
0d21b0e34   Rusty Russell   module: add new s...
573
  }
c6b378019   Tim Abbott   module: Export sy...
574
  EXPORT_SYMBOL_GPL(find_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
575
576
  
  #ifdef CONFIG_SMP
fbf59bc9d   Tejun Heo   percpu: implement...
577

259354dea   Tejun Heo   module: encapsula...
578
  static inline void __percpu *mod_percpu(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
579
  {
259354dea   Tejun Heo   module: encapsula...
580
581
  	return mod->percpu;
  }
fbf59bc9d   Tejun Heo   percpu: implement...
582

9eb76d779   Rusty Russell   module: cleanup c...
583
  static int percpu_modalloc(struct module *mod, struct load_info *info)
259354dea   Tejun Heo   module: encapsula...
584
  {
9eb76d779   Rusty Russell   module: cleanup c...
585
586
587
588
589
  	Elf_Shdr *pcpusec = &info->sechdrs[info->index.pcpu];
  	unsigned long align = pcpusec->sh_addralign;
  
  	if (!pcpusec->sh_size)
  		return 0;
fbf59bc9d   Tejun Heo   percpu: implement...
590
  	if (align > PAGE_SIZE) {
bddb12b32   Andrew Morton   kernel/module.c: ...
591
592
593
  		pr_warn("%s: per-cpu alignment %li > %li
  ",
  			mod->name, align, PAGE_SIZE);
fbf59bc9d   Tejun Heo   percpu: implement...
594
595
  		align = PAGE_SIZE;
  	}
9eb76d779   Rusty Russell   module: cleanup c...
596
  	mod->percpu = __alloc_reserved_percpu(pcpusec->sh_size, align);
259354dea   Tejun Heo   module: encapsula...
597
  	if (!mod->percpu) {
bddb12b32   Andrew Morton   kernel/module.c: ...
598
599
600
  		pr_warn("%s: Could not allocate %lu bytes percpu data
  ",
  			mod->name, (unsigned long)pcpusec->sh_size);
259354dea   Tejun Heo   module: encapsula...
601
602
  		return -ENOMEM;
  	}
9eb76d779   Rusty Russell   module: cleanup c...
603
  	mod->percpu_size = pcpusec->sh_size;
259354dea   Tejun Heo   module: encapsula...
604
  	return 0;
fbf59bc9d   Tejun Heo   percpu: implement...
605
  }
259354dea   Tejun Heo   module: encapsula...
606
  static void percpu_modfree(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
607
  {
259354dea   Tejun Heo   module: encapsula...
608
  	free_percpu(mod->percpu);
fbf59bc9d   Tejun Heo   percpu: implement...
609
  }
49668688d   Rusty Russell   module: pass load...
610
  static unsigned int find_pcpusec(struct load_info *info)
6b588c18f   Tejun Heo   module: reorder m...
611
  {
49668688d   Rusty Russell   module: pass load...
612
  	return find_sec(info, ".data..percpu");
6b588c18f   Tejun Heo   module: reorder m...
613
  }
259354dea   Tejun Heo   module: encapsula...
614
615
  static void percpu_modcopy(struct module *mod,
  			   const void *from, unsigned long size)
6b588c18f   Tejun Heo   module: reorder m...
616
617
618
619
  {
  	int cpu;
  
  	for_each_possible_cpu(cpu)
259354dea   Tejun Heo   module: encapsula...
620
  		memcpy(per_cpu_ptr(mod->percpu, cpu), from, size);
6b588c18f   Tejun Heo   module: reorder m...
621
  }
10fad5e46   Tejun Heo   percpu, module: i...
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
  /**
   * 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...
639
640
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
10fad5e46   Tejun Heo   percpu, module: i...
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
  		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...
656
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
657
  #else /* ... !CONFIG_SMP */
6b588c18f   Tejun Heo   module: reorder m...
658

259354dea   Tejun Heo   module: encapsula...
659
  static inline void __percpu *mod_percpu(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
660
661
662
  {
  	return NULL;
  }
9eb76d779   Rusty Russell   module: cleanup c...
663
  static int percpu_modalloc(struct module *mod, struct load_info *info)
259354dea   Tejun Heo   module: encapsula...
664
  {
9eb76d779   Rusty Russell   module: cleanup c...
665
666
667
668
  	/* UP modules shouldn't have this section: ENOMEM isn't quite right */
  	if (info->sechdrs[info->index.pcpu].sh_size != 0)
  		return -ENOMEM;
  	return 0;
259354dea   Tejun Heo   module: encapsula...
669
670
  }
  static inline void percpu_modfree(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
  }
49668688d   Rusty Russell   module: pass load...
673
  static unsigned int find_pcpusec(struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674
675
676
  {
  	return 0;
  }
259354dea   Tejun Heo   module: encapsula...
677
678
  static inline void percpu_modcopy(struct module *mod,
  				  const void *from, unsigned long size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
679
680
681
682
  {
  	/* pcpusec should be 0, and size of that section should be 0. */
  	BUG_ON(size != 0);
  }
10fad5e46   Tejun Heo   percpu, module: i...
683
684
685
686
  bool is_module_percpu_address(unsigned long addr)
  {
  	return false;
  }
6b588c18f   Tejun Heo   module: reorder m...
687

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688
  #endif /* CONFIG_SMP */
c988d2b28   Matt Domsch   [PATCH] modules: ...
689
690
691
692
693
694
  #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...
695
  			struct module_kobject *mk, char *buffer)      \
c988d2b28   Matt Domsch   [PATCH] modules: ...
696
  {                                                                     \
cc56ded3f   Chen Gang   kernel/module.c: ...
697
698
  	return scnprintf(buffer, PAGE_SIZE, "%s
  ", mk->mod->field);  \
c988d2b28   Matt Domsch   [PATCH] modules: ...
699
700
701
702
703
704
705
  }                                                                     \
  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:...
706
707
  	kfree(mod->field);                                            \
  	mod->field = NULL;                                            \
c988d2b28   Matt Domsch   [PATCH] modules: ...
708
709
  }                                                                     \
  static struct module_attribute modinfo_##field = {                    \
7b595756e   Tejun Heo   sysfs: kill unnec...
710
  	.attr = { .name = __stringify(field), .mode = 0444 },         \
c988d2b28   Matt Domsch   [PATCH] modules: ...
711
712
713
714
715
716
717
718
  	.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 ...
719
  static char last_unloaded_module[MODULE_NAME_LEN+1];
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
720
  #ifdef CONFIG_MODULE_UNLOAD
eb0c53771   Steven Rostedt   tracing: Fix comp...
721
722
  
  EXPORT_TRACEPOINT_SYMBOL(module_get);
e513cc1c0   Masami Hiramatsu   module: Remove st...
723
724
  /* MODULE_REF_BASE is the base reference count by kmodule loader. */
  #define MODULE_REF_BASE	1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
725
  /* Init the unload section of the module. */
9f85a4bbb   Rusty Russell   module: refactor ...
726
  static int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
727
  {
e513cc1c0   Masami Hiramatsu   module: Remove st...
728
729
730
731
732
  	/*
  	 * Initialize reference counter to MODULE_REF_BASE.
  	 * refcnt == 0 means module is going.
  	 */
  	atomic_set(&mod->refcnt, MODULE_REF_BASE);
9f85a4bbb   Rusty Russell   module: refactor ...
733

2c02dfe7f   Linus Torvalds   module: Make the ...
734
735
  	INIT_LIST_HEAD(&mod->source_list);
  	INIT_LIST_HEAD(&mod->target_list);
e1783a240   Christoph Lameter   module: Use this_...
736

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
737
  	/* Hold reference count during initialization. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
738
  	atomic_inc(&mod->refcnt);
9f85a4bbb   Rusty Russell   module: refactor ...
739
740
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
742
743
744
745
  /* 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 ...
746
747
  	list_for_each_entry(use, &b->source_list, source_list) {
  		if (use->source == a) {
5e1241692   Jim Cromie   module: replace D...
748
749
  			pr_debug("%s uses %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
751
752
  			return 1;
  		}
  	}
5e1241692   Jim Cromie   module: replace D...
753
754
  	pr_debug("%s does not use %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
755
756
  	return 0;
  }
2c02dfe7f   Linus Torvalds   module: Make the ...
757
758
759
760
761
762
763
764
765
  /*
   * 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 ...
766
  	struct module_use *use;
5e1241692   Jim Cromie   module: replace D...
767
768
  	pr_debug("Allocating new usage for %s.
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
769
770
  	use = kmalloc(sizeof(*use), GFP_ATOMIC);
  	if (!use) {
bddb12b32   Andrew Morton   kernel/module.c: ...
771
772
  		pr_warn("%s: out of memory loading
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
773
774
775
776
777
778
779
  		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 ...
780
781
  	return 0;
  }
75676500f   Rusty Russell   module: make lock...
782
  /* Module a uses b: caller needs module_mutex() */
9bea7f239   Rusty Russell   module: fix bne2 ...
783
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
784
  {
c8e21ced0   Rusty Russell   module: fix kdb's...
785
  	int err;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
786

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

9bea7f239   Rusty Russell   module: fix bne2 ...
790
791
  	/* If module isn't available, we fail. */
  	err = strong_try_module_get(b);
c9a3ba55b   Rusty Russell   module: wait for ...
792
  	if (err)
9bea7f239   Rusty Russell   module: fix bne2 ...
793
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
794

2c02dfe7f   Linus Torvalds   module: Make the ...
795
796
  	err = add_module_usage(a, b);
  	if (err) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
  		module_put(b);
9bea7f239   Rusty Russell   module: fix bne2 ...
798
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
800
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
802
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
803
804
805
806
  
  /* Clear the unload stuff of the module. */
  static void module_unload_free(struct module *mod)
  {
2c02dfe7f   Linus Torvalds   module: Make the ...
807
  	struct module_use *use, *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
808

75676500f   Rusty Russell   module: make lock...
809
  	mutex_lock(&module_mutex);
2c02dfe7f   Linus Torvalds   module: Make the ...
810
811
  	list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) {
  		struct module *i = use->target;
5e1241692   Jim Cromie   module: replace D...
812
813
  		pr_debug("%s unusing %s
  ", mod->name, i->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
814
815
816
817
  		module_put(i);
  		list_del(&use->source_list);
  		list_del(&use->target_list);
  		kfree(use);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
818
  	}
75676500f   Rusty Russell   module: make lock...
819
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
820
821
822
  }
  
  #ifdef CONFIG_MODULE_FORCE_UNLOAD
fb1697933   Akinobu Mita   [PATCH] modules: ...
823
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
824
825
826
  {
  	int ret = (flags & O_TRUNC);
  	if (ret)
373d4d099   Rusty Russell   taint: add explic...
827
  		add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
828
829
830
  	return ret;
  }
  #else
fb1697933   Akinobu Mita   [PATCH] modules: ...
831
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
832
833
834
835
  {
  	return 0;
  }
  #endif /* CONFIG_MODULE_FORCE_UNLOAD */
e513cc1c0   Masami Hiramatsu   module: Remove st...
836
837
  /* Try to release refcount of module, 0 means success. */
  static int try_release_module_ref(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
838
  {
e513cc1c0   Masami Hiramatsu   module: Remove st...
839
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
840

e513cc1c0   Masami Hiramatsu   module: Remove st...
841
842
843
844
845
846
  	/* Try to decrement refcnt which we set at loading */
  	ret = atomic_sub_return(MODULE_REF_BASE, &mod->refcnt);
  	BUG_ON(ret < 0);
  	if (ret)
  		/* Someone can put this right now, recover with checking */
  		ret = atomic_add_unless(&mod->refcnt, MODULE_REF_BASE, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
847

e513cc1c0   Masami Hiramatsu   module: Remove st...
848
849
  	return ret;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
850

e513cc1c0   Masami Hiramatsu   module: Remove st...
851
852
  static int try_stop_module(struct module *mod, int flags, int *forced)
  {
da39ba5e1   Rusty Russell   module: don't use...
853
  	/* If it's not unused, quit unless we're forcing. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
854
855
856
  	if (try_release_module_ref(mod) != 0) {
  		*forced = try_force_unload(flags);
  		if (!(*forced))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
857
858
859
860
  			return -EWOULDBLOCK;
  	}
  
  	/* Mark it as dying. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
861
  	mod->state = MODULE_STATE_GOING;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
862

e513cc1c0   Masami Hiramatsu   module: Remove st...
863
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
864
  }
d5db139ab   Rusty Russell   module: make modu...
865
866
867
868
869
870
871
872
873
874
  /**
   * module_refcount - return the refcount or -1 if unloading
   *
   * @mod:	the module we're checking
   *
   * Returns:
   *	-1 if the module is in the process of unloading
   *	otherwise the number of references in the kernel to the module
   */
  int module_refcount(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
875
  {
d5db139ab   Rusty Russell   module: make modu...
876
  	return atomic_read(&mod->refcnt) - MODULE_REF_BASE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
877
878
879
880
881
  }
  EXPORT_SYMBOL(module_refcount);
  
  /* This exists whether we can unload or not */
  static void free_module(struct module *mod);
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
882
883
  SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
  		unsigned int, flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
884
885
  {
  	struct module *mod;
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
886
  	char name[MODULE_NAME_LEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
887
  	int ret, forced = 0;
3d43321b7   Kees Cook   modules: sysctl t...
888
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
889
890
891
892
893
  		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...
894
895
  	if (mutex_lock_interruptible(&module_mutex) != 0)
  		return -EINTR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
896
897
898
899
900
901
  
  	mod = find_module(name);
  	if (!mod) {
  		ret = -ENOENT;
  		goto out;
  	}
2c02dfe7f   Linus Torvalds   module: Make the ...
902
  	if (!list_empty(&mod->source_list)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
903
904
905
906
907
908
909
  		/* Other modules depend on us: get rid of them first. */
  		ret = -EWOULDBLOCK;
  		goto out;
  	}
  
  	/* Doing init or already dying? */
  	if (mod->state != MODULE_STATE_LIVE) {
3f2b9c9cd   Rusty Russell   module: remove rm...
910
  		/* FIXME: if (force), slam module count damn the torpedoes */
5e1241692   Jim Cromie   module: replace D...
911
912
  		pr_debug("%s already dying
  ", mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
913
914
915
916
917
  		ret = -EBUSY;
  		goto out;
  	}
  
  	/* If it has an init func, it must have an exit func to unload */
af49d9248   Rusty Russell   Remove "unsafe" f...
918
  	if (mod->init && !mod->exit) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
919
  		forced = try_force_unload(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
921
922
923
924
925
  		if (!forced) {
  			/* This module can't be removed */
  			ret = -EBUSY;
  			goto out;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
926
927
928
929
  	/* Stop the machine so refcounts can't move and disable module. */
  	ret = try_stop_module(mod, flags, &forced);
  	if (ret != 0)
  		goto out;
df4b565e1   Peter Oberparleiter   module: add MODUL...
930
  	mutex_unlock(&module_mutex);
25985edce   Lucas De Marchi   Fix common misspe...
931
  	/* Final destruction now no one is using it. */
df4b565e1   Peter Oberparleiter   module: add MODUL...
932
  	if (mod->exit != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
933
  		mod->exit();
df4b565e1   Peter Oberparleiter   module: add MODUL...
934
935
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
22a9d6456   Arjan van de Ven   async: Asynchrono...
936
  	async_synchronize_full();
75676500f   Rusty Russell   module: make lock...
937

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

75676500f   Rusty Russell   module: make lock...
941
942
943
  	free_module(mod);
  	return 0;
  out:
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
944
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
945
946
  	return ret;
  }
d1e99d7ae   Jianjun Kong   module: fix warni...
947
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948
949
950
  {
  	struct module_use *use;
  	int printed_something = 0;
d5db139ab   Rusty Russell   module: make modu...
951
  	seq_printf(m, " %i ", module_refcount(mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952

6da0b5651   Ionut Alexa   kernel:module Fix...
953
954
955
956
  	/*
  	 * Always include a trailing , so userspace can differentiate
  	 * between this and the old multi-field proc format.
  	 */
2c02dfe7f   Linus Torvalds   module: Make the ...
957
  	list_for_each_entry(use, &mod->source_list, source_list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
  		printed_something = 1;
2c02dfe7f   Linus Torvalds   module: Make the ...
959
  		seq_printf(m, "%s,", use->source->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961
962
  	if (mod->init != NULL && mod->exit == NULL) {
  		printed_something = 1;
6da0b5651   Ionut Alexa   kernel:module Fix...
963
  		seq_puts(m, "[permanent],");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
964
965
966
  	}
  
  	if (!printed_something)
6da0b5651   Ionut Alexa   kernel:module Fix...
967
  		seq_puts(m, "-");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
969
970
971
972
  }
  
  void __symbol_put(const char *symbol)
  {
  	struct module *owner;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973

24da1cbff   Rusty Russell   modules: remove m...
974
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
975
  	if (!find_symbol(symbol, &owner, NULL, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
976
977
  		BUG();
  	module_put(owner);
24da1cbff   Rusty Russell   modules: remove m...
978
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
979
980
  }
  EXPORT_SYMBOL(__symbol_put);
7d1d16e41   Rusty Russell   module: fix BUG_O...
981
  /* Note this assumes addr is a function, which it currently always is. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
982
983
  void symbol_put_addr(void *addr)
  {
5e3766138   Trent Piepho   [PATCH] symbol_pu...
984
  	struct module *modaddr;
7d1d16e41   Rusty Russell   module: fix BUG_O...
985
  	unsigned long a = (unsigned long)dereference_function_descriptor(addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986

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

275d7d44d   Peter Zijlstra   module: Fix locki...
990
991
992
993
994
  	/*
  	 * Even though we hold a reference on the module; we still need to
  	 * disable preemption in order to safely traverse the data structure.
  	 */
  	preempt_disable();
7d1d16e41   Rusty Russell   module: fix BUG_O...
995
  	modaddr = __module_text_address(a);
a6e6abd57   Rusty Russell   module: remove mo...
996
  	BUG_ON(!modaddr);
5e3766138   Trent Piepho   [PATCH] symbol_pu...
997
  	module_put(modaddr);
275d7d44d   Peter Zijlstra   module: Fix locki...
998
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
1000
1001
1002
  }
  EXPORT_SYMBOL_GPL(symbol_put_addr);
  
  static ssize_t show_refcnt(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1003
  			   struct module_kobject *mk, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1004
  {
d5db139ab   Rusty Russell   module: make modu...
1005
1006
  	return sprintf(buffer, "%i
  ", module_refcount(mk->mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1008
1009
  static struct module_attribute modinfo_refcnt =
  	__ATTR(refcnt, 0444, show_refcnt, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010

d53799be6   Steven Rostedt   module: move __mo...
1011
1012
1013
1014
  void __module_get(struct module *module)
  {
  	if (module) {
  		preempt_disable();
2f35c41f5   Masami Hiramatsu   module: Replace m...
1015
  		atomic_inc(&module->refcnt);
d53799be6   Steven Rostedt   module: move __mo...
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
  		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();
e513cc1c0   Masami Hiramatsu   module: Remove st...
1028
1029
1030
  		/* Note: here, we can fail to get a reference */
  		if (likely(module_is_live(module) &&
  			   atomic_inc_not_zero(&module->refcnt) != 0))
d53799be6   Steven Rostedt   module: move __mo...
1031
  			trace_module_get(module, _RET_IP_);
e513cc1c0   Masami Hiramatsu   module: Remove st...
1032
  		else
d53799be6   Steven Rostedt   module: move __mo...
1033
1034
1035
1036
1037
1038
1039
  			ret = false;
  
  		preempt_enable();
  	}
  	return ret;
  }
  EXPORT_SYMBOL(try_module_get);
f6a570333   Al Viro   [PATCH] severing ...
1040
1041
  void module_put(struct module *module)
  {
e513cc1c0   Masami Hiramatsu   module: Remove st...
1042
  	int ret;
f6a570333   Al Viro   [PATCH] severing ...
1043
  	if (module) {
e1783a240   Christoph Lameter   module: Use this_...
1044
  		preempt_disable();
e513cc1c0   Masami Hiramatsu   module: Remove st...
1045
1046
  		ret = atomic_dec_if_positive(&module->refcnt);
  		WARN_ON(ret < 0);	/* Failed to put refcount */
ae832d1e0   Li Zefan   tracing: Remove s...
1047
  		trace_module_put(module, _RET_IP_);
e1783a240   Christoph Lameter   module: Use this_...
1048
  		preempt_enable();
f6a570333   Al Viro   [PATCH] severing ...
1049
1050
1051
  	}
  }
  EXPORT_SYMBOL(module_put);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1052
  #else /* !CONFIG_MODULE_UNLOAD */
d1e99d7ae   Jianjun Kong   module: fix warni...
1053
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1054
1055
  {
  	/* We don't know the usage count, or what modules are using. */
6da0b5651   Ionut Alexa   kernel:module Fix...
1056
  	seq_puts(m, " - -");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1057
1058
1059
1060
1061
  }
  
  static inline void module_unload_free(struct module *mod)
  {
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
1062
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1063
  {
9bea7f239   Rusty Russell   module: fix bne2 ...
1064
  	return strong_try_module_get(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1065
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
1066
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1067

9f85a4bbb   Rusty Russell   module: refactor ...
1068
  static inline int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1069
  {
9f85a4bbb   Rusty Russell   module: refactor ...
1070
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1071
1072
  }
  #endif /* CONFIG_MODULE_UNLOAD */
53999bf34   Kevin Winchester   error: implicit d...
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
  static size_t module_flags_taint(struct module *mod, char *buf)
  {
  	size_t l = 0;
  
  	if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE))
  		buf[l++] = 'P';
  	if (mod->taints & (1 << TAINT_OOT_MODULE))
  		buf[l++] = 'O';
  	if (mod->taints & (1 << TAINT_FORCED_MODULE))
  		buf[l++] = 'F';
  	if (mod->taints & (1 << TAINT_CRAP))
  		buf[l++] = 'C';
66cc69e34   Mathieu Desnoyers   Fix: module signa...
1085
  	if (mod->taints & (1 << TAINT_UNSIGNED_MODULE))
57673c2b0   Rusty Russell   Use 'E' instead o...
1086
  		buf[l++] = 'E';
53999bf34   Kevin Winchester   error: implicit d...
1087
1088
  	/*
  	 * TAINT_FORCED_RMMOD: could be added.
8c90487cd   Dave Jones   Rename TAINT_UNSA...
1089
  	 * TAINT_CPU_OUT_OF_SPEC, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
53999bf34   Kevin Winchester   error: implicit d...
1090
1091
1092
1093
  	 * apply to modules.
  	 */
  	return l;
  }
1f71740ab   Kay Sievers   Driver core: show...
1094
  static ssize_t show_initstate(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1095
  			      struct module_kobject *mk, char *buffer)
1f71740ab   Kay Sievers   Driver core: show...
1096
1097
  {
  	const char *state = "unknown";
4befb026c   Kay Sievers   module: change at...
1098
  	switch (mk->mod->state) {
1f71740ab   Kay Sievers   Driver core: show...
1099
1100
1101
1102
1103
1104
1105
1106
1107
  	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...
1108
1109
  	default:
  		BUG();
1f71740ab   Kay Sievers   Driver core: show...
1110
1111
1112
1113
  	}
  	return sprintf(buffer, "%s
  ", state);
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1114
1115
  static struct module_attribute modinfo_initstate =
  	__ATTR(initstate, 0444, show_initstate, NULL);
1f71740ab   Kay Sievers   Driver core: show...
1116

88bfa3247   Kay Sievers   module: add /sys/...
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
  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 - ...
1127
1128
1129
1130
1131
1132
  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)
  {
7523e4dc5   Rusty Russell   module: use a str...
1133
1134
  	return sprintf(buffer, "%u
  ", mk->mod->core_layout.size);
cca3e7073   Kay Sievers   modules: sysfs - ...
1135
1136
1137
1138
1139
1140
1141
1142
  }
  
  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)
  {
7523e4dc5   Rusty Russell   module: use a str...
1143
1144
  	return sprintf(buffer, "%u
  ", mk->mod->init_layout.size);
cca3e7073   Kay Sievers   modules: sysfs - ...
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
  }
  
  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/...
1163

03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1164
  static struct module_attribute *modinfo_attrs[] = {
cca3e7073   Kay Sievers   modules: sysfs - ...
1165
  	&module_uevent,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1166
1167
  	&modinfo_version,
  	&modinfo_srcversion,
cca3e7073   Kay Sievers   modules: sysfs - ...
1168
1169
1170
1171
  	&modinfo_initstate,
  	&modinfo_coresize,
  	&modinfo_initsize,
  	&modinfo_taint,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1172
  #ifdef CONFIG_MODULE_UNLOAD
cca3e7073   Kay Sievers   modules: sysfs - ...
1173
  	&modinfo_refcnt,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1174
1175
1176
  #endif
  	NULL,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1177
  static const char vermagic[] = VERMAGIC_STRING;
c6e665c8f   Rusty Russell   module: clarify t...
1178
  static int try_to_force_load(struct module *mod, const char *reason)
826e4506a   Linus Torvalds   Make forced modul...
1179
1180
  {
  #ifdef CONFIG_MODULE_FORCE_LOAD
25ddbb18a   Andi Kleen   Make the taint fl...
1181
  	if (!test_taint(TAINT_FORCED_MODULE))
bddb12b32   Andrew Morton   kernel/module.c: ...
1182
1183
  		pr_warn("%s: %s: kernel tainted.
  ", mod->name, reason);
373d4d099   Rusty Russell   taint: add explic...
1184
  	add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
826e4506a   Linus Torvalds   Make forced modul...
1185
1186
1187
1188
1189
  	return 0;
  #else
  	return -ENOEXEC;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1190
  #ifdef CONFIG_MODVERSIONS
d4703aefd   Rusty Russell   module: handle pp...
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
  /* 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
1201
1202
1203
  static int check_version(Elf_Shdr *sechdrs,
  			 unsigned int versindex,
  			 const char *symname,
6da0b5651   Ionut Alexa   kernel:module Fix...
1204
  			 struct module *mod,
d4703aefd   Rusty Russell   module: handle pp...
1205
1206
  			 const unsigned long *crc,
  			 const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1207
1208
1209
1210
1211
1212
1213
  {
  	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...
1214
1215
1216
  	/* 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
1217
1218
1219
1220
1221
1222
1223
  	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...
1224
  		if (versions[i].crc == maybe_relocated(*crc, crc_owner))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1225
  			return 1;
5e1241692   Jim Cromie   module: replace D...
1226
1227
  		pr_debug("Found checksum %lX vs module %lX
  ",
d4703aefd   Rusty Russell   module: handle pp...
1228
  		       maybe_relocated(*crc, crc_owner), versions[i].crc);
826e4506a   Linus Torvalds   Make forced modul...
1229
  		goto bad_version;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1230
  	}
826e4506a   Linus Torvalds   Make forced modul...
1231

bddb12b32   Andrew Morton   kernel/module.c: ...
1232
1233
  	pr_warn("%s: no symbol version for %s
  ", mod->name, symname);
a5dd69707   Rusty Russell   module: be more p...
1234
  	return 0;
826e4506a   Linus Torvalds   Make forced modul...
1235
1236
  
  bad_version:
6da0b5651   Ionut Alexa   kernel:module Fix...
1237
1238
  	pr_warn("%s: disagrees about version of symbol %s
  ",
826e4506a   Linus Torvalds   Make forced modul...
1239
1240
  	       mod->name, symname);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1241
1242
1243
1244
1245
1246
1247
  }
  
  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
1248

926a59b1d   Peter Zijlstra   module: Annotate ...
1249
1250
1251
1252
1253
  	/*
  	 * Since this should be found in kernel (which can't be removed), no
  	 * locking is necessary -- use preempt_disable() to placate lockdep.
  	 */
  	preempt_disable();
b92021b09   Rusty Russell   CONFIG_SYMBOL_PRE...
1254
  	if (!find_symbol(VMLINUX_SYMBOL_STR(module_layout), NULL,
926a59b1d   Peter Zijlstra   module: Annotate ...
1255
1256
  			 &crc, true, false)) {
  		preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257
  		BUG();
926a59b1d   Peter Zijlstra   module: Annotate ...
1258
1259
  	}
  	preempt_enable();
a4b6a77b7   James Hogan   module: fix symbo...
1260
1261
  	return check_version(sechdrs, versindex,
  			     VMLINUX_SYMBOL_STR(module_layout), mod, crc,
d4703aefd   Rusty Russell   module: handle pp...
1262
  			     NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1263
  }
91e37a793   Rusty Russell   module: don't ign...
1264
1265
1266
  /* 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
1267
  {
91e37a793   Rusty Russell   module: don't ign...
1268
1269
1270
1271
  	if (has_crcs) {
  		amagic += strcspn(amagic, " ");
  		bmagic += strcspn(bmagic, " ");
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1272
1273
1274
1275
1276
1277
  	return strcmp(amagic, bmagic) == 0;
  }
  #else
  static inline int check_version(Elf_Shdr *sechdrs,
  				unsigned int versindex,
  				const char *symname,
6da0b5651   Ionut Alexa   kernel:module Fix...
1278
  				struct module *mod,
d4703aefd   Rusty Russell   module: handle pp...
1279
1280
  				const unsigned long *crc,
  				const struct module *crc_owner)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
  {
  	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...
1291
1292
  static inline int same_magic(const char *amagic, const char *bmagic,
  			     bool has_crcs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293
1294
1295
1296
  {
  	return strcmp(amagic, bmagic) == 0;
  }
  #endif /* CONFIG_MODVERSIONS */
75676500f   Rusty Russell   module: make lock...
1297
  /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
49668688d   Rusty Russell   module: pass load...
1298
1299
  static const struct kernel_symbol *resolve_symbol(struct module *mod,
  						  const struct load_info *info,
414fd31b2   Tim Abbott   module: Make find...
1300
  						  const char *name,
9bea7f239   Rusty Russell   module: fix bne2 ...
1301
  						  char ownername[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1302
1303
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1304
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1305
  	const unsigned long *crc;
9bea7f239   Rusty Russell   module: fix bne2 ...
1306
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1307

d64810f56   Peter Zijlstra   module: Annotate ...
1308
1309
1310
1311
1312
1313
  	/*
  	 * The module_mutex should not be a heavily contended lock;
  	 * if we get the occasional sleep here, we'll go an extra iteration
  	 * in the wait_event_interruptible(), which is harmless.
  	 */
  	sched_annotate_sleep();
75676500f   Rusty Russell   module: make lock...
1314
  	mutex_lock(&module_mutex);
414fd31b2   Tim Abbott   module: Make find...
1315
  	sym = find_symbol(name, &owner, &crc,
25ddbb18a   Andi Kleen   Make the taint fl...
1316
  			  !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
9bea7f239   Rusty Russell   module: fix bne2 ...
1317
1318
  	if (!sym)
  		goto unlock;
49668688d   Rusty Russell   module: pass load...
1319
1320
  	if (!check_version(info->sechdrs, info->index.vers, name, mod, crc,
  			   owner)) {
9bea7f239   Rusty Russell   module: fix bne2 ...
1321
1322
  		sym = ERR_PTR(-EINVAL);
  		goto getname;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1323
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
  
  	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...
1335
  	mutex_unlock(&module_mutex);
218ce7351   Linus Torvalds   Revert "module: d...
1336
  	return sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1337
  }
49668688d   Rusty Russell   module: pass load...
1338
1339
1340
1341
  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 ...
1342
1343
  {
  	const struct kernel_symbol *ksym;
49668688d   Rusty Russell   module: pass load...
1344
  	char owner[MODULE_NAME_LEN];
9bea7f239   Rusty Russell   module: fix bne2 ...
1345
1346
  
  	if (wait_event_interruptible_timeout(module_wq,
49668688d   Rusty Russell   module: pass load...
1347
1348
  			!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
  			|| PTR_ERR(ksym) != -EBUSY,
9bea7f239   Rusty Russell   module: fix bne2 ...
1349
  					     30 * HZ) <= 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1350
1351
1352
  		pr_warn("%s: gave up waiting for init of module %s.
  ",
  			mod->name, owner);
9bea7f239   Rusty Russell   module: fix bne2 ...
1353
1354
1355
  	}
  	return ksym;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1356
1357
1358
1359
  /*
   * /sys/module/foo/sections stuff
   * J. Corbet <corbet@lwn.net>
   */
8f6d03781   Rusty Russell   module: sysfs cle...
1360
  #ifdef CONFIG_SYSFS
10b465aaf   Ben Hutchings   modules: Skip emp...
1361

8f6d03781   Rusty Russell   module: sysfs cle...
1362
  #ifdef CONFIG_KALLSYMS
10b465aaf   Ben Hutchings   modules: Skip emp...
1363
1364
1365
1366
  static inline bool sect_empty(const Elf_Shdr *sect)
  {
  	return !(sect->sh_flags & SHF_ALLOC) || sect->sh_size == 0;
  }
6da0b5651   Ionut Alexa   kernel:module Fix...
1367
  struct module_sect_attr {
a58730c42   Rusty Russell   module: make modu...
1368
1369
1370
1371
  	struct module_attribute mattr;
  	char *name;
  	unsigned long address;
  };
6da0b5651   Ionut Alexa   kernel:module Fix...
1372
  struct module_sect_attrs {
a58730c42   Rusty Russell   module: make modu...
1373
1374
1375
1376
  	struct attribute_group grp;
  	unsigned int nsections;
  	struct module_sect_attr attrs[0];
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1377
  static ssize_t module_sect_show(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1378
  				struct module_kobject *mk, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1379
1380
1381
  {
  	struct module_sect_attr *sattr =
  		container_of(mattr, struct module_sect_attr, mattr);
9f36e2c44   Kees Cook   printk: use %pK f...
1382
1383
  	return sprintf(buf, "0x%pK
  ", (void *)sattr->address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1384
  }
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1385
1386
  static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
  {
a58730c42   Rusty Russell   module: make modu...
1387
  	unsigned int section;
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1388
1389
1390
1391
1392
  
  	for (section = 0; section < sect_attrs->nsections; section++)
  		kfree(sect_attrs->attrs[section].name);
  	kfree(sect_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1393
  static void add_sect_attrs(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1394
1395
1396
1397
1398
  {
  	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:...
1399

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1400
  	/* Count loaded sections and allocate structures */
8f6d03781   Rusty Russell   module: sysfs cle...
1401
1402
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		if (!sect_empty(&info->sechdrs[i]))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1403
1404
1405
1406
1407
  			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...
1408
1409
  	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
  	if (sect_attrs == NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1410
1411
1412
1413
1414
  		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...
1415
  	sect_attrs->nsections = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1416
1417
  	sattr = &sect_attrs->attrs[0];
  	gattr = &sect_attrs->grp.attrs[0];
8f6d03781   Rusty Russell   module: sysfs cle...
1418
1419
1420
  	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...
1421
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1422
1423
  		sattr->address = sec->sh_addr;
  		sattr->name = kstrdup(info->secstrings + sec->sh_name,
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1424
1425
1426
1427
  					GFP_KERNEL);
  		if (sattr->name == NULL)
  			goto out;
  		sect_attrs->nsections++;
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1428
  		sysfs_attr_init(&sattr->mattr.attr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1429
1430
1431
  		sattr->mattr.show = module_sect_show;
  		sattr->mattr.store = NULL;
  		sattr->mattr.attr.name = sattr->name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
  		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...
1443
  	free_sect_attrs(sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1444
1445
1446
1447
1448
1449
1450
1451
1452
  }
  
  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...
1453
  		free_sect_attrs(mod->sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1454
1455
1456
  		mod->sect_attrs = NULL;
  	}
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1457
1458
1459
1460
1461
1462
1463
1464
1465
  /*
   * /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...
1466
  static ssize_t module_notes_read(struct file *filp, struct kobject *kobj,
6d7601338   Roland McGrath   Add /sys/module/n...
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
  				 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...
1484
  		kobject_put(notes_attrs->dir);
6d7601338   Roland McGrath   Add /sys/module/n...
1485
1486
1487
  	}
  	kfree(notes_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1488
  static void add_notes_attrs(struct module *mod, const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1489
1490
1491
1492
  {
  	unsigned int notes, loaded, i;
  	struct module_notes_attrs *notes_attrs;
  	struct bin_attribute *nattr;
ea6bff368   Ingo Molnar   modules: Fix buil...
1493
1494
1495
  	/* failed to create section attributes, so can't create notes */
  	if (!mod->sect_attrs)
  		return;
6d7601338   Roland McGrath   Add /sys/module/n...
1496
1497
  	/* Count notes sections and allocate structures.  */
  	notes = 0;
8f6d03781   Rusty Russell   module: sysfs cle...
1498
1499
1500
  	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...
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
  			++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...
1514
1515
  	for (loaded = i = 0; i < info->hdr->e_shnum; ++i) {
  		if (sect_empty(&info->sechdrs[i]))
6d7601338   Roland McGrath   Add /sys/module/n...
1516
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1517
  		if (info->sechdrs[i].sh_type == SHT_NOTE) {
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1518
  			sysfs_bin_attr_init(nattr);
6d7601338   Roland McGrath   Add /sys/module/n...
1519
1520
  			nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
  			nattr->attr.mode = S_IRUGO;
8f6d03781   Rusty Russell   module: sysfs cle...
1521
1522
  			nattr->size = info->sechdrs[i].sh_size;
  			nattr->private = (void *) info->sechdrs[i].sh_addr;
6d7601338   Roland McGrath   Add /sys/module/n...
1523
1524
1525
1526
1527
  			nattr->read = module_notes_read;
  			++nattr;
  		}
  		++loaded;
  	}
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1528
  	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
6d7601338   Roland McGrath   Add /sys/module/n...
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
  	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
1549
  #else
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1550

8f6d03781   Rusty Russell   module: sysfs cle...
1551
1552
  static inline void add_sect_attrs(struct module *mod,
  				  const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1553
1554
1555
1556
1557
1558
  {
  }
  
  static inline void remove_sect_attrs(struct module *mod)
  {
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1559

8f6d03781   Rusty Russell   module: sysfs cle...
1560
1561
  static inline void add_notes_attrs(struct module *mod,
  				   const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1562
1563
1564
1565
1566
1567
  {
  }
  
  static inline void remove_notes_attrs(struct module *mod)
  {
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1568
  #endif /* CONFIG_KALLSYMS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1569

80a3d1bb4   Rusty Russell   module: move sysf...
1570
1571
1572
1573
1574
  static void add_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
  	int nowarn;
75676500f   Rusty Russell   module: make lock...
1575
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1576
1577
1578
1579
  	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...
1580
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1581
1582
1583
1584
1585
1586
1587
  #endif
  }
  
  static void del_usage_links(struct module *mod)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
75676500f   Rusty Russell   module: make lock...
1588
  	mutex_lock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1589
1590
  	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...
1591
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1592
1593
  #endif
  }
6407ebb27   Rusty Russell   module: Make modu...
1594
  static int module_add_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1595
1596
  {
  	struct module_attribute *attr;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1597
  	struct module_attribute *temp_attr;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1598
1599
  	int error = 0;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1600
1601
1602
1603
1604
1605
1606
  	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: ...
1607
1608
  	for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) {
  		if (!attr->test ||
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1609
1610
  		    (attr->test && attr->test(mod))) {
  			memcpy(temp_attr, attr, sizeof(*temp_attr));
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1611
  			sysfs_attr_init(&temp_attr->attr);
6da0b5651   Ionut Alexa   kernel:module Fix...
1612
1613
  			error = sysfs_create_file(&mod->mkobj.kobj,
  					&temp_attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1614
1615
  			++temp_attr;
  		}
c988d2b28   Matt Domsch   [PATCH] modules: ...
1616
1617
1618
  	}
  	return error;
  }
6407ebb27   Rusty Russell   module: Make modu...
1619
  static void module_remove_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1620
1621
1622
  {
  	struct module_attribute *attr;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1623
1624
1625
1626
  	for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) {
  		/* pick a field to test for end of list */
  		if (!attr->attr.name)
  			break;
6da0b5651   Ionut Alexa   kernel:module Fix...
1627
  		sysfs_remove_file(&mod->mkobj.kobj, &attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1628
1629
  		if (attr->free)
  			attr->free(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1630
  	}
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1631
  	kfree(mod->modinfo_attrs);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1632
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1633

942e44312   Li Zhong   module: Fix mod->...
1634
1635
1636
1637
1638
1639
1640
  static void mod_kobject_put(struct module *mod)
  {
  	DECLARE_COMPLETION_ONSTACK(c);
  	mod->mkobj.kobj_completion = &c;
  	kobject_put(&mod->mkobj.kobj);
  	wait_for_completion(&c);
  }
6407ebb27   Rusty Russell   module: Make modu...
1641
  static int mod_sysfs_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1642
1643
  {
  	int err;
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1644
  	struct kobject *kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1645

823bccfc4   Greg Kroah-Hartman   remove "struct su...
1646
  	if (!module_sysfs_initialized) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1647
1648
  		pr_err("%s: module sysfs not initialized
  ", mod->name);
1cc5f7142   Ed Swierk   [PATCH] load_modu...
1649
1650
1651
  		err = -EINVAL;
  		goto out;
  	}
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1652
1653
1654
  
  	kobj = kset_find_obj(module_kset, mod->name);
  	if (kobj) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1655
1656
  		pr_err("%s: module is already loaded
  ", mod->name);
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1657
1658
1659
1660
  		kobject_put(kobj);
  		err = -EINVAL;
  		goto out;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1661
  	mod->mkobj.mod = mod;
e17e0f51a   Kay Sievers   Driver core: show...
1662

ac3c8141f   Greg Kroah-Hartman   Kobject: convert ...
1663
1664
1665
1666
1667
  	memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj));
  	mod->mkobj.kobj.kset = module_kset;
  	err = kobject_init_and_add(&mod->mkobj.kobj, &module_ktype, NULL,
  				   "%s", mod->name);
  	if (err)
942e44312   Li Zhong   module: Fix mod->...
1668
  		mod_kobject_put(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1669

97c146ef0   Kay Sievers   sysfs: fix /sys/m...
1670
  	/* delay uevent until full sysfs population */
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1671
1672
1673
  out:
  	return err;
  }
6407ebb27   Rusty Russell   module: Make modu...
1674
  static int mod_sysfs_setup(struct module *mod,
8f6d03781   Rusty Russell   module: sysfs cle...
1675
  			   const struct load_info *info,
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1676
1677
1678
1679
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	int err;
80a3d1bb4   Rusty Russell   module: move sysf...
1680
1681
1682
  	err = mod_sysfs_init(mod);
  	if (err)
  		goto out;
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1683
  	mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
240936e18   Akinobu Mita   mod_sysfs_setup()...
1684
1685
  	if (!mod->holders_dir) {
  		err = -ENOMEM;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1686
  		goto out_unreg;
240936e18   Akinobu Mita   mod_sysfs_setup()...
1687
  	}
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1688

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1689
1690
  	err = module_param_sysfs_setup(mod, kparam, num_params);
  	if (err)
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1691
  		goto out_unreg_holders;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1692

c988d2b28   Matt Domsch   [PATCH] modules: ...
1693
1694
  	err = module_add_modinfo_attrs(mod);
  	if (err)
e17e0f51a   Kay Sievers   Driver core: show...
1695
  		goto out_unreg_param;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1696

80a3d1bb4   Rusty Russell   module: move sysf...
1697
  	add_usage_links(mod);
8f6d03781   Rusty Russell   module: sysfs cle...
1698
1699
  	add_sect_attrs(mod, info);
  	add_notes_attrs(mod, info);
80a3d1bb4   Rusty Russell   module: move sysf...
1700

e17e0f51a   Kay Sievers   Driver core: show...
1701
  	kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1702
  	return 0;
e17e0f51a   Kay Sievers   Driver core: show...
1703
1704
  out_unreg_param:
  	module_param_sysfs_remove(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1705
  out_unreg_holders:
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1706
  	kobject_put(mod->holders_dir);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1707
  out_unreg:
942e44312   Li Zhong   module: Fix mod->...
1708
  	mod_kobject_put(mod);
80a3d1bb4   Rusty Russell   module: move sysf...
1709
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1710
1711
  	return err;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1712
1713
1714
  
  static void mod_sysfs_fini(struct module *mod)
  {
8f6d03781   Rusty Russell   module: sysfs cle...
1715
1716
  	remove_notes_attrs(mod);
  	remove_sect_attrs(mod);
942e44312   Li Zhong   module: Fix mod->...
1717
  	mod_kobject_put(mod);
34e4e2fef   Denis V. Lunev   modules: proper c...
1718
  }
cf2fde7b3   Rusty Russell   param: fix module...
1719
1720
1721
1722
  static void init_param_lock(struct module *mod)
  {
  	mutex_init(&mod->param_lock);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1723
  #else /* !CONFIG_SYSFS */
34e4e2fef   Denis V. Lunev   modules: proper c...
1724

8f6d03781   Rusty Russell   module: sysfs cle...
1725
1726
  static int mod_sysfs_setup(struct module *mod,
  			   const struct load_info *info,
6407ebb27   Rusty Russell   module: Make modu...
1727
1728
1729
1730
1731
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	return 0;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1732
1733
1734
  static void mod_sysfs_fini(struct module *mod)
  {
  }
36b0360d1   Rusty Russell   module: fix sysfs...
1735
1736
1737
  static void module_remove_modinfo_attrs(struct module *mod)
  {
  }
80a3d1bb4   Rusty Russell   module: move sysf...
1738
1739
1740
  static void del_usage_links(struct module *mod)
  {
  }
cf2fde7b3   Rusty Russell   param: fix module...
1741
1742
1743
  static void init_param_lock(struct module *mod)
  {
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1744
  #endif /* CONFIG_SYSFS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1745

36b0360d1   Rusty Russell   module: fix sysfs...
1746
  static void mod_sysfs_teardown(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1747
  {
80a3d1bb4   Rusty Russell   module: move sysf...
1748
  	del_usage_links(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1749
  	module_remove_modinfo_attrs(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1750
  	module_param_sysfs_remove(mod);
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1751
1752
  	kobject_put(mod->mkobj.drivers_dir);
  	kobject_put(mod->holders_dir);
34e4e2fef   Denis V. Lunev   modules: proper c...
1753
  	mod_sysfs_fini(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1754
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1755
1756
1757
1758
  #ifdef CONFIG_DEBUG_SET_MODULE_RONX
  /*
   * LKM RO/NX protection: protect module's text/ro-data
   * from modification and any data from execution.
85c898db6   Rusty Russell   module: clean up ...
1759
1760
1761
1762
1763
1764
1765
1766
   *
   * General layout of module is:
   *          [text] [read-only-data] [writable data]
   * text_size -----^                ^               ^
   * ro_size ------------------------|               |
   * size -------------------------------------------|
   *
   * These values are always page-aligned (as is base)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1767
   */
85c898db6   Rusty Russell   module: clean up ...
1768
1769
  static void frob_text(const struct module_layout *layout,
  		      int (*set_memory)(unsigned long start, int num_pages))
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1770
  {
85c898db6   Rusty Russell   module: clean up ...
1771
1772
1773
1774
  	BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
  	BUG_ON((unsigned long)layout->text_size & (PAGE_SIZE-1));
  	set_memory((unsigned long)layout->base,
  		   layout->text_size >> PAGE_SHIFT);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1775
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1776

85c898db6   Rusty Russell   module: clean up ...
1777
1778
  static void frob_rodata(const struct module_layout *layout,
  			int (*set_memory)(unsigned long start, int num_pages))
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1779
  {
85c898db6   Rusty Russell   module: clean up ...
1780
1781
1782
1783
1784
  	BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
  	BUG_ON((unsigned long)layout->text_size & (PAGE_SIZE-1));
  	BUG_ON((unsigned long)layout->ro_size & (PAGE_SIZE-1));
  	set_memory((unsigned long)layout->base + layout->text_size,
  		   (layout->ro_size - layout->text_size) >> PAGE_SHIFT);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1785
  }
85c898db6   Rusty Russell   module: clean up ...
1786
1787
  static void frob_writable_data(const struct module_layout *layout,
  			       int (*set_memory)(unsigned long start, int num_pages))
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1788
  {
85c898db6   Rusty Russell   module: clean up ...
1789
1790
1791
1792
1793
  	BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
  	BUG_ON((unsigned long)layout->ro_size & (PAGE_SIZE-1));
  	BUG_ON((unsigned long)layout->size & (PAGE_SIZE-1));
  	set_memory((unsigned long)layout->base + layout->ro_size,
  		   (layout->size - layout->ro_size) >> PAGE_SHIFT);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1794
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1795

85c898db6   Rusty Russell   module: clean up ...
1796
1797
  /* livepatching wants to disable read-only so it can frob module. */
  void module_disable_ro(const struct module *mod)
20ef10c1b   Josh Poimboeuf   module: Use the s...
1798
  {
85c898db6   Rusty Russell   module: clean up ...
1799
1800
1801
1802
  	frob_text(&mod->core_layout, set_memory_rw);
  	frob_rodata(&mod->core_layout, set_memory_rw);
  	frob_text(&mod->init_layout, set_memory_rw);
  	frob_rodata(&mod->init_layout, set_memory_rw);
20ef10c1b   Josh Poimboeuf   module: Use the s...
1803
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1804

85c898db6   Rusty Russell   module: clean up ...
1805
  void module_enable_ro(const struct module *mod)
01526ed08   Jan Glauber   module: split uns...
1806
  {
85c898db6   Rusty Russell   module: clean up ...
1807
1808
1809
1810
  	frob_text(&mod->core_layout, set_memory_ro);
  	frob_rodata(&mod->core_layout, set_memory_ro);
  	frob_text(&mod->init_layout, set_memory_ro);
  	frob_rodata(&mod->init_layout, set_memory_ro);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1811
  }
85c898db6   Rusty Russell   module: clean up ...
1812
  static void module_enable_nx(const struct module *mod)
01526ed08   Jan Glauber   module: split uns...
1813
  {
85c898db6   Rusty Russell   module: clean up ...
1814
1815
1816
1817
  	frob_rodata(&mod->core_layout, set_memory_nx);
  	frob_writable_data(&mod->core_layout, set_memory_nx);
  	frob_rodata(&mod->init_layout, set_memory_nx);
  	frob_writable_data(&mod->init_layout, set_memory_nx);
01526ed08   Jan Glauber   module: split uns...
1818
  }
85c898db6   Rusty Russell   module: clean up ...
1819
  static void module_disable_nx(const struct module *mod)
01526ed08   Jan Glauber   module: split uns...
1820
  {
85c898db6   Rusty Russell   module: clean up ...
1821
1822
1823
1824
  	frob_rodata(&mod->core_layout, set_memory_x);
  	frob_writable_data(&mod->core_layout, set_memory_x);
  	frob_rodata(&mod->init_layout, set_memory_x);
  	frob_writable_data(&mod->init_layout, set_memory_x);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1825
1826
1827
  }
  
  /* Iterate through all modules and set each module's text as RW */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1828
  void set_all_modules_text_rw(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1829
1830
1831
1832
1833
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1834
1835
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
85c898db6   Rusty Russell   module: clean up ...
1836
1837
1838
  
  		frob_text(&mod->core_layout, set_memory_rw);
  		frob_text(&mod->init_layout, set_memory_rw);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1839
1840
1841
1842
1843
  	}
  	mutex_unlock(&module_mutex);
  }
  
  /* Iterate through all modules and set each module's text as RO */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1844
  void set_all_modules_text_ro(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1845
1846
1847
1848
1849
  {
  	struct module *mod;
  
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1850
1851
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
85c898db6   Rusty Russell   module: clean up ...
1852
1853
1854
  
  		frob_text(&mod->core_layout, set_memory_ro);
  		frob_text(&mod->init_layout, set_memory_ro);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1855
1856
1857
  	}
  	mutex_unlock(&module_mutex);
  }
85c898db6   Rusty Russell   module: clean up ...
1858
1859
1860
1861
1862
1863
1864
1865
  
  static void disable_ro_nx(const struct module_layout *layout)
  {
  	frob_text(layout, set_memory_rw);
  	frob_rodata(layout, set_memory_rw);
  	frob_rodata(layout, set_memory_x);
  	frob_writable_data(layout, set_memory_x);
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1866
  #else
85c898db6   Rusty Russell   module: clean up ...
1867
1868
1869
  static void disable_ro_nx(const struct module_layout *layout) { }
  static void module_enable_nx(const struct module *mod) { }
  static void module_disable_nx(const struct module *mod) { }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1870
  #endif
be1f221c0   Rusty Russell   module: remove mo...
1871
  void __weak module_memfree(void *module_region)
74e08fcf7   Jonas Bonn   modules: add defa...
1872
1873
1874
1875
1876
1877
1878
  {
  	vfree(module_region);
  }
  
  void __weak module_arch_cleanup(struct module *mod)
  {
  }
d453cded0   Rusty Russell   module_arch_freei...
1879
1880
1881
  void __weak module_arch_freeing_init(struct module *mod)
  {
  }
75676500f   Rusty Russell   module: make lock...
1882
  /* Free a module, remove from lists, etc. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1883
1884
  static void free_module(struct module *mod)
  {
7ead8b831   Li Zefan   tracing/events: A...
1885
  	trace_module_free(mod);
36b0360d1   Rusty Russell   module: fix sysfs...
1886
  	mod_sysfs_teardown(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1887

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

b82bab4bb   Jason Baron   dynamic debug: mo...
1894
1895
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1896
1897
1898
1899
1900
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
1901
1902
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
944a1fa01   Rusty Russell   module: don't unl...
1903
1904
  	/* Now we can delete it from the lists */
  	mutex_lock(&module_mutex);
461e34aed   Masami Hiramatsu   module: Unlink mo...
1905
1906
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
93c2e105f   Peter Zijlstra   module: Optimize ...
1907
  	mod_tree_remove(mod);
0286b5ea1   Masami Hiramatsu   lib/bug: Use RCU ...
1908
  	/* Remove this module from bug list, this uses list_del_rcu */
461e34aed   Masami Hiramatsu   module: Unlink mo...
1909
  	module_bug_cleanup(mod);
0be964be0   Peter Zijlstra   module: Sanitize ...
1910
1911
  	/* Wait for RCU-sched synchronizing before releasing mod->list and buglist. */
  	synchronize_sched();
944a1fa01   Rusty Russell   module: don't unl...
1912
  	mutex_unlock(&module_mutex);
85c898db6   Rusty Russell   module: clean up ...
1913
1914
  	/* This may be empty, but that's OK */
  	disable_ro_nx(&mod->init_layout);
d453cded0   Rusty Russell   module_arch_freei...
1915
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
1916
  	module_memfree(mod->init_layout.base);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1917
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
1918
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
1919

35a9393c9   Peter Zijlstra   lockdep: Fix the ...
1920
  	/* Free lock-classes; relies on the preceding sync_rcu(). */
7523e4dc5   Rusty Russell   module: use a str...
1921
  	lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
1922

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1923
  	/* Finally, free the core (containing the module structure) */
85c898db6   Rusty Russell   module: clean up ...
1924
  	disable_ro_nx(&mod->core_layout);
7523e4dc5   Rusty Russell   module: use a str...
1925
  	module_memfree(mod->core_layout.base);
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
1926
1927
1928
1929
  
  #ifdef CONFIG_MPU
  	update_protections(current->mm);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1930
1931
1932
1933
1934
  }
  
  void *__symbol_get(const char *symbol)
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1935
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1936

24da1cbff   Rusty Russell   modules: remove m...
1937
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
1938
1939
1940
  	sym = find_symbol(symbol, &owner, NULL, true, true);
  	if (sym && strong_try_module_get(owner))
  		sym = NULL;
24da1cbff   Rusty Russell   modules: remove m...
1941
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1942

414fd31b2   Tim Abbott   module: Make find...
1943
  	return sym ? (void *)sym->value : NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1944
1945
  }
  EXPORT_SYMBOL_GPL(__symbol_get);
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1946
1947
  /*
   * Ensure that an exported symbol [global namespace] does not already exist
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
1948
   * in the kernel or in some other module's exported symbol table.
be593f4ce   Rusty Russell   module: verify_ex...
1949
1950
   *
   * You must hold the module_mutex.
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1951
1952
1953
   */
  static int verify_export_symbols(struct module *mod)
  {
b211104d1   Rusty Russell   module: Enhance v...
1954
  	unsigned int i;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1955
  	struct module *owner;
b211104d1   Rusty Russell   module: Enhance v...
1956
1957
1958
1959
1960
1961
1962
1963
  	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...
1964
  #ifdef CONFIG_UNUSED_SYMBOLS
b211104d1   Rusty Russell   module: Enhance v...
1965
1966
  		{ mod->unused_syms, mod->num_unused_syms },
  		{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
1967
  #endif
b211104d1   Rusty Russell   module: Enhance v...
1968
  	};
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1969

b211104d1   Rusty Russell   module: Enhance v...
1970
1971
  	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...
1972
  			if (find_symbol(s->name, &owner, NULL, true, false)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1973
  				pr_err("%s: exports duplicate symbol %s"
b211104d1   Rusty Russell   module: Enhance v...
1974
1975
1976
1977
1978
  				       " (owned by %s)
  ",
  				       mod->name, s->name, module_name(owner));
  				return -ENOEXEC;
  			}
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1979
  		}
b211104d1   Rusty Russell   module: Enhance v...
1980
1981
  	}
  	return 0;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
1982
  }
9a4b9708f   Matti Linnanvuori   module: fix and e...
1983
  /* Change all symbols so that st_value encodes the pointer directly. */
49668688d   Rusty Russell   module: pass load...
1984
1985
1986
1987
  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
1988
  	unsigned long secbase;
49668688d   Rusty Russell   module: pass load...
1989
  	unsigned int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1990
  	int ret = 0;
414fd31b2   Tim Abbott   module: Make find...
1991
  	const struct kernel_symbol *ksym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1992

49668688d   Rusty Russell   module: pass load...
1993
1994
  	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
1995
1996
  		switch (sym[i].st_shndx) {
  		case SHN_COMMON:
80375980f   Joe Mario   lto: Handle LTO c...
1997
1998
1999
  			/* Ignore common symbols */
  			if (!strncmp(name, "__gnu_lto", 9))
  				break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2000
2001
  			/* We compiled with -fno-common.  These are not
  			   supposed to happen.  */
5e1241692   Jim Cromie   module: replace D...
2002
2003
  			pr_debug("Common symbol: %s
  ", name);
6da0b5651   Ionut Alexa   kernel:module Fix...
2004
2005
  			pr_warn("%s: please compile with -fno-common
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2006
2007
2008
2009
2010
2011
  			       mod->name);
  			ret = -ENOEXEC;
  			break;
  
  		case SHN_ABS:
  			/* Don't need to do anything */
5e1241692   Jim Cromie   module: replace D...
2012
2013
  			pr_debug("Absolute symbol: 0x%08lx
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2014
2015
2016
2017
  			       (long)sym[i].st_value);
  			break;
  
  		case SHN_UNDEF:
49668688d   Rusty Russell   module: pass load...
2018
  			ksym = resolve_symbol_wait(mod, info, name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2019
  			/* Ok if resolved.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
2020
  			if (ksym && !IS_ERR(ksym)) {
414fd31b2   Tim Abbott   module: Make find...
2021
  				sym[i].st_value = ksym->value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2022
  				break;
414fd31b2   Tim Abbott   module: Make find...
2023
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2024
  			/* Ok if weak.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
2025
  			if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2026
  				break;
bddb12b32   Andrew Morton   kernel/module.c: ...
2027
2028
2029
  			pr_warn("%s: Unknown symbol %s (err %li)
  ",
  				mod->name, name, PTR_ERR(ksym));
9bea7f239   Rusty Russell   module: fix bne2 ...
2030
  			ret = PTR_ERR(ksym) ?: -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2031
2032
2033
2034
  			break;
  
  		default:
  			/* Divert to percpu allocation if a percpu var. */
49668688d   Rusty Russell   module: pass load...
2035
  			if (sym[i].st_shndx == info->index.pcpu)
259354dea   Tejun Heo   module: encapsula...
2036
  				secbase = (unsigned long)mod_percpu(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2037
  			else
49668688d   Rusty Russell   module: pass load...
2038
  				secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2039
2040
2041
2042
2043
2044
2045
  			sym[i].st_value += secbase;
  			break;
  		}
  	}
  
  	return ret;
  }
49668688d   Rusty Russell   module: pass load...
2046
  static int apply_relocations(struct module *mod, const struct load_info *info)
22e268ebe   Rusty Russell   module: refactor ...
2047
2048
2049
2050
2051
  {
  	unsigned int i;
  	int err = 0;
  
  	/* Now do relocations. */
49668688d   Rusty Russell   module: pass load...
2052
2053
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		unsigned int infosec = info->sechdrs[i].sh_info;
22e268ebe   Rusty Russell   module: refactor ...
2054
2055
  
  		/* Not a valid relocation section? */
49668688d   Rusty Russell   module: pass load...
2056
  		if (infosec >= info->hdr->e_shnum)
22e268ebe   Rusty Russell   module: refactor ...
2057
2058
2059
  			continue;
  
  		/* Don't bother with non-allocated sections */
49668688d   Rusty Russell   module: pass load...
2060
  		if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC))
22e268ebe   Rusty Russell   module: refactor ...
2061
  			continue;
49668688d   Rusty Russell   module: pass load...
2062
2063
2064
2065
2066
2067
  		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 ...
2068
2069
2070
2071
2072
  		if (err < 0)
  			break;
  	}
  	return err;
  }
088af9a6e   Helge Deller   module: fix modul...
2073
2074
2075
2076
2077
2078
2079
  /* 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
2080
  /* Update size with this section: return offset. */
088af9a6e   Helge Deller   module: fix modul...
2081
2082
  static long get_offset(struct module *mod, unsigned int *size,
  		       Elf_Shdr *sechdr, unsigned int section)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2083
2084
  {
  	long ret;
088af9a6e   Helge Deller   module: fix modul...
2085
  	*size += arch_mod_section_prepend(mod, section);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2086
2087
2088
2089
2090
2091
2092
2093
2094
  	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...
2095
  static void layout_sections(struct module *mod, struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
  {
  	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...
2107
2108
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		info->sechdrs[i].sh_entsize = ~0UL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2109

5e1241692   Jim Cromie   module: replace D...
2110
2111
  	pr_debug("Core section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2112
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
2113
2114
2115
  		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
2116
2117
2118
2119
  
  			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...
2120
  			    || strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2121
  				continue;
7523e4dc5   Rusty Russell   module: use a str...
2122
  			s->sh_entsize = get_offset(mod, &mod->core_layout.size, s, i);
5e1241692   Jim Cromie   module: replace D...
2123
2124
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2125
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2126
2127
  		switch (m) {
  		case 0: /* executable */
7523e4dc5   Rusty Russell   module: use a str...
2128
2129
  			mod->core_layout.size = debug_align(mod->core_layout.size);
  			mod->core_layout.text_size = mod->core_layout.size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2130
2131
  			break;
  		case 1: /* RO: text and ro-data */
7523e4dc5   Rusty Russell   module: use a str...
2132
2133
  			mod->core_layout.size = debug_align(mod->core_layout.size);
  			mod->core_layout.ro_size = mod->core_layout.size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2134
2135
  			break;
  		case 3: /* whole core */
7523e4dc5   Rusty Russell   module: use a str...
2136
  			mod->core_layout.size = debug_align(mod->core_layout.size);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2137
2138
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2139
  	}
5e1241692   Jim Cromie   module: replace D...
2140
2141
  	pr_debug("Init section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2142
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
2143
2144
2145
  		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
2146
2147
2148
2149
  
  			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...
2150
  			    || !strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2151
  				continue;
7523e4dc5   Rusty Russell   module: use a str...
2152
  			s->sh_entsize = (get_offset(mod, &mod->init_layout.size, s, i)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2153
  					 | INIT_OFFSET_MASK);
5e1241692   Jim Cromie   module: replace D...
2154
2155
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2156
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2157
2158
  		switch (m) {
  		case 0: /* executable */
7523e4dc5   Rusty Russell   module: use a str...
2159
2160
  			mod->init_layout.size = debug_align(mod->init_layout.size);
  			mod->init_layout.text_size = mod->init_layout.size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2161
2162
  			break;
  		case 1: /* RO: text and ro-data */
7523e4dc5   Rusty Russell   module: use a str...
2163
2164
  			mod->init_layout.size = debug_align(mod->init_layout.size);
  			mod->init_layout.ro_size = mod->init_layout.size;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2165
2166
  			break;
  		case 3: /* whole init */
7523e4dc5   Rusty Russell   module: use a str...
2167
  			mod->init_layout.size = debug_align(mod->init_layout.size);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2168
2169
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2170
2171
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2172
2173
2174
2175
  static void set_license(struct module *mod, const char *license)
  {
  	if (!license)
  		license = "unspecified";
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
2176
  	if (!license_is_gpl_compatible(license)) {
25ddbb18a   Andi Kleen   Make the taint fl...
2177
  		if (!test_taint(TAINT_PROPRIETARY_MODULE))
bddb12b32   Andrew Morton   kernel/module.c: ...
2178
2179
2180
  			pr_warn("%s: module license '%s' taints kernel.
  ",
  				mod->name, license);
373d4d099   Rusty Russell   taint: add explic...
2181
2182
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
  	}
  }
  
  /* 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...
2204
  static char *get_modinfo(struct load_info *info, const char *tag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2205
2206
2207
  {
  	char *p;
  	unsigned int taglen = strlen(tag);
49668688d   Rusty Russell   module: pass load...
2208
2209
  	Elf_Shdr *infosec = &info->sechdrs[info->index.info];
  	unsigned long size = infosec->sh_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2210

49668688d   Rusty Russell   module: pass load...
2211
  	for (p = (char *)infosec->sh_addr; p; p = next_string(p, &size)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2212
2213
2214
2215
2216
  		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
  			return p + taglen + 1;
  	}
  	return NULL;
  }
49668688d   Rusty Russell   module: pass load...
2217
  static void setup_modinfo(struct module *mod, struct load_info *info)
c988d2b28   Matt Domsch   [PATCH] modules: ...
2218
2219
2220
2221
2222
2223
  {
  	struct module_attribute *attr;
  	int i;
  
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
  		if (attr->setup)
49668688d   Rusty Russell   module: pass load...
2224
  			attr->setup(mod, get_modinfo(info, attr->attr.name));
c988d2b28   Matt Domsch   [PATCH] modules: ...
2225
2226
  	}
  }
c988d2b28   Matt Domsch   [PATCH] modules: ...
2227

a263f7763   Rusty Russell   module: fix memor...
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
  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
2238
  #ifdef CONFIG_KALLSYMS
15bba37d6   WANG Cong   module: fix build...
2239
2240
2241
2242
2243
2244
  
  /* 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...
2245
2246
  	return bsearch(name, start, stop - start,
  			sizeof(struct kernel_symbol), cmp_name);
15bba37d6   WANG Cong   module: fix build...
2247
  }
ca4787b77   Tim Abbott   kernel/module.c: ...
2248
2249
  static int is_exported(const char *name, unsigned long value,
  		       const struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2250
  {
ca4787b77   Tim Abbott   kernel/module.c: ...
2251
2252
2253
  	const struct kernel_symbol *ks;
  	if (!mod)
  		ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab);
3fd6805f4   Sam Ravnborg   [PATCH] Clean up ...
2254
  	else
ca4787b77   Tim Abbott   kernel/module.c: ...
2255
2256
  		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
2257
2258
2259
  }
  
  /* As per nm */
eded41c1c   Rusty Russell   module: kallsyms ...
2260
  static char elf_type(const Elf_Sym *sym, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2261
  {
eded41c1c   Rusty Russell   module: kallsyms ...
2262
  	const Elf_Shdr *sechdrs = info->sechdrs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2263
2264
2265
2266
2267
2268
2269
2270
  	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';
e02244185   Miroslav Benes   module: keep perc...
2271
  	if (sym->st_shndx == SHN_ABS || sym->st_shndx == info->index.pcpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
  		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 ...
2292
2293
  	if (strstarts(info->secstrings + sechdrs[sym->st_shndx].sh_name,
  		      ".debug")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2294
  		return 'n';
eded41c1c   Rusty Russell   module: kallsyms ...
2295
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2296
2297
  	return '?';
  }
4a4962263   Jan Beulich   module: reduce sy...
2298
  static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs,
e02244185   Miroslav Benes   module: keep perc...
2299
  			unsigned int shnum, unsigned int pcpundx)
4a4962263   Jan Beulich   module: reduce sy...
2300
2301
2302
2303
2304
2305
2306
  {
  	const Elf_Shdr *sec;
  
  	if (src->st_shndx == SHN_UNDEF
  	    || src->st_shndx >= shnum
  	    || !src->st_name)
  		return false;
e02244185   Miroslav Benes   module: keep perc...
2307
2308
2309
2310
  #ifdef CONFIG_KALLSYMS_ALL
  	if (src->st_shndx == pcpundx)
  		return true;
  #endif
4a4962263   Jan Beulich   module: reduce sy...
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
  	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...
2321
2322
2323
2324
2325
2326
2327
  /*
   * 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...
2328
  static void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2329
  {
49668688d   Rusty Russell   module: pass load...
2330
2331
  	Elf_Shdr *symsect = info->sechdrs + info->index.sym;
  	Elf_Shdr *strsect = info->sechdrs + info->index.str;
4a4962263   Jan Beulich   module: reduce sy...
2332
  	const Elf_Sym *src;
54523ec71   Satoru Takeuchi   module: Remove a ...
2333
  	unsigned int i, nsrc, ndst, strtab_size = 0;
4a4962263   Jan Beulich   module: reduce sy...
2334
2335
2336
  
  	/* Put symbol section at end of init part of module. */
  	symsect->sh_flags |= SHF_ALLOC;
7523e4dc5   Rusty Russell   module: use a str...
2337
  	symsect->sh_entsize = get_offset(mod, &mod->init_layout.size, symsect,
49668688d   Rusty Russell   module: pass load...
2338
  					 info->index.sym) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2339
2340
  	pr_debug("\t%s
  ", info->secstrings + symsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2341

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

48fd11880   Kevin Cernekee   module: Fix perfo...
2345
  	/* Compute total space required for the core symbols' strtab. */
59ef28b1f   Rusty Russell   module: fix out-b...
2346
2347
  	for (ndst = i = 0; i < nsrc; i++) {
  		if (i == 0 ||
e02244185   Miroslav Benes   module: keep perc...
2348
2349
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
  				   info->index.pcpu)) {
59ef28b1f   Rusty Russell   module: fix out-b...
2350
  			strtab_size += strlen(&info->strtab[src[i].st_name])+1;
48fd11880   Kevin Cernekee   module: Fix perfo...
2351
  			ndst++;
554bdfe5a   Jan Beulich   module: reduce st...
2352
  		}
59ef28b1f   Rusty Russell   module: fix out-b...
2353
  	}
4a4962263   Jan Beulich   module: reduce sy...
2354
2355
  
  	/* Append room for core symbols at end of core part. */
7523e4dc5   Rusty Russell   module: use a str...
2356
2357
2358
2359
  	info->symoffs = ALIGN(mod->core_layout.size, symsect->sh_addralign ?: 1);
  	info->stroffs = mod->core_layout.size = info->symoffs + ndst * sizeof(Elf_Sym);
  	mod->core_layout.size += strtab_size;
  	mod->core_layout.size = debug_align(mod->core_layout.size);
4a4962263   Jan Beulich   module: reduce sy...
2360

554bdfe5a   Jan Beulich   module: reduce st...
2361
2362
  	/* Put string table section at end of init part of module. */
  	strsect->sh_flags |= SHF_ALLOC;
7523e4dc5   Rusty Russell   module: use a str...
2363
  	strsect->sh_entsize = get_offset(mod, &mod->init_layout.size, strsect,
49668688d   Rusty Russell   module: pass load...
2364
  					 info->index.str) | INIT_OFFSET_MASK;
7523e4dc5   Rusty Russell   module: use a str...
2365
  	mod->init_layout.size = debug_align(mod->init_layout.size);
5e1241692   Jim Cromie   module: replace D...
2366
2367
  	pr_debug("\t%s
  ", info->secstrings + strsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2368
  }
811d66a0e   Rusty Russell   module: group pos...
2369
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2370
  {
4a4962263   Jan Beulich   module: reduce sy...
2371
2372
2373
  	unsigned int i, ndst;
  	const Elf_Sym *src;
  	Elf_Sym *dst;
554bdfe5a   Jan Beulich   module: reduce st...
2374
  	char *s;
eded41c1c   Rusty Russell   module: kallsyms ...
2375
  	Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2376

eded41c1c   Rusty Russell   module: kallsyms ...
2377
2378
  	mod->symtab = (void *)symsec->sh_addr;
  	mod->num_symtab = symsec->sh_size / sizeof(Elf_Sym);
511ca6ae4   Rusty Russell   module: fix crash...
2379
2380
  	/* 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
2381
2382
2383
  
  	/* Set types up while we still have access to sections. */
  	for (i = 0; i < mod->num_symtab; i++)
eded41c1c   Rusty Russell   module: kallsyms ...
2384
  		mod->symtab[i].st_info = elf_type(&mod->symtab[i], info);
4a4962263   Jan Beulich   module: reduce sy...
2385

7523e4dc5   Rusty Russell   module: use a str...
2386
2387
  	mod->core_symtab = dst = mod->core_layout.base + info->symoffs;
  	mod->core_strtab = s = mod->core_layout.base + info->stroffs;
4a4962263   Jan Beulich   module: reduce sy...
2388
  	src = mod->symtab;
59ef28b1f   Rusty Russell   module: fix out-b...
2389
2390
  	for (ndst = i = 0; i < mod->num_symtab; i++) {
  		if (i == 0 ||
e02244185   Miroslav Benes   module: keep perc...
2391
2392
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
  				   info->index.pcpu)) {
59ef28b1f   Rusty Russell   module: fix out-b...
2393
2394
2395
2396
2397
  			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...
2398
2399
  	}
  	mod->core_num_syms = ndst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2400
2401
  }
  #else
49668688d   Rusty Russell   module: pass load...
2402
  static inline void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2403
2404
  {
  }
3ae91c21d   Paul Mundt   module: fix up CO...
2405

abbce906d   MichaÅ‚ MirosÅ‚aw   (trivial) Fix com...
2406
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2407
2408
2409
  {
  }
  #endif /* CONFIG_KALLSYMS */
e9d376f0f   Jason Baron   dynamic debug: co...
2410
  static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num)
346e15beb   Jason Baron   driver core: basi...
2411
  {
811d66a0e   Rusty Russell   module: group pos...
2412
2413
  	if (!debug)
  		return;
e9d376f0f   Jason Baron   dynamic debug: co...
2414
2415
  #ifdef CONFIG_DYNAMIC_DEBUG
  	if (ddebug_add_module(debug, num, debug->modname))
bddb12b32   Andrew Morton   kernel/module.c: ...
2416
2417
2418
  		pr_err("dynamic debug error adding module: %s
  ",
  			debug->modname);
e9d376f0f   Jason Baron   dynamic debug: co...
2419
  #endif
5e458cc0f   Rusty Russell   module: simplify ...
2420
  }
346e15beb   Jason Baron   driver core: basi...
2421

ff49d74ad   Yehuda Sadeh   module: initializ...
2422
2423
2424
2425
2426
  static void dynamic_debug_remove(struct _ddebug *debug)
  {
  	if (debug)
  		ddebug_remove_module(debug->modname);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2427
2428
  void * __weak module_alloc(unsigned long size)
  {
82fab442f   Rusty Russell   modules: don't ha...
2429
  	return vmalloc_exec(size);
74e08fcf7   Jonas Bonn   modules: add defa...
2430
  }
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2431
  #ifdef CONFIG_DEBUG_KMEMLEAK
49668688d   Rusty Russell   module: pass load...
2432
2433
  static void kmemleak_load_module(const struct module *mod,
  				 const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2434
2435
2436
2437
  {
  	unsigned int i;
  
  	/* only scan the sections containing data */
c017b4be3   Catalin Marinas   kmemleak: Simplif...
2438
  	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2439

49668688d   Rusty Russell   module: pass load...
2440
  	for (i = 1; i < info->hdr->e_shnum; i++) {
06c9494c0   Steven Rostedt   kmemleak: Scan al...
2441
2442
2443
2444
  		/* Scan all writable sections that's not executable */
  		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) ||
  		    !(info->sechdrs[i].sh_flags & SHF_WRITE) ||
  		    (info->sechdrs[i].sh_flags & SHF_EXECINSTR))
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2445
  			continue;
49668688d   Rusty Russell   module: pass load...
2446
2447
  		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
  				   info->sechdrs[i].sh_size, GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2448
2449
2450
  	}
  }
  #else
49668688d   Rusty Russell   module: pass load...
2451
2452
  static inline void kmemleak_load_module(const struct module *mod,
  					const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2453
2454
2455
  {
  }
  #endif
106a4ee25   Rusty Russell   module: signature...
2456
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
2457
  static int module_sig_check(struct load_info *info)
106a4ee25   Rusty Russell   module: signature...
2458
2459
  {
  	int err = -ENOKEY;
34e1169d9   Kees Cook   module: add sysca...
2460
2461
  	const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1;
  	const void *mod = info->hdr;
caabe2405   David Howells   MODSIGN: Move the...
2462

34e1169d9   Kees Cook   module: add sysca...
2463
2464
  	if (info->len > markerlen &&
  	    memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) {
caabe2405   David Howells   MODSIGN: Move the...
2465
  		/* We truncate the module to discard the signature */
34e1169d9   Kees Cook   module: add sysca...
2466
2467
  		info->len -= markerlen;
  		err = mod_verify_sig(mod, &info->len);
106a4ee25   Rusty Russell   module: signature...
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
  	}
  
  	if (!err) {
  		info->sig_ok = true;
  		return 0;
  	}
  
  	/* Not having a signature is only an error if we're strict. */
  	if (err == -ENOKEY && !sig_enforce)
  		err = 0;
  
  	return err;
  }
  #else /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2482
  static int module_sig_check(struct load_info *info)
106a4ee25   Rusty Russell   module: signature...
2483
2484
2485
2486
  {
  	return 0;
  }
  #endif /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2487
2488
  /* Sanity checks against invalid binaries, wrong arch, weird elf version. */
  static int elf_header_check(struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2489
  {
34e1169d9   Kees Cook   module: add sysca...
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
  	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 ...
2503

34e1169d9   Kees Cook   module: add sysca...
2504
2505
  	return 0;
  }
3afe9f849   Linus Torvalds   Copy the kernel m...
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
  #define COPY_CHUNK_SIZE (16*PAGE_SIZE)
  
  static int copy_chunked_from_user(void *dst, const void __user *usrc, unsigned long len)
  {
  	do {
  		unsigned long n = min(len, COPY_CHUNK_SIZE);
  
  		if (copy_from_user(dst, usrc, n) != 0)
  			return -EFAULT;
  		cond_resched();
  		dst += n;
  		usrc += n;
  		len -= n;
  	} while (len);
  	return 0;
  }
34e1169d9   Kees Cook   module: add sysca...
2522
2523
2524
  /* 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 ...
2525
2526
  {
  	int err;
40dd2560e   Rusty Russell   module: refactor ...
2527

34e1169d9   Kees Cook   module: add sysca...
2528
2529
  	info->len = len;
  	if (info->len < sizeof(*(info->hdr)))
40dd2560e   Rusty Russell   module: refactor ...
2530
  		return -ENOEXEC;
2e72d51b4   Kees Cook   security: introdu...
2531
2532
2533
  	err = security_kernel_module_from_file(NULL);
  	if (err)
  		return err;
40dd2560e   Rusty Russell   module: refactor ...
2534
  	/* Suck in entire file: we'll want most of it. */
cc9e605dc   Kirill A. Shutemov   module: do not pr...
2535
2536
  	info->hdr = __vmalloc(info->len,
  			GFP_KERNEL | __GFP_HIGHMEM | __GFP_NOWARN, PAGE_KERNEL);
34e1169d9   Kees Cook   module: add sysca...
2537
  	if (!info->hdr)
40dd2560e   Rusty Russell   module: refactor ...
2538
  		return -ENOMEM;
3afe9f849   Linus Torvalds   Copy the kernel m...
2539
  	if (copy_chunked_from_user(info->hdr, umod, info->len) != 0) {
34e1169d9   Kees Cook   module: add sysca...
2540
2541
  		vfree(info->hdr);
  		return -EFAULT;
40dd2560e   Rusty Russell   module: refactor ...
2542
  	}
34e1169d9   Kees Cook   module: add sysca...
2543
2544
2545
2546
2547
2548
  	return 0;
  }
  
  /* Sets info->hdr and info->len. */
  static int copy_module_from_fd(int fd, struct load_info *info)
  {
a2e0578be   Al Viro   switch copy_modul...
2549
  	struct fd f = fdget(fd);
34e1169d9   Kees Cook   module: add sysca...
2550
2551
2552
2553
  	int err;
  	struct kstat stat;
  	loff_t pos;
  	ssize_t bytes = 0;
a2e0578be   Al Viro   switch copy_modul...
2554
  	if (!f.file)
34e1169d9   Kees Cook   module: add sysca...
2555
  		return -ENOEXEC;
a2e0578be   Al Viro   switch copy_modul...
2556
  	err = security_kernel_module_from_file(f.file);
106a4ee25   Rusty Russell   module: signature...
2557
  	if (err)
2e72d51b4   Kees Cook   security: introdu...
2558
  		goto out;
106a4ee25   Rusty Russell   module: signature...
2559

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

34e1169d9   Kees Cook   module: add sysca...
2564
2565
2566
  	if (stat.size > INT_MAX) {
  		err = -EFBIG;
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2567
  	}
52441fa8f   Sasha Levin   module: prevent w...
2568
2569
2570
2571
2572
2573
  
  	/* Don't hand 0 to vmalloc, it whines. */
  	if (stat.size == 0) {
  		err = -EINVAL;
  		goto out;
  	}
34e1169d9   Kees Cook   module: add sysca...
2574
2575
2576
2577
  	info->hdr = vmalloc(stat.size);
  	if (!info->hdr) {
  		err = -ENOMEM;
  		goto out;
40dd2560e   Rusty Russell   module: refactor ...
2578
  	}
d913188c7   Rusty Russell   module: layout_an...
2579

34e1169d9   Kees Cook   module: add sysca...
2580
2581
  	pos = 0;
  	while (pos < stat.size) {
a2e0578be   Al Viro   switch copy_modul...
2582
  		bytes = kernel_read(f.file, pos, (char *)(info->hdr) + pos,
34e1169d9   Kees Cook   module: add sysca...
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
  				    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 ...
2594

34e1169d9   Kees Cook   module: add sysca...
2595
  out:
a2e0578be   Al Viro   switch copy_modul...
2596
  	fdput(f);
40dd2560e   Rusty Russell   module: refactor ...
2597
2598
  	return err;
  }
d913188c7   Rusty Russell   module: layout_an...
2599
2600
  static void free_copy(struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2601
2602
  	vfree(info->hdr);
  }
2f3238aeb   Rusty Russell   module: add flags...
2603
  static int rewrite_section_headers(struct load_info *info, int flags)
8b5f61a79   Rusty Russell   module: refactor ...
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
  {
  	unsigned int i;
  
  	/* This should always be true, but let's be sure. */
  	info->sechdrs[0].sh_addr = 0;
  
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		Elf_Shdr *shdr = &info->sechdrs[i];
  		if (shdr->sh_type != SHT_NOBITS
  		    && info->len < shdr->sh_offset + shdr->sh_size) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2614
2615
  			pr_err("Module len %lu truncated
  ", info->len);
8b5f61a79   Rusty Russell   module: refactor ...
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
  			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 ...
2628
  	}
d6df72a06   Rusty Russell   module: refactor ...
2629
2630
  
  	/* Track but don't keep modinfo and version sections. */
2f3238aeb   Rusty Russell   module: add flags...
2631
2632
2633
2634
  	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...
2635
  	info->index.info = find_sec(info, ".modinfo");
d6df72a06   Rusty Russell   module: refactor ...
2636
2637
  	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 ...
2638
2639
  	return 0;
  }
3264d3f9d   Linus Torvalds   module: add load_...
2640
2641
2642
2643
2644
2645
2646
2647
  /*
   * 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...
2648
  static struct module *setup_load_info(struct load_info *info, int flags)
3264d3f9d   Linus Torvalds   module: add load_...
2649
2650
  {
  	unsigned int i;
8b5f61a79   Rusty Russell   module: refactor ...
2651
  	int err;
3264d3f9d   Linus Torvalds   module: add load_...
2652
2653
2654
2655
  	struct module *mod;
  
  	/* Set up the convenience variables */
  	info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
8b5f61a79   Rusty Russell   module: refactor ...
2656
2657
  	info->secstrings = (void *)info->hdr
  		+ info->sechdrs[info->hdr->e_shstrndx].sh_offset;
3264d3f9d   Linus Torvalds   module: add load_...
2658

2f3238aeb   Rusty Russell   module: add flags...
2659
  	err = rewrite_section_headers(info, flags);
8b5f61a79   Rusty Russell   module: refactor ...
2660
2661
  	if (err)
  		return ERR_PTR(err);
3264d3f9d   Linus Torvalds   module: add load_...
2662

8b5f61a79   Rusty Russell   module: refactor ...
2663
2664
  	/* Find internal symbols and strings. */
  	for (i = 1; i < info->hdr->e_shnum; i++) {
3264d3f9d   Linus Torvalds   module: add load_...
2665
2666
2667
  		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 ...
2668
2669
2670
  			info->strtab = (char *)info->hdr
  				+ info->sechdrs[info->index.str].sh_offset;
  			break;
3264d3f9d   Linus Torvalds   module: add load_...
2671
  		}
3264d3f9d   Linus Torvalds   module: add load_...
2672
  	}
49668688d   Rusty Russell   module: pass load...
2673
  	info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
3264d3f9d   Linus Torvalds   module: add load_...
2674
  	if (!info->index.mod) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2675
2676
  		pr_warn("No module found in object
  ");
3264d3f9d   Linus Torvalds   module: add load_...
2677
2678
2679
2680
2681
2682
  		return ERR_PTR(-ENOEXEC);
  	}
  	/* This is temporary: point mod into copy of data. */
  	mod = (void *)info->sechdrs[info->index.mod].sh_addr;
  
  	if (info->index.sym == 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2683
2684
  		pr_warn("%s: module has no symbols (stripped?)
  ", mod->name);
3264d3f9d   Linus Torvalds   module: add load_...
2685
2686
  		return ERR_PTR(-ENOEXEC);
  	}
49668688d   Rusty Russell   module: pass load...
2687
  	info->index.pcpu = find_pcpusec(info);
3264d3f9d   Linus Torvalds   module: add load_...
2688

3264d3f9d   Linus Torvalds   module: add load_...
2689
2690
2691
2692
2693
  	/* 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_...
2694
  }
2f3238aeb   Rusty Russell   module: add flags...
2695
  static int check_modinfo(struct module *mod, struct load_info *info, int flags)
40dd2560e   Rusty Russell   module: refactor ...
2696
  {
49668688d   Rusty Russell   module: pass load...
2697
  	const char *modmagic = get_modinfo(info, "vermagic");
40dd2560e   Rusty Russell   module: refactor ...
2698
  	int err;
2f3238aeb   Rusty Russell   module: add flags...
2699
2700
  	if (flags & MODULE_INIT_IGNORE_VERMAGIC)
  		modmagic = NULL;
40dd2560e   Rusty Russell   module: refactor ...
2701
2702
2703
2704
2705
  	/* 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...
2706
  	} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2707
2708
  		pr_err("%s: version magic '%s' should be '%s'
  ",
40dd2560e   Rusty Russell   module: refactor ...
2709
2710
2711
  		       mod->name, modmagic, vermagic);
  		return -ENOEXEC;
  	}
2449b8ba0   Ben Hutchings   module,bug: Add T...
2712
  	if (!get_modinfo(info, "intree"))
373d4d099   Rusty Russell   taint: add explic...
2713
  		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
2449b8ba0   Ben Hutchings   module,bug: Add T...
2714

49668688d   Rusty Russell   module: pass load...
2715
  	if (get_modinfo(info, "staging")) {
373d4d099   Rusty Russell   taint: add explic...
2716
  		add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
bddb12b32   Andrew Morton   kernel/module.c: ...
2717
2718
2719
  		pr_warn("%s: module is from the staging directory, the quality "
  			"is unknown, you have been warned.
  ", mod->name);
40dd2560e   Rusty Russell   module: refactor ...
2720
  	}
22e268ebe   Rusty Russell   module: refactor ...
2721
2722
  
  	/* Set up license info based on the info section */
49668688d   Rusty Russell   module: pass load...
2723
  	set_license(mod, get_modinfo(info, "license"));
22e268ebe   Rusty Russell   module: refactor ...
2724

40dd2560e   Rusty Russell   module: refactor ...
2725
2726
  	return 0;
  }
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2727
  static int find_module_sections(struct module *mod, struct load_info *info)
f91a13bb9   Linus Torvalds   module: refactor ...
2728
  {
49668688d   Rusty Russell   module: pass load...
2729
  	mod->kp = section_objs(info, "__param",
f91a13bb9   Linus Torvalds   module: refactor ...
2730
  			       sizeof(*mod->kp), &mod->num_kp);
49668688d   Rusty Russell   module: pass load...
2731
  	mod->syms = section_objs(info, "__ksymtab",
f91a13bb9   Linus Torvalds   module: refactor ...
2732
  				 sizeof(*mod->syms), &mod->num_syms);
49668688d   Rusty Russell   module: pass load...
2733
2734
  	mod->crcs = section_addr(info, "__kcrctab");
  	mod->gpl_syms = section_objs(info, "__ksymtab_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2735
2736
  				     sizeof(*mod->gpl_syms),
  				     &mod->num_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2737
2738
  	mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");
  	mod->gpl_future_syms = section_objs(info,
f91a13bb9   Linus Torvalds   module: refactor ...
2739
2740
2741
  					    "__ksymtab_gpl_future",
  					    sizeof(*mod->gpl_future_syms),
  					    &mod->num_gpl_future_syms);
49668688d   Rusty Russell   module: pass load...
2742
  	mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future");
f91a13bb9   Linus Torvalds   module: refactor ...
2743
2744
  
  #ifdef CONFIG_UNUSED_SYMBOLS
49668688d   Rusty Russell   module: pass load...
2745
  	mod->unused_syms = section_objs(info, "__ksymtab_unused",
f91a13bb9   Linus Torvalds   module: refactor ...
2746
2747
  					sizeof(*mod->unused_syms),
  					&mod->num_unused_syms);
49668688d   Rusty Russell   module: pass load...
2748
2749
  	mod->unused_crcs = section_addr(info, "__kcrctab_unused");
  	mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2750
2751
  					    sizeof(*mod->unused_gpl_syms),
  					    &mod->num_unused_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2752
  	mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
f91a13bb9   Linus Torvalds   module: refactor ...
2753
2754
  #endif
  #ifdef CONFIG_CONSTRUCTORS
49668688d   Rusty Russell   module: pass load...
2755
  	mod->ctors = section_objs(info, ".ctors",
f91a13bb9   Linus Torvalds   module: refactor ...
2756
  				  sizeof(*mod->ctors), &mod->num_ctors);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2757
2758
2759
2760
2761
2762
2763
2764
  	if (!mod->ctors)
  		mod->ctors = section_objs(info, ".init_array",
  				sizeof(*mod->ctors), &mod->num_ctors);
  	else if (find_sec(info, ".init_array")) {
  		/*
  		 * This shouldn't happen with same compiler and binutils
  		 * building all parts of the module.
  		 */
6da0b5651   Ionut Alexa   kernel:module Fix...
2765
2766
  		pr_warn("%s: has both .ctors and .init_array.
  ",
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2767
2768
2769
  		       mod->name);
  		return -EINVAL;
  	}
f91a13bb9   Linus Torvalds   module: refactor ...
2770
2771
2772
  #endif
  
  #ifdef CONFIG_TRACEPOINTS
654986462   Mathieu Desnoyers   tracepoints: Fix ...
2773
2774
2775
  	mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
  					     sizeof(*mod->tracepoints_ptrs),
  					     &mod->num_tracepoints);
f91a13bb9   Linus Torvalds   module: refactor ...
2776
  #endif
bf5438fca   Jason Baron   jump label: Base ...
2777
2778
2779
2780
2781
  #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 ...
2782
  #ifdef CONFIG_EVENT_TRACING
49668688d   Rusty Russell   module: pass load...
2783
  	mod->trace_events = section_objs(info, "_ftrace_events",
f91a13bb9   Linus Torvalds   module: refactor ...
2784
2785
  					 sizeof(*mod->trace_events),
  					 &mod->num_trace_events);
3673b8e4c   Steven Rostedt (Red Hat)   tracing: Allow fo...
2786
2787
2788
  	mod->trace_enums = section_objs(info, "_ftrace_enum_map",
  					sizeof(*mod->trace_enums),
  					&mod->num_trace_enums);
f91a13bb9   Linus Torvalds   module: refactor ...
2789
  #endif
13b9b6e74   Steven Rostedt   tracing: Fix modu...
2790
2791
2792
2793
  #ifdef CONFIG_TRACING
  	mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
  					 sizeof(*mod->trace_bprintk_fmt_start),
  					 &mod->num_trace_bprintk_fmt);
13b9b6e74   Steven Rostedt   tracing: Fix modu...
2794
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
2795
2796
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  	/* sechdrs[0].sh_size is always zero */
49668688d   Rusty Russell   module: pass load...
2797
  	mod->ftrace_callsites = section_objs(info, "__mcount_loc",
f91a13bb9   Linus Torvalds   module: refactor ...
2798
2799
2800
  					     sizeof(*mod->ftrace_callsites),
  					     &mod->num_ftrace_callsites);
  #endif
22e268ebe   Rusty Russell   module: refactor ...
2801

811d66a0e   Rusty Russell   module: group pos...
2802
2803
  	mod->extable = section_objs(info, "__ex_table",
  				    sizeof(*mod->extable), &mod->num_exentries);
49668688d   Rusty Russell   module: pass load...
2804
  	if (section_addr(info, "__obsparm"))
bddb12b32   Andrew Morton   kernel/module.c: ...
2805
2806
  		pr_warn("%s: Ignoring obsolete parameters
  ", mod->name);
811d66a0e   Rusty Russell   module: group pos...
2807
2808
2809
  
  	info->debug = section_objs(info, "__verbose",
  				   sizeof(*info->debug), &info->num_debug);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2810
2811
  
  	return 0;
f91a13bb9   Linus Torvalds   module: refactor ...
2812
  }
49668688d   Rusty Russell   module: pass load...
2813
  static int move_module(struct module *mod, struct load_info *info)
65b8a9b4d   Linus Torvalds   module: refactor ...
2814
2815
2816
2817
2818
  {
  	int i;
  	void *ptr;
  
  	/* Do the allocs. */
7523e4dc5   Rusty Russell   module: use a str...
2819
  	ptr = module_alloc(mod->core_layout.size);
65b8a9b4d   Linus Torvalds   module: refactor ...
2820
2821
2822
2823
2824
2825
2826
  	/*
  	 * 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...
2827
  		return -ENOMEM;
65b8a9b4d   Linus Torvalds   module: refactor ...
2828

7523e4dc5   Rusty Russell   module: use a str...
2829
2830
  	memset(ptr, 0, mod->core_layout.size);
  	mod->core_layout.base = ptr;
65b8a9b4d   Linus Torvalds   module: refactor ...
2831

7523e4dc5   Rusty Russell   module: use a str...
2832
2833
  	if (mod->init_layout.size) {
  		ptr = module_alloc(mod->init_layout.size);
82fab442f   Rusty Russell   modules: don't ha...
2834
2835
2836
2837
2838
2839
2840
2841
  		/*
  		 * 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) {
7523e4dc5   Rusty Russell   module: use a str...
2842
  			module_memfree(mod->core_layout.base);
82fab442f   Rusty Russell   modules: don't ha...
2843
2844
  			return -ENOMEM;
  		}
7523e4dc5   Rusty Russell   module: use a str...
2845
2846
  		memset(ptr, 0, mod->init_layout.size);
  		mod->init_layout.base = ptr;
82fab442f   Rusty Russell   modules: don't ha...
2847
  	} else
7523e4dc5   Rusty Russell   module: use a str...
2848
  		mod->init_layout.base = NULL;
65b8a9b4d   Linus Torvalds   module: refactor ...
2849
2850
  
  	/* Transfer each section which specifies SHF_ALLOC */
5e1241692   Jim Cromie   module: replace D...
2851
2852
  	pr_debug("final section addresses:
  ");
49668688d   Rusty Russell   module: pass load...
2853
  	for (i = 0; i < info->hdr->e_shnum; i++) {
65b8a9b4d   Linus Torvalds   module: refactor ...
2854
  		void *dest;
49668688d   Rusty Russell   module: pass load...
2855
  		Elf_Shdr *shdr = &info->sechdrs[i];
65b8a9b4d   Linus Torvalds   module: refactor ...
2856

49668688d   Rusty Russell   module: pass load...
2857
  		if (!(shdr->sh_flags & SHF_ALLOC))
65b8a9b4d   Linus Torvalds   module: refactor ...
2858
  			continue;
49668688d   Rusty Russell   module: pass load...
2859
  		if (shdr->sh_entsize & INIT_OFFSET_MASK)
7523e4dc5   Rusty Russell   module: use a str...
2860
  			dest = mod->init_layout.base
49668688d   Rusty Russell   module: pass load...
2861
  				+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);
65b8a9b4d   Linus Torvalds   module: refactor ...
2862
  		else
7523e4dc5   Rusty Russell   module: use a str...
2863
  			dest = mod->core_layout.base + shdr->sh_entsize;
65b8a9b4d   Linus Torvalds   module: refactor ...
2864

49668688d   Rusty Russell   module: pass load...
2865
2866
  		if (shdr->sh_type != SHT_NOBITS)
  			memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
65b8a9b4d   Linus Torvalds   module: refactor ...
2867
  		/* Update sh_addr to point to copy in image. */
49668688d   Rusty Russell   module: pass load...
2868
  		shdr->sh_addr = (unsigned long)dest;
5e1241692   Jim Cromie   module: replace D...
2869
2870
2871
  		pr_debug("\t0x%lx %s
  ",
  			 (long)shdr->sh_addr, info->secstrings + shdr->sh_name);
65b8a9b4d   Linus Torvalds   module: refactor ...
2872
  	}
d913188c7   Rusty Russell   module: layout_an...
2873
2874
  
  	return 0;
65b8a9b4d   Linus Torvalds   module: refactor ...
2875
  }
49668688d   Rusty Russell   module: pass load...
2876
  static int check_module_license_and_versions(struct module *mod)
22e268ebe   Rusty Russell   module: refactor ...
2877
2878
2879
2880
2881
2882
2883
  {
  	/*
  	 * 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...
2884
  		add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
2885
2886
2887
  
  	/* driverloader was caught wrongly pretending to be under GPL */
  	if (strcmp(mod->name, "driverloader") == 0)
373d4d099   Rusty Russell   taint: add explic...
2888
2889
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
2890

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

22e268ebe   Rusty Russell   module: refactor ...
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
  #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.
  	 */
7523e4dc5   Rusty Russell   module: use a str...
2925
2926
2927
2928
2929
2930
  	if (mod->init_layout.base)
  		flush_icache_range((unsigned long)mod->init_layout.base,
  				   (unsigned long)mod->init_layout.base
  				   + mod->init_layout.size);
  	flush_icache_range((unsigned long)mod->core_layout.base,
  			   (unsigned long)mod->core_layout.base + mod->core_layout.size);
22e268ebe   Rusty Russell   module: refactor ...
2931
2932
2933
  
  	set_fs(old_fs);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2934
2935
2936
2937
2938
2939
2940
  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...
2941
  static struct module *layout_and_allocate(struct load_info *info, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2942
  {
d913188c7   Rusty Russell   module: layout_an...
2943
  	/* Module within temporary copy. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2944
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
2945
  	int err;
3ae91c21d   Paul Mundt   module: fix up CO...
2946

2f3238aeb   Rusty Russell   module: add flags...
2947
  	mod = setup_load_info(info, flags);
d913188c7   Rusty Russell   module: layout_an...
2948
2949
  	if (IS_ERR(mod))
  		return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2950

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

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

8d8022e8a   Rusty Russell   module: do percpu...
2961
2962
  	/* We will do a special allocation for per-cpu sections later. */
  	info->sechdrs[info->index.pcpu].sh_flags &= ~(unsigned long)SHF_ALLOC;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2963
2964
2965
2966
  
  	/* 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...
2967
  	layout_sections(mod, info);
49668688d   Rusty Russell   module: pass load...
2968
  	layout_symtab(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2969

65b8a9b4d   Linus Torvalds   module: refactor ...
2970
  	/* Allocate and move to the final place */
49668688d   Rusty Russell   module: pass load...
2971
  	err = move_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2972
  	if (err)
8d8022e8a   Rusty Russell   module: do percpu...
2973
  		return ERR_PTR(err);
d913188c7   Rusty Russell   module: layout_an...
2974
2975
2976
  
  	/* 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...
2977
  	kmemleak_load_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
2978
  	return mod;
d913188c7   Rusty Russell   module: layout_an...
2979
2980
2981
2982
2983
  }
  
  /* mod is no longer valid after this! */
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2984
  	percpu_modfree(mod);
d453cded0   Rusty Russell   module_arch_freei...
2985
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
2986
2987
  	module_memfree(mod->init_layout.base);
  	module_memfree(mod->core_layout.base);
d913188c7   Rusty Russell   module: layout_an...
2988
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2989
2990
2991
2992
2993
2994
  int __weak module_finalize(const Elf_Ehdr *hdr,
  			   const Elf_Shdr *sechdrs,
  			   struct module *me)
  {
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
2995
2996
  static int post_relocation(struct module *mod, const struct load_info *info)
  {
51f3d0f47   Rusty Russell   module: cleanup c...
2997
  	/* Sort exception table now relocations are done. */
811d66a0e   Rusty Russell   module: group pos...
2998
2999
3000
3001
3002
  	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...
3003
  	/* Setup kallsyms-specific fields. */
811d66a0e   Rusty Russell   module: group pos...
3004
3005
3006
3007
3008
  	add_kallsyms(mod, info);
  
  	/* Arch-specific module finalizing. */
  	return module_finalize(info->hdr, info->sechdrs, mod);
  }
9bb9c3be5   Rusty Russell   module: wait when...
3009
3010
3011
3012
3013
  /* Is this module of this name done loading?  No locks held. */
  static bool finished_loading(const char *name)
  {
  	struct module *mod;
  	bool ret;
9cc019b8c   Peter Zijlstra   module: Replace o...
3014
3015
3016
3017
3018
3019
  	/*
  	 * The module_mutex should not be a heavily contended lock;
  	 * if we get the occasional sleep here, we'll go an extra iteration
  	 * in the wait_event_interruptible(), which is harmless.
  	 */
  	sched_annotate_sleep();
9bb9c3be5   Rusty Russell   module: wait when...
3020
  	mutex_lock(&module_mutex);
4f6de4d51   Mathias Krause   module: don't mod...
3021
  	mod = find_module_all(name, strlen(name), true);
0d21b0e34   Rusty Russell   module: add new s...
3022
3023
  	ret = !mod || mod->state == MODULE_STATE_LIVE
  		|| mod->state == MODULE_STATE_GOING;
9bb9c3be5   Rusty Russell   module: wait when...
3024
3025
3026
3027
  	mutex_unlock(&module_mutex);
  
  	return ret;
  }
34e1169d9   Kees Cook   module: add sysca...
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
  /* 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
  }
c74963790   Rusty Russell   module: fix race ...
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
  /* For freeing module_init on success, in case kallsyms traversing */
  struct mod_initfree {
  	struct rcu_head rcu;
  	void *module_init;
  };
  
  static void do_free_init(struct rcu_head *head)
  {
  	struct mod_initfree *m = container_of(head, struct mod_initfree, rcu);
  	module_memfree(m->module_init);
  	kfree(m);
  }
be02a1862   Jan Kiszka   kernel/module.c: ...
3050
3051
3052
3053
3054
3055
3056
  /*
   * This is where the real work happens.
   *
   * Keep it uninlined to provide a reliable breakpoint target, e.g. for the gdb
   * helper command 'lx-symbols'.
   */
  static noinline int do_init_module(struct module *mod)
34e1169d9   Kees Cook   module: add sysca...
3057
3058
  {
  	int ret = 0;
c74963790   Rusty Russell   module: fix race ...
3059
3060
3061
3062
3063
3064
3065
  	struct mod_initfree *freeinit;
  
  	freeinit = kmalloc(sizeof(*freeinit), GFP_KERNEL);
  	if (!freeinit) {
  		ret = -ENOMEM;
  		goto fail;
  	}
7523e4dc5   Rusty Russell   module: use a str...
3066
  	freeinit->module_init = mod->init_layout.base;
34e1169d9   Kees Cook   module: add sysca...
3067

774a1221e   Tejun Heo   module, async: as...
3068
3069
3070
3071
3072
  	/*
  	 * 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...
3073
3074
3075
3076
3077
  	do_mod_ctors(mod);
  	/* Start the module */
  	if (mod->init != NULL)
  		ret = do_one_initcall(mod->init);
  	if (ret < 0) {
c74963790   Rusty Russell   module: fix race ...
3078
  		goto fail_free_freeinit;
34e1169d9   Kees Cook   module: add sysca...
3079
3080
  	}
  	if (ret > 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
3081
3082
3083
3084
3085
3086
  		pr_warn("%s: '%s'->init suspiciously returned %d, it should "
  			"follow 0/-E convention
  "
  			"%s: loading module anyway...
  ",
  			__func__, mod->name, ret, __func__);
34e1169d9   Kees Cook   module: add sysca...
3087
3088
3089
3090
3091
3092
3093
  		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...
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
  	/*
  	 * 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
  	 */
f2411da74   Luis R. Rodriguez   driver-core: add ...
3111
  	if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
774a1221e   Tejun Heo   module, async: as...
3112
  		async_synchronize_full();
34e1169d9   Kees Cook   module: add sysca...
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
  
  	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
93c2e105f   Peter Zijlstra   module: Optimize ...
3123
  	mod_tree_remove_init(mod);
85c898db6   Rusty Russell   module: clean up ...
3124
  	disable_ro_nx(&mod->init_layout);
d453cded0   Rusty Russell   module_arch_freei...
3125
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
3126
3127
3128
3129
  	mod->init_layout.base = NULL;
  	mod->init_layout.size = 0;
  	mod->init_layout.ro_size = 0;
  	mod->init_layout.text_size = 0;
c74963790   Rusty Russell   module: fix race ...
3130
3131
  	/*
  	 * We want to free module_init, but be aware that kallsyms may be
0be964be0   Peter Zijlstra   module: Sanitize ...
3132
3133
3134
  	 * walking this with preempt disabled.  In all the failure paths, we
  	 * call synchronize_sched(), but we don't want to slow down the success
  	 * path, so use actual RCU here.
c74963790   Rusty Russell   module: fix race ...
3135
  	 */
0be964be0   Peter Zijlstra   module: Sanitize ...
3136
  	call_rcu_sched(&freeinit->rcu, do_free_init);
34e1169d9   Kees Cook   module: add sysca...
3137
3138
3139
3140
  	mutex_unlock(&module_mutex);
  	wake_up_all(&module_wq);
  
  	return 0;
c74963790   Rusty Russell   module: fix race ...
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
  
  fail_free_freeinit:
  	kfree(freeinit);
  fail:
  	/* 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;
34e1169d9   Kees Cook   module: add sysca...
3154
3155
3156
3157
3158
3159
3160
3161
3162
  }
  
  static int may_init_module(void)
  {
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
  		return -EPERM;
  
  	return 0;
  }
a3535c7e4   Rusty Russell   module: clean up ...
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
  /*
   * We try to place it in the list now to make sure it's unique before
   * we dedicate too many resources.  In particular, temporary percpu
   * memory exhaustion.
   */
  static int add_unformed_module(struct module *mod)
  {
  	int err;
  	struct module *old;
  
  	mod->state = MODULE_STATE_UNFORMED;
  
  again:
  	mutex_lock(&module_mutex);
4f6de4d51   Mathias Krause   module: don't mod...
3177
3178
  	old = find_module_all(mod->name, strlen(mod->name), true);
  	if (old != NULL) {
a3535c7e4   Rusty Russell   module: clean up ...
3179
3180
3181
3182
  		if (old->state == MODULE_STATE_COMING
  		    || old->state == MODULE_STATE_UNFORMED) {
  			/* Wait in case it fails to load. */
  			mutex_unlock(&module_mutex);
9cc019b8c   Peter Zijlstra   module: Replace o...
3183
3184
  			err = wait_event_interruptible(module_wq,
  					       finished_loading(mod->name));
a3535c7e4   Rusty Russell   module: clean up ...
3185
3186
3187
3188
3189
3190
3191
  			if (err)
  				goto out_unlocked;
  			goto again;
  		}
  		err = -EEXIST;
  		goto out;
  	}
4f666546d   Peter Zijlstra   module: Rework mo...
3192
  	mod_update_bounds(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3193
  	list_add_rcu(&mod->list, &modules);
93c2e105f   Peter Zijlstra   module: Optimize ...
3194
  	mod_tree_insert(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
  	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);
20ef10c1b   Josh Poimboeuf   module: Use the s...
3216
  	/* Set RO and NX regions */
85c898db6   Rusty Russell   module: clean up ...
3217
3218
  	module_enable_ro(mod);
  	module_enable_nx(mod);
4982223e5   Rusty Russell   module: set nx be...
3219

a3535c7e4   Rusty Russell   module: clean up ...
3220
3221
3222
  	/* Mark state as coming so strong_try_module_get() ignores us,
  	 * but kallsyms etc. can see us. */
  	mod->state = MODULE_STATE_COMING;
4982223e5   Rusty Russell   module: set nx be...
3223
3224
3225
3226
3227
  	mutex_unlock(&module_mutex);
  
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_COMING, mod);
  	return 0;
a3535c7e4   Rusty Russell   module: clean up ...
3228
3229
3230
3231
3232
  
  out:
  	mutex_unlock(&module_mutex);
  	return err;
  }
ecc861705   Luis R. Rodriguez   module: add extra...
3233
3234
  static int unknown_module_param_cb(char *param, char *val, const char *modname,
  				   void *arg)
54041d8a7   Rusty Russell   modules: don't fa...
3235
  {
f2411da74   Luis R. Rodriguez   driver-core: add ...
3236
3237
3238
3239
3240
3241
3242
  	struct module *mod = arg;
  	int ret;
  
  	if (strcmp(param, "async_probe") == 0) {
  		mod->async_probe_requested = true;
  		return 0;
  	}
6da0b5651   Ionut Alexa   kernel:module Fix...
3243
  	/* Check for magic 'dyndbg' arg */
f2411da74   Luis R. Rodriguez   driver-core: add ...
3244
  	ret = ddebug_dyndbg_module_param_cb(param, val, modname);
bddb12b32   Andrew Morton   kernel/module.c: ...
3245
3246
3247
  	if (ret != 0)
  		pr_warn("%s: unknown parameter '%s' ignored
  ", modname, param);
54041d8a7   Rusty Russell   modules: don't fa...
3248
3249
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
3250
3251
  /* 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...
3252
3253
  static int load_module(struct load_info *info, const char __user *uargs,
  		       int flags)
d913188c7   Rusty Russell   module: layout_an...
3254
  {
a3535c7e4   Rusty Russell   module: clean up ...
3255
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
3256
  	long err;
51e158c12   Rusty Russell   param: hand argum...
3257
  	char *after_dashes;
d913188c7   Rusty Russell   module: layout_an...
3258

34e1169d9   Kees Cook   module: add sysca...
3259
3260
3261
  	err = module_sig_check(info);
  	if (err)
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3262

34e1169d9   Kees Cook   module: add sysca...
3263
  	err = elf_header_check(info);
d913188c7   Rusty Russell   module: layout_an...
3264
  	if (err)
34e1169d9   Kees Cook   module: add sysca...
3265
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3266
3267
  
  	/* Figure out module layout, and allocate all the memory. */
2f3238aeb   Rusty Russell   module: add flags...
3268
  	mod = layout_and_allocate(info, flags);
65b8a9b4d   Linus Torvalds   module: refactor ...
3269
3270
  	if (IS_ERR(mod)) {
  		err = PTR_ERR(mod);
d913188c7   Rusty Russell   module: layout_an...
3271
  		goto free_copy;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3272
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3273

a3535c7e4   Rusty Russell   module: clean up ...
3274
3275
3276
  	/* Reserve our place in the list. */
  	err = add_unformed_module(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3277
  		goto free_module;
1fb9341ac   Rusty Russell   module: put modul...
3278

106a4ee25   Rusty Russell   module: signature...
3279
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
3280
  	mod->sig_ok = info->sig_ok;
64748a2c9   Rusty Russell   module: printk me...
3281
  	if (!mod->sig_ok) {
bddb12b32   Andrew Morton   kernel/module.c: ...
3282
  		pr_notice_once("%s: module verification failed: signature "
ab92ebbb8   Marcel Holtmann   module: Remove do...
3283
  			       "and/or required key missing - tainting "
bddb12b32   Andrew Morton   kernel/module.c: ...
3284
3285
  			       "kernel
  ", mod->name);
66cc69e34   Mathieu Desnoyers   Fix: module signa...
3286
  		add_taint_module(mod, TAINT_UNSIGNED_MODULE, LOCKDEP_STILL_OK);
64748a2c9   Rusty Russell   module: printk me...
3287
  	}
106a4ee25   Rusty Russell   module: signature...
3288
  #endif
8d8022e8a   Rusty Russell   module: do percpu...
3289
  	/* To avoid stressing percpu allocator, do this once we're unique. */
9eb76d779   Rusty Russell   module: cleanup c...
3290
  	err = percpu_modalloc(mod, info);
8d8022e8a   Rusty Russell   module: do percpu...
3291
3292
  	if (err)
  		goto unlink_mod;
49668688d   Rusty Russell   module: pass load...
3293
  	/* Now module is in final location, initialize linked lists, etc. */
9f85a4bbb   Rusty Russell   module: refactor ...
3294
3295
  	err = module_unload_init(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3296
  		goto unlink_mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3297

cf2fde7b3   Rusty Russell   param: fix module...
3298
  	init_param_lock(mod);
b51d23e4e   Dan Streetman   module: add per-m...
3299

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

49668688d   Rusty Russell   module: pass load...
3306
  	err = check_module_license_and_versions(mod);
22e268ebe   Rusty Russell   module: refactor ...
3307
3308
  	if (err)
  		goto free_unload;
9841d61d7   Dave Jones   [PATCH] Add taint...
3309

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

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

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

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

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

6526c534b   Rusty Russell   module: move modu...
3328
3329
3330
3331
3332
3333
  	/* 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...
3334

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

a949ae560   Steven Rostedt (Red Hat)   ftrace/module: Ha...
3337
3338
  	/* Ftrace init must be called in the MODULE_STATE_UNFORMED state */
  	ftrace_module_init(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3339
3340
3341
  	/* Finally it's fully formed, ready to start executing. */
  	err = complete_formation(mod, info);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3342
  		goto ddebug_cleanup;
be593f4ce   Rusty Russell   module: verify_ex...
3343

51f3d0f47   Rusty Russell   module: cleanup c...
3344
  	/* Module is ready to execute: parsing args may do that. */
51e158c12   Rusty Russell   param: hand argum...
3345
  	after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
ecc861705   Luis R. Rodriguez   module: add extra...
3346
3347
  				  -32768, 32767, NULL,
  				  unknown_module_param_cb);
51e158c12   Rusty Russell   param: hand argum...
3348
3349
  	if (IS_ERR(after_dashes)) {
  		err = PTR_ERR(after_dashes);
1fb9341ac   Rusty Russell   module: put modul...
3350
  		goto bug_cleanup;
51e158c12   Rusty Russell   param: hand argum...
3351
3352
3353
3354
3355
  	} else if (after_dashes) {
  		pr_warn("%s: parameters '%s' after `--' ignored
  ",
  		       mod->name, after_dashes);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3356

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

48fd11880   Kevin Cernekee   module: Fix perfo...
3362
  	/* Get rid of temporary copy. */
34e1169d9   Kees Cook   module: add sysca...
3363
  	free_copy(info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3364
3365
  
  	/* Done! */
51f3d0f47   Rusty Russell   module: cleanup c...
3366
  	trace_module_load(mod);
34e1169d9   Kees Cook   module: add sysca...
3367
3368
  
  	return do_init_module(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3369

1fb9341ac   Rusty Russell   module: put modul...
3370
3371
   bug_cleanup:
  	/* module_bug_cleanup needs module_mutex protection */
75676500f   Rusty Russell   module: make lock...
3372
  	mutex_lock(&module_mutex);
5336377d6   Linus Torvalds   modules: Fix modu...
3373
  	module_bug_cleanup(mod);
ee61abb32   Linus Torvalds   module: fix missi...
3374
  	mutex_unlock(&module_mutex);
ff7e0055b   Andy Lutomirski   module: Clean up ...
3375

37815bf86   Steven Rostedt   module: Call modu...
3376
3377
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
ff7e0055b   Andy Lutomirski   module: Clean up ...
3378
  	/* we can't deallocate the module until we clear memory protection */
85c898db6   Rusty Russell   module: clean up ...
3379
3380
  	module_disable_ro(mod);
  	module_disable_nx(mod);
ff7e0055b   Andy Lutomirski   module: Clean up ...
3381

a3535c7e4   Rusty Russell   module: clean up ...
3382
   ddebug_cleanup:
1fb9341ac   Rusty Russell   module: put modul...
3383
  	dynamic_debug_remove(info->debug);
e91defa26   Rusty Russell   module: don't use...
3384
  	synchronize_sched();
6526c534b   Rusty Russell   module: move modu...
3385
3386
  	kfree(mod->args);
   free_arch_cleanup:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3387
  	module_arch_cleanup(mod);
d913188c7   Rusty Russell   module: layout_an...
3388
   free_modinfo:
a263f7763   Rusty Russell   module: fix memor...
3389
  	free_modinfo(mod);
22e268ebe   Rusty Russell   module: refactor ...
3390
   free_unload:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3391
  	module_unload_free(mod);
1fb9341ac   Rusty Russell   module: put modul...
3392
3393
3394
3395
   unlink_mod:
  	mutex_lock(&module_mutex);
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
758556bdc   Peter Zijlstra   module: Fix load_...
3396
  	mod_tree_remove(mod);
1fb9341ac   Rusty Russell   module: put modul...
3397
  	wake_up_all(&module_wq);
0be964be0   Peter Zijlstra   module: Sanitize ...
3398
3399
  	/* Wait for RCU-sched synchronizing before releasing mod->list. */
  	synchronize_sched();
1fb9341ac   Rusty Russell   module: put modul...
3400
  	mutex_unlock(&module_mutex);
d913188c7   Rusty Russell   module: layout_an...
3401
   free_module:
049fb9bd4   Steven Rostedt (Red Hat)   ftrace/module: Ca...
3402
3403
3404
3405
3406
3407
  	/*
  	 * Ftrace needs to clean up what it initialized.
  	 * This does nothing if ftrace_module_init() wasn't called,
  	 * but it must be called outside of module_mutex.
  	 */
  	ftrace_release_mod(mod);
35a9393c9   Peter Zijlstra   lockdep: Fix the ...
3408
  	/* Free lock-classes; relies on the preceding sync_rcu() */
7523e4dc5   Rusty Russell   module: use a str...
3409
  	lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size);
35a9393c9   Peter Zijlstra   lockdep: Fix the ...
3410

34e1169d9   Kees Cook   module: add sysca...
3411
  	module_deallocate(mod, info);
d913188c7   Rusty Russell   module: layout_an...
3412
   free_copy:
34e1169d9   Kees Cook   module: add sysca...
3413
3414
  	free_copy(info);
  	return err;
b99b87f70   Peter Oberparleiter   kernel: construct...
3415
  }
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
3416
3417
  SYSCALL_DEFINE3(init_module, void __user *, umod,
  		unsigned long, len, const char __user *, uargs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3418
  {
34e1169d9   Kees Cook   module: add sysca...
3419
3420
  	int err;
  	struct load_info info = { };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3421

34e1169d9   Kees Cook   module: add sysca...
3422
3423
3424
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3425

34e1169d9   Kees Cook   module: add sysca...
3426
3427
3428
  	pr_debug("init_module: umod=%p, len=%lu, uargs=%p
  ",
  	       umod, len, uargs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3429

34e1169d9   Kees Cook   module: add sysca...
3430
3431
3432
  	err = copy_module_from_user(umod, len, &info);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3433

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

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

34e1169d9   Kees Cook   module: add sysca...
3442
3443
3444
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3445

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

2f3238aeb   Rusty Russell   module: add flags...
3449
3450
3451
  	if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
  		      |MODULE_INIT_IGNORE_VERMAGIC))
  		return -EINVAL;
d6de2c80e   Linus Torvalds   async: Fix module...
3452

34e1169d9   Kees Cook   module: add sysca...
3453
3454
3455
  	err = copy_module_from_fd(fd, &info);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3456

2f3238aeb   Rusty Russell   module: add flags...
3457
  	return load_module(&info, uargs, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
  }
  
  static inline int within(unsigned long addr, void *start, unsigned long size)
  {
  	return ((void *)addr >= start && (void *)addr < start + size);
  }
  
  #ifdef CONFIG_KALLSYMS
  /*
   * This ignores the intensely annoying "mapping symbols" found
   * in ARM ELF files: $a, $t and $d.
   */
  static inline int is_arm_mapping_symbol(const char *str)
  {
2e3a10a15   Russell King   ARM: avoid ARM bi...
3472
3473
  	if (str[0] == '.' && str[1] == 'L')
  		return true;
6c34f1f54   Kyle McMartin   aarch64: filter $...
3474
  	return str[0] == '$' && strchr("axtd", str[1])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
  	       && (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...
3487
  	if (within_module_init(addr, mod))
7523e4dc5   Rusty Russell   module: use a str...
3488
  		nextval = (unsigned long)mod->init_layout.base+mod->init_layout.text_size;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3489
  	else
7523e4dc5   Rusty Russell   module: use a str...
3490
  		nextval = (unsigned long)mod->core_layout.base+mod->core_layout.text_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3491

25985edce   Lucas De Marchi   Fix common misspe...
3492
  	/* Scan for closest preceding symbol, and next symbol. (ELF
22a8bdeb5   Daniel Walker   whitespace fixes:...
3493
  	   starts real symbols at 1). */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
  	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...
3514
3515
3516
3517
  	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
3518
3519
  	return mod->strtab + mod->symtab[best].st_name;
  }
6dd06c9fb   Rusty Russell   module: make modu...
3520
3521
  /* 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...
3522
  const char *module_address_lookup(unsigned long addr,
6dd06c9fb   Rusty Russell   module: make modu...
3523
3524
3525
3526
  			    unsigned long *size,
  			    unsigned long *offset,
  			    char **modname,
  			    char *namebuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3527
  {
cb2a52052   Rusty Russell   modules: de-mutex...
3528
  	const char *ret = NULL;
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3529
  	struct module *mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3530

cb2a52052   Rusty Russell   modules: de-mutex...
3531
  	preempt_disable();
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3532
3533
3534
3535
3536
  	mod = __module_address(addr);
  	if (mod) {
  		if (modname)
  			*modname = mod->name;
  		ret = get_ksymbol(mod, addr, size, offset);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3537
  	}
6dd06c9fb   Rusty Russell   module: make modu...
3538
3539
3540
3541
3542
  	/* 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...
3543
  	preempt_enable();
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3544

92dfc9dc7   Andrew Morton   fix "modules: mak...
3545
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3546
  }
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3547
3548
3549
  int lookup_module_symbol_name(unsigned long addr, char *symname)
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3550
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3551
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3552
3553
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3554
  		if (within_module(addr, mod)) {
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3555
3556
3557
3558
3559
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, NULL, NULL);
  			if (!sym)
  				goto out;
9281acea6   Tejun Heo   kallsyms: make KS...
3560
  			strlcpy(symname, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3561
  			preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3562
3563
3564
3565
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3566
  	preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3567
3568
  	return -ERANGE;
  }
a5c43dae7   Alexey Dobriyan   Fix race between ...
3569
3570
3571
3572
  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...
3573
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3574
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3575
3576
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3577
  		if (within_module(addr, mod)) {
a5c43dae7   Alexey Dobriyan   Fix race between ...
3578
3579
3580
3581
3582
3583
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, size, offset);
  			if (!sym)
  				goto out;
  			if (modname)
9281acea6   Tejun Heo   kallsyms: make KS...
3584
  				strlcpy(modname, mod->name, MODULE_NAME_LEN);
a5c43dae7   Alexey Dobriyan   Fix race between ...
3585
  			if (name)
9281acea6   Tejun Heo   kallsyms: make KS...
3586
  				strlcpy(name, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3587
  			preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3588
3589
3590
3591
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3592
  	preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3593
3594
  	return -ERANGE;
  }
ea07890a6   Alexey Dobriyan   Fix race between ...
3595
3596
  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
3597
3598
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3599
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3600
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3601
3602
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3603
3604
3605
  		if (symnum < mod->num_symtab) {
  			*value = mod->symtab[symnum].st_value;
  			*type = mod->symtab[symnum].st_info;
098c5eea0   Andreas Gruenbacher   [PATCH] null-term...
3606
  			strlcpy(name, mod->strtab + mod->symtab[symnum].st_name,
9281acea6   Tejun Heo   kallsyms: make KS...
3607
3608
  				KSYM_NAME_LEN);
  			strlcpy(module_name, mod->name, MODULE_NAME_LEN);
ca4787b77   Tim Abbott   kernel/module.c: ...
3609
  			*exported = is_exported(name, *value, mod);
cb2a52052   Rusty Russell   modules: de-mutex...
3610
  			preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3611
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3612
3613
3614
  		}
  		symnum -= mod->num_symtab;
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3615
  	preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3616
  	return -ERANGE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3617
3618
3619
3620
3621
3622
3623
  }
  
  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...
3624
3625
  		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
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
  			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...
3638
  	preempt_disable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3639
  	if ((colon = strchr(name, ':')) != NULL) {
4f6de4d51   Mathias Krause   module: don't mod...
3640
  		if ((mod = find_module_all(name, colon - name, false)) != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3641
  			ret = mod_find_symname(mod, colon+1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3642
  	} else {
0d21b0e34   Rusty Russell   module: add new s...
3643
3644
3645
  		list_for_each_entry_rcu(mod, &modules, list) {
  			if (mod->state == MODULE_STATE_UNFORMED)
  				continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3646
3647
  			if ((ret = mod_find_symname(mod, name)) != 0)
  				break;
0d21b0e34   Rusty Russell   module: add new s...
3648
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3649
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3650
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3651
3652
  	return ret;
  }
75a66614d   Anders Kaseorg   Ksplice: Add func...
3653
3654
3655
3656
3657
3658
3659
3660
  
  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;
0be964be0   Peter Zijlstra   module: Sanitize ...
3661
  	module_assert_mutex();
75a66614d   Anders Kaseorg   Ksplice: Add func...
3662
  	list_for_each_entry(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3663
3664
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
75a66614d   Anders Kaseorg   Ksplice: Add func...
3665
3666
3667
3668
3669
3670
3671
3672
3673
  		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
3674
  #endif /* CONFIG_KALLSYMS */
21aa9280b   Arjan van de Ven   debug: show being...
3675
  static char *module_flags(struct module *mod, char *buf)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3676
3677
  {
  	int bx = 0;
0d21b0e34   Rusty Russell   module: add new s...
3678
  	BUG_ON(mod->state == MODULE_STATE_UNFORMED);
21aa9280b   Arjan van de Ven   debug: show being...
3679
3680
3681
  	if (mod->taints ||
  	    mod->state == MODULE_STATE_GOING ||
  	    mod->state == MODULE_STATE_COMING) {
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3682
  		buf[bx++] = '(';
cca3e7073   Kay Sievers   modules: sysfs - ...
3683
  		bx += module_flags_taint(mod, buf + bx);
21aa9280b   Arjan van de Ven   debug: show being...
3684
3685
3686
3687
3688
3689
  		/* 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...
3690
3691
3692
3693
3694
3695
  		buf[bx++] = ')';
  	}
  	buf[bx] = '\0';
  
  	return buf;
  }
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
  #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
3713
3714
3715
  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...
3716
  	char buf[8];
0d21b0e34   Rusty Russell   module: add new s...
3717
3718
3719
  	/* We always ignore unformed modules. */
  	if (mod->state == MODULE_STATE_UNFORMED)
  		return 0;
2f0f2a334   Denys Vlasenko   module: turn long...
3720
  	seq_printf(m, "%s %u",
7523e4dc5   Rusty Russell   module: use a str...
3721
  		   mod->name, mod->init_layout.size + mod->core_layout.size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3722
3723
3724
3725
  	print_unload_info(m, mod);
  
  	/* Informative for users. */
  	seq_printf(m, " %s",
6da0b5651   Ionut Alexa   kernel:module Fix...
3726
3727
  		   mod->state == MODULE_STATE_GOING ? "Unloading" :
  		   mod->state == MODULE_STATE_COMING ? "Loading" :
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3728
3729
  		   "Live");
  	/* Used by oprofile and other similar tools. */
7523e4dc5   Rusty Russell   module: use a str...
3730
  	seq_printf(m, " 0x%pK", mod->core_layout.base);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3731

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

6da0b5651   Ionut Alexa   kernel:module Fix...
3736
3737
  	seq_puts(m, "
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3738
3739
3740
3741
3742
3743
3744
3745
  	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/...
3746
  static const struct seq_operations modules_op = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3747
3748
3749
3750
3751
  	.start	= m_start,
  	.next	= m_next,
  	.stop	= m_stop,
  	.show	= m_show
  };
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
  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
3771
3772
3773
  /* 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
3774
3775
  	const struct exception_table_entry *e = NULL;
  	struct module *mod;
24da1cbff   Rusty Russell   modules: remove m...
3776
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3777
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3778
3779
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3780
3781
  		if (mod->num_exentries == 0)
  			continue;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3782

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3783
3784
3785
3786
3787
3788
  		e = search_extable(mod->extable,
  				   mod->extable + mod->num_exentries - 1,
  				   addr);
  		if (e)
  			break;
  	}
24da1cbff   Rusty Russell   modules: remove m...
3789
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3790
3791
  
  	/* Now, if we found one, we are running inside it now, hence
22a8bdeb5   Daniel Walker   whitespace fixes:...
3792
  	   we cannot unload the module, hence no refcnt needed. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3793
3794
  	return e;
  }
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3795
  /*
e610499e2   Rusty Russell   module: __module_...
3796
3797
3798
3799
3800
   * 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: ...
3801
   */
e610499e2   Rusty Russell   module: __module_...
3802
  bool is_module_address(unsigned long addr)
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3803
  {
e610499e2   Rusty Russell   module: __module_...
3804
  	bool ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3805

24da1cbff   Rusty Russell   modules: remove m...
3806
  	preempt_disable();
e610499e2   Rusty Russell   module: __module_...
3807
  	ret = __module_address(addr) != NULL;
24da1cbff   Rusty Russell   modules: remove m...
3808
  	preempt_enable();
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3809

e610499e2   Rusty Russell   module: __module_...
3810
  	return ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
3811
  }
e610499e2   Rusty Russell   module: __module_...
3812
3813
3814
3815
3816
3817
3818
  /*
   * __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...
3819
  struct module *__module_address(unsigned long addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3820
3821
  {
  	struct module *mod;
3a642e99b   Rusty Russell   modules: Take a s...
3822
3823
  	if (addr < module_addr_min || addr > module_addr_max)
  		return NULL;
0be964be0   Peter Zijlstra   module: Sanitize ...
3824
  	module_assert_mutex_or_preempt();
6c9692e2d   Peter Zijlstra   module: Make the ...
3825
  	mod = mod_find(addr);
93c2e105f   Peter Zijlstra   module: Optimize ...
3826
3827
  	if (mod) {
  		BUG_ON(!within_module(addr, mod));
0d21b0e34   Rusty Russell   module: add new s...
3828
  		if (mod->state == MODULE_STATE_UNFORMED)
93c2e105f   Peter Zijlstra   module: Optimize ...
3829
  			mod = NULL;
0d21b0e34   Rusty Russell   module: add new s...
3830
  	}
93c2e105f   Peter Zijlstra   module: Optimize ...
3831
  	return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3832
  }
c6b378019   Tim Abbott   module: Export sy...
3833
  EXPORT_SYMBOL_GPL(__module_address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3834

e610499e2   Rusty Russell   module: __module_...
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
  /*
   * 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. */
7523e4dc5   Rusty Russell   module: use a str...
3866
3867
  		if (!within(addr, mod->init_layout.base, mod->init_layout.text_size)
  		    && !within(addr, mod->core_layout.base, mod->core_layout.text_size))
e610499e2   Rusty Russell   module: __module_...
3868
3869
3870
3871
  			mod = NULL;
  	}
  	return mod;
  }
c6b378019   Tim Abbott   module: Export sy...
3872
  EXPORT_SYMBOL_GPL(__module_text_address);
e610499e2   Rusty Russell   module: __module_...
3873

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3874
3875
3876
3877
  /* Don't grab lock, we're oopsing. */
  void print_modules(void)
  {
  	struct module *mod;
2bc2d61a9   Randy Dunlap   [PATCH] list modu...
3878
  	char buf[8];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3879

b231125af   Linus Torvalds   printk: add KERN_...
3880
  	printk(KERN_DEFAULT "Modules linked in:");
d72b37513   Andi Kleen   Remove stop_machi...
3881
3882
  	/* Most callers should already have preempt disabled, but make sure */
  	preempt_disable();
0d21b0e34   Rusty Russell   module: add new s...
3883
3884
3885
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
27bba4d6b   Jiri Slaby   module: use pr_cont
3886
  		pr_cont(" %s%s", mod->name, module_flags(mod, buf));
0d21b0e34   Rusty Russell   module: add new s...
3887
  	}
d72b37513   Andi Kleen   Remove stop_machi...
3888
  	preempt_enable();
e14af7eeb   Arjan van de Ven   debug: track and ...
3889
  	if (last_unloaded_module[0])
27bba4d6b   Jiri Slaby   module: use pr_cont
3890
3891
3892
  		pr_cont(" [last unloaded: %s]", last_unloaded_module);
  	pr_cont("
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3893
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3894
  #ifdef CONFIG_MODVERSIONS
8c8ef42ae   Rusty Russell   module: include o...
3895
3896
3897
3898
3899
3900
  /* 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 ...
3901
  		   struct tracepoint * const *tp)
8c8ef42ae   Rusty Russell   module: include o...
3902
3903
3904
  {
  }
  EXPORT_SYMBOL(module_layout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3905
  #endif