Blame view

kernel/module.c 111 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>
8a293be0d   Paul Gortmaker   core: migrate exc...
20
  #include <linux/extable.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  #include <linux/moduleloader.h>
af658dca2   Steven Rostedt (Red Hat)   tracing: Rename f...
22
  #include <linux/trace_events.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  #include <linux/init.h>
ae84e3247   Alexey Dobriyan   Simplify module_g...
24
  #include <linux/kallsyms.h>
34e1169d9   Kees Cook   module: add sysca...
25
  #include <linux/file.h>
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
26
  #include <linux/fs.h>
6d7601338   Roland McGrath   Add /sys/module/n...
27
  #include <linux/sysfs.h>
9f1583339   Randy Dunlap   [PATCH] use add_t...
28
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
31
  #include <linux/slab.h>
  #include <linux/vmalloc.h>
  #include <linux/elf.h>
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
32
  #include <linux/proc_fs.h>
2e72d51b4   Kees Cook   security: introdu...
33
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
  #include <linux/seq_file.h>
  #include <linux/syscalls.h>
  #include <linux/fcntl.h>
  #include <linux/rcupdate.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
38
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
43
44
  #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 ...
45
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  #include <linux/device.h>
c988d2b28   Matt Domsch   [PATCH] modules: ...
47
  #include <linux/string.h>
97d1f15b7   Arjan van de Ven   [PATCH] sem2mutex...
48
  #include <linux/mutex.h>
d72b37513   Andi Kleen   Remove stop_machi...
49
  #include <linux/rculist.h>
7c0f6ba68   Linus Torvalds   Replace <asm/uacc...
50
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  #include <asm/cacheflush.h>
563ec5cbc   Michael Ellerman   kernel/module.c: ...
52
  #include <linux/set_memory.h>
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
53
  #include <asm/mmu_context.h>
b817f6fef   Sam Ravnborg   kbuild: check lic...
54
  #include <linux/license.h>
6d7623943   Christoph Lameter   modules: include ...
55
  #include <asm/sections.h>
97e1c18e8   Mathieu Desnoyers   tracing: Kernel T...
56
  #include <linux/tracepoint.h>
90d595fe5   Steven Rostedt   ftrace: enable mc...
57
  #include <linux/ftrace.h>
7e545d6ec   Jessica Yu   livepatch/module:...
58
  #include <linux/livepatch.h>
22a9d6456   Arjan van de Ven   async: Asynchrono...
59
  #include <linux/async.h>
fbf59bc9d   Tejun Heo   percpu: implement...
60
  #include <linux/percpu.h>
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
61
  #include <linux/kmemleak.h>
bf5438fca   Jason Baron   jump label: Base ...
62
  #include <linux/jump_label.h>
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
63
  #include <linux/pfn.h>
403ed2784   Alessio Igor Bogani   module: Use the b...
64
  #include <linux/bsearch.h>
9d5059c95   Luis de Bethencourt   dynamic_debug: on...
65
  #include <linux/dynamic_debug.h>
ca86cad73   Richard Guy Briggs   audit: log module...
66
  #include <linux/audit.h>
2f3238aeb   Rusty Russell   module: add flags...
67
  #include <uapi/linux/module.h>
106a4ee25   Rusty Russell   module: signature...
68
  #include "module-internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69

7ead8b831   Li Zefan   tracing/events: A...
70
71
  #define CREATE_TRACE_POINTS
  #include <trace/events/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
73
74
  #ifndef ARCH_SHF_SMALL
  #define ARCH_SHF_SMALL 0
  #endif
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
75
76
77
  /*
   * Modules' sections will be aligned on page boundaries
   * to ensure complete separation of code and data, but
0f5bf6d0a   Laura Abbott   arch: Rename CONF...
78
   * only when CONFIG_STRICT_MODULE_RWX=y
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
79
   */
0f5bf6d0a   Laura Abbott   arch: Rename CONF...
80
  #ifdef CONFIG_STRICT_MODULE_RWX
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
81
82
83
84
  # define debug_align(X) ALIGN(X, PAGE_SIZE)
  #else
  # define debug_align(X) (X)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
  /* 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...
87
88
89
90
91
  /*
   * 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...
92
   * (delete and add uses RCU list operations). */
c6b378019   Tim Abbott   module: Export sy...
93
94
  DEFINE_MUTEX(module_mutex);
  EXPORT_SYMBOL_GPL(module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
  static LIST_HEAD(modules);
67fc4e0cb   Jason Wessel   kdb: core for kgd...
96

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

93c2e105f   Peter Zijlstra   module: Optimize ...
99
100
101
102
  /*
   * 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 ...
103
104
105
   * 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 ...
106
107
108
   */
  
  static __always_inline unsigned long __mod_tree_val(struct latch_tree_node *n)
106a4ee25   Rusty Russell   module: signature...
109
  {
7523e4dc5   Rusty Russell   module: use a str...
110
  	struct module_layout *layout = container_of(n, struct module_layout, mtn.node);
106a4ee25   Rusty Russell   module: signature...
111

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

7523e4dc5   Rusty Russell   module: use a str...
119
  	return (unsigned long)layout->size;
93c2e105f   Peter Zijlstra   module: Optimize ...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  }
  
  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...
141

106a4ee25   Rusty Russell   module: signature...
142
143
  	return 0;
  }
93c2e105f   Peter Zijlstra   module: Optimize ...
144
145
146
147
  static const struct latch_tree_ops mod_tree_ops = {
  	.less = mod_tree_less,
  	.comp = mod_tree_comp,
  };
4f666546d   Peter Zijlstra   module: Rework mo...
148
149
150
151
152
153
  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...
154
  };
106a4ee25   Rusty Russell   module: signature...
155

4f666546d   Peter Zijlstra   module: Rework mo...
156
157
158
159
160
161
162
163
164
165
166
167
  #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 ...
168
169
170
171
172
173
174
  
  /*
   * 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...
175
176
  	mod->core_layout.mtn.mod = mod;
  	mod->init_layout.mtn.mod = mod;
93c2e105f   Peter Zijlstra   module: Optimize ...
177

7523e4dc5   Rusty Russell   module: use a str...
178
179
180
  	__mod_tree_insert(&mod->core_layout.mtn);
  	if (mod->init_layout.size)
  		__mod_tree_insert(&mod->init_layout.mtn);
93c2e105f   Peter Zijlstra   module: Optimize ...
181
182
183
184
  }
  
  static void mod_tree_remove_init(struct module *mod)
  {
7523e4dc5   Rusty Russell   module: use a str...
185
186
  	if (mod->init_layout.size)
  		__mod_tree_remove(&mod->init_layout.mtn);
93c2e105f   Peter Zijlstra   module: Optimize ...
187
188
189
190
  }
  
  static void mod_tree_remove(struct module *mod)
  {
7523e4dc5   Rusty Russell   module: use a str...
191
  	__mod_tree_remove(&mod->core_layout.mtn);
93c2e105f   Peter Zijlstra   module: Optimize ...
192
193
  	mod_tree_remove_init(mod);
  }
6c9692e2d   Peter Zijlstra   module: Make the ...
194
  static struct module *mod_find(unsigned long addr)
93c2e105f   Peter Zijlstra   module: Optimize ...
195
196
  {
  	struct latch_tree_node *ltn;
4f666546d   Peter Zijlstra   module: Rework mo...
197
  	ltn = latch_tree_find((void *)addr, &mod_tree.root, &mod_tree_ops);
93c2e105f   Peter Zijlstra   module: Optimize ...
198
199
200
201
202
  	if (!ltn)
  		return NULL;
  
  	return container_of(ltn, struct mod_tree_node, node)->mod;
  }
6c9692e2d   Peter Zijlstra   module: Make the ...
203
  #else /* MODULES_TREE_LOOKUP */
4f666546d   Peter Zijlstra   module: Rework mo...
204
  static unsigned long module_addr_min = -1UL, module_addr_max = 0;
6c9692e2d   Peter Zijlstra   module: Make the ...
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
  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...
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
  /*
   * 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...
239
240
241
  	__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...
242
  }
67fc4e0cb   Jason Wessel   kdb: core for kgd...
243
244
245
  #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 ...
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;
9502514f2   Steven Rostedt   module: Do a WARN...
256
  	WARN_ON_ONCE(!rcu_read_lock_sched_held() &&
0be964be0   Peter Zijlstra   module: Sanitize ...
257
258
259
  		!lockdep_is_held(&module_mutex));
  #endif
  }
6727bb9c6   Luis R. Rodriguez   kernel/module.c: ...
260
261
  static bool sig_enforce = IS_ENABLED(CONFIG_MODULE_SIG_FORCE);
  #ifndef CONFIG_MODULE_SIG_FORCE
106a4ee25   Rusty Russell   module: signature...
262
263
  module_param(sig_enforce, bool_enable_only, 0644);
  #endif /* !CONFIG_MODULE_SIG_FORCE */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264

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

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

6da0b5651   Ionut Alexa   kernel:module Fix...
273
  int register_module_notifier(struct notifier_block *nb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
275
  	return blocking_notifier_chain_register(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
  }
  EXPORT_SYMBOL(register_module_notifier);
6da0b5651   Ionut Alexa   kernel:module Fix...
278
  int unregister_module_notifier(struct notifier_block *nb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
280
  	return blocking_notifier_chain_unregister(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
  }
  EXPORT_SYMBOL(unregister_module_notifier);
eded41c1c   Rusty Russell   module: kallsyms ...
283
  struct load_info {
96b5b1945   Luis R. Rodriguez   module: make the ...
284
  	const char *name;
eded41c1c   Rusty Russell   module: kallsyms ...
285
286
287
  	Elf_Ehdr *hdr;
  	unsigned long len;
  	Elf_Shdr *sechdrs;
6526c534b   Rusty Russell   module: move modu...
288
  	char *secstrings, *strtab;
d913188c7   Rusty Russell   module: layout_an...
289
  	unsigned long symoffs, stroffs;
811d66a0e   Rusty Russell   module: group pos...
290
291
  	struct _ddebug *debug;
  	unsigned int num_debug;
106a4ee25   Rusty Russell   module: signature...
292
  	bool sig_ok;
8244062ef   Rusty Russell   modules: fix long...
293
294
295
  #ifdef CONFIG_KALLSYMS
  	unsigned long mod_kallsyms_init_off;
  #endif
eded41c1c   Rusty Russell   module: kallsyms ...
296
297
298
299
  	struct {
  		unsigned int sym, str, mod, vers, info, pcpu;
  	} index;
  };
71d9f5079   Miroslav Benes   module: Fix a com...
300
301
302
303
304
  /*
   * We require a truly strong try_module_get(): 0 means success.
   * Otherwise an error is returned due to ongoing or failed
   * initialization etc.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
306
  static inline int strong_try_module_get(struct module *mod)
  {
0d21b0e34   Rusty Russell   module: add new s...
307
  	BUG_ON(mod && mod->state == MODULE_STATE_UNFORMED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308
  	if (mod && mod->state == MODULE_STATE_COMING)
c9a3ba55b   Rusty Russell   module: wait for ...
309
310
  		return -EBUSY;
  	if (try_module_get(mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
  		return 0;
c9a3ba55b   Rusty Russell   module: wait for ...
312
313
  	else
  		return -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
  }
373d4d099   Rusty Russell   taint: add explic...
315
316
  static inline void add_taint_module(struct module *mod, unsigned flag,
  				    enum lockdep_ok lockdep_ok)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
317
  {
373d4d099   Rusty Russell   taint: add explic...
318
  	add_taint(flag, lockdep_ok);
7fd8329ba   Petr Mladek   taint/module: Cle...
319
  	set_bit(flag, &mod->taints);
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
320
  }
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
321
322
323
  /*
   * 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
324
   */
bf262dcec   Jiri Kosina   module: fix noret...
325
  void __noreturn __module_put_and_exit(struct module *mod, long code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
328
329
330
  {
  	module_put(mod);
  	do_exit(code);
  }
  EXPORT_SYMBOL(__module_put_and_exit);
22a8bdeb5   Daniel Walker   whitespace fixes:...
331

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

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

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

d72b37513   Andi Kleen   Remove stop_machi...
435
  	list_for_each_entry_rcu(mod, &modules, list) {
ad9546c99   Rusty Russell   module: neaten __...
436
437
  		struct symsearch arr[] = {
  			{ mod->syms, mod->syms + mod->num_syms, mod->crcs,
dafd0940c   Rusty Russell   module: generic e...
438
  			  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
439
  			{ mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
440
441
  			  mod->gpl_crcs,
  			  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
442
443
  			{ mod->gpl_future_syms,
  			  mod->gpl_future_syms + mod->num_gpl_future_syms,
dafd0940c   Rusty Russell   module: generic e...
444
445
  			  mod->gpl_future_crcs,
  			  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
446
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
447
448
  			{ mod->unused_syms,
  			  mod->unused_syms + mod->num_unused_syms,
dafd0940c   Rusty Russell   module: generic e...
449
450
  			  mod->unused_crcs,
  			  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
451
452
  			{ mod->unused_gpl_syms,
  			  mod->unused_gpl_syms + mod->num_unused_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
453
454
  			  mod->unused_gpl_crcs,
  			  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
455
  #endif
ad9546c99   Rusty Russell   module: neaten __...
456
  		};
0d21b0e34   Rusty Russell   module: add new s...
457
458
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
dafd0940c   Rusty Russell   module: generic e...
459
460
461
462
463
  		if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data))
  			return true;
  	}
  	return false;
  }
de4d8d534   Rusty Russell   module: each_symb...
464
  EXPORT_SYMBOL_GPL(each_symbol_section);
dafd0940c   Rusty Russell   module: generic e...
465
466
467
468
469
470
471
472
473
  
  struct find_symbol_arg {
  	/* Input */
  	const char *name;
  	bool gplok;
  	bool warn;
  
  	/* Output */
  	struct module *owner;
71810db27   Ard Biesheuvel   modversions: trea...
474
  	const s32 *crc;
414fd31b2   Tim Abbott   module: Make find...
475
  	const struct kernel_symbol *sym;
dafd0940c   Rusty Russell   module: generic e...
476
  };
de4d8d534   Rusty Russell   module: each_symb...
477
478
479
  static bool check_symbol(const struct symsearch *syms,
  				 struct module *owner,
  				 unsigned int symnum, void *data)
dafd0940c   Rusty Russell   module: generic e...
480
481
  {
  	struct find_symbol_arg *fsa = data;
dafd0940c   Rusty Russell   module: generic e...
482
483
484
485
  	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: ...
486
487
488
489
  			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...
490
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491
  	}
ad9546c99   Rusty Russell   module: neaten __...
492

f7f5b6755   Denys Vlasenko   Shrink struct mod...
493
  #ifdef CONFIG_UNUSED_SYMBOLS
dafd0940c   Rusty Russell   module: generic e...
494
  	if (syms->unused && fsa->warn) {
bddb12b32   Andrew Morton   kernel/module.c: ...
495
496
497
498
499
  		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: ...
500
501
502
  		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: ...
503
504
  			"inclusion.
  ");
dafd0940c   Rusty Russell   module: generic e...
505
  	}
f7f5b6755   Denys Vlasenko   Shrink struct mod...
506
  #endif
dafd0940c   Rusty Russell   module: generic e...
507
508
509
  
  	fsa->owner = owner;
  	fsa->crc = symversion(syms->crcs, symnum);
414fd31b2   Tim Abbott   module: Make find...
510
  	fsa->sym = &syms->start[symnum];
dafd0940c   Rusty Russell   module: generic e...
511
512
  	return true;
  }
403ed2784   Alessio Igor Bogani   module: Use the b...
513
514
515
516
517
518
519
  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...
520
521
522
523
524
  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...
525
526
527
528
529
530
531
  	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...
532

de4d8d534   Rusty Russell   module: each_symb...
533
534
  	return false;
  }
414fd31b2   Tim Abbott   module: Make find...
535
  /* Find a symbol and return it, along with, (optional) crc and
75676500f   Rusty Russell   module: make lock...
536
   * (optional) module which owns it.  Needs preempt disabled or module_mutex. */
c6b378019   Tim Abbott   module: Export sy...
537
538
  const struct kernel_symbol *find_symbol(const char *name,
  					struct module **owner,
71810db27   Ard Biesheuvel   modversions: trea...
539
  					const s32 **crc,
c6b378019   Tim Abbott   module: Export sy...
540
541
  					bool gplok,
  					bool warn)
dafd0940c   Rusty Russell   module: generic e...
542
543
544
545
546
547
  {
  	struct find_symbol_arg fsa;
  
  	fsa.name = name;
  	fsa.gplok = gplok;
  	fsa.warn = warn;
de4d8d534   Rusty Russell   module: each_symb...
548
  	if (each_symbol_section(find_symbol_in_section, &fsa)) {
dafd0940c   Rusty Russell   module: generic e...
549
550
551
552
  		if (owner)
  			*owner = fsa.owner;
  		if (crc)
  			*crc = fsa.crc;
414fd31b2   Tim Abbott   module: Make find...
553
  		return fsa.sym;
dafd0940c   Rusty Russell   module: generic e...
554
  	}
5e1241692   Jim Cromie   module: replace D...
555
556
  	pr_debug("Failed to find symbol %s
  ", name);
414fd31b2   Tim Abbott   module: Make find...
557
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
558
  }
c6b378019   Tim Abbott   module: Export sy...
559
  EXPORT_SYMBOL_GPL(find_symbol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
560

fe0d34d24   Rusty Russell   module: weaken lo...
561
562
563
564
  /*
   * Search for module by name: must hold module_mutex (or preempt disabled
   * for read-only access).
   */
4f6de4d51   Mathias Krause   module: don't mod...
565
  static struct module *find_module_all(const char *name, size_t len,
0d21b0e34   Rusty Russell   module: add new s...
566
  				      bool even_unformed)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
567
568
  {
  	struct module *mod;
fe0d34d24   Rusty Russell   module: weaken lo...
569
  	module_assert_mutex_or_preempt();
0be964be0   Peter Zijlstra   module: Sanitize ...
570

93437353d   Luis R. Rodriguez   module: use list_...
571
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
572
573
  		if (!even_unformed && mod->state == MODULE_STATE_UNFORMED)
  			continue;
4f6de4d51   Mathias Krause   module: don't mod...
574
  		if (strlen(mod->name) == len && !memcmp(mod->name, name, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
575
576
577
578
  			return mod;
  	}
  	return NULL;
  }
0d21b0e34   Rusty Russell   module: add new s...
579
580
581
  
  struct module *find_module(const char *name)
  {
fe0d34d24   Rusty Russell   module: weaken lo...
582
  	module_assert_mutex();
4f6de4d51   Mathias Krause   module: don't mod...
583
  	return find_module_all(name, strlen(name), false);
0d21b0e34   Rusty Russell   module: add new s...
584
  }
c6b378019   Tim Abbott   module: Export sy...
585
  EXPORT_SYMBOL_GPL(find_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
586
587
  
  #ifdef CONFIG_SMP
fbf59bc9d   Tejun Heo   percpu: implement...
588

259354dea   Tejun Heo   module: encapsula...
589
  static inline void __percpu *mod_percpu(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
590
  {
259354dea   Tejun Heo   module: encapsula...
591
592
  	return mod->percpu;
  }
fbf59bc9d   Tejun Heo   percpu: implement...
593

9eb76d779   Rusty Russell   module: cleanup c...
594
  static int percpu_modalloc(struct module *mod, struct load_info *info)
259354dea   Tejun Heo   module: encapsula...
595
  {
9eb76d779   Rusty Russell   module: cleanup c...
596
597
598
599
600
  	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...
601
  	if (align > PAGE_SIZE) {
bddb12b32   Andrew Morton   kernel/module.c: ...
602
603
604
  		pr_warn("%s: per-cpu alignment %li > %li
  ",
  			mod->name, align, PAGE_SIZE);
fbf59bc9d   Tejun Heo   percpu: implement...
605
606
  		align = PAGE_SIZE;
  	}
9eb76d779   Rusty Russell   module: cleanup c...
607
  	mod->percpu = __alloc_reserved_percpu(pcpusec->sh_size, align);
259354dea   Tejun Heo   module: encapsula...
608
  	if (!mod->percpu) {
bddb12b32   Andrew Morton   kernel/module.c: ...
609
610
611
  		pr_warn("%s: Could not allocate %lu bytes percpu data
  ",
  			mod->name, (unsigned long)pcpusec->sh_size);
259354dea   Tejun Heo   module: encapsula...
612
613
  		return -ENOMEM;
  	}
9eb76d779   Rusty Russell   module: cleanup c...
614
  	mod->percpu_size = pcpusec->sh_size;
259354dea   Tejun Heo   module: encapsula...
615
  	return 0;
fbf59bc9d   Tejun Heo   percpu: implement...
616
  }
259354dea   Tejun Heo   module: encapsula...
617
  static void percpu_modfree(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
618
  {
259354dea   Tejun Heo   module: encapsula...
619
  	free_percpu(mod->percpu);
fbf59bc9d   Tejun Heo   percpu: implement...
620
  }
49668688d   Rusty Russell   module: pass load...
621
  static unsigned int find_pcpusec(struct load_info *info)
6b588c18f   Tejun Heo   module: reorder m...
622
  {
49668688d   Rusty Russell   module: pass load...
623
  	return find_sec(info, ".data..percpu");
6b588c18f   Tejun Heo   module: reorder m...
624
  }
259354dea   Tejun Heo   module: encapsula...
625
626
  static void percpu_modcopy(struct module *mod,
  			   const void *from, unsigned long size)
6b588c18f   Tejun Heo   module: reorder m...
627
628
629
630
  {
  	int cpu;
  
  	for_each_possible_cpu(cpu)
259354dea   Tejun Heo   module: encapsula...
631
  		memcpy(per_cpu_ptr(mod->percpu, cpu), from, size);
6b588c18f   Tejun Heo   module: reorder m...
632
  }
383776fa7   Thomas Gleixner   locking/lockdep: ...
633
  bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
10fad5e46   Tejun Heo   percpu, module: i...
634
635
636
637
638
639
640
  {
  	struct module *mod;
  	unsigned int cpu;
  
  	preempt_disable();
  
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
641
642
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
10fad5e46   Tejun Heo   percpu, module: i...
643
644
645
646
  		if (!mod->percpu_size)
  			continue;
  		for_each_possible_cpu(cpu) {
  			void *start = per_cpu_ptr(mod->percpu, cpu);
383776fa7   Thomas Gleixner   locking/lockdep: ...
647
  			void *va = (void *)addr;
10fad5e46   Tejun Heo   percpu, module: i...
648

383776fa7   Thomas Gleixner   locking/lockdep: ...
649
  			if (va >= start && va < start + mod->percpu_size) {
8ce371f98   Peter Zijlstra   lockdep: Fix per-...
650
  				if (can_addr) {
383776fa7   Thomas Gleixner   locking/lockdep: ...
651
  					*can_addr = (unsigned long) (va - start);
8ce371f98   Peter Zijlstra   lockdep: Fix per-...
652
653
654
655
  					*can_addr += (unsigned long)
  						per_cpu_ptr(mod->percpu,
  							    get_boot_cpu_id());
  				}
10fad5e46   Tejun Heo   percpu, module: i...
656
657
658
659
660
661
662
663
  				preempt_enable();
  				return true;
  			}
  		}
  	}
  
  	preempt_enable();
  	return false;
6b588c18f   Tejun Heo   module: reorder m...
664
  }
383776fa7   Thomas Gleixner   locking/lockdep: ...
665
666
667
668
669
670
671
672
673
674
675
676
677
  /**
   * 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)
  {
  	return __is_module_percpu_address(addr, NULL);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
678
  #else /* ... !CONFIG_SMP */
6b588c18f   Tejun Heo   module: reorder m...
679

259354dea   Tejun Heo   module: encapsula...
680
  static inline void __percpu *mod_percpu(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681
682
683
  {
  	return NULL;
  }
9eb76d779   Rusty Russell   module: cleanup c...
684
  static int percpu_modalloc(struct module *mod, struct load_info *info)
259354dea   Tejun Heo   module: encapsula...
685
  {
9eb76d779   Rusty Russell   module: cleanup c...
686
687
688
689
  	/* 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...
690
691
  }
  static inline void percpu_modfree(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
  }
49668688d   Rusty Russell   module: pass load...
694
  static unsigned int find_pcpusec(struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
695
696
697
  {
  	return 0;
  }
259354dea   Tejun Heo   module: encapsula...
698
699
  static inline void percpu_modcopy(struct module *mod,
  				  const void *from, unsigned long size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700
701
702
703
  {
  	/* pcpusec should be 0, and size of that section should be 0. */
  	BUG_ON(size != 0);
  }
10fad5e46   Tejun Heo   percpu, module: i...
704
705
706
707
  bool is_module_percpu_address(unsigned long addr)
  {
  	return false;
  }
6b588c18f   Tejun Heo   module: reorder m...
708

383776fa7   Thomas Gleixner   locking/lockdep: ...
709
710
711
712
  bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
  {
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713
  #endif /* CONFIG_SMP */
c988d2b28   Matt Domsch   [PATCH] modules: ...
714
715
716
717
718
719
  #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...
720
  			struct module_kobject *mk, char *buffer)      \
c988d2b28   Matt Domsch   [PATCH] modules: ...
721
  {                                                                     \
cc56ded3f   Chen Gang   kernel/module.c: ...
722
723
  	return scnprintf(buffer, PAGE_SIZE, "%s
  ", mk->mod->field);  \
c988d2b28   Matt Domsch   [PATCH] modules: ...
724
725
726
727
728
729
730
  }                                                                     \
  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:...
731
732
  	kfree(mod->field);                                            \
  	mod->field = NULL;                                            \
c988d2b28   Matt Domsch   [PATCH] modules: ...
733
734
  }                                                                     \
  static struct module_attribute modinfo_##field = {                    \
7b595756e   Tejun Heo   sysfs: kill unnec...
735
  	.attr = { .name = __stringify(field), .mode = 0444 },         \
c988d2b28   Matt Domsch   [PATCH] modules: ...
736
737
738
739
740
741
742
743
  	.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 ...
744
  static char last_unloaded_module[MODULE_NAME_LEN+1];
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
745
  #ifdef CONFIG_MODULE_UNLOAD
eb0c53771   Steven Rostedt   tracing: Fix comp...
746
747
  
  EXPORT_TRACEPOINT_SYMBOL(module_get);
e513cc1c0   Masami Hiramatsu   module: Remove st...
748
749
  /* MODULE_REF_BASE is the base reference count by kmodule loader. */
  #define MODULE_REF_BASE	1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
  /* Init the unload section of the module. */
9f85a4bbb   Rusty Russell   module: refactor ...
751
  static int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
752
  {
e513cc1c0   Masami Hiramatsu   module: Remove st...
753
754
755
756
757
  	/*
  	 * 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 ...
758

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
762
  	/* Hold reference count during initialization. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
763
  	atomic_inc(&mod->refcnt);
9f85a4bbb   Rusty Russell   module: refactor ...
764
765
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
766
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
767
768
769
770
  /* 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 ...
771
772
  	list_for_each_entry(use, &b->source_list, source_list) {
  		if (use->source == a) {
5e1241692   Jim Cromie   module: replace D...
773
774
  			pr_debug("%s uses %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
775
776
777
  			return 1;
  		}
  	}
5e1241692   Jim Cromie   module: replace D...
778
779
  	pr_debug("%s does not use %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780
781
  	return 0;
  }
2c02dfe7f   Linus Torvalds   module: Make the ...
782
783
784
785
786
787
788
789
790
  /*
   * 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 ...
791
  	struct module_use *use;
5e1241692   Jim Cromie   module: replace D...
792
793
  	pr_debug("Allocating new usage for %s.
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
794
795
  	use = kmalloc(sizeof(*use), GFP_ATOMIC);
  	if (!use) {
bddb12b32   Andrew Morton   kernel/module.c: ...
796
797
  		pr_warn("%s: out of memory loading
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
798
799
800
801
802
803
804
  		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 ...
805
806
  	return 0;
  }
75676500f   Rusty Russell   module: make lock...
807
  /* Module a uses b: caller needs module_mutex() */
9bea7f239   Rusty Russell   module: fix bne2 ...
808
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
809
  {
c8e21ced0   Rusty Russell   module: fix kdb's...
810
  	int err;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
811

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

9bea7f239   Rusty Russell   module: fix bne2 ...
815
816
  	/* If module isn't available, we fail. */
  	err = strong_try_module_get(b);
c9a3ba55b   Rusty Russell   module: wait for ...
817
  	if (err)
9bea7f239   Rusty Russell   module: fix bne2 ...
818
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
819

2c02dfe7f   Linus Torvalds   module: Make the ...
820
821
  	err = add_module_usage(a, b);
  	if (err) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
822
  		module_put(b);
9bea7f239   Rusty Russell   module: fix bne2 ...
823
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
824
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
825
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
826
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
827
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
828
829
830
831
  
  /* Clear the unload stuff of the module. */
  static void module_unload_free(struct module *mod)
  {
2c02dfe7f   Linus Torvalds   module: Make the ...
832
  	struct module_use *use, *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
833

75676500f   Rusty Russell   module: make lock...
834
  	mutex_lock(&module_mutex);
2c02dfe7f   Linus Torvalds   module: Make the ...
835
836
  	list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) {
  		struct module *i = use->target;
5e1241692   Jim Cromie   module: replace D...
837
838
  		pr_debug("%s unusing %s
  ", mod->name, i->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
839
840
841
842
  		module_put(i);
  		list_del(&use->source_list);
  		list_del(&use->target_list);
  		kfree(use);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
  	}
75676500f   Rusty Russell   module: make lock...
844
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
845
846
847
  }
  
  #ifdef CONFIG_MODULE_FORCE_UNLOAD
fb1697933   Akinobu Mita   [PATCH] modules: ...
848
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
849
850
851
  {
  	int ret = (flags & O_TRUNC);
  	if (ret)
373d4d099   Rusty Russell   taint: add explic...
852
  		add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853
854
855
  	return ret;
  }
  #else
fb1697933   Akinobu Mita   [PATCH] modules: ...
856
  static inline int try_force_unload(unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
857
858
859
860
  {
  	return 0;
  }
  #endif /* CONFIG_MODULE_FORCE_UNLOAD */
e513cc1c0   Masami Hiramatsu   module: Remove st...
861
862
  /* 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
863
  {
e513cc1c0   Masami Hiramatsu   module: Remove st...
864
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
865

e513cc1c0   Masami Hiramatsu   module: Remove st...
866
867
868
869
870
871
  	/* 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
872

e513cc1c0   Masami Hiramatsu   module: Remove st...
873
874
  	return ret;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
875

e513cc1c0   Masami Hiramatsu   module: Remove st...
876
877
  static int try_stop_module(struct module *mod, int flags, int *forced)
  {
da39ba5e1   Rusty Russell   module: don't use...
878
  	/* If it's not unused, quit unless we're forcing. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
879
880
881
  	if (try_release_module_ref(mod) != 0) {
  		*forced = try_force_unload(flags);
  		if (!(*forced))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882
883
884
885
  			return -EWOULDBLOCK;
  	}
  
  	/* Mark it as dying. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
886
  	mod->state = MODULE_STATE_GOING;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
887

e513cc1c0   Masami Hiramatsu   module: Remove st...
888
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
889
  }
d5db139ab   Rusty Russell   module: make modu...
890
891
892
893
894
895
896
897
898
899
  /**
   * 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
900
  {
d5db139ab   Rusty Russell   module: make modu...
901
  	return atomic_read(&mod->refcnt) - MODULE_REF_BASE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
902
903
904
905
906
  }
  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...
907
908
  SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
  		unsigned int, flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
909
910
  {
  	struct module *mod;
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
911
  	char name[MODULE_NAME_LEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
912
  	int ret, forced = 0;
3d43321b7   Kees Cook   modules: sysctl t...
913
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
dfff0a067   Greg Kroah-Hartman   Revert "Driver co...
914
915
916
917
918
  		return -EPERM;
  
  	if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
  		return -EFAULT;
  	name[MODULE_NAME_LEN-1] = '\0';
f6276ac95   Richard Guy Briggs   audit: log module...
919
  	audit_log_kern_module(name);
3fc1f1e27   Tejun Heo   stop_machine: rei...
920
921
  	if (mutex_lock_interruptible(&module_mutex) != 0)
  		return -EINTR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
922
923
924
925
926
927
  
  	mod = find_module(name);
  	if (!mod) {
  		ret = -ENOENT;
  		goto out;
  	}
2c02dfe7f   Linus Torvalds   module: Make the ...
928
  	if (!list_empty(&mod->source_list)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
930
931
932
933
934
935
  		/* 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...
936
  		/* FIXME: if (force), slam module count damn the torpedoes */
5e1241692   Jim Cromie   module: replace D...
937
938
  		pr_debug("%s already dying
  ", mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
939
940
941
942
943
  		ret = -EBUSY;
  		goto out;
  	}
  
  	/* If it has an init func, it must have an exit func to unload */
af49d9248   Rusty Russell   Remove "unsafe" f...
944
  	if (mod->init && !mod->exit) {
fb1697933   Akinobu Mita   [PATCH] modules: ...
945
  		forced = try_force_unload(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
947
948
949
950
951
  		if (!forced) {
  			/* This module can't be removed */
  			ret = -EBUSY;
  			goto out;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952
953
954
955
  	/* 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...
956
  	mutex_unlock(&module_mutex);
25985edce   Lucas De Marchi   Fix common misspe...
957
  	/* Final destruction now no one is using it. */
df4b565e1   Peter Oberparleiter   module: add MODUL...
958
  	if (mod->exit != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
959
  		mod->exit();
df4b565e1   Peter Oberparleiter   module: add MODUL...
960
961
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
7e545d6ec   Jessica Yu   livepatch/module:...
962
  	klp_module_going(mod);
7dcd182be   Jessica Yu   ftrace/module: re...
963
  	ftrace_release_mod(mod);
22a9d6456   Arjan van de Ven   async: Asynchrono...
964
  	async_synchronize_full();
75676500f   Rusty Russell   module: make lock...
965

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

75676500f   Rusty Russell   module: make lock...
969
970
971
  	free_module(mod);
  	return 0;
  out:
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
972
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
974
  	return ret;
  }
d1e99d7ae   Jianjun Kong   module: fix warni...
975
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
976
977
978
  {
  	struct module_use *use;
  	int printed_something = 0;
d5db139ab   Rusty Russell   module: make modu...
979
  	seq_printf(m, " %i ", module_refcount(mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
980

6da0b5651   Ionut Alexa   kernel:module Fix...
981
982
983
984
  	/*
  	 * Always include a trailing , so userspace can differentiate
  	 * between this and the old multi-field proc format.
  	 */
2c02dfe7f   Linus Torvalds   module: Make the ...
985
  	list_for_each_entry(use, &mod->source_list, source_list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
  		printed_something = 1;
2c02dfe7f   Linus Torvalds   module: Make the ...
987
  		seq_printf(m, "%s,", use->source->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
988
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
990
  	if (mod->init != NULL && mod->exit == NULL) {
  		printed_something = 1;
6da0b5651   Ionut Alexa   kernel:module Fix...
991
  		seq_puts(m, "[permanent],");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
992
993
994
  	}
  
  	if (!printed_something)
6da0b5651   Ionut Alexa   kernel:module Fix...
995
  		seq_puts(m, "-");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
996
997
998
999
1000
  }
  
  void __symbol_put(const char *symbol)
  {
  	struct module *owner;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001

24da1cbff   Rusty Russell   modules: remove m...
1002
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
1003
  	if (!find_symbol(symbol, &owner, NULL, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1004
1005
  		BUG();
  	module_put(owner);
24da1cbff   Rusty Russell   modules: remove m...
1006
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
1008
  }
  EXPORT_SYMBOL(__symbol_put);
7d1d16e41   Rusty Russell   module: fix BUG_O...
1009
  /* Note this assumes addr is a function, which it currently always is. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
1011
  void symbol_put_addr(void *addr)
  {
5e3766138   Trent Piepho   [PATCH] symbol_pu...
1012
  	struct module *modaddr;
7d1d16e41   Rusty Russell   module: fix BUG_O...
1013
  	unsigned long a = (unsigned long)dereference_function_descriptor(addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1014

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

275d7d44d   Peter Zijlstra   module: Fix locki...
1018
1019
1020
1021
1022
  	/*
  	 * 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...
1023
  	modaddr = __module_text_address(a);
a6e6abd57   Rusty Russell   module: remove mo...
1024
  	BUG_ON(!modaddr);
5e3766138   Trent Piepho   [PATCH] symbol_pu...
1025
  	module_put(modaddr);
275d7d44d   Peter Zijlstra   module: Fix locki...
1026
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1027
1028
1029
1030
  }
  EXPORT_SYMBOL_GPL(symbol_put_addr);
  
  static ssize_t show_refcnt(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1031
  			   struct module_kobject *mk, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1032
  {
d5db139ab   Rusty Russell   module: make modu...
1033
1034
  	return sprintf(buffer, "%i
  ", module_refcount(mk->mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1035
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1036
1037
  static struct module_attribute modinfo_refcnt =
  	__ATTR(refcnt, 0444, show_refcnt, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1038

d53799be6   Steven Rostedt   module: move __mo...
1039
1040
1041
1042
  void __module_get(struct module *module)
  {
  	if (module) {
  		preempt_disable();
2f35c41f5   Masami Hiramatsu   module: Replace m...
1043
  		atomic_inc(&module->refcnt);
d53799be6   Steven Rostedt   module: move __mo...
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
  		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...
1056
1057
1058
  		/* 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...
1059
  			trace_module_get(module, _RET_IP_);
e513cc1c0   Masami Hiramatsu   module: Remove st...
1060
  		else
d53799be6   Steven Rostedt   module: move __mo...
1061
1062
1063
1064
1065
1066
1067
  			ret = false;
  
  		preempt_enable();
  	}
  	return ret;
  }
  EXPORT_SYMBOL(try_module_get);
f6a570333   Al Viro   [PATCH] severing ...
1068
1069
  void module_put(struct module *module)
  {
e513cc1c0   Masami Hiramatsu   module: Remove st...
1070
  	int ret;
f6a570333   Al Viro   [PATCH] severing ...
1071
  	if (module) {
e1783a240   Christoph Lameter   module: Use this_...
1072
  		preempt_disable();
e513cc1c0   Masami Hiramatsu   module: Remove st...
1073
1074
  		ret = atomic_dec_if_positive(&module->refcnt);
  		WARN_ON(ret < 0);	/* Failed to put refcount */
ae832d1e0   Li Zefan   tracing: Remove s...
1075
  		trace_module_put(module, _RET_IP_);
e1783a240   Christoph Lameter   module: Use this_...
1076
  		preempt_enable();
f6a570333   Al Viro   [PATCH] severing ...
1077
1078
1079
  	}
  }
  EXPORT_SYMBOL(module_put);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1080
  #else /* !CONFIG_MODULE_UNLOAD */
d1e99d7ae   Jianjun Kong   module: fix warni...
1081
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1082
1083
  {
  	/* We don't know the usage count, or what modules are using. */
6da0b5651   Ionut Alexa   kernel:module Fix...
1084
  	seq_puts(m, " - -");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1085
1086
1087
1088
1089
  }
  
  static inline void module_unload_free(struct module *mod)
  {
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
1090
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
  {
9bea7f239   Rusty Russell   module: fix bne2 ...
1092
  	return strong_try_module_get(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1093
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
1094
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1095

9f85a4bbb   Rusty Russell   module: refactor ...
1096
  static inline int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1097
  {
9f85a4bbb   Rusty Russell   module: refactor ...
1098
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1099
1100
  }
  #endif /* CONFIG_MODULE_UNLOAD */
53999bf34   Kevin Winchester   error: implicit d...
1101
1102
1103
  static size_t module_flags_taint(struct module *mod, char *buf)
  {
  	size_t l = 0;
7fd8329ba   Petr Mladek   taint/module: Cle...
1104
1105
1106
1107
  	int i;
  
  	for (i = 0; i < TAINT_FLAGS_COUNT; i++) {
  		if (taint_flags[i].module && test_bit(i, &mod->taints))
5eb7c0d04   Larry Finger   taint/module: Fix...
1108
  			buf[l++] = taint_flags[i].c_true;
7fd8329ba   Petr Mladek   taint/module: Cle...
1109
  	}
53999bf34   Kevin Winchester   error: implicit d...
1110

53999bf34   Kevin Winchester   error: implicit d...
1111
1112
  	return l;
  }
1f71740ab   Kay Sievers   Driver core: show...
1113
  static ssize_t show_initstate(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1114
  			      struct module_kobject *mk, char *buffer)
1f71740ab   Kay Sievers   Driver core: show...
1115
1116
  {
  	const char *state = "unknown";
4befb026c   Kay Sievers   module: change at...
1117
  	switch (mk->mod->state) {
1f71740ab   Kay Sievers   Driver core: show...
1118
1119
1120
1121
1122
1123
1124
1125
1126
  	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...
1127
1128
  	default:
  		BUG();
1f71740ab   Kay Sievers   Driver core: show...
1129
1130
1131
1132
  	}
  	return sprintf(buffer, "%s
  ", state);
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1133
1134
  static struct module_attribute modinfo_initstate =
  	__ATTR(initstate, 0444, show_initstate, NULL);
1f71740ab   Kay Sievers   Driver core: show...
1135

88bfa3247   Kay Sievers   module: add /sys/...
1136
1137
1138
1139
  static ssize_t store_uevent(struct module_attribute *mattr,
  			    struct module_kobject *mk,
  			    const char *buffer, size_t count)
  {
f36776faf   Peter Rajnoha   kobject: support ...
1140
  	kobject_synth_uevent(&mk->kobj, buffer, count);
88bfa3247   Kay Sievers   module: add /sys/...
1141
1142
  	return count;
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1143
1144
1145
1146
1147
1148
  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...
1149
1150
  	return sprintf(buffer, "%u
  ", mk->mod->core_layout.size);
cca3e7073   Kay Sievers   modules: sysfs - ...
1151
1152
1153
1154
1155
1156
1157
1158
  }
  
  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...
1159
1160
  	return sprintf(buffer, "%u
  ", mk->mod->init_layout.size);
cca3e7073   Kay Sievers   modules: sysfs - ...
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
  }
  
  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/...
1179

03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1180
  static struct module_attribute *modinfo_attrs[] = {
cca3e7073   Kay Sievers   modules: sysfs - ...
1181
  	&module_uevent,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1182
1183
  	&modinfo_version,
  	&modinfo_srcversion,
cca3e7073   Kay Sievers   modules: sysfs - ...
1184
1185
1186
1187
  	&modinfo_initstate,
  	&modinfo_coresize,
  	&modinfo_initsize,
  	&modinfo_taint,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1188
  #ifdef CONFIG_MODULE_UNLOAD
cca3e7073   Kay Sievers   modules: sysfs - ...
1189
  	&modinfo_refcnt,
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1190
1191
1192
  #endif
  	NULL,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1193
  static const char vermagic[] = VERMAGIC_STRING;
c6e665c8f   Rusty Russell   module: clarify t...
1194
  static int try_to_force_load(struct module *mod, const char *reason)
826e4506a   Linus Torvalds   Make forced modul...
1195
1196
  {
  #ifdef CONFIG_MODULE_FORCE_LOAD
25ddbb18a   Andi Kleen   Make the taint fl...
1197
  	if (!test_taint(TAINT_FORCED_MODULE))
bddb12b32   Andrew Morton   kernel/module.c: ...
1198
1199
  		pr_warn("%s: %s: kernel tainted.
  ", mod->name, reason);
373d4d099   Rusty Russell   taint: add explic...
1200
  	add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
826e4506a   Linus Torvalds   Make forced modul...
1201
1202
1203
1204
1205
  	return 0;
  #else
  	return -ENOEXEC;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1206
  #ifdef CONFIG_MODVERSIONS
71810db27   Ard Biesheuvel   modversions: trea...
1207
1208
  
  static u32 resolve_rel_crc(const s32 *crc)
d4703aefd   Rusty Russell   module: handle pp...
1209
  {
71810db27   Ard Biesheuvel   modversions: trea...
1210
  	return *(u32 *)((void *)crc + *crc);
d4703aefd   Rusty Russell   module: handle pp...
1211
  }
490194269   Kees Cook   module: Pass stru...
1212
  static int check_version(const struct load_info *info,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1213
  			 const char *symname,
6da0b5651   Ionut Alexa   kernel:module Fix...
1214
  			 struct module *mod,
71810db27   Ard Biesheuvel   modversions: trea...
1215
  			 const s32 *crc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1216
  {
490194269   Kees Cook   module: Pass stru...
1217
1218
  	Elf_Shdr *sechdrs = info->sechdrs;
  	unsigned int versindex = info->index.vers;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1219
1220
1221
1222
1223
1224
  	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...
1225
1226
1227
  	/* 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
1228
1229
1230
1231
1232
  	versions = (void *) sechdrs[versindex].sh_addr;
  	num_versions = sechdrs[versindex].sh_size
  		/ sizeof(struct modversion_info);
  
  	for (i = 0; i < num_versions; i++) {
71810db27   Ard Biesheuvel   modversions: trea...
1233
  		u32 crcval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1234
1235
  		if (strcmp(versions[i].name, symname) != 0)
  			continue;
71810db27   Ard Biesheuvel   modversions: trea...
1236
1237
1238
1239
1240
  		if (IS_ENABLED(CONFIG_MODULE_REL_CRCS))
  			crcval = resolve_rel_crc(crc);
  		else
  			crcval = *crc;
  		if (versions[i].crc == crcval)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1241
  			return 1;
71810db27   Ard Biesheuvel   modversions: trea...
1242
1243
1244
  		pr_debug("Found checksum %X vs module %lX
  ",
  			 crcval, versions[i].crc);
826e4506a   Linus Torvalds   Make forced modul...
1245
  		goto bad_version;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1246
  	}
826e4506a   Linus Torvalds   Make forced modul...
1247

faaae2a58   Linus Torvalds   Re-enable CONFIG_...
1248
  	/* Broken toolchain. Warn once, then let it go.. */
3e2e857f9   Kees Cook   module: Add modul...
1249
1250
  	pr_warn_once("%s: no symbol version for %s
  ", info->name, symname);
faaae2a58   Linus Torvalds   Re-enable CONFIG_...
1251
  	return 1;
826e4506a   Linus Torvalds   Make forced modul...
1252
1253
  
  bad_version:
6da0b5651   Ionut Alexa   kernel:module Fix...
1254
1255
  	pr_warn("%s: disagrees about version of symbol %s
  ",
3e2e857f9   Kees Cook   module: Add modul...
1256
  	       info->name, symname);
826e4506a   Linus Torvalds   Make forced modul...
1257
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1258
  }
490194269   Kees Cook   module: Pass stru...
1259
  static inline int check_modstruct_version(const struct load_info *info,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1260
1261
  					  struct module *mod)
  {
71810db27   Ard Biesheuvel   modversions: trea...
1262
  	const s32 *crc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1263

926a59b1d   Peter Zijlstra   module: Annotate ...
1264
1265
1266
1267
1268
  	/*
  	 * 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...
1269
  	if (!find_symbol(VMLINUX_SYMBOL_STR(module_layout), NULL,
926a59b1d   Peter Zijlstra   module: Annotate ...
1270
1271
  			 &crc, true, false)) {
  		preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1272
  		BUG();
926a59b1d   Peter Zijlstra   module: Annotate ...
1273
1274
  	}
  	preempt_enable();
490194269   Kees Cook   module: Pass stru...
1275
1276
  	return check_version(info, VMLINUX_SYMBOL_STR(module_layout),
  			     mod, crc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1277
  }
91e37a793   Rusty Russell   module: don't ign...
1278
1279
1280
  /* 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
1281
  {
91e37a793   Rusty Russell   module: don't ign...
1282
1283
1284
1285
  	if (has_crcs) {
  		amagic += strcspn(amagic, " ");
  		bmagic += strcspn(bmagic, " ");
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1286
1287
1288
  	return strcmp(amagic, bmagic) == 0;
  }
  #else
490194269   Kees Cook   module: Pass stru...
1289
  static inline int check_version(const struct load_info *info,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1290
  				const char *symname,
6da0b5651   Ionut Alexa   kernel:module Fix...
1291
  				struct module *mod,
71810db27   Ard Biesheuvel   modversions: trea...
1292
  				const s32 *crc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293
1294
1295
  {
  	return 1;
  }
490194269   Kees Cook   module: Pass stru...
1296
  static inline int check_modstruct_version(const struct load_info *info,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1297
1298
1299
1300
  					  struct module *mod)
  {
  	return 1;
  }
91e37a793   Rusty Russell   module: don't ign...
1301
1302
  static inline int same_magic(const char *amagic, const char *bmagic,
  			     bool has_crcs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1303
1304
1305
1306
  {
  	return strcmp(amagic, bmagic) == 0;
  }
  #endif /* CONFIG_MODVERSIONS */
75676500f   Rusty Russell   module: make lock...
1307
  /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
49668688d   Rusty Russell   module: pass load...
1308
1309
  static const struct kernel_symbol *resolve_symbol(struct module *mod,
  						  const struct load_info *info,
414fd31b2   Tim Abbott   module: Make find...
1310
  						  const char *name,
9bea7f239   Rusty Russell   module: fix bne2 ...
1311
  						  char ownername[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1312
1313
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1314
  	const struct kernel_symbol *sym;
71810db27   Ard Biesheuvel   modversions: trea...
1315
  	const s32 *crc;
9bea7f239   Rusty Russell   module: fix bne2 ...
1316
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1317

d64810f56   Peter Zijlstra   module: Annotate ...
1318
1319
1320
1321
1322
1323
  	/*
  	 * 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...
1324
  	mutex_lock(&module_mutex);
414fd31b2   Tim Abbott   module: Make find...
1325
  	sym = find_symbol(name, &owner, &crc,
25ddbb18a   Andi Kleen   Make the taint fl...
1326
  			  !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
9bea7f239   Rusty Russell   module: fix bne2 ...
1327
1328
  	if (!sym)
  		goto unlock;
490194269   Kees Cook   module: Pass stru...
1329
  	if (!check_version(info, name, mod, crc)) {
9bea7f239   Rusty Russell   module: fix bne2 ...
1330
1331
  		sym = ERR_PTR(-EINVAL);
  		goto getname;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1332
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
  
  	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...
1344
  	mutex_unlock(&module_mutex);
218ce7351   Linus Torvalds   Revert "module: d...
1345
  	return sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1346
  }
49668688d   Rusty Russell   module: pass load...
1347
1348
1349
1350
  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 ...
1351
1352
  {
  	const struct kernel_symbol *ksym;
49668688d   Rusty Russell   module: pass load...
1353
  	char owner[MODULE_NAME_LEN];
9bea7f239   Rusty Russell   module: fix bne2 ...
1354
1355
  
  	if (wait_event_interruptible_timeout(module_wq,
49668688d   Rusty Russell   module: pass load...
1356
1357
  			!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
  			|| PTR_ERR(ksym) != -EBUSY,
9bea7f239   Rusty Russell   module: fix bne2 ...
1358
  					     30 * HZ) <= 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1359
1360
1361
  		pr_warn("%s: gave up waiting for init of module %s.
  ",
  			mod->name, owner);
9bea7f239   Rusty Russell   module: fix bne2 ...
1362
1363
1364
  	}
  	return ksym;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1365
1366
1367
1368
  /*
   * /sys/module/foo/sections stuff
   * J. Corbet <corbet@lwn.net>
   */
8f6d03781   Rusty Russell   module: sysfs cle...
1369
  #ifdef CONFIG_SYSFS
10b465aaf   Ben Hutchings   modules: Skip emp...
1370

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

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

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

8f6d03781   Rusty Russell   module: sysfs cle...
1569
1570
  static inline void add_notes_attrs(struct module *mod,
  				   const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1571
1572
1573
1574
1575
1576
  {
  }
  
  static inline void remove_notes_attrs(struct module *mod)
  {
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1577
  #endif /* CONFIG_KALLSYMS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1578

1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1579
  static void del_usage_links(struct module *mod)
80a3d1bb4   Rusty Russell   module: move sysf...
1580
1581
1582
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
80a3d1bb4   Rusty Russell   module: move sysf...
1583

75676500f   Rusty Russell   module: make lock...
1584
  	mutex_lock(&module_mutex);
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1585
1586
  	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...
1587
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1588
1589
  #endif
  }
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1590
  static int add_usage_links(struct module *mod)
80a3d1bb4   Rusty Russell   module: move sysf...
1591
  {
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1592
  	int ret = 0;
80a3d1bb4   Rusty Russell   module: move sysf...
1593
1594
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
75676500f   Rusty Russell   module: make lock...
1595
  	mutex_lock(&module_mutex);
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1596
1597
1598
1599
1600
1601
  	list_for_each_entry(use, &mod->target_list, target_list) {
  		ret = sysfs_create_link(use->target->holders_dir,
  					&mod->mkobj.kobj, mod->name);
  		if (ret)
  			break;
  	}
75676500f   Rusty Russell   module: make lock...
1602
  	mutex_unlock(&module_mutex);
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1603
1604
  	if (ret)
  		del_usage_links(mod);
80a3d1bb4   Rusty Russell   module: move sysf...
1605
  #endif
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1606
  	return ret;
80a3d1bb4   Rusty Russell   module: move sysf...
1607
  }
6407ebb27   Rusty Russell   module: Make modu...
1608
  static int module_add_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1609
1610
  {
  	struct module_attribute *attr;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1611
  	struct module_attribute *temp_attr;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1612
1613
  	int error = 0;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1614
1615
1616
1617
1618
1619
1620
  	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: ...
1621
  	for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) {
c75b590d6   Rusty Russell   module: fix redun...
1622
  		if (!attr->test || attr->test(mod)) {
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1623
  			memcpy(temp_attr, attr, sizeof(*temp_attr));
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1624
  			sysfs_attr_init(&temp_attr->attr);
6da0b5651   Ionut Alexa   kernel:module Fix...
1625
1626
  			error = sysfs_create_file(&mod->mkobj.kobj,
  					&temp_attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1627
1628
  			++temp_attr;
  		}
c988d2b28   Matt Domsch   [PATCH] modules: ...
1629
1630
1631
  	}
  	return error;
  }
6407ebb27   Rusty Russell   module: Make modu...
1632
  static void module_remove_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1633
1634
1635
  {
  	struct module_attribute *attr;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1636
1637
1638
1639
  	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...
1640
  		sysfs_remove_file(&mod->mkobj.kobj, &attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1641
1642
  		if (attr->free)
  			attr->free(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1643
  	}
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1644
  	kfree(mod->modinfo_attrs);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1645
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1646

942e44312   Li Zhong   module: Fix mod->...
1647
1648
1649
1650
1651
1652
1653
  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...
1654
  static int mod_sysfs_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1655
1656
  {
  	int err;
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1657
  	struct kobject *kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1658

823bccfc4   Greg Kroah-Hartman   remove "struct su...
1659
  	if (!module_sysfs_initialized) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1660
1661
  		pr_err("%s: module sysfs not initialized
  ", mod->name);
1cc5f7142   Ed Swierk   [PATCH] load_modu...
1662
1663
1664
  		err = -EINVAL;
  		goto out;
  	}
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1665
1666
1667
  
  	kobj = kset_find_obj(module_kset, mod->name);
  	if (kobj) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1668
1669
  		pr_err("%s: module is already loaded
  ", mod->name);
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1670
1671
1672
1673
  		kobject_put(kobj);
  		err = -EINVAL;
  		goto out;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1674
  	mod->mkobj.mod = mod;
e17e0f51a   Kay Sievers   Driver core: show...
1675

ac3c8141f   Greg Kroah-Hartman   Kobject: convert ...
1676
1677
1678
1679
1680
  	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->...
1681
  		mod_kobject_put(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1682

97c146ef0   Kay Sievers   sysfs: fix /sys/m...
1683
  	/* delay uevent until full sysfs population */
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1684
1685
1686
  out:
  	return err;
  }
6407ebb27   Rusty Russell   module: Make modu...
1687
  static int mod_sysfs_setup(struct module *mod,
8f6d03781   Rusty Russell   module: sysfs cle...
1688
  			   const struct load_info *info,
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1689
1690
1691
1692
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	int err;
80a3d1bb4   Rusty Russell   module: move sysf...
1693
1694
1695
  	err = mod_sysfs_init(mod);
  	if (err)
  		goto out;
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1696
  	mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
240936e18   Akinobu Mita   mod_sysfs_setup()...
1697
1698
  	if (!mod->holders_dir) {
  		err = -ENOMEM;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1699
  		goto out_unreg;
240936e18   Akinobu Mita   mod_sysfs_setup()...
1700
  	}
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1701

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1702
1703
  	err = module_param_sysfs_setup(mod, kparam, num_params);
  	if (err)
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1704
  		goto out_unreg_holders;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1705

c988d2b28   Matt Domsch   [PATCH] modules: ...
1706
1707
  	err = module_add_modinfo_attrs(mod);
  	if (err)
e17e0f51a   Kay Sievers   Driver core: show...
1708
  		goto out_unreg_param;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1709

1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1710
1711
1712
  	err = add_usage_links(mod);
  	if (err)
  		goto out_unreg_modinfo_attrs;
8f6d03781   Rusty Russell   module: sysfs cle...
1713
1714
  	add_sect_attrs(mod, info);
  	add_notes_attrs(mod, info);
80a3d1bb4   Rusty Russell   module: move sysf...
1715

e17e0f51a   Kay Sievers   Driver core: show...
1716
  	kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1717
  	return 0;
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1718
1719
  out_unreg_modinfo_attrs:
  	module_remove_modinfo_attrs(mod);
e17e0f51a   Kay Sievers   Driver core: show...
1720
1721
  out_unreg_param:
  	module_param_sysfs_remove(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1722
  out_unreg_holders:
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1723
  	kobject_put(mod->holders_dir);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1724
  out_unreg:
942e44312   Li Zhong   module: Fix mod->...
1725
  	mod_kobject_put(mod);
80a3d1bb4   Rusty Russell   module: move sysf...
1726
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1727
1728
  	return err;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1729
1730
1731
  
  static void mod_sysfs_fini(struct module *mod)
  {
8f6d03781   Rusty Russell   module: sysfs cle...
1732
1733
  	remove_notes_attrs(mod);
  	remove_sect_attrs(mod);
942e44312   Li Zhong   module: Fix mod->...
1734
  	mod_kobject_put(mod);
34e4e2fef   Denis V. Lunev   modules: proper c...
1735
  }
cf2fde7b3   Rusty Russell   param: fix module...
1736
1737
1738
1739
  static void init_param_lock(struct module *mod)
  {
  	mutex_init(&mod->param_lock);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1740
  #else /* !CONFIG_SYSFS */
34e4e2fef   Denis V. Lunev   modules: proper c...
1741

8f6d03781   Rusty Russell   module: sysfs cle...
1742
1743
  static int mod_sysfs_setup(struct module *mod,
  			   const struct load_info *info,
6407ebb27   Rusty Russell   module: Make modu...
1744
1745
1746
1747
1748
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	return 0;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1749
1750
1751
  static void mod_sysfs_fini(struct module *mod)
  {
  }
36b0360d1   Rusty Russell   module: fix sysfs...
1752
1753
1754
  static void module_remove_modinfo_attrs(struct module *mod)
  {
  }
80a3d1bb4   Rusty Russell   module: move sysf...
1755
1756
1757
  static void del_usage_links(struct module *mod)
  {
  }
cf2fde7b3   Rusty Russell   param: fix module...
1758
1759
1760
  static void init_param_lock(struct module *mod)
  {
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1761
  #endif /* CONFIG_SYSFS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1762

36b0360d1   Rusty Russell   module: fix sysfs...
1763
  static void mod_sysfs_teardown(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1764
  {
80a3d1bb4   Rusty Russell   module: move sysf...
1765
  	del_usage_links(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1766
  	module_remove_modinfo_attrs(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1767
  	module_param_sysfs_remove(mod);
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1768
1769
  	kobject_put(mod->mkobj.drivers_dir);
  	kobject_put(mod->holders_dir);
34e4e2fef   Denis V. Lunev   modules: proper c...
1770
  	mod_sysfs_fini(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1771
  }
0f5bf6d0a   Laura Abbott   arch: Rename CONF...
1772
  #ifdef CONFIG_STRICT_MODULE_RWX
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1773
1774
1775
  /*
   * LKM RO/NX protection: protect module's text/ro-data
   * from modification and any data from execution.
85c898db6   Rusty Russell   module: clean up ...
1776
1777
   *
   * General layout of module is:
444d13ff1   Jessica Yu   modules: add ro_a...
1778
1779
1780
1781
1782
   *          [text] [read-only-data] [ro-after-init] [writable data]
   * text_size -----^                ^               ^               ^
   * ro_size ------------------------|               |               |
   * ro_after_init_size -----------------------------|               |
   * size -----------------------------------------------------------|
85c898db6   Rusty Russell   module: clean up ...
1783
1784
   *
   * These values are always page-aligned (as is base)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1785
   */
85c898db6   Rusty Russell   module: clean up ...
1786
1787
  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...
1788
  {
85c898db6   Rusty Russell   module: clean up ...
1789
1790
1791
1792
  	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...
1793
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1794

85c898db6   Rusty Russell   module: clean up ...
1795
1796
  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...
1797
  {
85c898db6   Rusty Russell   module: clean up ...
1798
1799
1800
1801
1802
  	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...
1803
  }
444d13ff1   Jessica Yu   modules: add ro_a...
1804
1805
1806
1807
1808
1809
1810
1811
1812
  static void frob_ro_after_init(const struct module_layout *layout,
  				int (*set_memory)(unsigned long start, int num_pages))
  {
  	BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
  	BUG_ON((unsigned long)layout->ro_size & (PAGE_SIZE-1));
  	BUG_ON((unsigned long)layout->ro_after_init_size & (PAGE_SIZE-1));
  	set_memory((unsigned long)layout->base + layout->ro_size,
  		   (layout->ro_after_init_size - layout->ro_size) >> PAGE_SHIFT);
  }
85c898db6   Rusty Russell   module: clean up ...
1813
1814
  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...
1815
  {
85c898db6   Rusty Russell   module: clean up ...
1816
  	BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
444d13ff1   Jessica Yu   modules: add ro_a...
1817
  	BUG_ON((unsigned long)layout->ro_after_init_size & (PAGE_SIZE-1));
85c898db6   Rusty Russell   module: clean up ...
1818
  	BUG_ON((unsigned long)layout->size & (PAGE_SIZE-1));
444d13ff1   Jessica Yu   modules: add ro_a...
1819
1820
  	set_memory((unsigned long)layout->base + layout->ro_after_init_size,
  		   (layout->size - layout->ro_after_init_size) >> PAGE_SHIFT);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1821
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1822

85c898db6   Rusty Russell   module: clean up ...
1823
1824
  /* 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...
1825
  {
39290b389   AKASHI Takahiro   module: extend 'r...
1826
1827
  	if (!rodata_enabled)
  		return;
85c898db6   Rusty Russell   module: clean up ...
1828
1829
  	frob_text(&mod->core_layout, set_memory_rw);
  	frob_rodata(&mod->core_layout, set_memory_rw);
444d13ff1   Jessica Yu   modules: add ro_a...
1830
  	frob_ro_after_init(&mod->core_layout, set_memory_rw);
85c898db6   Rusty Russell   module: clean up ...
1831
1832
  	frob_text(&mod->init_layout, set_memory_rw);
  	frob_rodata(&mod->init_layout, set_memory_rw);
20ef10c1b   Josh Poimboeuf   module: Use the s...
1833
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1834

444d13ff1   Jessica Yu   modules: add ro_a...
1835
  void module_enable_ro(const struct module *mod, bool after_init)
01526ed08   Jan Glauber   module: split uns...
1836
  {
39290b389   AKASHI Takahiro   module: extend 'r...
1837
1838
  	if (!rodata_enabled)
  		return;
85c898db6   Rusty Russell   module: clean up ...
1839
1840
1841
1842
  	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);
444d13ff1   Jessica Yu   modules: add ro_a...
1843
1844
1845
  
  	if (after_init)
  		frob_ro_after_init(&mod->core_layout, set_memory_ro);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1846
  }
85c898db6   Rusty Russell   module: clean up ...
1847
  static void module_enable_nx(const struct module *mod)
01526ed08   Jan Glauber   module: split uns...
1848
  {
85c898db6   Rusty Russell   module: clean up ...
1849
  	frob_rodata(&mod->core_layout, set_memory_nx);
444d13ff1   Jessica Yu   modules: add ro_a...
1850
  	frob_ro_after_init(&mod->core_layout, set_memory_nx);
85c898db6   Rusty Russell   module: clean up ...
1851
1852
1853
  	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...
1854
  }
85c898db6   Rusty Russell   module: clean up ...
1855
  static void module_disable_nx(const struct module *mod)
01526ed08   Jan Glauber   module: split uns...
1856
  {
85c898db6   Rusty Russell   module: clean up ...
1857
  	frob_rodata(&mod->core_layout, set_memory_x);
444d13ff1   Jessica Yu   modules: add ro_a...
1858
  	frob_ro_after_init(&mod->core_layout, set_memory_x);
85c898db6   Rusty Russell   module: clean up ...
1859
1860
1861
  	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...
1862
1863
1864
  }
  
  /* Iterate through all modules and set each module's text as RW */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1865
  void set_all_modules_text_rw(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1866
1867
  {
  	struct module *mod;
39290b389   AKASHI Takahiro   module: extend 'r...
1868
1869
  	if (!rodata_enabled)
  		return;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1870
1871
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1872
1873
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
85c898db6   Rusty Russell   module: clean up ...
1874
1875
1876
  
  		frob_text(&mod->core_layout, set_memory_rw);
  		frob_text(&mod->init_layout, set_memory_rw);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1877
1878
1879
1880
1881
  	}
  	mutex_unlock(&module_mutex);
  }
  
  /* Iterate through all modules and set each module's text as RO */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1882
  void set_all_modules_text_ro(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1883
1884
  {
  	struct module *mod;
39290b389   AKASHI Takahiro   module: extend 'r...
1885
1886
  	if (!rodata_enabled)
  		return;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1887
1888
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
905dd707f   Aaron Tomlin   module: When modi...
1889
1890
1891
1892
1893
1894
1895
  		/*
  		 * Ignore going modules since it's possible that ro
  		 * protection has already been disabled, otherwise we'll
  		 * run into protection faults at module deallocation.
  		 */
  		if (mod->state == MODULE_STATE_UNFORMED ||
  			mod->state == MODULE_STATE_GOING)
0d21b0e34   Rusty Russell   module: add new s...
1896
  			continue;
85c898db6   Rusty Russell   module: clean up ...
1897
1898
1899
  
  		frob_text(&mod->core_layout, set_memory_ro);
  		frob_text(&mod->init_layout, set_memory_ro);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1900
1901
1902
  	}
  	mutex_unlock(&module_mutex);
  }
85c898db6   Rusty Russell   module: clean up ...
1903
1904
1905
  
  static void disable_ro_nx(const struct module_layout *layout)
  {
39290b389   AKASHI Takahiro   module: extend 'r...
1906
1907
1908
1909
1910
  	if (rodata_enabled) {
  		frob_text(layout, set_memory_rw);
  		frob_rodata(layout, set_memory_rw);
  		frob_ro_after_init(layout, set_memory_rw);
  	}
85c898db6   Rusty Russell   module: clean up ...
1911
  	frob_rodata(layout, set_memory_x);
444d13ff1   Jessica Yu   modules: add ro_a...
1912
  	frob_ro_after_init(layout, set_memory_x);
85c898db6   Rusty Russell   module: clean up ...
1913
1914
  	frob_writable_data(layout, set_memory_x);
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1915
  #else
85c898db6   Rusty Russell   module: clean up ...
1916
1917
1918
  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...
1919
  #endif
1ce15ef4f   Jessica Yu   module: preserve ...
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
  #ifdef CONFIG_LIVEPATCH
  /*
   * Persist Elf information about a module. Copy the Elf header,
   * section header table, section string table, and symtab section
   * index from info to mod->klp_info.
   */
  static int copy_module_elf(struct module *mod, struct load_info *info)
  {
  	unsigned int size, symndx;
  	int ret;
  
  	size = sizeof(*mod->klp_info);
  	mod->klp_info = kmalloc(size, GFP_KERNEL);
  	if (mod->klp_info == NULL)
  		return -ENOMEM;
  
  	/* Elf header */
  	size = sizeof(mod->klp_info->hdr);
  	memcpy(&mod->klp_info->hdr, info->hdr, size);
  
  	/* Elf section header table */
  	size = sizeof(*info->sechdrs) * info->hdr->e_shnum;
  	mod->klp_info->sechdrs = kmalloc(size, GFP_KERNEL);
  	if (mod->klp_info->sechdrs == NULL) {
  		ret = -ENOMEM;
  		goto free_info;
  	}
  	memcpy(mod->klp_info->sechdrs, info->sechdrs, size);
  
  	/* Elf section name string table */
  	size = info->sechdrs[info->hdr->e_shstrndx].sh_size;
  	mod->klp_info->secstrings = kmalloc(size, GFP_KERNEL);
  	if (mod->klp_info->secstrings == NULL) {
  		ret = -ENOMEM;
  		goto free_sechdrs;
  	}
  	memcpy(mod->klp_info->secstrings, info->secstrings, size);
  
  	/* Elf symbol section index */
  	symndx = info->index.sym;
  	mod->klp_info->symndx = symndx;
  
  	/*
  	 * For livepatch modules, core_kallsyms.symtab is a complete
  	 * copy of the original symbol table. Adjust sh_addr to point
  	 * to core_kallsyms.symtab since the copy of the symtab in module
  	 * init memory is freed at the end of do_init_module().
  	 */
  	mod->klp_info->sechdrs[symndx].sh_addr = \
  		(unsigned long) mod->core_kallsyms.symtab;
  
  	return 0;
  
  free_sechdrs:
  	kfree(mod->klp_info->sechdrs);
  free_info:
  	kfree(mod->klp_info);
  	return ret;
  }
  
  static void free_module_elf(struct module *mod)
  {
  	kfree(mod->klp_info->sechdrs);
  	kfree(mod->klp_info->secstrings);
  	kfree(mod->klp_info);
  }
  #else /* !CONFIG_LIVEPATCH */
  static int copy_module_elf(struct module *mod, struct load_info *info)
  {
  	return 0;
  }
  
  static void free_module_elf(struct module *mod)
  {
  }
  #endif /* CONFIG_LIVEPATCH */
be1f221c0   Rusty Russell   module: remove mo...
1996
  void __weak module_memfree(void *module_region)
74e08fcf7   Jonas Bonn   modules: add defa...
1997
1998
1999
2000
2001
2002
2003
  {
  	vfree(module_region);
  }
  
  void __weak module_arch_cleanup(struct module *mod)
  {
  }
d453cded0   Rusty Russell   module_arch_freei...
2004
2005
2006
  void __weak module_arch_freeing_init(struct module *mod)
  {
  }
75676500f   Rusty Russell   module: make lock...
2007
  /* Free a module, remove from lists, etc. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2008
2009
  static void free_module(struct module *mod)
  {
7ead8b831   Li Zefan   tracing/events: A...
2010
  	trace_module_free(mod);
36b0360d1   Rusty Russell   module: fix sysfs...
2011
  	mod_sysfs_teardown(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2012

944a1fa01   Rusty Russell   module: don't unl...
2013
2014
  	/* 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...
2015
  	mutex_lock(&module_mutex);
944a1fa01   Rusty Russell   module: don't unl...
2016
  	mod->state = MODULE_STATE_UNFORMED;
d3051b489   Prarit Bhargava   modules, lock aro...
2017
  	mutex_unlock(&module_mutex);
944a1fa01   Rusty Russell   module: don't unl...
2018

b82bab4bb   Jason Baron   dynamic debug: mo...
2019
2020
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2021
2022
2023
2024
2025
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
2026
2027
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
1ce15ef4f   Jessica Yu   module: preserve ...
2028
2029
  	if (is_livepatch_module(mod))
  		free_module_elf(mod);
944a1fa01   Rusty Russell   module: don't unl...
2030
2031
  	/* Now we can delete it from the lists */
  	mutex_lock(&module_mutex);
461e34aed   Masami Hiramatsu   module: Unlink mo...
2032
2033
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
93c2e105f   Peter Zijlstra   module: Optimize ...
2034
  	mod_tree_remove(mod);
0286b5ea1   Masami Hiramatsu   lib/bug: Use RCU ...
2035
  	/* Remove this module from bug list, this uses list_del_rcu */
461e34aed   Masami Hiramatsu   module: Unlink mo...
2036
  	module_bug_cleanup(mod);
0be964be0   Peter Zijlstra   module: Sanitize ...
2037
2038
  	/* Wait for RCU-sched synchronizing before releasing mod->list and buglist. */
  	synchronize_sched();
944a1fa01   Rusty Russell   module: don't unl...
2039
  	mutex_unlock(&module_mutex);
85c898db6   Rusty Russell   module: clean up ...
2040
2041
  	/* This may be empty, but that's OK */
  	disable_ro_nx(&mod->init_layout);
d453cded0   Rusty Russell   module_arch_freei...
2042
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
2043
  	module_memfree(mod->init_layout.base);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2044
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
2045
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
2046

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2050
  	/* Finally, free the core (containing the module structure) */
85c898db6   Rusty Russell   module: clean up ...
2051
  	disable_ro_nx(&mod->core_layout);
7523e4dc5   Rusty Russell   module: use a str...
2052
  	module_memfree(mod->core_layout.base);
eb8cdec4a   Bernd Schmidt   nommu: add suppor...
2053
2054
2055
2056
  
  #ifdef CONFIG_MPU
  	update_protections(current->mm);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2057
2058
2059
2060
2061
  }
  
  void *__symbol_get(const char *symbol)
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
2062
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2063

24da1cbff   Rusty Russell   modules: remove m...
2064
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
2065
2066
2067
  	sym = find_symbol(symbol, &owner, NULL, true, true);
  	if (sym && strong_try_module_get(owner))
  		sym = NULL;
24da1cbff   Rusty Russell   modules: remove m...
2068
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2069

414fd31b2   Tim Abbott   module: Make find...
2070
  	return sym ? (void *)sym->value : NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2071
2072
  }
  EXPORT_SYMBOL_GPL(__symbol_get);
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2073
2074
  /*
   * Ensure that an exported symbol [global namespace] does not already exist
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
2075
   * in the kernel or in some other module's exported symbol table.
be593f4ce   Rusty Russell   module: verify_ex...
2076
2077
   *
   * You must hold the module_mutex.
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2078
2079
2080
   */
  static int verify_export_symbols(struct module *mod)
  {
b211104d1   Rusty Russell   module: Enhance v...
2081
  	unsigned int i;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2082
  	struct module *owner;
b211104d1   Rusty Russell   module: Enhance v...
2083
2084
2085
2086
2087
2088
2089
2090
  	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...
2091
  #ifdef CONFIG_UNUSED_SYMBOLS
b211104d1   Rusty Russell   module: Enhance v...
2092
2093
  		{ mod->unused_syms, mod->num_unused_syms },
  		{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
2094
  #endif
b211104d1   Rusty Russell   module: Enhance v...
2095
  	};
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2096

b211104d1   Rusty Russell   module: Enhance v...
2097
2098
  	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...
2099
  			if (find_symbol(s->name, &owner, NULL, true, false)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2100
  				pr_err("%s: exports duplicate symbol %s"
b211104d1   Rusty Russell   module: Enhance v...
2101
2102
2103
2104
2105
  				       " (owned by %s)
  ",
  				       mod->name, s->name, module_name(owner));
  				return -ENOEXEC;
  			}
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2106
  		}
b211104d1   Rusty Russell   module: Enhance v...
2107
2108
  	}
  	return 0;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2109
  }
9a4b9708f   Matti Linnanvuori   module: fix and e...
2110
  /* Change all symbols so that st_value encodes the pointer directly. */
49668688d   Rusty Russell   module: pass load...
2111
2112
2113
2114
  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
2115
  	unsigned long secbase;
49668688d   Rusty Russell   module: pass load...
2116
  	unsigned int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2117
  	int ret = 0;
414fd31b2   Tim Abbott   module: Make find...
2118
  	const struct kernel_symbol *ksym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2119

49668688d   Rusty Russell   module: pass load...
2120
2121
  	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
2122
2123
  		switch (sym[i].st_shndx) {
  		case SHN_COMMON:
80375980f   Joe Mario   lto: Handle LTO c...
2124
2125
2126
  			/* Ignore common symbols */
  			if (!strncmp(name, "__gnu_lto", 9))
  				break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2127
2128
  			/* We compiled with -fno-common.  These are not
  			   supposed to happen.  */
5e1241692   Jim Cromie   module: replace D...
2129
2130
  			pr_debug("Common symbol: %s
  ", name);
6da0b5651   Ionut Alexa   kernel:module Fix...
2131
2132
  			pr_warn("%s: please compile with -fno-common
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2133
2134
2135
2136
2137
2138
  			       mod->name);
  			ret = -ENOEXEC;
  			break;
  
  		case SHN_ABS:
  			/* Don't need to do anything */
5e1241692   Jim Cromie   module: replace D...
2139
2140
  			pr_debug("Absolute symbol: 0x%08lx
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2141
2142
  			       (long)sym[i].st_value);
  			break;
1ce15ef4f   Jessica Yu   module: preserve ...
2143
2144
2145
  		case SHN_LIVEPATCH:
  			/* Livepatch symbols are resolved by livepatch */
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2146
  		case SHN_UNDEF:
49668688d   Rusty Russell   module: pass load...
2147
  			ksym = resolve_symbol_wait(mod, info, name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2148
  			/* Ok if resolved.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
2149
  			if (ksym && !IS_ERR(ksym)) {
414fd31b2   Tim Abbott   module: Make find...
2150
  				sym[i].st_value = ksym->value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2151
  				break;
414fd31b2   Tim Abbott   module: Make find...
2152
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2153
  			/* Ok if weak.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
2154
  			if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2155
  				break;
bddb12b32   Andrew Morton   kernel/module.c: ...
2156
2157
2158
  			pr_warn("%s: Unknown symbol %s (err %li)
  ",
  				mod->name, name, PTR_ERR(ksym));
9bea7f239   Rusty Russell   module: fix bne2 ...
2159
  			ret = PTR_ERR(ksym) ?: -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2160
2161
2162
2163
  			break;
  
  		default:
  			/* Divert to percpu allocation if a percpu var. */
49668688d   Rusty Russell   module: pass load...
2164
  			if (sym[i].st_shndx == info->index.pcpu)
259354dea   Tejun Heo   module: encapsula...
2165
  				secbase = (unsigned long)mod_percpu(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2166
  			else
49668688d   Rusty Russell   module: pass load...
2167
  				secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2168
2169
2170
2171
2172
2173
2174
  			sym[i].st_value += secbase;
  			break;
  		}
  	}
  
  	return ret;
  }
49668688d   Rusty Russell   module: pass load...
2175
  static int apply_relocations(struct module *mod, const struct load_info *info)
22e268ebe   Rusty Russell   module: refactor ...
2176
2177
2178
2179
2180
  {
  	unsigned int i;
  	int err = 0;
  
  	/* Now do relocations. */
49668688d   Rusty Russell   module: pass load...
2181
2182
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		unsigned int infosec = info->sechdrs[i].sh_info;
22e268ebe   Rusty Russell   module: refactor ...
2183
2184
  
  		/* Not a valid relocation section? */
49668688d   Rusty Russell   module: pass load...
2185
  		if (infosec >= info->hdr->e_shnum)
22e268ebe   Rusty Russell   module: refactor ...
2186
2187
2188
  			continue;
  
  		/* Don't bother with non-allocated sections */
49668688d   Rusty Russell   module: pass load...
2189
  		if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC))
22e268ebe   Rusty Russell   module: refactor ...
2190
  			continue;
1ce15ef4f   Jessica Yu   module: preserve ...
2191
2192
2193
  		/* Livepatch relocation sections are applied by livepatch */
  		if (info->sechdrs[i].sh_flags & SHF_RELA_LIVEPATCH)
  			continue;
49668688d   Rusty Russell   module: pass load...
2194
2195
2196
2197
2198
2199
  		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 ...
2200
2201
2202
2203
2204
  		if (err < 0)
  			break;
  	}
  	return err;
  }
088af9a6e   Helge Deller   module: fix modul...
2205
2206
2207
2208
2209
2210
2211
  /* 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
2212
  /* Update size with this section: return offset. */
088af9a6e   Helge Deller   module: fix modul...
2213
2214
  static long get_offset(struct module *mod, unsigned int *size,
  		       Elf_Shdr *sechdr, unsigned int section)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2215
2216
  {
  	long ret;
088af9a6e   Helge Deller   module: fix modul...
2217
  	*size += arch_mod_section_prepend(mod, section);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2218
2219
2220
2221
2222
2223
2224
2225
2226
  	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...
2227
  static void layout_sections(struct module *mod, struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2228
2229
2230
2231
2232
2233
2234
  {
  	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 },
444d13ff1   Jessica Yu   modules: add ro_a...
2235
  		{ SHF_RO_AFTER_INIT | SHF_ALLOC, ARCH_SHF_SMALL },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2236
2237
2238
2239
  		{ SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL },
  		{ ARCH_SHF_SMALL | SHF_ALLOC, 0 }
  	};
  	unsigned int m, i;
49668688d   Rusty Russell   module: pass load...
2240
2241
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		info->sechdrs[i].sh_entsize = ~0UL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2242

5e1241692   Jim Cromie   module: replace D...
2243
2244
  	pr_debug("Core section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2245
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
2246
2247
2248
  		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
2249
2250
2251
2252
  
  			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...
2253
  			    || strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2254
  				continue;
7523e4dc5   Rusty Russell   module: use a str...
2255
  			s->sh_entsize = get_offset(mod, &mod->core_layout.size, s, i);
5e1241692   Jim Cromie   module: replace D...
2256
2257
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2258
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2259
2260
  		switch (m) {
  		case 0: /* executable */
7523e4dc5   Rusty Russell   module: use a str...
2261
2262
  			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...
2263
2264
  			break;
  		case 1: /* RO: text and ro-data */
7523e4dc5   Rusty Russell   module: use a str...
2265
2266
  			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...
2267
  			break;
444d13ff1   Jessica Yu   modules: add ro_a...
2268
2269
2270
2271
2272
  		case 2: /* RO after init */
  			mod->core_layout.size = debug_align(mod->core_layout.size);
  			mod->core_layout.ro_after_init_size = mod->core_layout.size;
  			break;
  		case 4: /* whole core */
7523e4dc5   Rusty Russell   module: use a str...
2273
  			mod->core_layout.size = debug_align(mod->core_layout.size);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2274
2275
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2276
  	}
5e1241692   Jim Cromie   module: replace D...
2277
2278
  	pr_debug("Init section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2279
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
2280
2281
2282
  		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
2283
2284
2285
2286
  
  			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...
2287
  			    || !strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2288
  				continue;
7523e4dc5   Rusty Russell   module: use a str...
2289
  			s->sh_entsize = (get_offset(mod, &mod->init_layout.size, s, i)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2290
  					 | INIT_OFFSET_MASK);
5e1241692   Jim Cromie   module: replace D...
2291
2292
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2293
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2294
2295
  		switch (m) {
  		case 0: /* executable */
7523e4dc5   Rusty Russell   module: use a str...
2296
2297
  			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...
2298
2299
  			break;
  		case 1: /* RO: text and ro-data */
7523e4dc5   Rusty Russell   module: use a str...
2300
2301
  			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...
2302
  			break;
444d13ff1   Jessica Yu   modules: add ro_a...
2303
2304
2305
2306
2307
2308
2309
2310
  		case 2:
  			/*
  			 * RO after init doesn't apply to init_layout (only
  			 * core_layout), so it just takes the value of ro_size.
  			 */
  			mod->init_layout.ro_after_init_size = mod->init_layout.ro_size;
  			break;
  		case 4: /* whole init */
7523e4dc5   Rusty Russell   module: use a str...
2311
  			mod->init_layout.size = debug_align(mod->init_layout.size);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2312
2313
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2314
2315
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2316
2317
2318
2319
  static void set_license(struct module *mod, const char *license)
  {
  	if (!license)
  		license = "unspecified";
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
2320
  	if (!license_is_gpl_compatible(license)) {
25ddbb18a   Andi Kleen   Make the taint fl...
2321
  		if (!test_taint(TAINT_PROPRIETARY_MODULE))
bddb12b32   Andrew Morton   kernel/module.c: ...
2322
2323
2324
  			pr_warn("%s: module license '%s' taints kernel.
  ",
  				mod->name, license);
373d4d099   Rusty Russell   taint: add explic...
2325
2326
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
  	}
  }
  
  /* 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...
2348
  static char *get_modinfo(struct load_info *info, const char *tag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2349
2350
2351
  {
  	char *p;
  	unsigned int taglen = strlen(tag);
49668688d   Rusty Russell   module: pass load...
2352
2353
  	Elf_Shdr *infosec = &info->sechdrs[info->index.info];
  	unsigned long size = infosec->sh_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2354

49668688d   Rusty Russell   module: pass load...
2355
  	for (p = (char *)infosec->sh_addr; p; p = next_string(p, &size)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2356
2357
2358
2359
2360
  		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
  			return p + taglen + 1;
  	}
  	return NULL;
  }
49668688d   Rusty Russell   module: pass load...
2361
  static void setup_modinfo(struct module *mod, struct load_info *info)
c988d2b28   Matt Domsch   [PATCH] modules: ...
2362
2363
2364
2365
2366
2367
  {
  	struct module_attribute *attr;
  	int i;
  
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
  		if (attr->setup)
49668688d   Rusty Russell   module: pass load...
2368
  			attr->setup(mod, get_modinfo(info, attr->attr.name));
c988d2b28   Matt Domsch   [PATCH] modules: ...
2369
2370
  	}
  }
c988d2b28   Matt Domsch   [PATCH] modules: ...
2371

a263f7763   Rusty Russell   module: fix memor...
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
  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
2382
  #ifdef CONFIG_KALLSYMS
15bba37d6   WANG Cong   module: fix build...
2383
2384
2385
2386
2387
2388
  
  /* 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...
2389
2390
  	return bsearch(name, start, stop - start,
  			sizeof(struct kernel_symbol), cmp_name);
15bba37d6   WANG Cong   module: fix build...
2391
  }
ca4787b77   Tim Abbott   kernel/module.c: ...
2392
2393
  static int is_exported(const char *name, unsigned long value,
  		       const struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2394
  {
ca4787b77   Tim Abbott   kernel/module.c: ...
2395
2396
2397
  	const struct kernel_symbol *ks;
  	if (!mod)
  		ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab);
3fd6805f4   Sam Ravnborg   [PATCH] Clean up ...
2398
  	else
ca4787b77   Tim Abbott   kernel/module.c: ...
2399
2400
  		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
2401
2402
2403
  }
  
  /* As per nm */
eded41c1c   Rusty Russell   module: kallsyms ...
2404
  static char elf_type(const Elf_Sym *sym, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2405
  {
eded41c1c   Rusty Russell   module: kallsyms ...
2406
  	const Elf_Shdr *sechdrs = info->sechdrs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2407
2408
2409
2410
2411
2412
2413
2414
  	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...
2415
  	if (sym->st_shndx == SHN_ABS || sym->st_shndx == info->index.pcpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
  		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 ...
2436
2437
  	if (strstarts(info->secstrings + sechdrs[sym->st_shndx].sh_name,
  		      ".debug")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2438
  		return 'n';
eded41c1c   Rusty Russell   module: kallsyms ...
2439
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2440
2441
  	return '?';
  }
4a4962263   Jan Beulich   module: reduce sy...
2442
  static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs,
e02244185   Miroslav Benes   module: keep perc...
2443
  			unsigned int shnum, unsigned int pcpundx)
4a4962263   Jan Beulich   module: reduce sy...
2444
2445
2446
2447
2448
2449
2450
  {
  	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...
2451
2452
2453
2454
  #ifdef CONFIG_KALLSYMS_ALL
  	if (src->st_shndx == pcpundx)
  		return true;
  #endif
4a4962263   Jan Beulich   module: reduce sy...
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
  	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...
2465
2466
2467
2468
2469
2470
2471
  /*
   * 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...
2472
  static void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2473
  {
49668688d   Rusty Russell   module: pass load...
2474
2475
  	Elf_Shdr *symsect = info->sechdrs + info->index.sym;
  	Elf_Shdr *strsect = info->sechdrs + info->index.str;
4a4962263   Jan Beulich   module: reduce sy...
2476
  	const Elf_Sym *src;
54523ec71   Satoru Takeuchi   module: Remove a ...
2477
  	unsigned int i, nsrc, ndst, strtab_size = 0;
4a4962263   Jan Beulich   module: reduce sy...
2478
2479
2480
  
  	/* Put symbol section at end of init part of module. */
  	symsect->sh_flags |= SHF_ALLOC;
7523e4dc5   Rusty Russell   module: use a str...
2481
  	symsect->sh_entsize = get_offset(mod, &mod->init_layout.size, symsect,
49668688d   Rusty Russell   module: pass load...
2482
  					 info->index.sym) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2483
2484
  	pr_debug("\t%s
  ", info->secstrings + symsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2485

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

48fd11880   Kevin Cernekee   module: Fix perfo...
2489
  	/* Compute total space required for the core symbols' strtab. */
59ef28b1f   Rusty Russell   module: fix out-b...
2490
  	for (ndst = i = 0; i < nsrc; i++) {
1ce15ef4f   Jessica Yu   module: preserve ...
2491
  		if (i == 0 || is_livepatch_module(mod) ||
e02244185   Miroslav Benes   module: keep perc...
2492
2493
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
  				   info->index.pcpu)) {
59ef28b1f   Rusty Russell   module: fix out-b...
2494
  			strtab_size += strlen(&info->strtab[src[i].st_name])+1;
48fd11880   Kevin Cernekee   module: Fix perfo...
2495
  			ndst++;
554bdfe5a   Jan Beulich   module: reduce st...
2496
  		}
59ef28b1f   Rusty Russell   module: fix out-b...
2497
  	}
4a4962263   Jan Beulich   module: reduce sy...
2498
2499
  
  	/* Append room for core symbols at end of core part. */
7523e4dc5   Rusty Russell   module: use a str...
2500
2501
2502
2503
  	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...
2504

554bdfe5a   Jan Beulich   module: reduce st...
2505
2506
  	/* Put string table section at end of init part of module. */
  	strsect->sh_flags |= SHF_ALLOC;
7523e4dc5   Rusty Russell   module: use a str...
2507
  	strsect->sh_entsize = get_offset(mod, &mod->init_layout.size, strsect,
49668688d   Rusty Russell   module: pass load...
2508
  					 info->index.str) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2509
2510
  	pr_debug("\t%s
  ", info->secstrings + strsect->sh_name);
8244062ef   Rusty Russell   modules: fix long...
2511
2512
2513
2514
2515
2516
2517
  
  	/* We'll tack temporary mod_kallsyms on the end. */
  	mod->init_layout.size = ALIGN(mod->init_layout.size,
  				      __alignof__(struct mod_kallsyms));
  	info->mod_kallsyms_init_off = mod->init_layout.size;
  	mod->init_layout.size += sizeof(struct mod_kallsyms);
  	mod->init_layout.size = debug_align(mod->init_layout.size);
4a4962263   Jan Beulich   module: reduce sy...
2518
  }
8244062ef   Rusty Russell   modules: fix long...
2519
2520
2521
2522
2523
  /*
   * We use the full symtab and strtab which layout_symtab arranged to
   * be appended to the init section.  Later we switch to the cut-down
   * core-only ones.
   */
811d66a0e   Rusty Russell   module: group pos...
2524
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2525
  {
4a4962263   Jan Beulich   module: reduce sy...
2526
2527
2528
  	unsigned int i, ndst;
  	const Elf_Sym *src;
  	Elf_Sym *dst;
554bdfe5a   Jan Beulich   module: reduce st...
2529
  	char *s;
eded41c1c   Rusty Russell   module: kallsyms ...
2530
  	Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2531

8244062ef   Rusty Russell   modules: fix long...
2532
2533
2534
2535
2536
  	/* Set up to point into init section. */
  	mod->kallsyms = mod->init_layout.base + info->mod_kallsyms_init_off;
  
  	mod->kallsyms->symtab = (void *)symsec->sh_addr;
  	mod->kallsyms->num_symtab = symsec->sh_size / sizeof(Elf_Sym);
511ca6ae4   Rusty Russell   module: fix crash...
2537
  	/* Make sure we get permanent strtab: don't use info->strtab. */
8244062ef   Rusty Russell   modules: fix long...
2538
  	mod->kallsyms->strtab = (void *)info->sechdrs[info->index.str].sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2539
2540
  
  	/* Set types up while we still have access to sections. */
8244062ef   Rusty Russell   modules: fix long...
2541
2542
2543
2544
2545
2546
2547
2548
2549
  	for (i = 0; i < mod->kallsyms->num_symtab; i++)
  		mod->kallsyms->symtab[i].st_info
  			= elf_type(&mod->kallsyms->symtab[i], info);
  
  	/* Now populate the cut down core kallsyms for after init. */
  	mod->core_kallsyms.symtab = dst = mod->core_layout.base + info->symoffs;
  	mod->core_kallsyms.strtab = s = mod->core_layout.base + info->stroffs;
  	src = mod->kallsyms->symtab;
  	for (ndst = i = 0; i < mod->kallsyms->num_symtab; i++) {
1ce15ef4f   Jessica Yu   module: preserve ...
2550
  		if (i == 0 || is_livepatch_module(mod) ||
e02244185   Miroslav Benes   module: keep perc...
2551
2552
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
  				   info->index.pcpu)) {
59ef28b1f   Rusty Russell   module: fix out-b...
2553
  			dst[ndst] = src[i];
8244062ef   Rusty Russell   modules: fix long...
2554
2555
  			dst[ndst++].st_name = s - mod->core_kallsyms.strtab;
  			s += strlcpy(s, &mod->kallsyms->strtab[src[i].st_name],
59ef28b1f   Rusty Russell   module: fix out-b...
2556
2557
  				     KSYM_NAME_LEN) + 1;
  		}
4a4962263   Jan Beulich   module: reduce sy...
2558
  	}
8244062ef   Rusty Russell   modules: fix long...
2559
  	mod->core_kallsyms.num_symtab = ndst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2560
2561
  }
  #else
49668688d   Rusty Russell   module: pass load...
2562
  static inline void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2563
2564
  {
  }
3ae91c21d   Paul Mundt   module: fix up CO...
2565

abbce906d   MichaÅ‚ MirosÅ‚aw   (trivial) Fix com...
2566
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2567
2568
2569
  {
  }
  #endif /* CONFIG_KALLSYMS */
527963127   Zhou Chengming   module: fix ddebu...
2570
  static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsigned int num)
346e15beb   Jason Baron   driver core: basi...
2571
  {
811d66a0e   Rusty Russell   module: group pos...
2572
2573
  	if (!debug)
  		return;
e9d376f0f   Jason Baron   dynamic debug: co...
2574
  #ifdef CONFIG_DYNAMIC_DEBUG
527963127   Zhou Chengming   module: fix ddebu...
2575
  	if (ddebug_add_module(debug, num, mod->name))
bddb12b32   Andrew Morton   kernel/module.c: ...
2576
2577
2578
  		pr_err("dynamic debug error adding module: %s
  ",
  			debug->modname);
e9d376f0f   Jason Baron   dynamic debug: co...
2579
  #endif
5e458cc0f   Rusty Russell   module: simplify ...
2580
  }
346e15beb   Jason Baron   driver core: basi...
2581

527963127   Zhou Chengming   module: fix ddebu...
2582
  static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug)
ff49d74ad   Yehuda Sadeh   module: initializ...
2583
2584
  {
  	if (debug)
527963127   Zhou Chengming   module: fix ddebu...
2585
  		ddebug_remove_module(mod->name);
ff49d74ad   Yehuda Sadeh   module: initializ...
2586
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2587
2588
  void * __weak module_alloc(unsigned long size)
  {
82fab442f   Rusty Russell   modules: don't ha...
2589
  	return vmalloc_exec(size);
74e08fcf7   Jonas Bonn   modules: add defa...
2590
  }
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2591
  #ifdef CONFIG_DEBUG_KMEMLEAK
49668688d   Rusty Russell   module: pass load...
2592
2593
  static void kmemleak_load_module(const struct module *mod,
  				 const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2594
2595
2596
2597
  {
  	unsigned int i;
  
  	/* only scan the sections containing data */
c017b4be3   Catalin Marinas   kmemleak: Simplif...
2598
  	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2599

49668688d   Rusty Russell   module: pass load...
2600
  	for (i = 1; i < info->hdr->e_shnum; i++) {
06c9494c0   Steven Rostedt   kmemleak: Scan al...
2601
2602
2603
2604
  		/* 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...
2605
  			continue;
49668688d   Rusty Russell   module: pass load...
2606
2607
  		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
  				   info->sechdrs[i].sh_size, GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2608
2609
2610
  	}
  }
  #else
49668688d   Rusty Russell   module: pass load...
2611
2612
  static inline void kmemleak_load_module(const struct module *mod,
  					const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2613
2614
2615
  {
  }
  #endif
106a4ee25   Rusty Russell   module: signature...
2616
  #ifdef CONFIG_MODULE_SIG
bca014caa   Ben Hutchings   module: Invalidat...
2617
  static int module_sig_check(struct load_info *info, int flags)
106a4ee25   Rusty Russell   module: signature...
2618
2619
  {
  	int err = -ENOKEY;
34e1169d9   Kees Cook   module: add sysca...
2620
2621
  	const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1;
  	const void *mod = info->hdr;
caabe2405   David Howells   MODSIGN: Move the...
2622

bca014caa   Ben Hutchings   module: Invalidat...
2623
2624
2625
2626
2627
2628
  	/*
  	 * Require flags == 0, as a module with version information
  	 * removed is no longer the module that was signed
  	 */
  	if (flags == 0 &&
  	    info->len > markerlen &&
34e1169d9   Kees Cook   module: add sysca...
2629
  	    memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) {
caabe2405   David Howells   MODSIGN: Move the...
2630
  		/* We truncate the module to discard the signature */
34e1169d9   Kees Cook   module: add sysca...
2631
2632
  		info->len -= markerlen;
  		err = mod_verify_sig(mod, &info->len);
106a4ee25   Rusty Russell   module: signature...
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
  	}
  
  	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 */
bca014caa   Ben Hutchings   module: Invalidat...
2647
  static int module_sig_check(struct load_info *info, int flags)
106a4ee25   Rusty Russell   module: signature...
2648
2649
2650
2651
  {
  	return 0;
  }
  #endif /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2652
2653
  /* Sanity checks against invalid binaries, wrong arch, weird elf version. */
  static int elf_header_check(struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2654
  {
34e1169d9   Kees Cook   module: add sysca...
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
  	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 ...
2668

34e1169d9   Kees Cook   module: add sysca...
2669
2670
  	return 0;
  }
3afe9f849   Linus Torvalds   Copy the kernel m...
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
  #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;
  }
1ce15ef4f   Jessica Yu   module: preserve ...
2687
  #ifdef CONFIG_LIVEPATCH
2992ef29a   Josh Poimboeuf   livepatch/module:...
2688
  static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
1ce15ef4f   Jessica Yu   module: preserve ...
2689
  {
2992ef29a   Josh Poimboeuf   livepatch/module:...
2690
2691
2692
  	if (get_modinfo(info, "livepatch")) {
  		mod->klp = true;
  		add_taint_module(mod, TAINT_LIVEPATCH, LOCKDEP_STILL_OK);
7598d167d   Joe Lawrence   livepatch/module:...
2693
2694
2695
  		pr_notice_once("%s: tainting kernel with TAINT_LIVEPATCH
  ",
  			       mod->name);
2992ef29a   Josh Poimboeuf   livepatch/module:...
2696
  	}
1ce15ef4f   Jessica Yu   module: preserve ...
2697
2698
2699
2700
  
  	return 0;
  }
  #else /* !CONFIG_LIVEPATCH */
2992ef29a   Josh Poimboeuf   livepatch/module:...
2701
  static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
1ce15ef4f   Jessica Yu   module: preserve ...
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
  {
  	if (get_modinfo(info, "livepatch")) {
  		pr_err("%s: module is marked as livepatch module, but livepatch support is disabled",
  		       mod->name);
  		return -ENOEXEC;
  	}
  
  	return 0;
  }
  #endif /* CONFIG_LIVEPATCH */
86b5b1eb1   Andi Kleen   module/retpoline:...
2712
2713
2714
2715
2716
2717
2718
2719
2720
  static void check_modinfo_retpoline(struct module *mod, struct load_info *info)
  {
  	if (retpoline_module_ok(get_modinfo(info, "retpoline")))
  		return;
  
  	pr_warn("%s: loading module not compiled with retpoline compiler.
  ",
  		mod->name);
  }
34e1169d9   Kees Cook   module: add sysca...
2721
2722
2723
  /* 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 ...
2724
2725
  {
  	int err;
40dd2560e   Rusty Russell   module: refactor ...
2726

34e1169d9   Kees Cook   module: add sysca...
2727
2728
  	info->len = len;
  	if (info->len < sizeof(*(info->hdr)))
40dd2560e   Rusty Russell   module: refactor ...
2729
  		return -ENOEXEC;
a1db74209   Mimi Zohar   module: replace c...
2730
  	err = security_kernel_read_file(NULL, READING_MODULE);
2e72d51b4   Kees Cook   security: introdu...
2731
2732
  	if (err)
  		return err;
40dd2560e   Rusty Russell   module: refactor ...
2733
  	/* Suck in entire file: we'll want most of it. */
cc9e605dc   Kirill A. Shutemov   module: do not pr...
2734
  	info->hdr = __vmalloc(info->len,
19809c2da   Michal Hocko   mm, vmalloc: use ...
2735
  			GFP_KERNEL | __GFP_NOWARN, PAGE_KERNEL);
34e1169d9   Kees Cook   module: add sysca...
2736
  	if (!info->hdr)
40dd2560e   Rusty Russell   module: refactor ...
2737
  		return -ENOMEM;
3afe9f849   Linus Torvalds   Copy the kernel m...
2738
  	if (copy_chunked_from_user(info->hdr, umod, info->len) != 0) {
34e1169d9   Kees Cook   module: add sysca...
2739
2740
  		vfree(info->hdr);
  		return -EFAULT;
40dd2560e   Rusty Russell   module: refactor ...
2741
  	}
34e1169d9   Kees Cook   module: add sysca...
2742
2743
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
2744
2745
  static void free_copy(struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2746
2747
  	vfree(info->hdr);
  }
2f3238aeb   Rusty Russell   module: add flags...
2748
  static int rewrite_section_headers(struct load_info *info, int flags)
8b5f61a79   Rusty Russell   module: refactor ...
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
  {
  	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: ...
2759
2760
  			pr_err("Module len %lu truncated
  ", info->len);
8b5f61a79   Rusty Russell   module: refactor ...
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
  			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 ...
2773
  	}
d6df72a06   Rusty Russell   module: refactor ...
2774
2775
  
  	/* Track but don't keep modinfo and version sections. */
2f3238aeb   Rusty Russell   module: add flags...
2776
2777
2778
2779
  	if (flags & MODULE_INIT_IGNORE_MODVERSIONS)
  		info->index.vers = 0; /* Pretend no __versions section! */
  	else
  		info->index.vers = find_sec(info, "__versions");
3e2e857f9   Kees Cook   module: Add modul...
2780
  	info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC;
49668688d   Rusty Russell   module: pass load...
2781
  	info->index.info = find_sec(info, ".modinfo");
3e2e857f9   Kees Cook   module: Add modul...
2782
2783
2784
2785
  	if (!info->index.info)
  		info->name = "(missing .modinfo section)";
  	else
  		info->name = get_modinfo(info, "name");
d6df72a06   Rusty Russell   module: refactor ...
2786
  	info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC;
3e2e857f9   Kees Cook   module: Add modul...
2787

8b5f61a79   Rusty Russell   module: refactor ...
2788
2789
  	return 0;
  }
3264d3f9d   Linus Torvalds   module: add load_...
2790
2791
2792
2793
2794
2795
2796
2797
  /*
   * 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...
2798
  static struct module *setup_load_info(struct load_info *info, int flags)
3264d3f9d   Linus Torvalds   module: add load_...
2799
2800
  {
  	unsigned int i;
8b5f61a79   Rusty Russell   module: refactor ...
2801
  	int err;
3264d3f9d   Linus Torvalds   module: add load_...
2802
2803
2804
2805
  	struct module *mod;
  
  	/* Set up the convenience variables */
  	info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
8b5f61a79   Rusty Russell   module: refactor ...
2806
2807
  	info->secstrings = (void *)info->hdr
  		+ info->sechdrs[info->hdr->e_shstrndx].sh_offset;
3264d3f9d   Linus Torvalds   module: add load_...
2808

2f3238aeb   Rusty Russell   module: add flags...
2809
  	err = rewrite_section_headers(info, flags);
8b5f61a79   Rusty Russell   module: refactor ...
2810
2811
  	if (err)
  		return ERR_PTR(err);
3264d3f9d   Linus Torvalds   module: add load_...
2812

8b5f61a79   Rusty Russell   module: refactor ...
2813
2814
  	/* Find internal symbols and strings. */
  	for (i = 1; i < info->hdr->e_shnum; i++) {
3264d3f9d   Linus Torvalds   module: add load_...
2815
2816
2817
  		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 ...
2818
2819
2820
  			info->strtab = (char *)info->hdr
  				+ info->sechdrs[info->index.str].sh_offset;
  			break;
3264d3f9d   Linus Torvalds   module: add load_...
2821
  		}
3264d3f9d   Linus Torvalds   module: add load_...
2822
  	}
49668688d   Rusty Russell   module: pass load...
2823
  	info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
3264d3f9d   Linus Torvalds   module: add load_...
2824
  	if (!info->index.mod) {
3e2e857f9   Kees Cook   module: Add modul...
2825
2826
2827
  		pr_warn("%s: No module found in object
  ",
  			info->name ?: "(missing .modinfo name field)");
3264d3f9d   Linus Torvalds   module: add load_...
2828
2829
2830
2831
  		return ERR_PTR(-ENOEXEC);
  	}
  	/* This is temporary: point mod into copy of data. */
  	mod = (void *)info->sechdrs[info->index.mod].sh_addr;
3e2e857f9   Kees Cook   module: Add modul...
2832
2833
2834
2835
2836
2837
  	/*
  	 * If we didn't load the .modinfo 'name' field, fall back to
  	 * on-disk struct mod 'name' field.
  	 */
  	if (!info->name)
  		info->name = mod->name;
3264d3f9d   Linus Torvalds   module: add load_...
2838
  	if (info->index.sym == 0) {
3e2e857f9   Kees Cook   module: Add modul...
2839
2840
  		pr_warn("%s: module has no symbols (stripped?)
  ", info->name);
3264d3f9d   Linus Torvalds   module: add load_...
2841
2842
  		return ERR_PTR(-ENOEXEC);
  	}
49668688d   Rusty Russell   module: pass load...
2843
  	info->index.pcpu = find_pcpusec(info);
3264d3f9d   Linus Torvalds   module: add load_...
2844

3264d3f9d   Linus Torvalds   module: add load_...
2845
  	/* Check module struct version now, before we try to use module. */
490194269   Kees Cook   module: Pass stru...
2846
  	if (!check_modstruct_version(info, mod))
3264d3f9d   Linus Torvalds   module: add load_...
2847
2848
2849
  		return ERR_PTR(-ENOEXEC);
  
  	return mod;
3264d3f9d   Linus Torvalds   module: add load_...
2850
  }
2f3238aeb   Rusty Russell   module: add flags...
2851
  static int check_modinfo(struct module *mod, struct load_info *info, int flags)
40dd2560e   Rusty Russell   module: refactor ...
2852
  {
49668688d   Rusty Russell   module: pass load...
2853
  	const char *modmagic = get_modinfo(info, "vermagic");
40dd2560e   Rusty Russell   module: refactor ...
2854
  	int err;
2f3238aeb   Rusty Russell   module: add flags...
2855
2856
  	if (flags & MODULE_INIT_IGNORE_VERMAGIC)
  		modmagic = NULL;
40dd2560e   Rusty Russell   module: refactor ...
2857
2858
2859
2860
2861
  	/* 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...
2862
  	} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2863
2864
  		pr_err("%s: version magic '%s' should be '%s'
  ",
3e2e857f9   Kees Cook   module: Add modul...
2865
  		       info->name, modmagic, vermagic);
40dd2560e   Rusty Russell   module: refactor ...
2866
2867
  		return -ENOEXEC;
  	}
3205c36cf   Libor Pechacek   module: Issue war...
2868
2869
2870
2871
2872
  	if (!get_modinfo(info, "intree")) {
  		if (!test_taint(TAINT_OOT_MODULE))
  			pr_warn("%s: loading out-of-tree module taints kernel.
  ",
  				mod->name);
373d4d099   Rusty Russell   taint: add explic...
2873
  		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
3205c36cf   Libor Pechacek   module: Issue war...
2874
  	}
2449b8ba0   Ben Hutchings   module,bug: Add T...
2875

86b5b1eb1   Andi Kleen   module/retpoline:...
2876
  	check_modinfo_retpoline(mod, info);
49668688d   Rusty Russell   module: pass load...
2877
  	if (get_modinfo(info, "staging")) {
373d4d099   Rusty Russell   taint: add explic...
2878
  		add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
bddb12b32   Andrew Morton   kernel/module.c: ...
2879
2880
2881
  		pr_warn("%s: module is from the staging directory, the quality "
  			"is unknown, you have been warned.
  ", mod->name);
40dd2560e   Rusty Russell   module: refactor ...
2882
  	}
22e268ebe   Rusty Russell   module: refactor ...
2883

2992ef29a   Josh Poimboeuf   livepatch/module:...
2884
  	err = check_modinfo_livepatch(mod, info);
1ce15ef4f   Jessica Yu   module: preserve ...
2885
2886
  	if (err)
  		return err;
22e268ebe   Rusty Russell   module: refactor ...
2887
  	/* Set up license info based on the info section */
49668688d   Rusty Russell   module: pass load...
2888
  	set_license(mod, get_modinfo(info, "license"));
22e268ebe   Rusty Russell   module: refactor ...
2889

40dd2560e   Rusty Russell   module: refactor ...
2890
2891
  	return 0;
  }
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2892
  static int find_module_sections(struct module *mod, struct load_info *info)
f91a13bb9   Linus Torvalds   module: refactor ...
2893
  {
49668688d   Rusty Russell   module: pass load...
2894
  	mod->kp = section_objs(info, "__param",
f91a13bb9   Linus Torvalds   module: refactor ...
2895
  			       sizeof(*mod->kp), &mod->num_kp);
49668688d   Rusty Russell   module: pass load...
2896
  	mod->syms = section_objs(info, "__ksymtab",
f91a13bb9   Linus Torvalds   module: refactor ...
2897
  				 sizeof(*mod->syms), &mod->num_syms);
49668688d   Rusty Russell   module: pass load...
2898
2899
  	mod->crcs = section_addr(info, "__kcrctab");
  	mod->gpl_syms = section_objs(info, "__ksymtab_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2900
2901
  				     sizeof(*mod->gpl_syms),
  				     &mod->num_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2902
2903
  	mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");
  	mod->gpl_future_syms = section_objs(info,
f91a13bb9   Linus Torvalds   module: refactor ...
2904
2905
2906
  					    "__ksymtab_gpl_future",
  					    sizeof(*mod->gpl_future_syms),
  					    &mod->num_gpl_future_syms);
49668688d   Rusty Russell   module: pass load...
2907
  	mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future");
f91a13bb9   Linus Torvalds   module: refactor ...
2908
2909
  
  #ifdef CONFIG_UNUSED_SYMBOLS
49668688d   Rusty Russell   module: pass load...
2910
  	mod->unused_syms = section_objs(info, "__ksymtab_unused",
f91a13bb9   Linus Torvalds   module: refactor ...
2911
2912
  					sizeof(*mod->unused_syms),
  					&mod->num_unused_syms);
49668688d   Rusty Russell   module: pass load...
2913
2914
  	mod->unused_crcs = section_addr(info, "__kcrctab_unused");
  	mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2915
2916
  					    sizeof(*mod->unused_gpl_syms),
  					    &mod->num_unused_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2917
  	mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
f91a13bb9   Linus Torvalds   module: refactor ...
2918
2919
  #endif
  #ifdef CONFIG_CONSTRUCTORS
49668688d   Rusty Russell   module: pass load...
2920
  	mod->ctors = section_objs(info, ".ctors",
f91a13bb9   Linus Torvalds   module: refactor ...
2921
  				  sizeof(*mod->ctors), &mod->num_ctors);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2922
2923
2924
2925
2926
2927
2928
2929
  	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...
2930
2931
  		pr_warn("%s: has both .ctors and .init_array.
  ",
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2932
2933
2934
  		       mod->name);
  		return -EINVAL;
  	}
f91a13bb9   Linus Torvalds   module: refactor ...
2935
2936
2937
  #endif
  
  #ifdef CONFIG_TRACEPOINTS
654986462   Mathieu Desnoyers   tracepoints: Fix ...
2938
2939
2940
  	mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
  					     sizeof(*mod->tracepoints_ptrs),
  					     &mod->num_tracepoints);
f91a13bb9   Linus Torvalds   module: refactor ...
2941
  #endif
bf5438fca   Jason Baron   jump label: Base ...
2942
2943
2944
2945
2946
  #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 ...
2947
  #ifdef CONFIG_EVENT_TRACING
49668688d   Rusty Russell   module: pass load...
2948
  	mod->trace_events = section_objs(info, "_ftrace_events",
f91a13bb9   Linus Torvalds   module: refactor ...
2949
2950
  					 sizeof(*mod->trace_events),
  					 &mod->num_trace_events);
99be647c5   Jeremy Linton   trace: rename str...
2951
2952
2953
  	mod->trace_evals = section_objs(info, "_ftrace_eval_map",
  					sizeof(*mod->trace_evals),
  					&mod->num_trace_evals);
f91a13bb9   Linus Torvalds   module: refactor ...
2954
  #endif
13b9b6e74   Steven Rostedt   tracing: Fix modu...
2955
2956
2957
2958
  #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...
2959
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
2960
2961
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  	/* sechdrs[0].sh_size is always zero */
49668688d   Rusty Russell   module: pass load...
2962
  	mod->ftrace_callsites = section_objs(info, "__mcount_loc",
f91a13bb9   Linus Torvalds   module: refactor ...
2963
2964
2965
  					     sizeof(*mod->ftrace_callsites),
  					     &mod->num_ftrace_callsites);
  #endif
22e268ebe   Rusty Russell   module: refactor ...
2966

811d66a0e   Rusty Russell   module: group pos...
2967
2968
  	mod->extable = section_objs(info, "__ex_table",
  				    sizeof(*mod->extable), &mod->num_exentries);
49668688d   Rusty Russell   module: pass load...
2969
  	if (section_addr(info, "__obsparm"))
bddb12b32   Andrew Morton   kernel/module.c: ...
2970
2971
  		pr_warn("%s: Ignoring obsolete parameters
  ", mod->name);
811d66a0e   Rusty Russell   module: group pos...
2972
2973
2974
  
  	info->debug = section_objs(info, "__verbose",
  				   sizeof(*info->debug), &info->num_debug);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2975
2976
  
  	return 0;
f91a13bb9   Linus Torvalds   module: refactor ...
2977
  }
49668688d   Rusty Russell   module: pass load...
2978
  static int move_module(struct module *mod, struct load_info *info)
65b8a9b4d   Linus Torvalds   module: refactor ...
2979
2980
2981
2982
2983
  {
  	int i;
  	void *ptr;
  
  	/* Do the allocs. */
7523e4dc5   Rusty Russell   module: use a str...
2984
  	ptr = module_alloc(mod->core_layout.size);
65b8a9b4d   Linus Torvalds   module: refactor ...
2985
2986
2987
2988
2989
2990
2991
  	/*
  	 * 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...
2992
  		return -ENOMEM;
65b8a9b4d   Linus Torvalds   module: refactor ...
2993

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

7523e4dc5   Rusty Russell   module: use a str...
2997
2998
  	if (mod->init_layout.size) {
  		ptr = module_alloc(mod->init_layout.size);
82fab442f   Rusty Russell   modules: don't ha...
2999
3000
3001
3002
3003
3004
3005
3006
  		/*
  		 * 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...
3007
  			module_memfree(mod->core_layout.base);
82fab442f   Rusty Russell   modules: don't ha...
3008
3009
  			return -ENOMEM;
  		}
7523e4dc5   Rusty Russell   module: use a str...
3010
3011
  		memset(ptr, 0, mod->init_layout.size);
  		mod->init_layout.base = ptr;
82fab442f   Rusty Russell   modules: don't ha...
3012
  	} else
7523e4dc5   Rusty Russell   module: use a str...
3013
  		mod->init_layout.base = NULL;
65b8a9b4d   Linus Torvalds   module: refactor ...
3014
3015
  
  	/* Transfer each section which specifies SHF_ALLOC */
5e1241692   Jim Cromie   module: replace D...
3016
3017
  	pr_debug("final section addresses:
  ");
49668688d   Rusty Russell   module: pass load...
3018
  	for (i = 0; i < info->hdr->e_shnum; i++) {
65b8a9b4d   Linus Torvalds   module: refactor ...
3019
  		void *dest;
49668688d   Rusty Russell   module: pass load...
3020
  		Elf_Shdr *shdr = &info->sechdrs[i];
65b8a9b4d   Linus Torvalds   module: refactor ...
3021

49668688d   Rusty Russell   module: pass load...
3022
  		if (!(shdr->sh_flags & SHF_ALLOC))
65b8a9b4d   Linus Torvalds   module: refactor ...
3023
  			continue;
49668688d   Rusty Russell   module: pass load...
3024
  		if (shdr->sh_entsize & INIT_OFFSET_MASK)
7523e4dc5   Rusty Russell   module: use a str...
3025
  			dest = mod->init_layout.base
49668688d   Rusty Russell   module: pass load...
3026
  				+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);
65b8a9b4d   Linus Torvalds   module: refactor ...
3027
  		else
7523e4dc5   Rusty Russell   module: use a str...
3028
  			dest = mod->core_layout.base + shdr->sh_entsize;
65b8a9b4d   Linus Torvalds   module: refactor ...
3029

49668688d   Rusty Russell   module: pass load...
3030
3031
  		if (shdr->sh_type != SHT_NOBITS)
  			memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
65b8a9b4d   Linus Torvalds   module: refactor ...
3032
  		/* Update sh_addr to point to copy in image. */
49668688d   Rusty Russell   module: pass load...
3033
  		shdr->sh_addr = (unsigned long)dest;
5e1241692   Jim Cromie   module: replace D...
3034
3035
3036
  		pr_debug("\t0x%lx %s
  ",
  			 (long)shdr->sh_addr, info->secstrings + shdr->sh_name);
65b8a9b4d   Linus Torvalds   module: refactor ...
3037
  	}
d913188c7   Rusty Russell   module: layout_an...
3038
3039
  
  	return 0;
65b8a9b4d   Linus Torvalds   module: refactor ...
3040
  }
49668688d   Rusty Russell   module: pass load...
3041
  static int check_module_license_and_versions(struct module *mod)
22e268ebe   Rusty Russell   module: refactor ...
3042
  {
3205c36cf   Libor Pechacek   module: Issue war...
3043
  	int prev_taint = test_taint(TAINT_PROPRIETARY_MODULE);
22e268ebe   Rusty Russell   module: refactor ...
3044
3045
3046
3047
3048
3049
  	/*
  	 * 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...
3050
  		add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
3051
3052
3053
  
  	/* driverloader was caught wrongly pretending to be under GPL */
  	if (strcmp(mod->name, "driverloader") == 0)
373d4d099   Rusty Russell   taint: add explic...
3054
3055
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
3056

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

3205c36cf   Libor Pechacek   module: Issue war...
3062
3063
3064
  	if (!prev_taint && test_taint(TAINT_PROPRIETARY_MODULE))
  		pr_warn("%s: module license taints kernel.
  ", mod->name);
22e268ebe   Rusty Russell   module: refactor ...
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
  #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...
3094
3095
3096
3097
3098
3099
  	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 ...
3100
3101
3102
  
  	set_fs(old_fs);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
3103
3104
3105
3106
3107
3108
3109
  int __weak module_frob_arch_sections(Elf_Ehdr *hdr,
  				     Elf_Shdr *sechdrs,
  				     char *secstrings,
  				     struct module *mod)
  {
  	return 0;
  }
be7de5f91   Prarit Bhargava   modules: Add kern...
3110
3111
  /* module_blacklist is a comma-separated list of module names */
  static char *module_blacklist;
96b5b1945   Luis R. Rodriguez   module: make the ...
3112
  static bool blacklisted(const char *module_name)
be7de5f91   Prarit Bhargava   modules: Add kern...
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
  {
  	const char *p;
  	size_t len;
  
  	if (!module_blacklist)
  		return false;
  
  	for (p = module_blacklist; *p; p += len) {
  		len = strcspn(p, ",");
  		if (strlen(module_name) == len && !memcmp(module_name, p, len))
  			return true;
  		if (p[len] == ',')
  			len++;
  	}
  	return false;
  }
  core_param(module_blacklist, module_blacklist, charp, 0400);
2f3238aeb   Rusty Russell   module: add flags...
3130
  static struct module *layout_and_allocate(struct load_info *info, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3131
  {
d913188c7   Rusty Russell   module: layout_an...
3132
  	/* Module within temporary copy. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3133
  	struct module *mod;
444d13ff1   Jessica Yu   modules: add ro_a...
3134
  	unsigned int ndx;
d913188c7   Rusty Russell   module: layout_an...
3135
  	int err;
3ae91c21d   Paul Mundt   module: fix up CO...
3136

2f3238aeb   Rusty Russell   module: add flags...
3137
  	mod = setup_load_info(info, flags);
d913188c7   Rusty Russell   module: layout_an...
3138
3139
  	if (IS_ERR(mod))
  		return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3140

3e2e857f9   Kees Cook   module: Add modul...
3141
  	if (blacklisted(info->name))
be7de5f91   Prarit Bhargava   modules: Add kern...
3142
  		return ERR_PTR(-EPERM);
2f3238aeb   Rusty Russell   module: add flags...
3143
  	err = check_modinfo(mod, info, flags);
40dd2560e   Rusty Russell   module: refactor ...
3144
3145
  	if (err)
  		return ERR_PTR(err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3146

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

8d8022e8a   Rusty Russell   module: do percpu...
3153
3154
  	/* 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
3155

444d13ff1   Jessica Yu   modules: add ro_a...
3156
3157
3158
3159
3160
3161
3162
3163
  	/*
  	 * Mark ro_after_init section with SHF_RO_AFTER_INIT so that
  	 * layout_sections() can put it in the right place.
  	 * Note: ro_after_init sections also have SHF_{WRITE,ALLOC} set.
  	 */
  	ndx = find_sec(info, ".data..ro_after_init");
  	if (ndx)
  		info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3164
3165
3166
  	/* 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...
3167
  	layout_sections(mod, info);
49668688d   Rusty Russell   module: pass load...
3168
  	layout_symtab(mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3169

65b8a9b4d   Linus Torvalds   module: refactor ...
3170
  	/* Allocate and move to the final place */
49668688d   Rusty Russell   module: pass load...
3171
  	err = move_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
3172
  	if (err)
8d8022e8a   Rusty Russell   module: do percpu...
3173
  		return ERR_PTR(err);
d913188c7   Rusty Russell   module: layout_an...
3174
3175
3176
  
  	/* 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...
3177
  	kmemleak_load_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
3178
  	return mod;
d913188c7   Rusty Russell   module: layout_an...
3179
3180
3181
3182
3183
  }
  
  /* mod is no longer valid after this! */
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
3184
  	percpu_modfree(mod);
d453cded0   Rusty Russell   module_arch_freei...
3185
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
3186
3187
  	module_memfree(mod->init_layout.base);
  	module_memfree(mod->core_layout.base);
d913188c7   Rusty Russell   module: layout_an...
3188
  }
74e08fcf7   Jonas Bonn   modules: add defa...
3189
3190
3191
3192
3193
3194
  int __weak module_finalize(const Elf_Ehdr *hdr,
  			   const Elf_Shdr *sechdrs,
  			   struct module *me)
  {
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
3195
3196
  static int post_relocation(struct module *mod, const struct load_info *info)
  {
51f3d0f47   Rusty Russell   module: cleanup c...
3197
  	/* Sort exception table now relocations are done. */
811d66a0e   Rusty Russell   module: group pos...
3198
3199
3200
3201
3202
  	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...
3203
  	/* Setup kallsyms-specific fields. */
811d66a0e   Rusty Russell   module: group pos...
3204
3205
3206
3207
3208
  	add_kallsyms(mod, info);
  
  	/* Arch-specific module finalizing. */
  	return module_finalize(info->hdr, info->sechdrs, mod);
  }
9bb9c3be5   Rusty Russell   module: wait when...
3209
3210
3211
3212
3213
  /* 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...
3214
3215
3216
3217
3218
3219
  	/*
  	 * 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...
3220
  	mutex_lock(&module_mutex);
4f6de4d51   Mathias Krause   module: don't mod...
3221
  	mod = find_module_all(name, strlen(name), true);
0d21b0e34   Rusty Russell   module: add new s...
3222
3223
  	ret = !mod || mod->state == MODULE_STATE_LIVE
  		|| mod->state == MODULE_STATE_GOING;
9bb9c3be5   Rusty Russell   module: wait when...
3224
3225
3226
3227
  	mutex_unlock(&module_mutex);
  
  	return ret;
  }
34e1169d9   Kees Cook   module: add sysca...
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
  /* 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 ...
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
  /* 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: ...
3250
3251
3252
3253
3254
3255
3256
  /*
   * 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...
3257
3258
  {
  	int ret = 0;
c74963790   Rusty Russell   module: fix race ...
3259
3260
3261
3262
3263
3264
3265
  	struct mod_initfree *freeinit;
  
  	freeinit = kmalloc(sizeof(*freeinit), GFP_KERNEL);
  	if (!freeinit) {
  		ret = -ENOMEM;
  		goto fail;
  	}
7523e4dc5   Rusty Russell   module: use a str...
3266
  	freeinit->module_init = mod->init_layout.base;
34e1169d9   Kees Cook   module: add sysca...
3267

774a1221e   Tejun Heo   module, async: as...
3268
3269
3270
3271
3272
  	/*
  	 * 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...
3273
3274
3275
3276
3277
  	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 ...
3278
  		goto fail_free_freeinit;
34e1169d9   Kees Cook   module: add sysca...
3279
3280
  	}
  	if (ret > 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
3281
3282
3283
3284
3285
3286
  		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...
3287
3288
3289
3290
3291
3292
3293
  		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...
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
  	/*
  	 * 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 ...
3311
  	if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
774a1221e   Tejun Heo   module, async: as...
3312
  		async_synchronize_full();
34e1169d9   Kees Cook   module: add sysca...
3313
3314
3315
3316
3317
3318
  
  	mutex_lock(&module_mutex);
  	/* Drop initial reference. */
  	module_put(mod);
  	trim_init_extable(mod);
  #ifdef CONFIG_KALLSYMS
8244062ef   Rusty Russell   modules: fix long...
3319
3320
  	/* Switch to core kallsyms now init is done: kallsyms may be walking! */
  	rcu_assign_pointer(mod->kallsyms, &mod->core_kallsyms);
34e1169d9   Kees Cook   module: add sysca...
3321
  #endif
444d13ff1   Jessica Yu   modules: add ro_a...
3322
  	module_enable_ro(mod, true);
93c2e105f   Peter Zijlstra   module: Optimize ...
3323
  	mod_tree_remove_init(mod);
85c898db6   Rusty Russell   module: clean up ...
3324
  	disable_ro_nx(&mod->init_layout);
d453cded0   Rusty Russell   module_arch_freei...
3325
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
3326
3327
3328
  	mod->init_layout.base = NULL;
  	mod->init_layout.size = 0;
  	mod->init_layout.ro_size = 0;
444d13ff1   Jessica Yu   modules: add ro_a...
3329
  	mod->init_layout.ro_after_init_size = 0;
7523e4dc5   Rusty Russell   module: use a str...
3330
  	mod->init_layout.text_size = 0;
c74963790   Rusty Russell   module: fix race ...
3331
3332
  	/*
  	 * We want to free module_init, but be aware that kallsyms may be
0be964be0   Peter Zijlstra   module: Sanitize ...
3333
3334
3335
  	 * 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.
20e557fb2   Jeffrey Hugo   init: fix false p...
3336
3337
3338
3339
3340
  	 * Note that module_alloc() on most architectures creates W+X page
  	 * mappings which won't be cleaned up until do_free_init() runs.  Any
  	 * code such as mark_rodata_ro() which depends on those mappings to
  	 * be cleaned up needs to sync with the queued work - ie
  	 * rcu_barrier_sched()
c74963790   Rusty Russell   module: fix race ...
3341
  	 */
0be964be0   Peter Zijlstra   module: Sanitize ...
3342
  	call_rcu_sched(&freeinit->rcu, do_free_init);
34e1169d9   Kees Cook   module: add sysca...
3343
3344
3345
3346
  	mutex_unlock(&module_mutex);
  	wake_up_all(&module_wq);
  
  	return 0;
c74963790   Rusty Russell   module: fix race ...
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
  
  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);
7e545d6ec   Jessica Yu   livepatch/module:...
3357
  	klp_module_going(mod);
7dcd182be   Jessica Yu   ftrace/module: re...
3358
  	ftrace_release_mod(mod);
c74963790   Rusty Russell   module: fix race ...
3359
3360
3361
  	free_module(mod);
  	wake_up_all(&module_wq);
  	return ret;
34e1169d9   Kees Cook   module: add sysca...
3362
3363
3364
3365
3366
3367
3368
3369
3370
  }
  
  static int may_init_module(void)
  {
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
  		return -EPERM;
  
  	return 0;
  }
a3535c7e4   Rusty Russell   module: clean up ...
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
  /*
   * 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...
3385
3386
  	old = find_module_all(mod->name, strlen(mod->name), true);
  	if (old != NULL) {
a3535c7e4   Rusty Russell   module: clean up ...
3387
3388
3389
3390
  		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...
3391
3392
  			err = wait_event_interruptible(module_wq,
  					       finished_loading(mod->name));
a3535c7e4   Rusty Russell   module: clean up ...
3393
3394
3395
3396
3397
3398
3399
  			if (err)
  				goto out_unlocked;
  			goto again;
  		}
  		err = -EEXIST;
  		goto out;
  	}
4f666546d   Peter Zijlstra   module: Rework mo...
3400
  	mod_update_bounds(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3401
  	list_add_rcu(&mod->list, &modules);
93c2e105f   Peter Zijlstra   module: Optimize ...
3402
  	mod_tree_insert(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
  	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);
444d13ff1   Jessica Yu   modules: add ro_a...
3424
  	module_enable_ro(mod, false);
85c898db6   Rusty Russell   module: clean up ...
3425
  	module_enable_nx(mod);
4982223e5   Rusty Russell   module: set nx be...
3426

a3535c7e4   Rusty Russell   module: clean up ...
3427
3428
3429
  	/* 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...
3430
  	mutex_unlock(&module_mutex);
4982223e5   Rusty Russell   module: set nx be...
3431
  	return 0;
a3535c7e4   Rusty Russell   module: clean up ...
3432
3433
3434
3435
3436
  
  out:
  	mutex_unlock(&module_mutex);
  	return err;
  }
4c973d162   Jessica Yu   modules: split pa...
3437
3438
  static int prepare_coming_module(struct module *mod)
  {
7e545d6ec   Jessica Yu   livepatch/module:...
3439
  	int err;
4c973d162   Jessica Yu   modules: split pa...
3440
  	ftrace_module_enable(mod);
7e545d6ec   Jessica Yu   livepatch/module:...
3441
3442
3443
  	err = klp_module_coming(mod);
  	if (err)
  		return err;
4c973d162   Jessica Yu   modules: split pa...
3444
3445
3446
3447
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_COMING, mod);
  	return 0;
  }
ecc861705   Luis R. Rodriguez   module: add extra...
3448
3449
  static int unknown_module_param_cb(char *param, char *val, const char *modname,
  				   void *arg)
54041d8a7   Rusty Russell   modules: don't fa...
3450
  {
f2411da74   Luis R. Rodriguez   driver-core: add ...
3451
3452
3453
3454
3455
3456
3457
  	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...
3458
  	/* Check for magic 'dyndbg' arg */
f2411da74   Luis R. Rodriguez   driver-core: add ...
3459
  	ret = ddebug_dyndbg_module_param_cb(param, val, modname);
bddb12b32   Andrew Morton   kernel/module.c: ...
3460
3461
3462
  	if (ret != 0)
  		pr_warn("%s: unknown parameter '%s' ignored
  ", modname, param);
54041d8a7   Rusty Russell   modules: don't fa...
3463
3464
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
3465
3466
  /* 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...
3467
3468
  static int load_module(struct load_info *info, const char __user *uargs,
  		       int flags)
d913188c7   Rusty Russell   module: layout_an...
3469
  {
a3535c7e4   Rusty Russell   module: clean up ...
3470
  	struct module *mod;
d913188c7   Rusty Russell   module: layout_an...
3471
  	long err;
51e158c12   Rusty Russell   param: hand argum...
3472
  	char *after_dashes;
d913188c7   Rusty Russell   module: layout_an...
3473

bca014caa   Ben Hutchings   module: Invalidat...
3474
  	err = module_sig_check(info, flags);
34e1169d9   Kees Cook   module: add sysca...
3475
3476
  	if (err)
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3477

34e1169d9   Kees Cook   module: add sysca...
3478
  	err = elf_header_check(info);
d913188c7   Rusty Russell   module: layout_an...
3479
  	if (err)
34e1169d9   Kees Cook   module: add sysca...
3480
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3481
3482
  
  	/* Figure out module layout, and allocate all the memory. */
2f3238aeb   Rusty Russell   module: add flags...
3483
  	mod = layout_and_allocate(info, flags);
65b8a9b4d   Linus Torvalds   module: refactor ...
3484
3485
  	if (IS_ERR(mod)) {
  		err = PTR_ERR(mod);
d913188c7   Rusty Russell   module: layout_an...
3486
  		goto free_copy;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3487
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3488

ca86cad73   Richard Guy Briggs   audit: log module...
3489
  	audit_log_kern_module(mod->name);
a3535c7e4   Rusty Russell   module: clean up ...
3490
3491
3492
  	/* Reserve our place in the list. */
  	err = add_unformed_module(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3493
  		goto free_module;
1fb9341ac   Rusty Russell   module: put modul...
3494

106a4ee25   Rusty Russell   module: signature...
3495
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
3496
  	mod->sig_ok = info->sig_ok;
64748a2c9   Rusty Russell   module: printk me...
3497
  	if (!mod->sig_ok) {
bddb12b32   Andrew Morton   kernel/module.c: ...
3498
  		pr_notice_once("%s: module verification failed: signature "
ab92ebbb8   Marcel Holtmann   module: Remove do...
3499
  			       "and/or required key missing - tainting "
bddb12b32   Andrew Morton   kernel/module.c: ...
3500
3501
  			       "kernel
  ", mod->name);
66cc69e34   Mathieu Desnoyers   Fix: module signa...
3502
  		add_taint_module(mod, TAINT_UNSIGNED_MODULE, LOCKDEP_STILL_OK);
64748a2c9   Rusty Russell   module: printk me...
3503
  	}
106a4ee25   Rusty Russell   module: signature...
3504
  #endif
8d8022e8a   Rusty Russell   module: do percpu...
3505
  	/* To avoid stressing percpu allocator, do this once we're unique. */
9eb76d779   Rusty Russell   module: cleanup c...
3506
  	err = percpu_modalloc(mod, info);
8d8022e8a   Rusty Russell   module: do percpu...
3507
3508
  	if (err)
  		goto unlink_mod;
49668688d   Rusty Russell   module: pass load...
3509
  	/* Now module is in final location, initialize linked lists, etc. */
9f85a4bbb   Rusty Russell   module: refactor ...
3510
3511
  	err = module_unload_init(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3512
  		goto unlink_mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3513

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

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

49668688d   Rusty Russell   module: pass load...
3522
  	err = check_module_license_and_versions(mod);
22e268ebe   Rusty Russell   module: refactor ...
3523
3524
  	if (err)
  		goto free_unload;
9841d61d7   Dave Jones   [PATCH] Add taint...
3525

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

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

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

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

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

6526c534b   Rusty Russell   module: move modu...
3544
3545
3546
3547
3548
3549
  	/* 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...
3550

527963127   Zhou Chengming   module: fix ddebu...
3551
  	dynamic_debug_setup(mod, info->debug, info->num_debug);
ff49d74ad   Yehuda Sadeh   module: initializ...
3552

a949ae560   Steven Rostedt (Red Hat)   ftrace/module: Ha...
3553
3554
  	/* Ftrace init must be called in the MODULE_STATE_UNFORMED state */
  	ftrace_module_init(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3555
3556
3557
  	/* Finally it's fully formed, ready to start executing. */
  	err = complete_formation(mod, info);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3558
  		goto ddebug_cleanup;
be593f4ce   Rusty Russell   module: verify_ex...
3559

4c973d162   Jessica Yu   modules: split pa...
3560
3561
3562
  	err = prepare_coming_module(mod);
  	if (err)
  		goto bug_cleanup;
51f3d0f47   Rusty Russell   module: cleanup c...
3563
  	/* Module is ready to execute: parsing args may do that. */
51e158c12   Rusty Russell   param: hand argum...
3564
  	after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
4355efbd8   Luis R. Rodriguez   modules: fix modp...
3565
  				  -32768, 32767, mod,
ecc861705   Luis R. Rodriguez   module: add extra...
3566
  				  unknown_module_param_cb);
51e158c12   Rusty Russell   param: hand argum...
3567
3568
  	if (IS_ERR(after_dashes)) {
  		err = PTR_ERR(after_dashes);
4c973d162   Jessica Yu   modules: split pa...
3569
  		goto coming_cleanup;
51e158c12   Rusty Russell   param: hand argum...
3570
3571
3572
3573
3574
  	} else if (after_dashes) {
  		pr_warn("%s: parameters '%s' after `--' ignored
  ",
  		       mod->name, after_dashes);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3575

ca86cad73   Richard Guy Briggs   audit: log module...
3576
  	/* Link in to sysfs. */
34e1169d9   Kees Cook   module: add sysca...
3577
  	err = mod_sysfs_setup(mod, info, mod->kp, mod->num_kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3578
  	if (err < 0)
4c973d162   Jessica Yu   modules: split pa...
3579
  		goto coming_cleanup;
80a3d1bb4   Rusty Russell   module: move sysf...
3580

1ce15ef4f   Jessica Yu   module: preserve ...
3581
3582
3583
3584
3585
  	if (is_livepatch_module(mod)) {
  		err = copy_module_elf(mod, info);
  		if (err < 0)
  			goto sysfs_cleanup;
  	}
48fd11880   Kevin Cernekee   module: Fix perfo...
3586
  	/* Get rid of temporary copy. */
34e1169d9   Kees Cook   module: add sysca...
3587
  	free_copy(info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3588
3589
  
  	/* Done! */
51f3d0f47   Rusty Russell   module: cleanup c...
3590
  	trace_module_load(mod);
34e1169d9   Kees Cook   module: add sysca...
3591
3592
  
  	return do_init_module(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3593

1ce15ef4f   Jessica Yu   module: preserve ...
3594
3595
   sysfs_cleanup:
  	mod_sysfs_teardown(mod);
4c973d162   Jessica Yu   modules: split pa...
3596
   coming_cleanup:
885a78d4a   Aaron Tomlin   module: Ensure a ...
3597
  	mod->state = MODULE_STATE_GOING;
a5544880a   Luis R. Rodriguez   module: fix memor...
3598
  	destroy_params(mod->kp, mod->num_kp);
4c973d162   Jessica Yu   modules: split pa...
3599
3600
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
7e545d6ec   Jessica Yu   livepatch/module:...
3601
  	klp_module_going(mod);
1fb9341ac   Rusty Russell   module: put modul...
3602
3603
   bug_cleanup:
  	/* module_bug_cleanup needs module_mutex protection */
75676500f   Rusty Russell   module: make lock...
3604
  	mutex_lock(&module_mutex);
5336377d6   Linus Torvalds   modules: Fix modu...
3605
  	module_bug_cleanup(mod);
ee61abb32   Linus Torvalds   module: fix missi...
3606
  	mutex_unlock(&module_mutex);
ff7e0055b   Andy Lutomirski   module: Clean up ...
3607
3608
  
  	/* we can't deallocate the module until we clear memory protection */
85c898db6   Rusty Russell   module: clean up ...
3609
3610
  	module_disable_ro(mod);
  	module_disable_nx(mod);
ff7e0055b   Andy Lutomirski   module: Clean up ...
3611

a3535c7e4   Rusty Russell   module: clean up ...
3612
   ddebug_cleanup:
527963127   Zhou Chengming   module: fix ddebu...
3613
  	dynamic_debug_remove(mod, info->debug);
e91defa26   Rusty Russell   module: don't use...
3614
  	synchronize_sched();
6526c534b   Rusty Russell   module: move modu...
3615
3616
  	kfree(mod->args);
   free_arch_cleanup:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3617
  	module_arch_cleanup(mod);
d913188c7   Rusty Russell   module: layout_an...
3618
   free_modinfo:
a263f7763   Rusty Russell   module: fix memor...
3619
  	free_modinfo(mod);
22e268ebe   Rusty Russell   module: refactor ...
3620
   free_unload:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3621
  	module_unload_free(mod);
1fb9341ac   Rusty Russell   module: put modul...
3622
3623
3624
3625
   unlink_mod:
  	mutex_lock(&module_mutex);
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
758556bdc   Peter Zijlstra   module: Fix load_...
3626
  	mod_tree_remove(mod);
1fb9341ac   Rusty Russell   module: put modul...
3627
  	wake_up_all(&module_wq);
0be964be0   Peter Zijlstra   module: Sanitize ...
3628
3629
  	/* Wait for RCU-sched synchronizing before releasing mod->list. */
  	synchronize_sched();
1fb9341ac   Rusty Russell   module: put modul...
3630
  	mutex_unlock(&module_mutex);
d913188c7   Rusty Russell   module: layout_an...
3631
   free_module:
049fb9bd4   Steven Rostedt (Red Hat)   ftrace/module: Ca...
3632
3633
3634
3635
3636
3637
  	/*
  	 * 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 ...
3638
  	/* Free lock-classes; relies on the preceding sync_rcu() */
7523e4dc5   Rusty Russell   module: use a str...
3639
  	lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size);
35a9393c9   Peter Zijlstra   lockdep: Fix the ...
3640

34e1169d9   Kees Cook   module: add sysca...
3641
  	module_deallocate(mod, info);
d913188c7   Rusty Russell   module: layout_an...
3642
   free_copy:
34e1169d9   Kees Cook   module: add sysca...
3643
3644
  	free_copy(info);
  	return err;
b99b87f70   Peter Oberparleiter   kernel: construct...
3645
  }
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
3646
3647
  SYSCALL_DEFINE3(init_module, void __user *, umod,
  		unsigned long, len, const char __user *, uargs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3648
  {
34e1169d9   Kees Cook   module: add sysca...
3649
3650
  	int err;
  	struct load_info info = { };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3651

34e1169d9   Kees Cook   module: add sysca...
3652
3653
3654
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3655

34e1169d9   Kees Cook   module: add sysca...
3656
3657
3658
  	pr_debug("init_module: umod=%p, len=%lu, uargs=%p
  ",
  	       umod, len, uargs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3659

34e1169d9   Kees Cook   module: add sysca...
3660
3661
3662
  	err = copy_module_from_user(umod, len, &info);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3663

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

2f3238aeb   Rusty Russell   module: add flags...
3667
  SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)
34e1169d9   Kees Cook   module: add sysca...
3668
  {
34e1169d9   Kees Cook   module: add sysca...
3669
  	struct load_info info = { };
a1db74209   Mimi Zohar   module: replace c...
3670
3671
3672
  	loff_t size;
  	void *hdr;
  	int err;
94462ad3b   Steven Rostedt   module: Move RO/N...
3673

34e1169d9   Kees Cook   module: add sysca...
3674
3675
3676
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3677

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

2f3238aeb   Rusty Russell   module: add flags...
3681
3682
3683
  	if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
  		      |MODULE_INIT_IGNORE_VERMAGIC))
  		return -EINVAL;
d6de2c80e   Linus Torvalds   async: Fix module...
3684

a1db74209   Mimi Zohar   module: replace c...
3685
3686
  	err = kernel_read_file_from_fd(fd, &hdr, &size, INT_MAX,
  				       READING_MODULE);
34e1169d9   Kees Cook   module: add sysca...
3687
3688
  	if (err)
  		return err;
a1db74209   Mimi Zohar   module: replace c...
3689
3690
  	info.hdr = hdr;
  	info.len = size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3691

2f3238aeb   Rusty Russell   module: add flags...
3692
  	return load_module(&info, uargs, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
  }
  
  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...
3707
3708
  	if (str[0] == '.' && str[1] == 'L')
  		return true;
6c34f1f54   Kyle McMartin   aarch64: filter $...
3709
  	return str[0] == '$' && strchr("axtd", str[1])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3710
3711
  	       && (str[2] == '\0' || str[2] == '.');
  }
8244062ef   Rusty Russell   modules: fix long...
3712
  static const char *symname(struct mod_kallsyms *kallsyms, unsigned int symnum)
2e7bac536   Rusty Russell   module: wrapper f...
3713
  {
8244062ef   Rusty Russell   modules: fix long...
3714
  	return kallsyms->strtab + kallsyms->symtab[symnum].st_name;
2e7bac536   Rusty Russell   module: wrapper f...
3715
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3716
3717
3718
3719
3720
3721
3722
  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;
8244062ef   Rusty Russell   modules: fix long...
3723
  	struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3724
3725
  
  	/* At worse, next value is at end of module */
a06f6211e   Masami Hiramatsu   module: add withi...
3726
  	if (within_module_init(addr, mod))
7523e4dc5   Rusty Russell   module: use a str...
3727
  		nextval = (unsigned long)mod->init_layout.base+mod->init_layout.text_size;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3728
  	else
7523e4dc5   Rusty Russell   module: use a str...
3729
  		nextval = (unsigned long)mod->core_layout.base+mod->core_layout.text_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3730

25985edce   Lucas De Marchi   Fix common misspe...
3731
  	/* Scan for closest preceding symbol, and next symbol. (ELF
22a8bdeb5   Daniel Walker   whitespace fixes:...
3732
  	   starts real symbols at 1). */
8244062ef   Rusty Russell   modules: fix long...
3733
3734
  	for (i = 1; i < kallsyms->num_symtab; i++) {
  		if (kallsyms->symtab[i].st_shndx == SHN_UNDEF)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3735
3736
3737
3738
  			continue;
  
  		/* We ignore unnamed symbols: they're uninformative
  		 * and inserted at a whim. */
8244062ef   Rusty Russell   modules: fix long...
3739
3740
  		if (*symname(kallsyms, i) == '\0'
  		    || is_arm_mapping_symbol(symname(kallsyms, i)))
2e7bac536   Rusty Russell   module: wrapper f...
3741
  			continue;
8244062ef   Rusty Russell   modules: fix long...
3742
3743
  		if (kallsyms->symtab[i].st_value <= addr
  		    && kallsyms->symtab[i].st_value > kallsyms->symtab[best].st_value)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3744
  			best = i;
8244062ef   Rusty Russell   modules: fix long...
3745
3746
3747
  		if (kallsyms->symtab[i].st_value > addr
  		    && kallsyms->symtab[i].st_value < nextval)
  			nextval = kallsyms->symtab[i].st_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3748
3749
3750
3751
  	}
  
  	if (!best)
  		return NULL;
ffb451227   Alexey Dobriyan   Simplify kallsyms...
3752
  	if (size)
8244062ef   Rusty Russell   modules: fix long...
3753
  		*size = nextval - kallsyms->symtab[best].st_value;
ffb451227   Alexey Dobriyan   Simplify kallsyms...
3754
  	if (offset)
8244062ef   Rusty Russell   modules: fix long...
3755
3756
  		*offset = addr - kallsyms->symtab[best].st_value;
  	return symname(kallsyms, best);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3757
  }
6dd06c9fb   Rusty Russell   module: make modu...
3758
3759
  /* 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...
3760
  const char *module_address_lookup(unsigned long addr,
6dd06c9fb   Rusty Russell   module: make modu...
3761
3762
3763
3764
  			    unsigned long *size,
  			    unsigned long *offset,
  			    char **modname,
  			    char *namebuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3765
  {
cb2a52052   Rusty Russell   modules: de-mutex...
3766
  	const char *ret = NULL;
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3767
  	struct module *mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3768

cb2a52052   Rusty Russell   modules: de-mutex...
3769
  	preempt_disable();
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3770
3771
3772
3773
3774
  	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
3775
  	}
6dd06c9fb   Rusty Russell   module: make modu...
3776
3777
3778
3779
3780
  	/* 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...
3781
  	preempt_enable();
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3782

92dfc9dc7   Andrew Morton   fix "modules: mak...
3783
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3784
  }
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3785
3786
3787
  int lookup_module_symbol_name(unsigned long addr, char *symname)
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3788
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3789
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3790
3791
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3792
  		if (within_module(addr, mod)) {
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3793
3794
3795
3796
3797
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, NULL, NULL);
  			if (!sym)
  				goto out;
9281acea6   Tejun Heo   kallsyms: make KS...
3798
  			strlcpy(symname, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3799
  			preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3800
3801
3802
3803
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3804
  	preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3805
3806
  	return -ERANGE;
  }
a5c43dae7   Alexey Dobriyan   Fix race between ...
3807
3808
3809
3810
  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...
3811
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3812
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3813
3814
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3815
  		if (within_module(addr, mod)) {
a5c43dae7   Alexey Dobriyan   Fix race between ...
3816
3817
3818
3819
3820
3821
  			const char *sym;
  
  			sym = get_ksymbol(mod, addr, size, offset);
  			if (!sym)
  				goto out;
  			if (modname)
9281acea6   Tejun Heo   kallsyms: make KS...
3822
  				strlcpy(modname, mod->name, MODULE_NAME_LEN);
a5c43dae7   Alexey Dobriyan   Fix race between ...
3823
  			if (name)
9281acea6   Tejun Heo   kallsyms: make KS...
3824
  				strlcpy(name, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3825
  			preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3826
3827
3828
3829
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3830
  	preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3831
3832
  	return -ERANGE;
  }
ea07890a6   Alexey Dobriyan   Fix race between ...
3833
3834
  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
3835
3836
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3837
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3838
  	list_for_each_entry_rcu(mod, &modules, list) {
8244062ef   Rusty Russell   modules: fix long...
3839
  		struct mod_kallsyms *kallsyms;
0d21b0e34   Rusty Russell   module: add new s...
3840
3841
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
8244062ef   Rusty Russell   modules: fix long...
3842
3843
3844
3845
3846
  		kallsyms = rcu_dereference_sched(mod->kallsyms);
  		if (symnum < kallsyms->num_symtab) {
  			*value = kallsyms->symtab[symnum].st_value;
  			*type = kallsyms->symtab[symnum].st_info;
  			strlcpy(name, symname(kallsyms, symnum), KSYM_NAME_LEN);
9281acea6   Tejun Heo   kallsyms: make KS...
3847
  			strlcpy(module_name, mod->name, MODULE_NAME_LEN);
ca4787b77   Tim Abbott   kernel/module.c: ...
3848
  			*exported = is_exported(name, *value, mod);
cb2a52052   Rusty Russell   modules: de-mutex...
3849
  			preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3850
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3851
  		}
8244062ef   Rusty Russell   modules: fix long...
3852
  		symnum -= kallsyms->num_symtab;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3853
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3854
  	preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
3855
  	return -ERANGE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3856
3857
3858
3859
3860
  }
  
  static unsigned long mod_find_symname(struct module *mod, const char *name)
  {
  	unsigned int i;
8244062ef   Rusty Russell   modules: fix long...
3861
  	struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3862

8244062ef   Rusty Russell   modules: fix long...
3863
3864
  	for (i = 0; i < kallsyms->num_symtab; i++)
  		if (strcmp(name, symname(kallsyms, i)) == 0 &&
5bcbbadf6   Jessica Yu   module: exclude S...
3865
  		    kallsyms->symtab[i].st_shndx != SHN_UNDEF)
8244062ef   Rusty Russell   modules: fix long...
3866
  			return kallsyms->symtab[i].st_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
  	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...
3878
  	preempt_disable();
175861882   Naveen N. Rao   kallsyms: Use bou...
3879
  	if ((colon = strnchr(name, MODULE_NAME_LEN, ':')) != NULL) {
4f6de4d51   Mathias Krause   module: don't mod...
3880
  		if ((mod = find_module_all(name, colon - name, false)) != NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3881
  			ret = mod_find_symname(mod, colon+1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3882
  	} else {
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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3886
3887
  			if ((ret = mod_find_symname(mod, name)) != 0)
  				break;
0d21b0e34   Rusty Russell   module: add new s...
3888
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3889
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
3890
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3891
3892
  	return ret;
  }
75a66614d   Anders Kaseorg   Ksplice: Add func...
3893
3894
3895
3896
3897
3898
3899
3900
  
  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 ...
3901
  	module_assert_mutex();
75a66614d   Anders Kaseorg   Ksplice: Add func...
3902
  	list_for_each_entry(mod, &modules, list) {
8244062ef   Rusty Russell   modules: fix long...
3903
3904
  		/* We hold module_mutex: no need for rcu_dereference_sched */
  		struct mod_kallsyms *kallsyms = mod->kallsyms;
0d21b0e34   Rusty Russell   module: add new s...
3905
3906
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
8244062ef   Rusty Russell   modules: fix long...
3907
  		for (i = 0; i < kallsyms->num_symtab; i++) {
5bcbbadf6   Jessica Yu   module: exclude S...
3908
3909
3910
  
  			if (kallsyms->symtab[i].st_shndx == SHN_UNDEF)
  				continue;
8244062ef   Rusty Russell   modules: fix long...
3911
3912
  			ret = fn(data, symname(kallsyms, i),
  				 mod, kallsyms->symtab[i].st_value);
75a66614d   Anders Kaseorg   Ksplice: Add func...
3913
3914
3915
3916
3917
3918
  			if (ret != 0)
  				return ret;
  		}
  	}
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3919
  #endif /* CONFIG_KALLSYMS */
7fd8329ba   Petr Mladek   taint/module: Cle...
3920
3921
3922
3923
  /* Maximum number of characters written by module_flags() */
  #define MODULE_FLAGS_BUF_SIZE (TAINT_FLAGS_COUNT + 4)
  
  /* Keep in sync with MODULE_FLAGS_BUF_SIZE !!! */
21aa9280b   Arjan van de Ven   debug: show being...
3924
  static char *module_flags(struct module *mod, char *buf)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3925
3926
  {
  	int bx = 0;
0d21b0e34   Rusty Russell   module: add new s...
3927
  	BUG_ON(mod->state == MODULE_STATE_UNFORMED);
21aa9280b   Arjan van de Ven   debug: show being...
3928
3929
3930
  	if (mod->taints ||
  	    mod->state == MODULE_STATE_GOING ||
  	    mod->state == MODULE_STATE_COMING) {
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3931
  		buf[bx++] = '(';
cca3e7073   Kay Sievers   modules: sysfs - ...
3932
  		bx += module_flags_taint(mod, buf + bx);
21aa9280b   Arjan van de Ven   debug: show being...
3933
3934
3935
3936
3937
3938
  		/* 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...
3939
3940
3941
3942
3943
3944
  		buf[bx++] = ')';
  	}
  	buf[bx] = '\0';
  
  	return buf;
  }
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
  #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
3962
3963
3964
  static int m_show(struct seq_file *m, void *p)
  {
  	struct module *mod = list_entry(p, struct module, list);
7fd8329ba   Petr Mladek   taint/module: Cle...
3965
  	char buf[MODULE_FLAGS_BUF_SIZE];
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
3966

0d21b0e34   Rusty Russell   module: add new s...
3967
3968
3969
  	/* We always ignore unformed modules. */
  	if (mod->state == MODULE_STATE_UNFORMED)
  		return 0;
2f0f2a334   Denys Vlasenko   module: turn long...
3970
  	seq_printf(m, "%s %u",
7523e4dc5   Rusty Russell   module: use a str...
3971
  		   mod->name, mod->init_layout.size + mod->core_layout.size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3972
3973
3974
3975
  	print_unload_info(m, mod);
  
  	/* Informative for users. */
  	seq_printf(m, " %s",
6da0b5651   Ionut Alexa   kernel:module Fix...
3976
3977
  		   mod->state == MODULE_STATE_GOING ? "Unloading" :
  		   mod->state == MODULE_STATE_COMING ? "Loading" :
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3978
3979
  		   "Live");
  	/* Used by oprofile and other similar tools. */
7523e4dc5   Rusty Russell   module: use a str...
3980
  	seq_printf(m, " 0x%pK", mod->core_layout.base);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3981

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

6da0b5651   Ionut Alexa   kernel:module Fix...
3986
3987
  	seq_puts(m, "
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3988
3989
3990
3991
3992
3993
3994
3995
  	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/...
3996
  static const struct seq_operations modules_op = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3997
3998
3999
4000
4001
  	.start	= m_start,
  	.next	= m_next,
  	.stop	= m_stop,
  	.show	= m_show
  };
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
  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
4021
4022
4023
  /* 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
4024
4025
  	const struct exception_table_entry *e = NULL;
  	struct module *mod;
24da1cbff   Rusty Russell   modules: remove m...
4026
  	preempt_disable();
5ff22646d   Peter Zijlstra   module: Optimize ...
4027
4028
4029
  	mod = __module_address(addr);
  	if (!mod)
  		goto out;
22a8bdeb5   Daniel Walker   whitespace fixes:...
4030

5ff22646d   Peter Zijlstra   module: Optimize ...
4031
4032
4033
4034
  	if (!mod->num_exentries)
  		goto out;
  
  	e = search_extable(mod->extable,
a94c33dd1   Thomas Meyer   lib/extable.c: us...
4035
  			   mod->num_exentries,
5ff22646d   Peter Zijlstra   module: Optimize ...
4036
4037
  			   addr);
  out:
24da1cbff   Rusty Russell   modules: remove m...
4038
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4039

5ff22646d   Peter Zijlstra   module: Optimize ...
4040
4041
4042
4043
  	/*
  	 * Now, if we found one, we are running inside it now, hence
  	 * we cannot unload the module, hence no refcnt needed.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4044
4045
  	return e;
  }
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4046
  /*
e610499e2   Rusty Russell   module: __module_...
4047
4048
4049
4050
4051
   * 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: ...
4052
   */
e610499e2   Rusty Russell   module: __module_...
4053
  bool is_module_address(unsigned long addr)
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4054
  {
e610499e2   Rusty Russell   module: __module_...
4055
  	bool ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4056

24da1cbff   Rusty Russell   modules: remove m...
4057
  	preempt_disable();
e610499e2   Rusty Russell   module: __module_...
4058
  	ret = __module_address(addr) != NULL;
24da1cbff   Rusty Russell   modules: remove m...
4059
  	preempt_enable();
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4060

e610499e2   Rusty Russell   module: __module_...
4061
  	return ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4062
  }
e610499e2   Rusty Russell   module: __module_...
4063
4064
4065
4066
4067
4068
4069
  /*
   * __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...
4070
  struct module *__module_address(unsigned long addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4071
4072
  {
  	struct module *mod;
3a642e99b   Rusty Russell   modules: Take a s...
4073
4074
  	if (addr < module_addr_min || addr > module_addr_max)
  		return NULL;
0be964be0   Peter Zijlstra   module: Sanitize ...
4075
  	module_assert_mutex_or_preempt();
6c9692e2d   Peter Zijlstra   module: Make the ...
4076
  	mod = mod_find(addr);
93c2e105f   Peter Zijlstra   module: Optimize ...
4077
4078
  	if (mod) {
  		BUG_ON(!within_module(addr, mod));
0d21b0e34   Rusty Russell   module: add new s...
4079
  		if (mod->state == MODULE_STATE_UNFORMED)
93c2e105f   Peter Zijlstra   module: Optimize ...
4080
  			mod = NULL;
0d21b0e34   Rusty Russell   module: add new s...
4081
  	}
93c2e105f   Peter Zijlstra   module: Optimize ...
4082
  	return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4083
  }
c6b378019   Tim Abbott   module: Export sy...
4084
  EXPORT_SYMBOL_GPL(__module_address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4085

e610499e2   Rusty Russell   module: __module_...
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
  /*
   * 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...
4117
4118
  		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_...
4119
4120
4121
4122
  			mod = NULL;
  	}
  	return mod;
  }
c6b378019   Tim Abbott   module: Export sy...
4123
  EXPORT_SYMBOL_GPL(__module_text_address);
e610499e2   Rusty Russell   module: __module_...
4124

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4125
4126
4127
4128
  /* Don't grab lock, we're oopsing. */
  void print_modules(void)
  {
  	struct module *mod;
7fd8329ba   Petr Mladek   taint/module: Cle...
4129
  	char buf[MODULE_FLAGS_BUF_SIZE];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4130

b231125af   Linus Torvalds   printk: add KERN_...
4131
  	printk(KERN_DEFAULT "Modules linked in:");
d72b37513   Andi Kleen   Remove stop_machi...
4132
4133
  	/* Most callers should already have preempt disabled, but make sure */
  	preempt_disable();
0d21b0e34   Rusty Russell   module: add new s...
4134
4135
4136
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
27bba4d6b   Jiri Slaby   module: use pr_cont
4137
  		pr_cont(" %s%s", mod->name, module_flags(mod, buf));
0d21b0e34   Rusty Russell   module: add new s...
4138
  	}
d72b37513   Andi Kleen   Remove stop_machi...
4139
  	preempt_enable();
e14af7eeb   Arjan van de Ven   debug: track and ...
4140
  	if (last_unloaded_module[0])
27bba4d6b   Jiri Slaby   module: use pr_cont
4141
4142
4143
  		pr_cont(" [last unloaded: %s]", last_unloaded_module);
  	pr_cont("
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4144
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4145
  #ifdef CONFIG_MODVERSIONS
8c8ef42ae   Rusty Russell   module: include o...
4146
4147
4148
4149
4150
4151
  /* 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 ...
4152
  		   struct tracepoint * const *tp)
8c8ef42ae   Rusty Russell   module: include o...
4153
4154
4155
  {
  }
  EXPORT_SYMBOL(module_layout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4156
  #endif