Blame view

kernel/module.c 116 KB
1a59d1b8e   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
f71d20e96   Arjan van de Ven   [PATCH] Add EXPOR...
2
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
     Copyright (C) 2002 Richard Henderson
51f3d0f47   Rusty Russell   module: cleanup c...
4
     Copyright (C) 2001 Rusty Russell, 2002, 2010 Rusty Russell IBM.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5

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

7ead8b831   Li Zefan   tracing/events: A...
59
60
  #define CREATE_TRACE_POINTS
  #include <trace/events/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
  #ifndef ARCH_SHF_SMALL
  #define ARCH_SHF_SMALL 0
  #endif
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
64
65
  /*
   * Modules' sections will be aligned on page boundaries
3b5be16c7   He Zhe   modules: page-ali...
66
67
   * to ensure complete separation of code and data, but
   * only when CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
68
   */
3b5be16c7   He Zhe   modules: page-ali...
69
  #ifdef CONFIG_ARCH_HAS_STRICT_MODULE_RWX
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
70
  # define debug_align(X) ALIGN(X, PAGE_SIZE)
3b5be16c7   He Zhe   modules: page-ali...
71
72
73
  #else
  # define debug_align(X) (X)
  #endif
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
74

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
76
  /* 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...
77
78
79
80
81
  /*
   * 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...
82
   * (delete and add uses RCU list operations). */
c6b378019   Tim Abbott   module: Export sy...
83
84
  DEFINE_MUTEX(module_mutex);
  EXPORT_SYMBOL_GPL(module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
  static LIST_HEAD(modules);
67fc4e0cb   Jason Wessel   kdb: core for kgd...
86

1a7b7d922   Rick Edgecombe   modules: Use vmal...
87
88
89
  /* Work queue for freeing init sections in success case */
  static struct work_struct init_free_wq;
  static struct llist_head init_free_list;
6c9692e2d   Peter Zijlstra   module: Make the ...
90
  #ifdef CONFIG_MODULES_TREE_LOOKUP
106a4ee25   Rusty Russell   module: signature...
91

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

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

7523e4dc5   Rusty Russell   module: use a str...
112
  	return (unsigned long)layout->size;
93c2e105f   Peter Zijlstra   module: Optimize ...
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
  }
  
  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...
134

106a4ee25   Rusty Russell   module: signature...
135
136
  	return 0;
  }
93c2e105f   Peter Zijlstra   module: Optimize ...
137
138
139
140
  static const struct latch_tree_ops mod_tree_ops = {
  	.less = mod_tree_less,
  	.comp = mod_tree_comp,
  };
4f666546d   Peter Zijlstra   module: Rework mo...
141
142
143
144
145
146
  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...
147
  };
106a4ee25   Rusty Russell   module: signature...
148

4f666546d   Peter Zijlstra   module: Rework mo...
149
150
151
152
153
154
155
156
157
158
159
160
  #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 ...
161
162
163
164
165
166
167
  
  /*
   * 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...
168
169
  	mod->core_layout.mtn.mod = mod;
  	mod->init_layout.mtn.mod = mod;
93c2e105f   Peter Zijlstra   module: Optimize ...
170

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

fda784e50   Bruno E. O. Meneguele   module: export mo...
256
257
258
259
260
261
262
263
264
  /*
   * Export sig_enforce kernel cmdline parameter to allow other subsystems rely
   * on that instead of directly to CONFIG_MODULE_SIG_FORCE config.
   */
  bool is_module_sig_enforced(void)
  {
  	return sig_enforce;
  }
  EXPORT_SYMBOL(is_module_sig_enforced);
8db5da0b8   Mimi Zohar   x86/ima: require ...
265
266
267
268
  void set_module_sig_enforced(void)
  {
  	sig_enforce = true;
  }
19e4529ee   Stephen Rothwell   modules: Fix up b...
269
270
  /* Block module loading/unloading? */
  int modules_disabled = 0;
02608bef8   Dave Young   module: add kerne...
271
  core_param(nomodule, modules_disabled, bint, 0);
19e4529ee   Stephen Rothwell   modules: Fix up b...
272

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

6da0b5651   Ionut Alexa   kernel:module Fix...
277
  int register_module_notifier(struct notifier_block *nb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
279
  	return blocking_notifier_chain_register(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
  }
  EXPORT_SYMBOL(register_module_notifier);
6da0b5651   Ionut Alexa   kernel:module Fix...
282
  int unregister_module_notifier(struct notifier_block *nb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
  {
e041c6834   Alan Stern   [PATCH] Notifier ...
284
  	return blocking_notifier_chain_unregister(&module_notify_list, nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
286
  }
  EXPORT_SYMBOL(unregister_module_notifier);
71d9f5079   Miroslav Benes   module: Fix a com...
287
288
289
290
291
  /*
   * 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
292
293
  static inline int strong_try_module_get(struct module *mod)
  {
0d21b0e34   Rusty Russell   module: add new s...
294
  	BUG_ON(mod && mod->state == MODULE_STATE_UNFORMED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
  	if (mod && mod->state == MODULE_STATE_COMING)
c9a3ba55b   Rusty Russell   module: wait for ...
296
297
  		return -EBUSY;
  	if (try_module_get(mod))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
  		return 0;
c9a3ba55b   Rusty Russell   module: wait for ...
299
300
  	else
  		return -ENOENT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
  }
373d4d099   Rusty Russell   taint: add explic...
302
303
  static inline void add_taint_module(struct module *mod, unsigned flag,
  				    enum lockdep_ok lockdep_ok)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
304
  {
373d4d099   Rusty Russell   taint: add explic...
305
  	add_taint(flag, lockdep_ok);
7fd8329ba   Petr Mladek   taint/module: Cle...
306
  	set_bit(flag, &mod->taints);
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
307
  }
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
308
309
310
  /*
   * 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
311
   */
bf262dcec   Jiri Kosina   module: fix noret...
312
  void __noreturn __module_put_and_exit(struct module *mod, long code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
314
315
316
317
  {
  	module_put(mod);
  	do_exit(code);
  }
  EXPORT_SYMBOL(__module_put_and_exit);
22a8bdeb5   Daniel Walker   whitespace fixes:...
318

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

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

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

4c50665fc   Masami Hiramatsu   modules: lockdep:...
422
423
  	list_for_each_entry_rcu(mod, &modules, list,
  				lockdep_is_held(&module_mutex)) {
ad9546c99   Rusty Russell   module: neaten __...
424
425
  		struct symsearch arr[] = {
  			{ mod->syms, mod->syms + mod->num_syms, mod->crcs,
dafd0940c   Rusty Russell   module: generic e...
426
  			  NOT_GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
427
  			{ mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
428
429
  			  mod->gpl_crcs,
  			  GPL_ONLY, false },
ad9546c99   Rusty Russell   module: neaten __...
430
431
  			{ mod->gpl_future_syms,
  			  mod->gpl_future_syms + mod->num_gpl_future_syms,
dafd0940c   Rusty Russell   module: generic e...
432
433
  			  mod->gpl_future_crcs,
  			  WILL_BE_GPL_ONLY, false },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
434
  #ifdef CONFIG_UNUSED_SYMBOLS
ad9546c99   Rusty Russell   module: neaten __...
435
436
  			{ mod->unused_syms,
  			  mod->unused_syms + mod->num_unused_syms,
dafd0940c   Rusty Russell   module: generic e...
437
438
  			  mod->unused_crcs,
  			  NOT_GPL_ONLY, true },
ad9546c99   Rusty Russell   module: neaten __...
439
440
  			{ mod->unused_gpl_syms,
  			  mod->unused_gpl_syms + mod->num_unused_gpl_syms,
dafd0940c   Rusty Russell   module: generic e...
441
442
  			  mod->unused_gpl_crcs,
  			  GPL_ONLY, true },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
443
  #endif
ad9546c99   Rusty Russell   module: neaten __...
444
  		};
0d21b0e34   Rusty Russell   module: add new s...
445
446
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
dafd0940c   Rusty Russell   module: generic e...
447
448
449
450
451
  		if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data))
  			return true;
  	}
  	return false;
  }
de4d8d534   Rusty Russell   module: each_symb...
452
  EXPORT_SYMBOL_GPL(each_symbol_section);
dafd0940c   Rusty Russell   module: generic e...
453
454
455
456
457
458
459
460
461
  
  struct find_symbol_arg {
  	/* Input */
  	const char *name;
  	bool gplok;
  	bool warn;
  
  	/* Output */
  	struct module *owner;
71810db27   Ard Biesheuvel   modversions: trea...
462
  	const s32 *crc;
414fd31b2   Tim Abbott   module: Make find...
463
  	const struct kernel_symbol *sym;
dafd0940c   Rusty Russell   module: generic e...
464
  };
2d25bc552   Jessica Yu   module: make it c...
465
466
467
  static bool check_exported_symbol(const struct symsearch *syms,
  				  struct module *owner,
  				  unsigned int symnum, void *data)
dafd0940c   Rusty Russell   module: generic e...
468
469
  {
  	struct find_symbol_arg *fsa = data;
dafd0940c   Rusty Russell   module: generic e...
470
471
472
473
  	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: ...
474
475
476
477
  			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...
478
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
479
  	}
ad9546c99   Rusty Russell   module: neaten __...
480

f7f5b6755   Denys Vlasenko   Shrink struct mod...
481
  #ifdef CONFIG_UNUSED_SYMBOLS
dafd0940c   Rusty Russell   module: generic e...
482
  	if (syms->unused && fsa->warn) {
bddb12b32   Andrew Morton   kernel/module.c: ...
483
484
485
486
487
  		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: ...
488
489
490
  		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: ...
491
492
  			"inclusion.
  ");
dafd0940c   Rusty Russell   module: generic e...
493
  	}
f7f5b6755   Denys Vlasenko   Shrink struct mod...
494
  #endif
dafd0940c   Rusty Russell   module: generic e...
495
496
497
  
  	fsa->owner = owner;
  	fsa->crc = symversion(syms->crcs, symnum);
414fd31b2   Tim Abbott   module: Make find...
498
  	fsa->sym = &syms->start[symnum];
dafd0940c   Rusty Russell   module: generic e...
499
500
  	return true;
  }
7290d5809   Ard Biesheuvel   module: use relat...
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
  static unsigned long kernel_symbol_value(const struct kernel_symbol *sym)
  {
  #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
  	return (unsigned long)offset_to_ptr(&sym->value_offset);
  #else
  	return sym->value;
  #endif
  }
  
  static const char *kernel_symbol_name(const struct kernel_symbol *sym)
  {
  #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
  	return offset_to_ptr(&sym->name_offset);
  #else
  	return sym->name;
  #endif
  }
8651ec01d   Matthias Maennich   module: add suppo...
518
519
520
  static const char *kernel_symbol_namespace(const struct kernel_symbol *sym)
  {
  #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
069e1c07c   Will Deacon   module: Fix link ...
521
522
  	if (!sym->namespace_offset)
  		return NULL;
8651ec01d   Matthias Maennich   module: add suppo...
523
524
525
526
527
  	return offset_to_ptr(&sym->namespace_offset);
  #else
  	return sym->namespace;
  #endif
  }
b605be658   Masahiro Yamada   module: remove un...
528
  static int cmp_name(const void *name, const void *sym)
403ed2784   Alessio Igor Bogani   module: Use the b...
529
  {
b605be658   Masahiro Yamada   module: remove un...
530
  	return strcmp(name, kernel_symbol_name(sym));
403ed2784   Alessio Igor Bogani   module: Use the b...
531
  }
2d25bc552   Jessica Yu   module: make it c...
532
533
534
  static bool find_exported_symbol_in_section(const struct symsearch *syms,
  					    struct module *owner,
  					    void *data)
de4d8d534   Rusty Russell   module: each_symb...
535
536
  {
  	struct find_symbol_arg *fsa = data;
403ed2784   Alessio Igor Bogani   module: Use the b...
537
538
539
540
  	struct kernel_symbol *sym;
  
  	sym = bsearch(fsa->name, syms->start, syms->stop - syms->start,
  			sizeof(struct kernel_symbol), cmp_name);
2d25bc552   Jessica Yu   module: make it c...
541
542
  	if (sym != NULL && check_exported_symbol(syms, owner,
  						 sym - syms->start, data))
403ed2784   Alessio Igor Bogani   module: Use the b...
543
  		return true;
de4d8d534   Rusty Russell   module: each_symb...
544

de4d8d534   Rusty Russell   module: each_symb...
545
546
  	return false;
  }
2d25bc552   Jessica Yu   module: make it c...
547
  /* Find an exported symbol and return it, along with, (optional) crc and
75676500f   Rusty Russell   module: make lock...
548
   * (optional) module which owns it.  Needs preempt disabled or module_mutex. */
c6b378019   Tim Abbott   module: Export sy...
549
550
  const struct kernel_symbol *find_symbol(const char *name,
  					struct module **owner,
71810db27   Ard Biesheuvel   modversions: trea...
551
  					const s32 **crc,
c6b378019   Tim Abbott   module: Export sy...
552
553
  					bool gplok,
  					bool warn)
dafd0940c   Rusty Russell   module: generic e...
554
555
556
557
558
559
  {
  	struct find_symbol_arg fsa;
  
  	fsa.name = name;
  	fsa.gplok = gplok;
  	fsa.warn = warn;
2d25bc552   Jessica Yu   module: make it c...
560
  	if (each_symbol_section(find_exported_symbol_in_section, &fsa)) {
dafd0940c   Rusty Russell   module: generic e...
561
562
563
564
  		if (owner)
  			*owner = fsa.owner;
  		if (crc)
  			*crc = fsa.crc;
414fd31b2   Tim Abbott   module: Make find...
565
  		return fsa.sym;
dafd0940c   Rusty Russell   module: generic e...
566
  	}
5e1241692   Jim Cromie   module: replace D...
567
568
  	pr_debug("Failed to find symbol %s
  ", name);
414fd31b2   Tim Abbott   module: Make find...
569
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
570
  }
c6b378019   Tim Abbott   module: Export sy...
571
  EXPORT_SYMBOL_GPL(find_symbol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
572

fe0d34d24   Rusty Russell   module: weaken lo...
573
574
575
576
  /*
   * Search for module by name: must hold module_mutex (or preempt disabled
   * for read-only access).
   */
4f6de4d51   Mathias Krause   module: don't mod...
577
  static struct module *find_module_all(const char *name, size_t len,
0d21b0e34   Rusty Russell   module: add new s...
578
  				      bool even_unformed)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
579
580
  {
  	struct module *mod;
fe0d34d24   Rusty Russell   module: weaken lo...
581
  	module_assert_mutex_or_preempt();
0be964be0   Peter Zijlstra   module: Sanitize ...
582

4c50665fc   Masami Hiramatsu   modules: lockdep:...
583
584
  	list_for_each_entry_rcu(mod, &modules, list,
  				lockdep_is_held(&module_mutex)) {
0d21b0e34   Rusty Russell   module: add new s...
585
586
  		if (!even_unformed && mod->state == MODULE_STATE_UNFORMED)
  			continue;
4f6de4d51   Mathias Krause   module: don't mod...
587
  		if (strlen(mod->name) == len && !memcmp(mod->name, name, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
589
590
591
  			return mod;
  	}
  	return NULL;
  }
0d21b0e34   Rusty Russell   module: add new s...
592
593
594
  
  struct module *find_module(const char *name)
  {
fe0d34d24   Rusty Russell   module: weaken lo...
595
  	module_assert_mutex();
4f6de4d51   Mathias Krause   module: don't mod...
596
  	return find_module_all(name, strlen(name), false);
0d21b0e34   Rusty Russell   module: add new s...
597
  }
c6b378019   Tim Abbott   module: Export sy...
598
  EXPORT_SYMBOL_GPL(find_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
600
  
  #ifdef CONFIG_SMP
fbf59bc9d   Tejun Heo   percpu: implement...
601

259354dea   Tejun Heo   module: encapsula...
602
  static inline void __percpu *mod_percpu(struct module *mod)
fbf59bc9d   Tejun Heo   percpu: implement...
603
  {
259354dea   Tejun Heo   module: encapsula...
604
605
  	return mod->percpu;
  }
fbf59bc9d   Tejun Heo   percpu: implement...
606

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

383776fa7   Thomas Gleixner   locking/lockdep: ...
662
  			if (va >= start && va < start + mod->percpu_size) {
8ce371f98   Peter Zijlstra   lockdep: Fix per-...
663
  				if (can_addr) {
383776fa7   Thomas Gleixner   locking/lockdep: ...
664
  					*can_addr = (unsigned long) (va - start);
8ce371f98   Peter Zijlstra   lockdep: Fix per-...
665
666
667
668
  					*can_addr += (unsigned long)
  						per_cpu_ptr(mod->percpu,
  							    get_boot_cpu_id());
  				}
10fad5e46   Tejun Heo   percpu, module: i...
669
670
671
672
673
674
675
676
  				preempt_enable();
  				return true;
  			}
  		}
  	}
  
  	preempt_enable();
  	return false;
6b588c18f   Tejun Heo   module: reorder m...
677
  }
383776fa7   Thomas Gleixner   locking/lockdep: ...
678
679
680
681
682
683
684
685
686
687
688
689
690
  /**
   * 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
691
  #else /* ... !CONFIG_SMP */
6b588c18f   Tejun Heo   module: reorder m...
692

259354dea   Tejun Heo   module: encapsula...
693
  static inline void __percpu *mod_percpu(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
694
695
696
  {
  	return NULL;
  }
9eb76d779   Rusty Russell   module: cleanup c...
697
  static int percpu_modalloc(struct module *mod, struct load_info *info)
259354dea   Tejun Heo   module: encapsula...
698
  {
9eb76d779   Rusty Russell   module: cleanup c...
699
700
701
702
  	/* 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...
703
704
  }
  static inline void percpu_modfree(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
705
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
  }
49668688d   Rusty Russell   module: pass load...
707
  static unsigned int find_pcpusec(struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708
709
710
  {
  	return 0;
  }
259354dea   Tejun Heo   module: encapsula...
711
712
  static inline void percpu_modcopy(struct module *mod,
  				  const void *from, unsigned long size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713
714
715
716
  {
  	/* pcpusec should be 0, and size of that section should be 0. */
  	BUG_ON(size != 0);
  }
10fad5e46   Tejun Heo   percpu, module: i...
717
718
719
720
  bool is_module_percpu_address(unsigned long addr)
  {
  	return false;
  }
6b588c18f   Tejun Heo   module: reorder m...
721

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
775
  	/* Hold reference count during initialization. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
776
  	atomic_inc(&mod->refcnt);
9f85a4bbb   Rusty Russell   module: refactor ...
777
778
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
779
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780
781
782
783
  /* 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 ...
784
785
  	list_for_each_entry(use, &b->source_list, source_list) {
  		if (use->source == a) {
5e1241692   Jim Cromie   module: replace D...
786
787
  			pr_debug("%s uses %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
788
789
790
  			return 1;
  		}
  	}
5e1241692   Jim Cromie   module: replace D...
791
792
  	pr_debug("%s does not use %s!
  ", a->name, b->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
794
  	return 0;
  }
2c02dfe7f   Linus Torvalds   module: Make the ...
795
796
797
798
799
800
801
802
803
  /*
   * 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 ...
804
  	struct module_use *use;
5e1241692   Jim Cromie   module: replace D...
805
806
  	pr_debug("Allocating new usage for %s.
  ", a->name);
2c02dfe7f   Linus Torvalds   module: Make the ...
807
  	use = kmalloc(sizeof(*use), GFP_ATOMIC);
9ad045742   Markus Elfring   kernel/module: De...
808
  	if (!use)
2c02dfe7f   Linus Torvalds   module: Make the ...
809
  		return -ENOMEM;
2c02dfe7f   Linus Torvalds   module: Make the ...
810
811
812
813
814
  
  	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 ...
815
816
  	return 0;
  }
75676500f   Rusty Russell   module: make lock...
817
  /* Module a uses b: caller needs module_mutex() */
9bea7f239   Rusty Russell   module: fix bne2 ...
818
  int ref_module(struct module *a, struct module *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
819
  {
c8e21ced0   Rusty Russell   module: fix kdb's...
820
  	int err;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
821

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

9bea7f239   Rusty Russell   module: fix bne2 ...
825
826
  	/* If module isn't available, we fail. */
  	err = strong_try_module_get(b);
c9a3ba55b   Rusty Russell   module: wait for ...
827
  	if (err)
9bea7f239   Rusty Russell   module: fix bne2 ...
828
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
829

2c02dfe7f   Linus Torvalds   module: Make the ...
830
831
  	err = add_module_usage(a, b);
  	if (err) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
832
  		module_put(b);
9bea7f239   Rusty Russell   module: fix bne2 ...
833
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
834
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
835
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
836
  }
9bea7f239   Rusty Russell   module: fix bne2 ...
837
  EXPORT_SYMBOL_GPL(ref_module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
838
839
840
841
  
  /* Clear the unload stuff of the module. */
  static void module_unload_free(struct module *mod)
  {
2c02dfe7f   Linus Torvalds   module: Make the ...
842
  	struct module_use *use, *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843

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

e513cc1c0   Masami Hiramatsu   module: Remove st...
876
877
878
879
880
881
  	/* 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
882

e513cc1c0   Masami Hiramatsu   module: Remove st...
883
884
  	return ret;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
885

e513cc1c0   Masami Hiramatsu   module: Remove st...
886
887
  static int try_stop_module(struct module *mod, int flags, int *forced)
  {
da39ba5e1   Rusty Russell   module: don't use...
888
  	/* If it's not unused, quit unless we're forcing. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
889
890
891
  	if (try_release_module_ref(mod) != 0) {
  		*forced = try_force_unload(flags);
  		if (!(*forced))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892
893
894
895
  			return -EWOULDBLOCK;
  	}
  
  	/* Mark it as dying. */
e513cc1c0   Masami Hiramatsu   module: Remove st...
896
  	mod->state = MODULE_STATE_GOING;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
897

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

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

75676500f   Rusty Russell   module: make lock...
979
  	free_module(mod);
1e102037f   Konstantin Khorenko   kernel/module.c: ...
980
981
  	/* someone could wait for the module in add_unformed_module() */
  	wake_up_all(&module_wq);
75676500f   Rusty Russell   module: make lock...
982
983
  	return 0;
  out:
6389a3851   Ashutosh Naik   [PATCH] kernel/mo...
984
  	mutex_unlock(&module_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
985
986
  	return ret;
  }
d1e99d7ae   Jianjun Kong   module: fix warni...
987
  static inline void print_unload_info(struct seq_file *m, struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
988
989
990
  {
  	struct module_use *use;
  	int printed_something = 0;
d5db139ab   Rusty Russell   module: make modu...
991
  	seq_printf(m, " %i ", module_refcount(mod));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
992

6da0b5651   Ionut Alexa   kernel:module Fix...
993
994
995
996
  	/*
  	 * Always include a trailing , so userspace can differentiate
  	 * between this and the old multi-field proc format.
  	 */
2c02dfe7f   Linus Torvalds   module: Make the ...
997
  	list_for_each_entry(use, &mod->source_list, source_list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
998
  		printed_something = 1;
2c02dfe7f   Linus Torvalds   module: Make the ...
999
  		seq_printf(m, "%s,", use->source->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001
1002
  	if (mod->init != NULL && mod->exit == NULL) {
  		printed_something = 1;
6da0b5651   Ionut Alexa   kernel:module Fix...
1003
  		seq_puts(m, "[permanent],");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1004
1005
1006
  	}
  
  	if (!printed_something)
6da0b5651   Ionut Alexa   kernel:module Fix...
1007
  		seq_puts(m, "-");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1008
1009
1010
1011
1012
  }
  
  void __symbol_put(const char *symbol)
  {
  	struct module *owner;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1013

24da1cbff   Rusty Russell   modules: remove m...
1014
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
1015
  	if (!find_symbol(symbol, &owner, NULL, true, false))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016
1017
  		BUG();
  	module_put(owner);
24da1cbff   Rusty Russell   modules: remove m...
1018
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019
1020
  }
  EXPORT_SYMBOL(__symbol_put);
7d1d16e41   Rusty Russell   module: fix BUG_O...
1021
  /* Note this assumes addr is a function, which it currently always is. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1022
1023
  void symbol_put_addr(void *addr)
  {
5e3766138   Trent Piepho   [PATCH] symbol_pu...
1024
  	struct module *modaddr;
7d1d16e41   Rusty Russell   module: fix BUG_O...
1025
  	unsigned long a = (unsigned long)dereference_function_descriptor(addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026

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

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

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

9f85a4bbb   Rusty Russell   module: refactor ...
1108
  static inline int module_unload_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1109
  {
9f85a4bbb   Rusty Russell   module: refactor ...
1110
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1111
1112
  }
  #endif /* CONFIG_MODULE_UNLOAD */
53999bf34   Kevin Winchester   error: implicit d...
1113
1114
1115
  static size_t module_flags_taint(struct module *mod, char *buf)
  {
  	size_t l = 0;
7fd8329ba   Petr Mladek   taint/module: Cle...
1116
1117
1118
1119
  	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...
1120
  			buf[l++] = taint_flags[i].c_true;
7fd8329ba   Petr Mladek   taint/module: Cle...
1121
  	}
53999bf34   Kevin Winchester   error: implicit d...
1122

53999bf34   Kevin Winchester   error: implicit d...
1123
1124
  	return l;
  }
1f71740ab   Kay Sievers   Driver core: show...
1125
  static ssize_t show_initstate(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1126
  			      struct module_kobject *mk, char *buffer)
1f71740ab   Kay Sievers   Driver core: show...
1127
1128
  {
  	const char *state = "unknown";
4befb026c   Kay Sievers   module: change at...
1129
  	switch (mk->mod->state) {
1f71740ab   Kay Sievers   Driver core: show...
1130
1131
1132
1133
1134
1135
1136
1137
1138
  	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...
1139
1140
  	default:
  		BUG();
1f71740ab   Kay Sievers   Driver core: show...
1141
1142
1143
1144
  	}
  	return sprintf(buffer, "%s
  ", state);
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1145
1146
  static struct module_attribute modinfo_initstate =
  	__ATTR(initstate, 0444, show_initstate, NULL);
1f71740ab   Kay Sievers   Driver core: show...
1147

88bfa3247   Kay Sievers   module: add /sys/...
1148
1149
1150
1151
  static ssize_t store_uevent(struct module_attribute *mattr,
  			    struct module_kobject *mk,
  			    const char *buffer, size_t count)
  {
df44b4796   Peter Rajnoha   kobject: return e...
1152
1153
1154
1155
  	int rc;
  
  	rc = kobject_synth_uevent(&mk->kobj, buffer, count);
  	return rc ? rc : count;
88bfa3247   Kay Sievers   module: add /sys/...
1156
  }
cca3e7073   Kay Sievers   modules: sysfs - ...
1157
1158
1159
1160
1161
1162
  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...
1163
1164
  	return sprintf(buffer, "%u
  ", mk->mod->core_layout.size);
cca3e7073   Kay Sievers   modules: sysfs - ...
1165
1166
1167
1168
1169
1170
1171
1172
  }
  
  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...
1173
1174
  	return sprintf(buffer, "%u
  ", mk->mod->init_layout.size);
cca3e7073   Kay Sievers   modules: sysfs - ...
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
  }
  
  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/...
1193

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

faaae2a58   Linus Torvalds   Re-enable CONFIG_...
1262
  	/* Broken toolchain. Warn once, then let it go.. */
3e2e857f9   Kees Cook   module: Add modul...
1263
1264
  	pr_warn_once("%s: no symbol version for %s
  ", info->name, symname);
faaae2a58   Linus Torvalds   Re-enable CONFIG_...
1265
  	return 1;
826e4506a   Linus Torvalds   Make forced modul...
1266
1267
  
  bad_version:
6da0b5651   Ionut Alexa   kernel:module Fix...
1268
1269
  	pr_warn("%s: disagrees about version of symbol %s
  ",
3e2e857f9   Kees Cook   module: Add modul...
1270
  	       info->name, symname);
826e4506a   Linus Torvalds   Make forced modul...
1271
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1272
  }
490194269   Kees Cook   module: Pass stru...
1273
  static inline int check_modstruct_version(const struct load_info *info,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1274
1275
  					  struct module *mod)
  {
71810db27   Ard Biesheuvel   modversions: trea...
1276
  	const s32 *crc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1277

926a59b1d   Peter Zijlstra   module: Annotate ...
1278
1279
1280
1281
1282
  	/*
  	 * Since this should be found in kernel (which can't be removed), no
  	 * locking is necessary -- use preempt_disable() to placate lockdep.
  	 */
  	preempt_disable();
996302c5e   Masahiro Yamada   module: replace V...
1283
  	if (!find_symbol("module_layout", NULL, &crc, true, false)) {
926a59b1d   Peter Zijlstra   module: Annotate ...
1284
  		preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1285
  		BUG();
926a59b1d   Peter Zijlstra   module: Annotate ...
1286
1287
  	}
  	preempt_enable();
996302c5e   Masahiro Yamada   module: replace V...
1288
  	return check_version(info, "module_layout", mod, crc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1289
  }
91e37a793   Rusty Russell   module: don't ign...
1290
1291
1292
  /* 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
1293
  {
91e37a793   Rusty Russell   module: don't ign...
1294
1295
1296
1297
  	if (has_crcs) {
  		amagic += strcspn(amagic, " ");
  		bmagic += strcspn(bmagic, " ");
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298
1299
1300
  	return strcmp(amagic, bmagic) == 0;
  }
  #else
490194269   Kees Cook   module: Pass stru...
1301
  static inline int check_version(const struct load_info *info,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1302
  				const char *symname,
6da0b5651   Ionut Alexa   kernel:module Fix...
1303
  				struct module *mod,
71810db27   Ard Biesheuvel   modversions: trea...
1304
  				const s32 *crc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1305
1306
1307
  {
  	return 1;
  }
490194269   Kees Cook   module: Pass stru...
1308
  static inline int check_modstruct_version(const struct load_info *info,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1309
1310
1311
1312
  					  struct module *mod)
  {
  	return 1;
  }
91e37a793   Rusty Russell   module: don't ign...
1313
1314
  static inline int same_magic(const char *amagic, const char *bmagic,
  			     bool has_crcs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1315
1316
1317
1318
  {
  	return strcmp(amagic, bmagic) == 0;
  }
  #endif /* CONFIG_MODVERSIONS */
8651ec01d   Matthias Maennich   module: add suppo...
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
  static char *get_modinfo(const struct load_info *info, const char *tag);
  static char *get_next_modinfo(const struct load_info *info, const char *tag,
  			      char *prev);
  
  static int verify_namespace_is_imported(const struct load_info *info,
  					const struct kernel_symbol *sym,
  					struct module *mod)
  {
  	const char *namespace;
  	char *imported_namespace;
  
  	namespace = kernel_symbol_namespace(sym);
  	if (namespace) {
  		imported_namespace = get_modinfo(info, "import_ns");
  		while (imported_namespace) {
  			if (strcmp(namespace, imported_namespace) == 0)
  				return 0;
  			imported_namespace = get_next_modinfo(
  				info, "import_ns", imported_namespace);
  		}
3d52ec5e5   Matthias Maennich   module: add confi...
1339
1340
1341
1342
1343
1344
1345
1346
1347
  #ifdef CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
  		pr_warn(
  #else
  		pr_err(
  #endif
  			"%s: module uses symbol (%s) from namespace %s, but does not import it.
  ",
  			mod->name, kernel_symbol_name(sym), namespace);
  #ifndef CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
8651ec01d   Matthias Maennich   module: add suppo...
1348
  		return -EINVAL;
3d52ec5e5   Matthias Maennich   module: add confi...
1349
  #endif
8651ec01d   Matthias Maennich   module: add suppo...
1350
1351
1352
  	}
  	return 0;
  }
75676500f   Rusty Russell   module: make lock...
1353
  /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
49668688d   Rusty Russell   module: pass load...
1354
1355
  static const struct kernel_symbol *resolve_symbol(struct module *mod,
  						  const struct load_info *info,
414fd31b2   Tim Abbott   module: Make find...
1356
  						  const char *name,
9bea7f239   Rusty Russell   module: fix bne2 ...
1357
  						  char ownername[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1358
1359
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
1360
  	const struct kernel_symbol *sym;
71810db27   Ard Biesheuvel   modversions: trea...
1361
  	const s32 *crc;
9bea7f239   Rusty Russell   module: fix bne2 ...
1362
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1363

d64810f56   Peter Zijlstra   module: Annotate ...
1364
1365
1366
1367
1368
1369
  	/*
  	 * 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...
1370
  	mutex_lock(&module_mutex);
414fd31b2   Tim Abbott   module: Make find...
1371
  	sym = find_symbol(name, &owner, &crc,
25ddbb18a   Andi Kleen   Make the taint fl...
1372
  			  !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
9bea7f239   Rusty Russell   module: fix bne2 ...
1373
1374
  	if (!sym)
  		goto unlock;
490194269   Kees Cook   module: Pass stru...
1375
  	if (!check_version(info, name, mod, crc)) {
9bea7f239   Rusty Russell   module: fix bne2 ...
1376
1377
  		sym = ERR_PTR(-EINVAL);
  		goto getname;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1378
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
1379

8651ec01d   Matthias Maennich   module: add suppo...
1380
1381
1382
1383
1384
  	err = verify_namespace_is_imported(info, sym, mod);
  	if (err) {
  		sym = ERR_PTR(err);
  		goto getname;
  	}
9bea7f239   Rusty Russell   module: fix bne2 ...
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
  	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...
1395
  	mutex_unlock(&module_mutex);
218ce7351   Linus Torvalds   Revert "module: d...
1396
  	return sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1397
  }
49668688d   Rusty Russell   module: pass load...
1398
1399
1400
1401
  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 ...
1402
1403
  {
  	const struct kernel_symbol *ksym;
49668688d   Rusty Russell   module: pass load...
1404
  	char owner[MODULE_NAME_LEN];
9bea7f239   Rusty Russell   module: fix bne2 ...
1405
1406
  
  	if (wait_event_interruptible_timeout(module_wq,
49668688d   Rusty Russell   module: pass load...
1407
1408
  			!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
  			|| PTR_ERR(ksym) != -EBUSY,
9bea7f239   Rusty Russell   module: fix bne2 ...
1409
  					     30 * HZ) <= 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1410
1411
1412
  		pr_warn("%s: gave up waiting for init of module %s.
  ",
  			mod->name, owner);
9bea7f239   Rusty Russell   module: fix bne2 ...
1413
1414
1415
  	}
  	return ksym;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1416
1417
1418
1419
  /*
   * /sys/module/foo/sections stuff
   * J. Corbet <corbet@lwn.net>
   */
8f6d03781   Rusty Russell   module: sysfs cle...
1420
  #ifdef CONFIG_SYSFS
10b465aaf   Ben Hutchings   modules: Skip emp...
1421

8f6d03781   Rusty Russell   module: sysfs cle...
1422
  #ifdef CONFIG_KALLSYMS
10b465aaf   Ben Hutchings   modules: Skip emp...
1423
1424
1425
1426
  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...
1427
  struct module_sect_attr {
a58730c42   Rusty Russell   module: make modu...
1428
1429
1430
1431
  	struct module_attribute mattr;
  	char *name;
  	unsigned long address;
  };
6da0b5651   Ionut Alexa   kernel:module Fix...
1432
  struct module_sect_attrs {
a58730c42   Rusty Russell   module: make modu...
1433
1434
1435
1436
  	struct attribute_group grp;
  	unsigned int nsections;
  	struct module_sect_attr attrs[0];
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1437
  static ssize_t module_sect_show(struct module_attribute *mattr,
4befb026c   Kay Sievers   module: change at...
1438
  				struct module_kobject *mk, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1439
1440
1441
  {
  	struct module_sect_attr *sattr =
  		container_of(mattr, struct module_sect_attr, mattr);
be71eda53   Thomas Richter   module: Fix displ...
1442
1443
1444
  	return sprintf(buf, "0x%px
  ", kptr_restrict < 2 ?
  		       (void *)sattr->address : NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1445
  }
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1446
1447
  static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
  {
a58730c42   Rusty Russell   module: make modu...
1448
  	unsigned int section;
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1449
1450
1451
1452
1453
  
  	for (section = 0; section < sect_attrs->nsections; section++)
  		kfree(sect_attrs->attrs[section].name);
  	kfree(sect_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1454
  static void add_sect_attrs(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1455
1456
1457
1458
1459
  {
  	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:...
1460

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1461
  	/* Count loaded sections and allocate structures */
8f6d03781   Rusty Russell   module: sysfs cle...
1462
1463
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		if (!sect_empty(&info->sechdrs[i]))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1464
  			nloaded++;
8d1b73dd2   Gustavo A. R. Silva   kernel: module: U...
1465
  	size[0] = ALIGN(struct_size(sect_attrs, attrs, nloaded),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
1467
  			sizeof(sect_attrs->grp.attrs[0]));
  	size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]);
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1468
1469
  	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
  	if (sect_attrs == NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1470
1471
1472
1473
1474
  		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...
1475
  	sect_attrs->nsections = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476
1477
  	sattr = &sect_attrs->attrs[0];
  	gattr = &sect_attrs->grp.attrs[0];
8f6d03781   Rusty Russell   module: sysfs cle...
1478
1479
1480
  	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...
1481
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1482
1483
  		sattr->address = sec->sh_addr;
  		sattr->name = kstrdup(info->secstrings + sec->sh_name,
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1484
1485
1486
1487
  					GFP_KERNEL);
  		if (sattr->name == NULL)
  			goto out;
  		sect_attrs->nsections++;
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1488
  		sysfs_attr_init(&sattr->mattr.attr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1489
1490
1491
  		sattr->mattr.show = module_sect_show;
  		sattr->mattr.store = NULL;
  		sattr->mattr.attr.name = sattr->name;
277642dcc   Linus Torvalds   modules: make sys...
1492
  		sattr->mattr.attr.mode = S_IRUSR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
  		*(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...
1503
  	free_sect_attrs(sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1504
1505
1506
1507
1508
1509
1510
1511
1512
  }
  
  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...
1513
  		free_sect_attrs(mod->sect_attrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1514
1515
1516
  		mod->sect_attrs = NULL;
  	}
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1517
1518
1519
1520
1521
1522
1523
1524
1525
  /*
   * /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...
1526
  static ssize_t module_notes_read(struct file *filp, struct kobject *kobj,
6d7601338   Roland McGrath   Add /sys/module/n...
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
  				 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...
1544
  		kobject_put(notes_attrs->dir);
6d7601338   Roland McGrath   Add /sys/module/n...
1545
1546
1547
  	}
  	kfree(notes_attrs);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1548
  static void add_notes_attrs(struct module *mod, const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1549
1550
1551
1552
  {
  	unsigned int notes, loaded, i;
  	struct module_notes_attrs *notes_attrs;
  	struct bin_attribute *nattr;
ea6bff368   Ingo Molnar   modules: Fix buil...
1553
1554
1555
  	/* failed to create section attributes, so can't create notes */
  	if (!mod->sect_attrs)
  		return;
6d7601338   Roland McGrath   Add /sys/module/n...
1556
1557
  	/* Count notes sections and allocate structures.  */
  	notes = 0;
8f6d03781   Rusty Russell   module: sysfs cle...
1558
1559
1560
  	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...
1561
1562
1563
1564
  			++notes;
  
  	if (notes == 0)
  		return;
acafe7e30   Kees Cook   treewide: Use str...
1565
  	notes_attrs = kzalloc(struct_size(notes_attrs, attrs, notes),
6d7601338   Roland McGrath   Add /sys/module/n...
1566
1567
1568
1569
1570
1571
  			      GFP_KERNEL);
  	if (notes_attrs == NULL)
  		return;
  
  	notes_attrs->notes = notes;
  	nattr = &notes_attrs->attrs[0];
8f6d03781   Rusty Russell   module: sysfs cle...
1572
1573
  	for (loaded = i = 0; i < info->hdr->e_shnum; ++i) {
  		if (sect_empty(&info->sechdrs[i]))
6d7601338   Roland McGrath   Add /sys/module/n...
1574
  			continue;
8f6d03781   Rusty Russell   module: sysfs cle...
1575
  		if (info->sechdrs[i].sh_type == SHT_NOTE) {
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1576
  			sysfs_bin_attr_init(nattr);
6d7601338   Roland McGrath   Add /sys/module/n...
1577
1578
  			nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
  			nattr->attr.mode = S_IRUGO;
8f6d03781   Rusty Russell   module: sysfs cle...
1579
1580
  			nattr->size = info->sechdrs[i].sh_size;
  			nattr->private = (void *) info->sechdrs[i].sh_addr;
6d7601338   Roland McGrath   Add /sys/module/n...
1581
1582
1583
1584
1585
  			nattr->read = module_notes_read;
  			++nattr;
  		}
  		++loaded;
  	}
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1586
  	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
6d7601338   Roland McGrath   Add /sys/module/n...
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
  	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
1607
  #else
04b1db9fd   Ian S. Nelson   [PATCH] /sys/modu...
1608

8f6d03781   Rusty Russell   module: sysfs cle...
1609
1610
  static inline void add_sect_attrs(struct module *mod,
  				  const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1611
1612
1613
1614
1615
1616
  {
  }
  
  static inline void remove_sect_attrs(struct module *mod)
  {
  }
6d7601338   Roland McGrath   Add /sys/module/n...
1617

8f6d03781   Rusty Russell   module: sysfs cle...
1618
1619
  static inline void add_notes_attrs(struct module *mod,
  				   const struct load_info *info)
6d7601338   Roland McGrath   Add /sys/module/n...
1620
1621
1622
1623
1624
1625
  {
  }
  
  static inline void remove_notes_attrs(struct module *mod)
  {
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1626
  #endif /* CONFIG_KALLSYMS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1627

1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1628
  static void del_usage_links(struct module *mod)
80a3d1bb4   Rusty Russell   module: move sysf...
1629
1630
1631
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
80a3d1bb4   Rusty Russell   module: move sysf...
1632

75676500f   Rusty Russell   module: make lock...
1633
  	mutex_lock(&module_mutex);
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1634
1635
  	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...
1636
  	mutex_unlock(&module_mutex);
80a3d1bb4   Rusty Russell   module: move sysf...
1637
1638
  #endif
  }
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1639
  static int add_usage_links(struct module *mod)
80a3d1bb4   Rusty Russell   module: move sysf...
1640
  {
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1641
  	int ret = 0;
80a3d1bb4   Rusty Russell   module: move sysf...
1642
1643
  #ifdef CONFIG_MODULE_UNLOAD
  	struct module_use *use;
75676500f   Rusty Russell   module: make lock...
1644
  	mutex_lock(&module_mutex);
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1645
1646
1647
1648
1649
1650
  	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...
1651
  	mutex_unlock(&module_mutex);
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1652
1653
  	if (ret)
  		del_usage_links(mod);
80a3d1bb4   Rusty Russell   module: move sysf...
1654
  #endif
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1655
  	return ret;
80a3d1bb4   Rusty Russell   module: move sysf...
1656
  }
bc6f2a757   YueHaibing   kernel/module: Fi...
1657
  static void module_remove_modinfo_attrs(struct module *mod, int end);
6407ebb27   Rusty Russell   module: Make modu...
1658
  static int module_add_modinfo_attrs(struct module *mod)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1659
1660
  {
  	struct module_attribute *attr;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1661
  	struct module_attribute *temp_attr;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1662
1663
  	int error = 0;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1664
1665
1666
1667
1668
1669
1670
  	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;
bc6f2a757   YueHaibing   kernel/module: Fi...
1671
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
c75b590d6   Rusty Russell   module: fix redun...
1672
  		if (!attr->test || attr->test(mod)) {
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1673
  			memcpy(temp_attr, attr, sizeof(*temp_attr));
361795b1e   Eric W. Biederman   sysfs: Use sysfs_...
1674
  			sysfs_attr_init(&temp_attr->attr);
6da0b5651   Ionut Alexa   kernel:module Fix...
1675
1676
  			error = sysfs_create_file(&mod->mkobj.kobj,
  					&temp_attr->attr);
bc6f2a757   YueHaibing   kernel/module: Fi...
1677
1678
  			if (error)
  				goto error_out;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1679
1680
  			++temp_attr;
  		}
c988d2b28   Matt Domsch   [PATCH] modules: ...
1681
  	}
bc6f2a757   YueHaibing   kernel/module: Fi...
1682
1683
1684
1685
1686
1687
  
  	return 0;
  
  error_out:
  	if (i > 0)
  		module_remove_modinfo_attrs(mod, --i);
f60672166   YueHaibing   kernel/module: Fi...
1688
1689
  	else
  		kfree(mod->modinfo_attrs);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1690
1691
  	return error;
  }
bc6f2a757   YueHaibing   kernel/module: Fi...
1692
  static void module_remove_modinfo_attrs(struct module *mod, int end)
c988d2b28   Matt Domsch   [PATCH] modules: ...
1693
1694
1695
  {
  	struct module_attribute *attr;
  	int i;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1696
  	for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) {
bc6f2a757   YueHaibing   kernel/module: Fi...
1697
1698
  		if (end >= 0 && i > end)
  			break;
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1699
1700
1701
  		/* pick a field to test for end of list */
  		if (!attr->attr.name)
  			break;
6da0b5651   Ionut Alexa   kernel:module Fix...
1702
  		sysfs_remove_file(&mod->mkobj.kobj, &attr->attr);
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1703
1704
  		if (attr->free)
  			attr->free(mod);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1705
  	}
03e88ae1b   Greg Kroah-Hartman   [PATCH] fix modul...
1706
  	kfree(mod->modinfo_attrs);
c988d2b28   Matt Domsch   [PATCH] modules: ...
1707
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1708

942e44312   Li Zhong   module: Fix mod->...
1709
1710
1711
1712
1713
1714
1715
  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...
1716
  static int mod_sysfs_init(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1717
1718
  {
  	int err;
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1719
  	struct kobject *kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1720

823bccfc4   Greg Kroah-Hartman   remove "struct su...
1721
  	if (!module_sysfs_initialized) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1722
1723
  		pr_err("%s: module sysfs not initialized
  ", mod->name);
1cc5f7142   Ed Swierk   [PATCH] load_modu...
1724
1725
1726
  		err = -EINVAL;
  		goto out;
  	}
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1727
1728
1729
  
  	kobj = kset_find_obj(module_kset, mod->name);
  	if (kobj) {
bddb12b32   Andrew Morton   kernel/module.c: ...
1730
1731
  		pr_err("%s: module is already loaded
  ", mod->name);
6494a93d5   Greg Kroah-Hartman   Module: check to ...
1732
1733
1734
1735
  		kobject_put(kobj);
  		err = -EINVAL;
  		goto out;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1736
  	mod->mkobj.mod = mod;
e17e0f51a   Kay Sievers   Driver core: show...
1737

ac3c8141f   Greg Kroah-Hartman   Kobject: convert ...
1738
1739
1740
1741
1742
  	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->...
1743
  		mod_kobject_put(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1744

97c146ef0   Kay Sievers   sysfs: fix /sys/m...
1745
  	/* delay uevent until full sysfs population */
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1746
1747
1748
  out:
  	return err;
  }
6407ebb27   Rusty Russell   module: Make modu...
1749
  static int mod_sysfs_setup(struct module *mod,
8f6d03781   Rusty Russell   module: sysfs cle...
1750
  			   const struct load_info *info,
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1751
1752
1753
1754
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	int err;
80a3d1bb4   Rusty Russell   module: move sysf...
1755
1756
1757
  	err = mod_sysfs_init(mod);
  	if (err)
  		goto out;
4ff6abff8   Greg Kroah-Hartman   kobject: get rid ...
1758
  	mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
240936e18   Akinobu Mita   mod_sysfs_setup()...
1759
1760
  	if (!mod->holders_dir) {
  		err = -ENOMEM;
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1761
  		goto out_unreg;
240936e18   Akinobu Mita   mod_sysfs_setup()...
1762
  	}
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1763

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1764
1765
  	err = module_param_sysfs_setup(mod, kparam, num_params);
  	if (err)
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1766
  		goto out_unreg_holders;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1767

c988d2b28   Matt Domsch   [PATCH] modules: ...
1768
1769
  	err = module_add_modinfo_attrs(mod);
  	if (err)
e17e0f51a   Kay Sievers   Driver core: show...
1770
  		goto out_unreg_param;
c988d2b28   Matt Domsch   [PATCH] modules: ...
1771

1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1772
1773
1774
  	err = add_usage_links(mod);
  	if (err)
  		goto out_unreg_modinfo_attrs;
8f6d03781   Rusty Russell   module: sysfs cle...
1775
1776
  	add_sect_attrs(mod, info);
  	add_notes_attrs(mod, info);
80a3d1bb4   Rusty Russell   module: move sysf...
1777

e17e0f51a   Kay Sievers   Driver core: show...
1778
  	kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1779
  	return 0;
1ba5c08b5   Corentin Labbe   kernel/module.c: ...
1780
  out_unreg_modinfo_attrs:
bc6f2a757   YueHaibing   kernel/module: Fi...
1781
  	module_remove_modinfo_attrs(mod, -1);
e17e0f51a   Kay Sievers   Driver core: show...
1782
1783
  out_unreg_param:
  	module_param_sysfs_remove(mod);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1784
  out_unreg_holders:
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1785
  	kobject_put(mod->holders_dir);
270a6c4ca   Kay Sievers   /sys/modules/*/ho...
1786
  out_unreg:
942e44312   Li Zhong   module: Fix mod->...
1787
  	mod_kobject_put(mod);
80a3d1bb4   Rusty Russell   module: move sysf...
1788
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1789
1790
  	return err;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1791
1792
1793
  
  static void mod_sysfs_fini(struct module *mod)
  {
8f6d03781   Rusty Russell   module: sysfs cle...
1794
1795
  	remove_notes_attrs(mod);
  	remove_sect_attrs(mod);
942e44312   Li Zhong   module: Fix mod->...
1796
  	mod_kobject_put(mod);
34e4e2fef   Denis V. Lunev   modules: proper c...
1797
  }
cf2fde7b3   Rusty Russell   param: fix module...
1798
1799
1800
1801
  static void init_param_lock(struct module *mod)
  {
  	mutex_init(&mod->param_lock);
  }
8f6d03781   Rusty Russell   module: sysfs cle...
1802
  #else /* !CONFIG_SYSFS */
34e4e2fef   Denis V. Lunev   modules: proper c...
1803

8f6d03781   Rusty Russell   module: sysfs cle...
1804
1805
  static int mod_sysfs_setup(struct module *mod,
  			   const struct load_info *info,
6407ebb27   Rusty Russell   module: Make modu...
1806
1807
1808
1809
1810
  			   struct kernel_param *kparam,
  			   unsigned int num_params)
  {
  	return 0;
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1811
1812
1813
  static void mod_sysfs_fini(struct module *mod)
  {
  }
bc6f2a757   YueHaibing   kernel/module: Fi...
1814
  static void module_remove_modinfo_attrs(struct module *mod, int end)
36b0360d1   Rusty Russell   module: fix sysfs...
1815
1816
  {
  }
80a3d1bb4   Rusty Russell   module: move sysf...
1817
1818
1819
  static void del_usage_links(struct module *mod)
  {
  }
cf2fde7b3   Rusty Russell   param: fix module...
1820
1821
1822
  static void init_param_lock(struct module *mod)
  {
  }
34e4e2fef   Denis V. Lunev   modules: proper c...
1823
  #endif /* CONFIG_SYSFS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1824

36b0360d1   Rusty Russell   module: fix sysfs...
1825
  static void mod_sysfs_teardown(struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1826
  {
80a3d1bb4   Rusty Russell   module: move sysf...
1827
  	del_usage_links(mod);
bc6f2a757   YueHaibing   kernel/module: Fi...
1828
  	module_remove_modinfo_attrs(mod, -1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1829
  	module_param_sysfs_remove(mod);
78a2d906b   Greg Kroah-Hartman   Kobject: convert ...
1830
1831
  	kobject_put(mod->mkobj.drivers_dir);
  	kobject_put(mod->holders_dir);
34e4e2fef   Denis V. Lunev   modules: proper c...
1832
  	mod_sysfs_fini(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1833
  }
93651f80d   Yang Yingliang   modules: fix comp...
1834
  #ifdef CONFIG_ARCH_HAS_STRICT_MODULE_RWX
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1835
1836
1837
  /*
   * LKM RO/NX protection: protect module's text/ro-data
   * from modification and any data from execution.
85c898db6   Rusty Russell   module: clean up ...
1838
1839
   *
   * General layout of module is:
444d13ff1   Jessica Yu   modules: add ro_a...
1840
1841
1842
1843
1844
   *          [text] [read-only-data] [ro-after-init] [writable data]
   * text_size -----^                ^               ^               ^
   * ro_size ------------------------|               |               |
   * ro_after_init_size -----------------------------|               |
   * size -----------------------------------------------------------|
85c898db6   Rusty Russell   module: clean up ...
1845
1846
   *
   * These values are always page-aligned (as is base)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1847
   */
85c898db6   Rusty Russell   module: clean up ...
1848
1849
  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...
1850
  {
85c898db6   Rusty Russell   module: clean up ...
1851
1852
1853
1854
  	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...
1855
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1856

93651f80d   Yang Yingliang   modules: fix comp...
1857
  #ifdef CONFIG_STRICT_MODULE_RWX
85c898db6   Rusty Russell   module: clean up ...
1858
1859
  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...
1860
  {
85c898db6   Rusty Russell   module: clean up ...
1861
1862
1863
1864
1865
  	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...
1866
  }
444d13ff1   Jessica Yu   modules: add ro_a...
1867
1868
1869
1870
1871
1872
1873
1874
1875
  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 ...
1876
1877
  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...
1878
  {
85c898db6   Rusty Russell   module: clean up ...
1879
  	BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
444d13ff1   Jessica Yu   modules: add ro_a...
1880
  	BUG_ON((unsigned long)layout->ro_after_init_size & (PAGE_SIZE-1));
85c898db6   Rusty Russell   module: clean up ...
1881
  	BUG_ON((unsigned long)layout->size & (PAGE_SIZE-1));
444d13ff1   Jessica Yu   modules: add ro_a...
1882
1883
  	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...
1884
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1885

85c898db6   Rusty Russell   module: clean up ...
1886
1887
  /* 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...
1888
  {
39290b389   AKASHI Takahiro   module: extend 'r...
1889
1890
  	if (!rodata_enabled)
  		return;
85c898db6   Rusty Russell   module: clean up ...
1891
1892
  	frob_text(&mod->core_layout, set_memory_rw);
  	frob_rodata(&mod->core_layout, set_memory_rw);
444d13ff1   Jessica Yu   modules: add ro_a...
1893
  	frob_ro_after_init(&mod->core_layout, set_memory_rw);
85c898db6   Rusty Russell   module: clean up ...
1894
1895
  	frob_text(&mod->init_layout, set_memory_rw);
  	frob_rodata(&mod->init_layout, set_memory_rw);
20ef10c1b   Josh Poimboeuf   module: Use the s...
1896
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1897

444d13ff1   Jessica Yu   modules: add ro_a...
1898
  void module_enable_ro(const struct module *mod, bool after_init)
01526ed08   Jan Glauber   module: split uns...
1899
  {
39290b389   AKASHI Takahiro   module: extend 'r...
1900
1901
  	if (!rodata_enabled)
  		return;
1a7b7d922   Rick Edgecombe   modules: Use vmal...
1902
1903
  	set_vm_flush_reset_perms(mod->core_layout.base);
  	set_vm_flush_reset_perms(mod->init_layout.base);
85c898db6   Rusty Russell   module: clean up ...
1904
  	frob_text(&mod->core_layout, set_memory_ro);
f2c65fb32   Nadav Amit   x86/modules: Avoi...
1905

85c898db6   Rusty Russell   module: clean up ...
1906
1907
1908
  	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...
1909
1910
1911
  
  	if (after_init)
  		frob_ro_after_init(&mod->core_layout, set_memory_ro);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1912
  }
85c898db6   Rusty Russell   module: clean up ...
1913
  static void module_enable_nx(const struct module *mod)
01526ed08   Jan Glauber   module: split uns...
1914
  {
85c898db6   Rusty Russell   module: clean up ...
1915
  	frob_rodata(&mod->core_layout, set_memory_nx);
444d13ff1   Jessica Yu   modules: add ro_a...
1916
  	frob_ro_after_init(&mod->core_layout, set_memory_nx);
85c898db6   Rusty Russell   module: clean up ...
1917
1918
1919
  	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...
1920
  }
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1921
  /* Iterate through all modules and set each module's text as RW */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1922
  void set_all_modules_text_rw(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1923
1924
  {
  	struct module *mod;
39290b389   AKASHI Takahiro   module: extend 'r...
1925
1926
  	if (!rodata_enabled)
  		return;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1927
1928
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
1929
1930
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
85c898db6   Rusty Russell   module: clean up ...
1931
1932
1933
  
  		frob_text(&mod->core_layout, set_memory_rw);
  		frob_text(&mod->init_layout, set_memory_rw);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1934
1935
1936
1937
1938
  	}
  	mutex_unlock(&module_mutex);
  }
  
  /* Iterate through all modules and set each module's text as RO */
5d05c7084   Daniel J Blueman   minor ANSI protot...
1939
  void set_all_modules_text_ro(void)
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1940
1941
  {
  	struct module *mod;
39290b389   AKASHI Takahiro   module: extend 'r...
1942
1943
  	if (!rodata_enabled)
  		return;
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1944
1945
  	mutex_lock(&module_mutex);
  	list_for_each_entry_rcu(mod, &modules, list) {
905dd707f   Aaron Tomlin   module: When modi...
1946
1947
1948
1949
1950
1951
1952
  		/*
  		 * 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...
1953
  			continue;
85c898db6   Rusty Russell   module: clean up ...
1954
1955
1956
  
  		frob_text(&mod->core_layout, set_memory_ro);
  		frob_text(&mod->init_layout, set_memory_ro);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1957
1958
1959
  	}
  	mutex_unlock(&module_mutex);
  }
93651f80d   Yang Yingliang   modules: fix comp...
1960
  #else /* !CONFIG_STRICT_MODULE_RWX */
85c898db6   Rusty Russell   module: clean up ...
1961
  static void module_enable_nx(const struct module *mod) { }
93651f80d   Yang Yingliang   modules: fix comp...
1962
  #endif /*  CONFIG_STRICT_MODULE_RWX */
2eef1399a   Yang Yingliang   modules: fix BUG ...
1963
1964
1965
1966
1967
  static void module_enable_x(const struct module *mod)
  {
  	frob_text(&mod->core_layout, set_memory_x);
  	frob_text(&mod->init_layout, set_memory_x);
  }
93651f80d   Yang Yingliang   modules: fix comp...
1968
1969
1970
1971
  #else /* !CONFIG_ARCH_HAS_STRICT_MODULE_RWX */
  static void module_enable_nx(const struct module *mod) { }
  static void module_enable_x(const struct module *mod) { }
  #endif /* CONFIG_ARCH_HAS_STRICT_MODULE_RWX */
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
1972

1ce15ef4f   Jessica Yu   module: preserve ...
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
  #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;
9be936f4b   zhong jiang   kernel/module: Us...
1995
  	mod->klp_info->sechdrs = kmemdup(info->sechdrs, size, GFP_KERNEL);
1ce15ef4f   Jessica Yu   module: preserve ...
1996
1997
1998
1999
  	if (mod->klp_info->sechdrs == NULL) {
  		ret = -ENOMEM;
  		goto free_info;
  	}
1ce15ef4f   Jessica Yu   module: preserve ...
2000
2001
2002
  
  	/* Elf section name string table */
  	size = info->sechdrs[info->hdr->e_shstrndx].sh_size;
9be936f4b   zhong jiang   kernel/module: Us...
2003
  	mod->klp_info->secstrings = kmemdup(info->secstrings, size, GFP_KERNEL);
1ce15ef4f   Jessica Yu   module: preserve ...
2004
2005
2006
2007
  	if (mod->klp_info->secstrings == NULL) {
  		ret = -ENOMEM;
  		goto free_sechdrs;
  	}
1ce15ef4f   Jessica Yu   module: preserve ...
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
  
  	/* 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...
2047
  void __weak module_memfree(void *module_region)
74e08fcf7   Jonas Bonn   modules: add defa...
2048
  {
1a7b7d922   Rick Edgecombe   modules: Use vmal...
2049
2050
2051
2052
2053
  	/*
  	 * This memory may be RO, and freeing RO memory in an interrupt is not
  	 * supported by vmalloc.
  	 */
  	WARN_ON(in_interrupt());
74e08fcf7   Jonas Bonn   modules: add defa...
2054
2055
2056
2057
2058
2059
  	vfree(module_region);
  }
  
  void __weak module_arch_cleanup(struct module *mod)
  {
  }
d453cded0   Rusty Russell   module_arch_freei...
2060
2061
2062
  void __weak module_arch_freeing_init(struct module *mod)
  {
  }
75676500f   Rusty Russell   module: make lock...
2063
  /* Free a module, remove from lists, etc. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2064
2065
  static void free_module(struct module *mod)
  {
7ead8b831   Li Zefan   tracing/events: A...
2066
  	trace_module_free(mod);
36b0360d1   Rusty Russell   module: fix sysfs...
2067
  	mod_sysfs_teardown(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2068

944a1fa01   Rusty Russell   module: don't unl...
2069
2070
  	/* 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...
2071
  	mutex_lock(&module_mutex);
944a1fa01   Rusty Russell   module: don't unl...
2072
  	mod->state = MODULE_STATE_UNFORMED;
d3051b489   Prarit Bhargava   modules, lock aro...
2073
  	mutex_unlock(&module_mutex);
944a1fa01   Rusty Russell   module: don't unl...
2074

b82bab4bb   Jason Baron   dynamic debug: mo...
2075
2076
  	/* Remove dynamic debug info */
  	ddebug_remove_module(mod->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2077
2078
2079
2080
2081
  	/* Arch-specific cleanup. */
  	module_arch_cleanup(mod);
  
  	/* Module unload stuff */
  	module_unload_free(mod);
e180a6b77   Rusty Russell   param: fix charp ...
2082
2083
  	/* Free any allocated parameters. */
  	destroy_params(mod->kp, mod->num_kp);
1ce15ef4f   Jessica Yu   module: preserve ...
2084
2085
  	if (is_livepatch_module(mod))
  		free_module_elf(mod);
944a1fa01   Rusty Russell   module: don't unl...
2086
2087
  	/* Now we can delete it from the lists */
  	mutex_lock(&module_mutex);
461e34aed   Masami Hiramatsu   module: Unlink mo...
2088
2089
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
93c2e105f   Peter Zijlstra   module: Optimize ...
2090
  	mod_tree_remove(mod);
0286b5ea1   Masami Hiramatsu   lib/bug: Use RCU ...
2091
  	/* Remove this module from bug list, this uses list_del_rcu */
461e34aed   Masami Hiramatsu   module: Unlink mo...
2092
  	module_bug_cleanup(mod);
0be964be0   Peter Zijlstra   module: Sanitize ...
2093
  	/* Wait for RCU-sched synchronizing before releasing mod->list and buglist. */
cb2f55369   Paul E. McKenney   modules: Replace ...
2094
  	synchronize_rcu();
944a1fa01   Rusty Russell   module: don't unl...
2095
  	mutex_unlock(&module_mutex);
85c898db6   Rusty Russell   module: clean up ...
2096
  	/* This may be empty, but that's OK */
d453cded0   Rusty Russell   module_arch_freei...
2097
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
2098
  	module_memfree(mod->init_layout.base);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2099
  	kfree(mod->args);
259354dea   Tejun Heo   module: encapsula...
2100
  	percpu_modfree(mod);
9f85a4bbb   Rusty Russell   module: refactor ...
2101

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2105
  	/* Finally, free the core (containing the module structure) */
7523e4dc5   Rusty Russell   module: use a str...
2106
  	module_memfree(mod->core_layout.base);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2107
2108
2109
2110
2111
  }
  
  void *__symbol_get(const char *symbol)
  {
  	struct module *owner;
414fd31b2   Tim Abbott   module: Make find...
2112
  	const struct kernel_symbol *sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2113

24da1cbff   Rusty Russell   modules: remove m...
2114
  	preempt_disable();
414fd31b2   Tim Abbott   module: Make find...
2115
2116
2117
  	sym = find_symbol(symbol, &owner, NULL, true, true);
  	if (sym && strong_try_module_get(owner))
  		sym = NULL;
24da1cbff   Rusty Russell   modules: remove m...
2118
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2119

7290d5809   Ard Biesheuvel   module: use relat...
2120
  	return sym ? (void *)kernel_symbol_value(sym) : NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2121
2122
  }
  EXPORT_SYMBOL_GPL(__symbol_get);
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2123
2124
  /*
   * Ensure that an exported symbol [global namespace] does not already exist
02a3e59a0   Robert P. J. Day   Fix minor typoes ...
2125
   * in the kernel or in some other module's exported symbol table.
be593f4ce   Rusty Russell   module: verify_ex...
2126
2127
   *
   * You must hold the module_mutex.
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2128
   */
2d25bc552   Jessica Yu   module: make it c...
2129
  static int verify_exported_symbols(struct module *mod)
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2130
  {
b211104d1   Rusty Russell   module: Enhance v...
2131
  	unsigned int i;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2132
  	struct module *owner;
b211104d1   Rusty Russell   module: Enhance v...
2133
2134
2135
2136
2137
2138
2139
2140
  	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...
2141
  #ifdef CONFIG_UNUSED_SYMBOLS
b211104d1   Rusty Russell   module: Enhance v...
2142
2143
  		{ mod->unused_syms, mod->num_unused_syms },
  		{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
f7f5b6755   Denys Vlasenko   Shrink struct mod...
2144
  #endif
b211104d1   Rusty Russell   module: Enhance v...
2145
  	};
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2146

b211104d1   Rusty Russell   module: Enhance v...
2147
2148
  	for (i = 0; i < ARRAY_SIZE(arr); i++) {
  		for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
7290d5809   Ard Biesheuvel   module: use relat...
2149
2150
  			if (find_symbol(kernel_symbol_name(s), &owner, NULL,
  					true, false)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2151
  				pr_err("%s: exports duplicate symbol %s"
b211104d1   Rusty Russell   module: Enhance v...
2152
2153
  				       " (owned by %s)
  ",
7290d5809   Ard Biesheuvel   module: use relat...
2154
2155
  				       mod->name, kernel_symbol_name(s),
  				       module_name(owner));
b211104d1   Rusty Russell   module: Enhance v...
2156
2157
  				return -ENOEXEC;
  			}
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2158
  		}
b211104d1   Rusty Russell   module: Enhance v...
2159
2160
  	}
  	return 0;
eea8b54dc   Ashutosh Naik   [PATCH] modules: ...
2161
  }
9a4b9708f   Matti Linnanvuori   module: fix and e...
2162
  /* Change all symbols so that st_value encodes the pointer directly. */
49668688d   Rusty Russell   module: pass load...
2163
2164
2165
2166
  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
2167
  	unsigned long secbase;
49668688d   Rusty Russell   module: pass load...
2168
  	unsigned int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2169
  	int ret = 0;
414fd31b2   Tim Abbott   module: Make find...
2170
  	const struct kernel_symbol *ksym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2171

49668688d   Rusty Russell   module: pass load...
2172
2173
  	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
2174
2175
  		switch (sym[i].st_shndx) {
  		case SHN_COMMON:
80375980f   Joe Mario   lto: Handle LTO c...
2176
2177
2178
  			/* Ignore common symbols */
  			if (!strncmp(name, "__gnu_lto", 9))
  				break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2179
2180
  			/* We compiled with -fno-common.  These are not
  			   supposed to happen.  */
5e1241692   Jim Cromie   module: replace D...
2181
2182
  			pr_debug("Common symbol: %s
  ", name);
6da0b5651   Ionut Alexa   kernel:module Fix...
2183
2184
  			pr_warn("%s: please compile with -fno-common
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2185
2186
2187
2188
2189
2190
  			       mod->name);
  			ret = -ENOEXEC;
  			break;
  
  		case SHN_ABS:
  			/* Don't need to do anything */
5e1241692   Jim Cromie   module: replace D...
2191
2192
  			pr_debug("Absolute symbol: 0x%08lx
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2193
2194
  			       (long)sym[i].st_value);
  			break;
1ce15ef4f   Jessica Yu   module: preserve ...
2195
2196
2197
  		case SHN_LIVEPATCH:
  			/* Livepatch symbols are resolved by livepatch */
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2198
  		case SHN_UNDEF:
49668688d   Rusty Russell   module: pass load...
2199
  			ksym = resolve_symbol_wait(mod, info, name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2200
  			/* Ok if resolved.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
2201
  			if (ksym && !IS_ERR(ksym)) {
7290d5809   Ard Biesheuvel   module: use relat...
2202
  				sym[i].st_value = kernel_symbol_value(ksym);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2203
  				break;
414fd31b2   Tim Abbott   module: Make find...
2204
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2205
  			/* Ok if weak.  */
9bea7f239   Rusty Russell   module: fix bne2 ...
2206
  			if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2207
  				break;
9bea7f239   Rusty Russell   module: fix bne2 ...
2208
  			ret = PTR_ERR(ksym) ?: -ENOENT;
62267e0ec   Jason A. Donenfeld   module: print sen...
2209
2210
2211
  			pr_warn("%s: Unknown symbol %s (err %d)
  ",
  				mod->name, name, ret);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2212
2213
2214
2215
  			break;
  
  		default:
  			/* Divert to percpu allocation if a percpu var. */
49668688d   Rusty Russell   module: pass load...
2216
  			if (sym[i].st_shndx == info->index.pcpu)
259354dea   Tejun Heo   module: encapsula...
2217
  				secbase = (unsigned long)mod_percpu(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2218
  			else
49668688d   Rusty Russell   module: pass load...
2219
  				secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2220
2221
2222
2223
2224
2225
2226
  			sym[i].st_value += secbase;
  			break;
  		}
  	}
  
  	return ret;
  }
49668688d   Rusty Russell   module: pass load...
2227
  static int apply_relocations(struct module *mod, const struct load_info *info)
22e268ebe   Rusty Russell   module: refactor ...
2228
2229
2230
2231
2232
  {
  	unsigned int i;
  	int err = 0;
  
  	/* Now do relocations. */
49668688d   Rusty Russell   module: pass load...
2233
2234
  	for (i = 1; i < info->hdr->e_shnum; i++) {
  		unsigned int infosec = info->sechdrs[i].sh_info;
22e268ebe   Rusty Russell   module: refactor ...
2235
2236
  
  		/* Not a valid relocation section? */
49668688d   Rusty Russell   module: pass load...
2237
  		if (infosec >= info->hdr->e_shnum)
22e268ebe   Rusty Russell   module: refactor ...
2238
2239
2240
  			continue;
  
  		/* Don't bother with non-allocated sections */
49668688d   Rusty Russell   module: pass load...
2241
  		if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC))
22e268ebe   Rusty Russell   module: refactor ...
2242
  			continue;
1ce15ef4f   Jessica Yu   module: preserve ...
2243
2244
2245
  		/* Livepatch relocation sections are applied by livepatch */
  		if (info->sechdrs[i].sh_flags & SHF_RELA_LIVEPATCH)
  			continue;
49668688d   Rusty Russell   module: pass load...
2246
2247
2248
2249
2250
2251
  		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 ...
2252
2253
2254
2255
2256
  		if (err < 0)
  			break;
  	}
  	return err;
  }
088af9a6e   Helge Deller   module: fix modul...
2257
2258
2259
2260
2261
2262
2263
  /* 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
2264
  /* Update size with this section: return offset. */
088af9a6e   Helge Deller   module: fix modul...
2265
2266
  static long get_offset(struct module *mod, unsigned int *size,
  		       Elf_Shdr *sechdr, unsigned int section)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2267
2268
  {
  	long ret;
088af9a6e   Helge Deller   module: fix modul...
2269
  	*size += arch_mod_section_prepend(mod, section);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2270
2271
2272
2273
2274
2275
2276
2277
2278
  	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...
2279
  static void layout_sections(struct module *mod, struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2280
2281
2282
2283
2284
2285
2286
  {
  	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...
2287
  		{ SHF_RO_AFTER_INIT | SHF_ALLOC, ARCH_SHF_SMALL },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2288
2289
2290
2291
  		{ SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL },
  		{ ARCH_SHF_SMALL | SHF_ALLOC, 0 }
  	};
  	unsigned int m, i;
49668688d   Rusty Russell   module: pass load...
2292
2293
  	for (i = 0; i < info->hdr->e_shnum; i++)
  		info->sechdrs[i].sh_entsize = ~0UL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2294

5e1241692   Jim Cromie   module: replace D...
2295
2296
  	pr_debug("Core section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2297
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
2298
2299
2300
  		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
2301
2302
2303
2304
  
  			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...
2305
  			    || strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2306
  				continue;
7523e4dc5   Rusty Russell   module: use a str...
2307
  			s->sh_entsize = get_offset(mod, &mod->core_layout.size, s, i);
5e1241692   Jim Cromie   module: replace D...
2308
2309
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2310
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2311
2312
  		switch (m) {
  		case 0: /* executable */
7523e4dc5   Rusty Russell   module: use a str...
2313
2314
  			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...
2315
2316
  			break;
  		case 1: /* RO: text and ro-data */
7523e4dc5   Rusty Russell   module: use a str...
2317
2318
  			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...
2319
  			break;
444d13ff1   Jessica Yu   modules: add ro_a...
2320
2321
2322
2323
2324
  		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...
2325
  			mod->core_layout.size = debug_align(mod->core_layout.size);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2326
2327
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2328
  	}
5e1241692   Jim Cromie   module: replace D...
2329
2330
  	pr_debug("Init section allocation order:
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2331
  	for (m = 0; m < ARRAY_SIZE(masks); ++m) {
49668688d   Rusty Russell   module: pass load...
2332
2333
2334
  		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
2335
2336
2337
2338
  
  			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...
2339
  			    || !strstarts(sname, ".init"))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2340
  				continue;
7523e4dc5   Rusty Russell   module: use a str...
2341
  			s->sh_entsize = (get_offset(mod, &mod->init_layout.size, s, i)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2342
  					 | INIT_OFFSET_MASK);
5e1241692   Jim Cromie   module: replace D...
2343
2344
  			pr_debug("\t%s
  ", sname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2345
  		}
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2346
2347
  		switch (m) {
  		case 0: /* executable */
7523e4dc5   Rusty Russell   module: use a str...
2348
2349
  			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...
2350
2351
  			break;
  		case 1: /* RO: text and ro-data */
7523e4dc5   Rusty Russell   module: use a str...
2352
2353
  			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...
2354
  			break;
444d13ff1   Jessica Yu   modules: add ro_a...
2355
2356
2357
2358
2359
2360
2361
2362
  		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...
2363
  			mod->init_layout.size = debug_align(mod->init_layout.size);
84e1c6bb3   Matthieu CASTET   x86: Add RO/NX pr...
2364
2365
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2366
2367
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2368
2369
2370
2371
  static void set_license(struct module *mod, const char *license)
  {
  	if (!license)
  		license = "unspecified";
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
2372
  	if (!license_is_gpl_compatible(license)) {
25ddbb18a   Andi Kleen   Make the taint fl...
2373
  		if (!test_taint(TAINT_PROPRIETARY_MODULE))
bddb12b32   Andrew Morton   kernel/module.c: ...
2374
2375
2376
  			pr_warn("%s: module license '%s' taints kernel.
  ",
  				mod->name, license);
373d4d099   Rusty Russell   taint: add explic...
2377
2378
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
  	}
  }
  
  /* 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;
  }
c5e4a062f   Matthias Maennich   module: support r...
2400
2401
  static char *get_next_modinfo(const struct load_info *info, const char *tag,
  			      char *prev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2402
2403
2404
  {
  	char *p;
  	unsigned int taglen = strlen(tag);
49668688d   Rusty Russell   module: pass load...
2405
2406
  	Elf_Shdr *infosec = &info->sechdrs[info->index.info];
  	unsigned long size = infosec->sh_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2407

5fdc7db64   Jessica Yu   module: setup loa...
2408
2409
2410
2411
  	/*
  	 * get_modinfo() calls made before rewrite_section_headers()
  	 * must use sh_offset, as sh_addr isn't set!
  	 */
c5e4a062f   Matthias Maennich   module: support r...
2412
2413
2414
2415
2416
2417
2418
2419
  	char *modinfo = (char *)info->hdr + infosec->sh_offset;
  
  	if (prev) {
  		size -= prev - modinfo;
  		modinfo = next_string(prev, &size);
  	}
  
  	for (p = modinfo; p; p = next_string(p, &size)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2420
2421
2422
2423
2424
  		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
  			return p + taglen + 1;
  	}
  	return NULL;
  }
c5e4a062f   Matthias Maennich   module: support r...
2425
2426
2427
2428
  static char *get_modinfo(const struct load_info *info, const char *tag)
  {
  	return get_next_modinfo(info, tag, NULL);
  }
49668688d   Rusty Russell   module: pass load...
2429
  static void setup_modinfo(struct module *mod, struct load_info *info)
c988d2b28   Matt Domsch   [PATCH] modules: ...
2430
2431
2432
2433
2434
2435
  {
  	struct module_attribute *attr;
  	int i;
  
  	for (i = 0; (attr = modinfo_attrs[i]); i++) {
  		if (attr->setup)
49668688d   Rusty Russell   module: pass load...
2436
  			attr->setup(mod, get_modinfo(info, attr->attr.name));
c988d2b28   Matt Domsch   [PATCH] modules: ...
2437
2438
  	}
  }
c988d2b28   Matt Domsch   [PATCH] modules: ...
2439

a263f7763   Rusty Russell   module: fix memor...
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
  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
2450
  #ifdef CONFIG_KALLSYMS
15bba37d6   WANG Cong   module: fix build...
2451

2d25bc552   Jessica Yu   module: make it c...
2452
2453
2454
2455
  /* Lookup exported symbol in given range of kernel_symbols */
  static const struct kernel_symbol *lookup_exported_symbol(const char *name,
  							  const struct kernel_symbol *start,
  							  const struct kernel_symbol *stop)
15bba37d6   WANG Cong   module: fix build...
2456
  {
9d63487f8   Alessio Igor Bogani   module: Use binar...
2457
2458
  	return bsearch(name, start, stop - start,
  			sizeof(struct kernel_symbol), cmp_name);
15bba37d6   WANG Cong   module: fix build...
2459
  }
ca4787b77   Tim Abbott   kernel/module.c: ...
2460
2461
  static int is_exported(const char *name, unsigned long value,
  		       const struct module *mod)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2462
  {
ca4787b77   Tim Abbott   kernel/module.c: ...
2463
2464
  	const struct kernel_symbol *ks;
  	if (!mod)
2d25bc552   Jessica Yu   module: make it c...
2465
  		ks = lookup_exported_symbol(name, __start___ksymtab, __stop___ksymtab);
3fd6805f4   Sam Ravnborg   [PATCH] Clean up ...
2466
  	else
2d25bc552   Jessica Yu   module: make it c...
2467
  		ks = lookup_exported_symbol(name, mod->syms, mod->syms + mod->num_syms);
7290d5809   Ard Biesheuvel   module: use relat...
2468
  	return ks != NULL && kernel_symbol_value(ks) == value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2469
2470
2471
  }
  
  /* As per nm */
eded41c1c   Rusty Russell   module: kallsyms ...
2472
  static char elf_type(const Elf_Sym *sym, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2473
  {
eded41c1c   Rusty Russell   module: kallsyms ...
2474
  	const Elf_Shdr *sechdrs = info->sechdrs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2475
2476
2477
2478
2479
2480
2481
2482
  	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...
2483
  	if (sym->st_shndx == SHN_ABS || sym->st_shndx == info->index.pcpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
  		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 ...
2504
2505
  	if (strstarts(info->secstrings + sechdrs[sym->st_shndx].sh_name,
  		      ".debug")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2506
  		return 'n';
eded41c1c   Rusty Russell   module: kallsyms ...
2507
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2508
2509
  	return '?';
  }
4a4962263   Jan Beulich   module: reduce sy...
2510
  static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs,
e02244185   Miroslav Benes   module: keep perc...
2511
  			unsigned int shnum, unsigned int pcpundx)
4a4962263   Jan Beulich   module: reduce sy...
2512
2513
2514
2515
2516
2517
2518
  {
  	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...
2519
2520
2521
2522
  #ifdef CONFIG_KALLSYMS_ALL
  	if (src->st_shndx == pcpundx)
  		return true;
  #endif
4a4962263   Jan Beulich   module: reduce sy...
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
  	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...
2533
2534
2535
2536
2537
2538
2539
  /*
   * 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...
2540
  static void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2541
  {
49668688d   Rusty Russell   module: pass load...
2542
2543
  	Elf_Shdr *symsect = info->sechdrs + info->index.sym;
  	Elf_Shdr *strsect = info->sechdrs + info->index.str;
4a4962263   Jan Beulich   module: reduce sy...
2544
  	const Elf_Sym *src;
54523ec71   Satoru Takeuchi   module: Remove a ...
2545
  	unsigned int i, nsrc, ndst, strtab_size = 0;
4a4962263   Jan Beulich   module: reduce sy...
2546
2547
2548
  
  	/* Put symbol section at end of init part of module. */
  	symsect->sh_flags |= SHF_ALLOC;
7523e4dc5   Rusty Russell   module: use a str...
2549
  	symsect->sh_entsize = get_offset(mod, &mod->init_layout.size, symsect,
49668688d   Rusty Russell   module: pass load...
2550
  					 info->index.sym) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2551
2552
  	pr_debug("\t%s
  ", info->secstrings + symsect->sh_name);
4a4962263   Jan Beulich   module: reduce sy...
2553

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

48fd11880   Kevin Cernekee   module: Fix perfo...
2557
  	/* Compute total space required for the core symbols' strtab. */
59ef28b1f   Rusty Russell   module: fix out-b...
2558
  	for (ndst = i = 0; i < nsrc; i++) {
1ce15ef4f   Jessica Yu   module: preserve ...
2559
  		if (i == 0 || is_livepatch_module(mod) ||
e02244185   Miroslav Benes   module: keep perc...
2560
2561
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
  				   info->index.pcpu)) {
59ef28b1f   Rusty Russell   module: fix out-b...
2562
  			strtab_size += strlen(&info->strtab[src[i].st_name])+1;
48fd11880   Kevin Cernekee   module: Fix perfo...
2563
  			ndst++;
554bdfe5a   Jan Beulich   module: reduce st...
2564
  		}
59ef28b1f   Rusty Russell   module: fix out-b...
2565
  	}
4a4962263   Jan Beulich   module: reduce sy...
2566
2567
  
  	/* Append room for core symbols at end of core part. */
7523e4dc5   Rusty Russell   module: use a str...
2568
2569
2570
  	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;
1c7651f43   Eugene Loh   kallsyms: store t...
2571
2572
  	info->core_typeoffs = mod->core_layout.size;
  	mod->core_layout.size += ndst * sizeof(char);
7523e4dc5   Rusty Russell   module: use a str...
2573
  	mod->core_layout.size = debug_align(mod->core_layout.size);
4a4962263   Jan Beulich   module: reduce sy...
2574

554bdfe5a   Jan Beulich   module: reduce st...
2575
2576
  	/* Put string table section at end of init part of module. */
  	strsect->sh_flags |= SHF_ALLOC;
7523e4dc5   Rusty Russell   module: use a str...
2577
  	strsect->sh_entsize = get_offset(mod, &mod->init_layout.size, strsect,
49668688d   Rusty Russell   module: pass load...
2578
  					 info->index.str) | INIT_OFFSET_MASK;
5e1241692   Jim Cromie   module: replace D...
2579
2580
  	pr_debug("\t%s
  ", info->secstrings + strsect->sh_name);
8244062ef   Rusty Russell   modules: fix long...
2581
2582
2583
2584
2585
2586
  
  	/* 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);
1c7651f43   Eugene Loh   kallsyms: store t...
2587
2588
  	info->init_typeoffs = mod->init_layout.size;
  	mod->init_layout.size += nsrc * sizeof(char);
8244062ef   Rusty Russell   modules: fix long...
2589
  	mod->init_layout.size = debug_align(mod->init_layout.size);
4a4962263   Jan Beulich   module: reduce sy...
2590
  }
8244062ef   Rusty Russell   modules: fix long...
2591
2592
2593
2594
2595
  /*
   * 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...
2596
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2597
  {
4a4962263   Jan Beulich   module: reduce sy...
2598
2599
2600
  	unsigned int i, ndst;
  	const Elf_Sym *src;
  	Elf_Sym *dst;
554bdfe5a   Jan Beulich   module: reduce st...
2601
  	char *s;
eded41c1c   Rusty Russell   module: kallsyms ...
2602
  	Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2603

8244062ef   Rusty Russell   modules: fix long...
2604
2605
2606
2607
2608
  	/* 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...
2609
  	/* Make sure we get permanent strtab: don't use info->strtab. */
8244062ef   Rusty Russell   modules: fix long...
2610
  	mod->kallsyms->strtab = (void *)info->sechdrs[info->index.str].sh_addr;
1c7651f43   Eugene Loh   kallsyms: store t...
2611
  	mod->kallsyms->typetab = mod->init_layout.base + info->init_typeoffs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2612

1c7651f43   Eugene Loh   kallsyms: store t...
2613
2614
2615
2616
  	/*
  	 * Now populate the cut down core kallsyms for after init
  	 * and set types up while we still have access to sections.
  	 */
8244062ef   Rusty Russell   modules: fix long...
2617
2618
  	mod->core_kallsyms.symtab = dst = mod->core_layout.base + info->symoffs;
  	mod->core_kallsyms.strtab = s = mod->core_layout.base + info->stroffs;
1c7651f43   Eugene Loh   kallsyms: store t...
2619
  	mod->core_kallsyms.typetab = mod->core_layout.base + info->core_typeoffs;
8244062ef   Rusty Russell   modules: fix long...
2620
2621
  	src = mod->kallsyms->symtab;
  	for (ndst = i = 0; i < mod->kallsyms->num_symtab; i++) {
1c7651f43   Eugene Loh   kallsyms: store t...
2622
  		mod->kallsyms->typetab[i] = elf_type(src + i, info);
1ce15ef4f   Jessica Yu   module: preserve ...
2623
  		if (i == 0 || is_livepatch_module(mod) ||
e02244185   Miroslav Benes   module: keep perc...
2624
2625
  		    is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
  				   info->index.pcpu)) {
1c7651f43   Eugene Loh   kallsyms: store t...
2626
2627
  			mod->core_kallsyms.typetab[ndst] =
  			    mod->kallsyms->typetab[i];
59ef28b1f   Rusty Russell   module: fix out-b...
2628
  			dst[ndst] = src[i];
8244062ef   Rusty Russell   modules: fix long...
2629
2630
  			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...
2631
2632
  				     KSYM_NAME_LEN) + 1;
  		}
4a4962263   Jan Beulich   module: reduce sy...
2633
  	}
8244062ef   Rusty Russell   modules: fix long...
2634
  	mod->core_kallsyms.num_symtab = ndst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2635
2636
  }
  #else
49668688d   Rusty Russell   module: pass load...
2637
  static inline void layout_symtab(struct module *mod, struct load_info *info)
4a4962263   Jan Beulich   module: reduce sy...
2638
2639
  {
  }
3ae91c21d   Paul Mundt   module: fix up CO...
2640

abbce906d   MichaÅ‚ MirosÅ‚aw   (trivial) Fix com...
2641
  static void add_kallsyms(struct module *mod, const struct load_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2642
2643
2644
  {
  }
  #endif /* CONFIG_KALLSYMS */
527963127   Zhou Chengming   module: fix ddebu...
2645
  static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsigned int num)
346e15beb   Jason Baron   driver core: basi...
2646
  {
811d66a0e   Rusty Russell   module: group pos...
2647
2648
  	if (!debug)
  		return;
513770f54   Rasmus Villemoes   dynamic_debug: mo...
2649
  	ddebug_add_module(debug, num, mod->name);
5e458cc0f   Rusty Russell   module: simplify ...
2650
  }
346e15beb   Jason Baron   driver core: basi...
2651

527963127   Zhou Chengming   module: fix ddebu...
2652
  static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug)
ff49d74ad   Yehuda Sadeh   module: initializ...
2653
2654
  {
  	if (debug)
527963127   Zhou Chengming   module: fix ddebu...
2655
  		ddebug_remove_module(mod->name);
ff49d74ad   Yehuda Sadeh   module: initializ...
2656
  }
74e08fcf7   Jonas Bonn   modules: add defa...
2657
2658
  void * __weak module_alloc(unsigned long size)
  {
82fab442f   Rusty Russell   modules: don't ha...
2659
  	return vmalloc_exec(size);
74e08fcf7   Jonas Bonn   modules: add defa...
2660
  }
38b37d631   Matthias Schiffer   module: allow arc...
2661
2662
2663
2664
  bool __weak module_exit_section(const char *name)
  {
  	return strstarts(name, ".exit");
  }
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2665
  #ifdef CONFIG_DEBUG_KMEMLEAK
49668688d   Rusty Russell   module: pass load...
2666
2667
  static void kmemleak_load_module(const struct module *mod,
  				 const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2668
2669
2670
2671
  {
  	unsigned int i;
  
  	/* only scan the sections containing data */
c017b4be3   Catalin Marinas   kmemleak: Simplif...
2672
  	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2673

49668688d   Rusty Russell   module: pass load...
2674
  	for (i = 1; i < info->hdr->e_shnum; i++) {
06c9494c0   Steven Rostedt   kmemleak: Scan al...
2675
2676
2677
2678
  		/* 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...
2679
  			continue;
49668688d   Rusty Russell   module: pass load...
2680
2681
  		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
  				   info->sechdrs[i].sh_size, GFP_KERNEL);
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2682
2683
2684
  	}
  }
  #else
49668688d   Rusty Russell   module: pass load...
2685
2686
  static inline void kmemleak_load_module(const struct module *mod,
  					const struct load_info *info)
4f2294b6d   Catalin Marinas   kmemleak: Add mod...
2687
2688
2689
  {
  }
  #endif
106a4ee25   Rusty Russell   module: signature...
2690
  #ifdef CONFIG_MODULE_SIG
bca014caa   Ben Hutchings   module: Invalidat...
2691
  static int module_sig_check(struct load_info *info, int flags)
106a4ee25   Rusty Russell   module: signature...
2692
  {
49fcf732b   David Howells   lockdown: Enforce...
2693
  	int err = -ENODATA;
34e1169d9   Kees Cook   module: add sysca...
2694
  	const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1;
49fcf732b   David Howells   lockdown: Enforce...
2695
  	const char *reason;
34e1169d9   Kees Cook   module: add sysca...
2696
  	const void *mod = info->hdr;
caabe2405   David Howells   MODSIGN: Move the...
2697

bca014caa   Ben Hutchings   module: Invalidat...
2698
2699
2700
2701
2702
2703
  	/*
  	 * 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...
2704
  	    memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) {
caabe2405   David Howells   MODSIGN: Move the...
2705
  		/* We truncate the module to discard the signature */
34e1169d9   Kees Cook   module: add sysca...
2706
  		info->len -= markerlen;
f314dfea1   Jessica Yu   modsign: log modu...
2707
  		err = mod_verify_sig(mod, info);
106a4ee25   Rusty Russell   module: signature...
2708
  	}
49fcf732b   David Howells   lockdown: Enforce...
2709
2710
  	switch (err) {
  	case 0:
106a4ee25   Rusty Russell   module: signature...
2711
2712
  		info->sig_ok = true;
  		return 0;
106a4ee25   Rusty Russell   module: signature...
2713

49fcf732b   David Howells   lockdown: Enforce...
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
  		/* We don't permit modules to be loaded into trusted kernels
  		 * without a valid signature on them, but if we're not
  		 * enforcing, certain errors are non-fatal.
  		 */
  	case -ENODATA:
  		reason = "Loading of unsigned module";
  		goto decide;
  	case -ENOPKG:
  		reason = "Loading of module with unsupported crypto";
  		goto decide;
  	case -ENOKEY:
  		reason = "Loading of module with unavailable key";
  	decide:
  		if (is_module_sig_enforced()) {
  			pr_notice("%s is rejected
  ", reason);
  			return -EKEYREJECTED;
  		}
106a4ee25   Rusty Russell   module: signature...
2732

49fcf732b   David Howells   lockdown: Enforce...
2733
2734
2735
2736
2737
2738
2739
2740
2741
  		return security_locked_down(LOCKDOWN_MODULE_SIGNATURE);
  
  		/* All other errors are fatal, including nomem, unparseable
  		 * signatures and signature check failures - even if signatures
  		 * aren't required.
  		 */
  	default:
  		return err;
  	}
106a4ee25   Rusty Russell   module: signature...
2742
2743
  }
  #else /* !CONFIG_MODULE_SIG */
bca014caa   Ben Hutchings   module: Invalidat...
2744
  static int module_sig_check(struct load_info *info, int flags)
106a4ee25   Rusty Russell   module: signature...
2745
2746
2747
2748
  {
  	return 0;
  }
  #endif /* !CONFIG_MODULE_SIG */
34e1169d9   Kees Cook   module: add sysca...
2749
2750
  /* Sanity checks against invalid binaries, wrong arch, weird elf version. */
  static int elf_header_check(struct load_info *info)
40dd2560e   Rusty Russell   module: refactor ...
2751
  {
34e1169d9   Kees Cook   module: add sysca...
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
  	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 ...
2765

34e1169d9   Kees Cook   module: add sysca...
2766
2767
  	return 0;
  }
3afe9f849   Linus Torvalds   Copy the kernel m...
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
  #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 ...
2784
  #ifdef CONFIG_LIVEPATCH
2992ef29a   Josh Poimboeuf   livepatch/module:...
2785
  static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
1ce15ef4f   Jessica Yu   module: preserve ...
2786
  {
2992ef29a   Josh Poimboeuf   livepatch/module:...
2787
2788
2789
  	if (get_modinfo(info, "livepatch")) {
  		mod->klp = true;
  		add_taint_module(mod, TAINT_LIVEPATCH, LOCKDEP_STILL_OK);
7598d167d   Joe Lawrence   livepatch/module:...
2790
2791
2792
  		pr_notice_once("%s: tainting kernel with TAINT_LIVEPATCH
  ",
  			       mod->name);
2992ef29a   Josh Poimboeuf   livepatch/module:...
2793
  	}
1ce15ef4f   Jessica Yu   module: preserve ...
2794
2795
2796
2797
  
  	return 0;
  }
  #else /* !CONFIG_LIVEPATCH */
2992ef29a   Josh Poimboeuf   livepatch/module:...
2798
  static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
1ce15ef4f   Jessica Yu   module: preserve ...
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
  {
  	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 */
caf7501a1   Andi Kleen   module/retpoline:...
2809
2810
2811
2812
2813
2814
2815
2816
2817
  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...
2818
2819
2820
  /* 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 ...
2821
2822
  {
  	int err;
40dd2560e   Rusty Russell   module: refactor ...
2823

34e1169d9   Kees Cook   module: add sysca...
2824
2825
  	info->len = len;
  	if (info->len < sizeof(*(info->hdr)))
40dd2560e   Rusty Russell   module: refactor ...
2826
  		return -ENOEXEC;
c77b8cdf7   Mimi Zohar   module: replace t...
2827
  	err = security_kernel_load_data(LOADING_MODULE);
2e72d51b4   Kees Cook   security: introdu...
2828
2829
  	if (err)
  		return err;
40dd2560e   Rusty Russell   module: refactor ...
2830
  	/* Suck in entire file: we'll want most of it. */
cc9e605dc   Kirill A. Shutemov   module: do not pr...
2831
  	info->hdr = __vmalloc(info->len,
19809c2da   Michal Hocko   mm, vmalloc: use ...
2832
  			GFP_KERNEL | __GFP_NOWARN, PAGE_KERNEL);
34e1169d9   Kees Cook   module: add sysca...
2833
  	if (!info->hdr)
40dd2560e   Rusty Russell   module: refactor ...
2834
  		return -ENOMEM;
3afe9f849   Linus Torvalds   Copy the kernel m...
2835
  	if (copy_chunked_from_user(info->hdr, umod, info->len) != 0) {
34e1169d9   Kees Cook   module: add sysca...
2836
2837
  		vfree(info->hdr);
  		return -EFAULT;
40dd2560e   Rusty Russell   module: refactor ...
2838
  	}
34e1169d9   Kees Cook   module: add sysca...
2839
2840
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
2841
2842
  static void free_copy(struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
2843
2844
  	vfree(info->hdr);
  }
2f3238aeb   Rusty Russell   module: add flags...
2845
  static int rewrite_section_headers(struct load_info *info, int flags)
8b5f61a79   Rusty Russell   module: refactor ...
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
  {
  	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: ...
2856
2857
  			pr_err("Module len %lu truncated
  ", info->len);
8b5f61a79   Rusty Russell   module: refactor ...
2858
2859
2860
2861
2862
2863
2864
2865
2866
  			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 */
38b37d631   Matthias Schiffer   module: allow arc...
2867
  		if (module_exit_section(info->secstrings+shdr->sh_name))
8b5f61a79   Rusty Russell   module: refactor ...
2868
2869
  			shdr->sh_flags &= ~(unsigned long)SHF_ALLOC;
  #endif
8b5f61a79   Rusty Russell   module: refactor ...
2870
  	}
d6df72a06   Rusty Russell   module: refactor ...
2871
2872
  
  	/* Track but don't keep modinfo and version sections. */
3e2e857f9   Kees Cook   module: Add modul...
2873
  	info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC;
d6df72a06   Rusty Russell   module: refactor ...
2874
  	info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC;
3e2e857f9   Kees Cook   module: Add modul...
2875

8b5f61a79   Rusty Russell   module: refactor ...
2876
2877
  	return 0;
  }
3264d3f9d   Linus Torvalds   module: add load_...
2878
2879
2880
2881
2882
  /*
   * Set up our basic convenience variables (pointers to section headers,
   * search for module section index etc), and do some basic section
   * verification.
   *
81a0abd9f   Jessica Yu   module: make it c...
2883
2884
   * Set info->mod to the temporary copy of the module in info->hdr. The final one
   * will be allocated in move_module().
3264d3f9d   Linus Torvalds   module: add load_...
2885
   */
81a0abd9f   Jessica Yu   module: make it c...
2886
  static int setup_load_info(struct load_info *info, int flags)
3264d3f9d   Linus Torvalds   module: add load_...
2887
2888
  {
  	unsigned int i;
3264d3f9d   Linus Torvalds   module: add load_...
2889
2890
2891
  
  	/* Set up the convenience variables */
  	info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
8b5f61a79   Rusty Russell   module: refactor ...
2892
2893
  	info->secstrings = (void *)info->hdr
  		+ info->sechdrs[info->hdr->e_shstrndx].sh_offset;
3264d3f9d   Linus Torvalds   module: add load_...
2894

5fdc7db64   Jessica Yu   module: setup loa...
2895
2896
  	/* Try to find a name early so we can log errors with a module name */
  	info->index.info = find_sec(info, ".modinfo");
496d6c021   Jessica Yu   module: avoid set...
2897
  	if (info->index.info)
5fdc7db64   Jessica Yu   module: setup loa...
2898
  		info->name = get_modinfo(info, "name");
3264d3f9d   Linus Torvalds   module: add load_...
2899

8b5f61a79   Rusty Russell   module: refactor ...
2900
2901
  	/* Find internal symbols and strings. */
  	for (i = 1; i < info->hdr->e_shnum; i++) {
3264d3f9d   Linus Torvalds   module: add load_...
2902
2903
2904
  		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 ...
2905
2906
2907
  			info->strtab = (char *)info->hdr
  				+ info->sechdrs[info->index.str].sh_offset;
  			break;
3264d3f9d   Linus Torvalds   module: add load_...
2908
  		}
3264d3f9d   Linus Torvalds   module: add load_...
2909
  	}
5fdc7db64   Jessica Yu   module: setup loa...
2910
  	if (info->index.sym == 0) {
496d6c021   Jessica Yu   module: avoid set...
2911
2912
2913
  		pr_warn("%s: module has no symbols (stripped?)
  ",
  			info->name ?: "(missing .modinfo section or name field)");
5fdc7db64   Jessica Yu   module: setup loa...
2914
2915
  		return -ENOEXEC;
  	}
49668688d   Rusty Russell   module: pass load...
2916
  	info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
3264d3f9d   Linus Torvalds   module: add load_...
2917
  	if (!info->index.mod) {
3e2e857f9   Kees Cook   module: Add modul...
2918
2919
  		pr_warn("%s: No module found in object
  ",
496d6c021   Jessica Yu   module: avoid set...
2920
  			info->name ?: "(missing .modinfo section or name field)");
81a0abd9f   Jessica Yu   module: make it c...
2921
  		return -ENOEXEC;
3264d3f9d   Linus Torvalds   module: add load_...
2922
2923
  	}
  	/* This is temporary: point mod into copy of data. */
5fdc7db64   Jessica Yu   module: setup loa...
2924
  	info->mod = (void *)info->hdr + info->sechdrs[info->index.mod].sh_offset;
3264d3f9d   Linus Torvalds   module: add load_...
2925

3e2e857f9   Kees Cook   module: Add modul...
2926
  	/*
5fdc7db64   Jessica Yu   module: setup loa...
2927
  	 * If we didn't load the .modinfo 'name' field earlier, fall back to
3e2e857f9   Kees Cook   module: Add modul...
2928
2929
2930
  	 * on-disk struct mod 'name' field.
  	 */
  	if (!info->name)
81a0abd9f   Jessica Yu   module: make it c...
2931
  		info->name = info->mod->name;
3e2e857f9   Kees Cook   module: Add modul...
2932

5fdc7db64   Jessica Yu   module: setup loa...
2933
2934
2935
2936
  	if (flags & MODULE_INIT_IGNORE_MODVERSIONS)
  		info->index.vers = 0; /* Pretend no __versions section! */
  	else
  		info->index.vers = find_sec(info, "__versions");
3264d3f9d   Linus Torvalds   module: add load_...
2937

49668688d   Rusty Russell   module: pass load...
2938
  	info->index.pcpu = find_pcpusec(info);
3264d3f9d   Linus Torvalds   module: add load_...
2939

81a0abd9f   Jessica Yu   module: make it c...
2940
  	return 0;
3264d3f9d   Linus Torvalds   module: add load_...
2941
  }
2f3238aeb   Rusty Russell   module: add flags...
2942
  static int check_modinfo(struct module *mod, struct load_info *info, int flags)
40dd2560e   Rusty Russell   module: refactor ...
2943
  {
49668688d   Rusty Russell   module: pass load...
2944
  	const char *modmagic = get_modinfo(info, "vermagic");
40dd2560e   Rusty Russell   module: refactor ...
2945
  	int err;
2f3238aeb   Rusty Russell   module: add flags...
2946
2947
  	if (flags & MODULE_INIT_IGNORE_VERMAGIC)
  		modmagic = NULL;
40dd2560e   Rusty Russell   module: refactor ...
2948
2949
2950
2951
2952
  	/* 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...
2953
  	} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
bddb12b32   Andrew Morton   kernel/module.c: ...
2954
2955
  		pr_err("%s: version magic '%s' should be '%s'
  ",
3e2e857f9   Kees Cook   module: Add modul...
2956
  		       info->name, modmagic, vermagic);
40dd2560e   Rusty Russell   module: refactor ...
2957
2958
  		return -ENOEXEC;
  	}
3205c36cf   Libor Pechacek   module: Issue war...
2959
2960
2961
2962
2963
  	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...
2964
  		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
3205c36cf   Libor Pechacek   module: Issue war...
2965
  	}
2449b8ba0   Ben Hutchings   module,bug: Add T...
2966

caf7501a1   Andi Kleen   module/retpoline:...
2967
  	check_modinfo_retpoline(mod, info);
49668688d   Rusty Russell   module: pass load...
2968
  	if (get_modinfo(info, "staging")) {
373d4d099   Rusty Russell   taint: add explic...
2969
  		add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
bddb12b32   Andrew Morton   kernel/module.c: ...
2970
2971
2972
  		pr_warn("%s: module is from the staging directory, the quality "
  			"is unknown, you have been warned.
  ", mod->name);
40dd2560e   Rusty Russell   module: refactor ...
2973
  	}
22e268ebe   Rusty Russell   module: refactor ...
2974

2992ef29a   Josh Poimboeuf   livepatch/module:...
2975
  	err = check_modinfo_livepatch(mod, info);
1ce15ef4f   Jessica Yu   module: preserve ...
2976
2977
  	if (err)
  		return err;
22e268ebe   Rusty Russell   module: refactor ...
2978
  	/* Set up license info based on the info section */
49668688d   Rusty Russell   module: pass load...
2979
  	set_license(mod, get_modinfo(info, "license"));
22e268ebe   Rusty Russell   module: refactor ...
2980

40dd2560e   Rusty Russell   module: refactor ...
2981
2982
  	return 0;
  }
eb3057df7   Frantisek Hrbata   kernel: add suppo...
2983
  static int find_module_sections(struct module *mod, struct load_info *info)
f91a13bb9   Linus Torvalds   module: refactor ...
2984
  {
49668688d   Rusty Russell   module: pass load...
2985
  	mod->kp = section_objs(info, "__param",
f91a13bb9   Linus Torvalds   module: refactor ...
2986
  			       sizeof(*mod->kp), &mod->num_kp);
49668688d   Rusty Russell   module: pass load...
2987
  	mod->syms = section_objs(info, "__ksymtab",
f91a13bb9   Linus Torvalds   module: refactor ...
2988
  				 sizeof(*mod->syms), &mod->num_syms);
49668688d   Rusty Russell   module: pass load...
2989
2990
  	mod->crcs = section_addr(info, "__kcrctab");
  	mod->gpl_syms = section_objs(info, "__ksymtab_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
2991
2992
  				     sizeof(*mod->gpl_syms),
  				     &mod->num_gpl_syms);
49668688d   Rusty Russell   module: pass load...
2993
2994
  	mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");
  	mod->gpl_future_syms = section_objs(info,
f91a13bb9   Linus Torvalds   module: refactor ...
2995
2996
2997
  					    "__ksymtab_gpl_future",
  					    sizeof(*mod->gpl_future_syms),
  					    &mod->num_gpl_future_syms);
49668688d   Rusty Russell   module: pass load...
2998
  	mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future");
f91a13bb9   Linus Torvalds   module: refactor ...
2999
3000
  
  #ifdef CONFIG_UNUSED_SYMBOLS
49668688d   Rusty Russell   module: pass load...
3001
  	mod->unused_syms = section_objs(info, "__ksymtab_unused",
f91a13bb9   Linus Torvalds   module: refactor ...
3002
3003
  					sizeof(*mod->unused_syms),
  					&mod->num_unused_syms);
49668688d   Rusty Russell   module: pass load...
3004
3005
  	mod->unused_crcs = section_addr(info, "__kcrctab_unused");
  	mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",
f91a13bb9   Linus Torvalds   module: refactor ...
3006
3007
  					    sizeof(*mod->unused_gpl_syms),
  					    &mod->num_unused_gpl_syms);
49668688d   Rusty Russell   module: pass load...
3008
  	mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
f91a13bb9   Linus Torvalds   module: refactor ...
3009
3010
  #endif
  #ifdef CONFIG_CONSTRUCTORS
49668688d   Rusty Russell   module: pass load...
3011
  	mod->ctors = section_objs(info, ".ctors",
f91a13bb9   Linus Torvalds   module: refactor ...
3012
  				  sizeof(*mod->ctors), &mod->num_ctors);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
3013
3014
3015
3016
3017
3018
3019
3020
  	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...
3021
3022
  		pr_warn("%s: has both .ctors and .init_array.
  ",
eb3057df7   Frantisek Hrbata   kernel: add suppo...
3023
3024
3025
  		       mod->name);
  		return -EINVAL;
  	}
f91a13bb9   Linus Torvalds   module: refactor ...
3026
3027
3028
  #endif
  
  #ifdef CONFIG_TRACEPOINTS
654986462   Mathieu Desnoyers   tracepoints: Fix ...
3029
3030
3031
  	mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
  					     sizeof(*mod->tracepoints_ptrs),
  					     &mod->num_tracepoints);
f91a13bb9   Linus Torvalds   module: refactor ...
3032
  #endif
fe15b50cd   Paul E. McKenney   srcu: Allocate pe...
3033
3034
3035
3036
3037
  #ifdef CONFIG_TREE_SRCU
  	mod->srcu_struct_ptrs = section_objs(info, "___srcu_struct_ptrs",
  					     sizeof(*mod->srcu_struct_ptrs),
  					     &mod->num_srcu_structs);
  #endif
a38d1107f   Matt Mullins   bpf: support raw ...
3038
3039
3040
3041
3042
  #ifdef CONFIG_BPF_EVENTS
  	mod->bpf_raw_events = section_objs(info, "__bpf_raw_tp_map",
  					   sizeof(*mod->bpf_raw_events),
  					   &mod->num_bpf_raw_events);
  #endif
e9666d10a   Masahiro Yamada   jump_label: move ...
3043
  #ifdef CONFIG_JUMP_LABEL
bf5438fca   Jason Baron   jump label: Base ...
3044
3045
3046
3047
  	mod->jump_entries = section_objs(info, "__jump_table",
  					sizeof(*mod->jump_entries),
  					&mod->num_jump_entries);
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
3048
  #ifdef CONFIG_EVENT_TRACING
49668688d   Rusty Russell   module: pass load...
3049
  	mod->trace_events = section_objs(info, "_ftrace_events",
f91a13bb9   Linus Torvalds   module: refactor ...
3050
3051
  					 sizeof(*mod->trace_events),
  					 &mod->num_trace_events);
99be647c5   Jeremy Linton   trace: rename str...
3052
3053
3054
  	mod->trace_evals = section_objs(info, "_ftrace_eval_map",
  					sizeof(*mod->trace_evals),
  					&mod->num_trace_evals);
f91a13bb9   Linus Torvalds   module: refactor ...
3055
  #endif
13b9b6e74   Steven Rostedt   tracing: Fix modu...
3056
3057
3058
3059
  #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...
3060
  #endif
f91a13bb9   Linus Torvalds   module: refactor ...
3061
3062
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  	/* sechdrs[0].sh_size is always zero */
49668688d   Rusty Russell   module: pass load...
3063
  	mod->ftrace_callsites = section_objs(info, "__mcount_loc",
f91a13bb9   Linus Torvalds   module: refactor ...
3064
3065
3066
  					     sizeof(*mod->ftrace_callsites),
  					     &mod->num_ftrace_callsites);
  #endif
540adea38   Masami Hiramatsu   error-injection: ...
3067
3068
3069
3070
  #ifdef CONFIG_FUNCTION_ERROR_INJECTION
  	mod->ei_funcs = section_objs(info, "_error_injection_whitelist",
  					    sizeof(*mod->ei_funcs),
  					    &mod->num_ei_funcs);
92ace9991   Josef Bacik   add infrastructur...
3071
  #endif
811d66a0e   Rusty Russell   module: group pos...
3072
3073
  	mod->extable = section_objs(info, "__ex_table",
  				    sizeof(*mod->extable), &mod->num_exentries);
49668688d   Rusty Russell   module: pass load...
3074
  	if (section_addr(info, "__obsparm"))
bddb12b32   Andrew Morton   kernel/module.c: ...
3075
3076
  		pr_warn("%s: Ignoring obsolete parameters
  ", mod->name);
811d66a0e   Rusty Russell   module: group pos...
3077
3078
3079
  
  	info->debug = section_objs(info, "__verbose",
  				   sizeof(*info->debug), &info->num_debug);
eb3057df7   Frantisek Hrbata   kernel: add suppo...
3080
3081
  
  	return 0;
f91a13bb9   Linus Torvalds   module: refactor ...
3082
  }
49668688d   Rusty Russell   module: pass load...
3083
  static int move_module(struct module *mod, struct load_info *info)
65b8a9b4d   Linus Torvalds   module: refactor ...
3084
3085
3086
3087
3088
  {
  	int i;
  	void *ptr;
  
  	/* Do the allocs. */
7523e4dc5   Rusty Russell   module: use a str...
3089
  	ptr = module_alloc(mod->core_layout.size);
65b8a9b4d   Linus Torvalds   module: refactor ...
3090
3091
3092
3093
3094
3095
3096
  	/*
  	 * 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...
3097
  		return -ENOMEM;
65b8a9b4d   Linus Torvalds   module: refactor ...
3098

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

7523e4dc5   Rusty Russell   module: use a str...
3102
3103
  	if (mod->init_layout.size) {
  		ptr = module_alloc(mod->init_layout.size);
82fab442f   Rusty Russell   modules: don't ha...
3104
3105
3106
3107
3108
3109
3110
3111
  		/*
  		 * 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...
3112
  			module_memfree(mod->core_layout.base);
82fab442f   Rusty Russell   modules: don't ha...
3113
3114
  			return -ENOMEM;
  		}
7523e4dc5   Rusty Russell   module: use a str...
3115
3116
  		memset(ptr, 0, mod->init_layout.size);
  		mod->init_layout.base = ptr;
82fab442f   Rusty Russell   modules: don't ha...
3117
  	} else
7523e4dc5   Rusty Russell   module: use a str...
3118
  		mod->init_layout.base = NULL;
65b8a9b4d   Linus Torvalds   module: refactor ...
3119
3120
  
  	/* Transfer each section which specifies SHF_ALLOC */
5e1241692   Jim Cromie   module: replace D...
3121
3122
  	pr_debug("final section addresses:
  ");
49668688d   Rusty Russell   module: pass load...
3123
  	for (i = 0; i < info->hdr->e_shnum; i++) {
65b8a9b4d   Linus Torvalds   module: refactor ...
3124
  		void *dest;
49668688d   Rusty Russell   module: pass load...
3125
  		Elf_Shdr *shdr = &info->sechdrs[i];
65b8a9b4d   Linus Torvalds   module: refactor ...
3126

49668688d   Rusty Russell   module: pass load...
3127
  		if (!(shdr->sh_flags & SHF_ALLOC))
65b8a9b4d   Linus Torvalds   module: refactor ...
3128
  			continue;
49668688d   Rusty Russell   module: pass load...
3129
  		if (shdr->sh_entsize & INIT_OFFSET_MASK)
7523e4dc5   Rusty Russell   module: use a str...
3130
  			dest = mod->init_layout.base
49668688d   Rusty Russell   module: pass load...
3131
  				+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);
65b8a9b4d   Linus Torvalds   module: refactor ...
3132
  		else
7523e4dc5   Rusty Russell   module: use a str...
3133
  			dest = mod->core_layout.base + shdr->sh_entsize;
65b8a9b4d   Linus Torvalds   module: refactor ...
3134

49668688d   Rusty Russell   module: pass load...
3135
3136
  		if (shdr->sh_type != SHT_NOBITS)
  			memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
65b8a9b4d   Linus Torvalds   module: refactor ...
3137
  		/* Update sh_addr to point to copy in image. */
49668688d   Rusty Russell   module: pass load...
3138
  		shdr->sh_addr = (unsigned long)dest;
5e1241692   Jim Cromie   module: replace D...
3139
3140
3141
  		pr_debug("\t0x%lx %s
  ",
  			 (long)shdr->sh_addr, info->secstrings + shdr->sh_name);
65b8a9b4d   Linus Torvalds   module: refactor ...
3142
  	}
d913188c7   Rusty Russell   module: layout_an...
3143
3144
  
  	return 0;
65b8a9b4d   Linus Torvalds   module: refactor ...
3145
  }
49668688d   Rusty Russell   module: pass load...
3146
  static int check_module_license_and_versions(struct module *mod)
22e268ebe   Rusty Russell   module: refactor ...
3147
  {
3205c36cf   Libor Pechacek   module: Issue war...
3148
  	int prev_taint = test_taint(TAINT_PROPRIETARY_MODULE);
22e268ebe   Rusty Russell   module: refactor ...
3149
3150
3151
3152
3153
3154
  	/*
  	 * 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...
3155
  		add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
3156
3157
3158
  
  	/* driverloader was caught wrongly pretending to be under GPL */
  	if (strcmp(mod->name, "driverloader") == 0)
373d4d099   Rusty Russell   taint: add explic...
3159
3160
  		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
  				 LOCKDEP_NOW_UNRELIABLE);
22e268ebe   Rusty Russell   module: refactor ...
3161

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

3205c36cf   Libor Pechacek   module: Issue war...
3167
3168
3169
  	if (!prev_taint && test_taint(TAINT_PROPRIETARY_MODULE))
  		pr_warn("%s: module license taints kernel.
  ", mod->name);
22e268ebe   Rusty Russell   module: refactor ...
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
  #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...
3199
3200
3201
3202
3203
3204
  	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 ...
3205
3206
3207
  
  	set_fs(old_fs);
  }
74e08fcf7   Jonas Bonn   modules: add defa...
3208
3209
3210
3211
3212
3213
3214
  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...
3215
3216
  /* module_blacklist is a comma-separated list of module names */
  static char *module_blacklist;
96b5b1945   Luis R. Rodriguez   module: make the ...
3217
  static bool blacklisted(const char *module_name)
be7de5f91   Prarit Bhargava   modules: Add kern...
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
  {
  	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...
3235
  static struct module *layout_and_allocate(struct load_info *info, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3236
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3237
  	struct module *mod;
444d13ff1   Jessica Yu   modules: add ro_a...
3238
  	unsigned int ndx;
d913188c7   Rusty Russell   module: layout_an...
3239
  	int err;
3ae91c21d   Paul Mundt   module: fix up CO...
3240

81a0abd9f   Jessica Yu   module: make it c...
3241
  	err = check_modinfo(info->mod, info, flags);
40dd2560e   Rusty Russell   module: refactor ...
3242
3243
  	if (err)
  		return ERR_PTR(err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3244

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3245
  	/* Allow arches to frob section contents and sizes.  */
49668688d   Rusty Russell   module: pass load...
3246
  	err = module_frob_arch_sections(info->hdr, info->sechdrs,
81a0abd9f   Jessica Yu   module: make it c...
3247
  					info->secstrings, info->mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3248
  	if (err < 0)
8d8022e8a   Rusty Russell   module: do percpu...
3249
  		return ERR_PTR(err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3250

8d8022e8a   Rusty Russell   module: do percpu...
3251
3252
  	/* 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
3253

444d13ff1   Jessica Yu   modules: add ro_a...
3254
3255
3256
3257
3258
3259
3260
3261
  	/*
  	 * 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;
e872267b8   Ard Biesheuvel   jump_table: Move ...
3262
3263
3264
3265
3266
3267
3268
3269
3270
  	/*
  	 * Mark the __jump_table section as ro_after_init as well: these data
  	 * structures are never modified, with the exception of entries that
  	 * refer to code in the __init section, which are annotated as such
  	 * at module load time.
  	 */
  	ndx = find_sec(info, "__jump_table");
  	if (ndx)
  		info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT;
444d13ff1   Jessica Yu   modules: add ro_a...
3271

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3272
3273
3274
  	/* 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. */
81a0abd9f   Jessica Yu   module: make it c...
3275
3276
  	layout_sections(info->mod, info);
  	layout_symtab(info->mod, info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3277

65b8a9b4d   Linus Torvalds   module: refactor ...
3278
  	/* Allocate and move to the final place */
81a0abd9f   Jessica Yu   module: make it c...
3279
  	err = move_module(info->mod, info);
d913188c7   Rusty Russell   module: layout_an...
3280
  	if (err)
8d8022e8a   Rusty Russell   module: do percpu...
3281
  		return ERR_PTR(err);
d913188c7   Rusty Russell   module: layout_an...
3282
3283
3284
  
  	/* 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...
3285
  	kmemleak_load_module(mod, info);
d913188c7   Rusty Russell   module: layout_an...
3286
  	return mod;
d913188c7   Rusty Russell   module: layout_an...
3287
3288
3289
3290
3291
  }
  
  /* mod is no longer valid after this! */
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
d913188c7   Rusty Russell   module: layout_an...
3292
  	percpu_modfree(mod);
d453cded0   Rusty Russell   module_arch_freei...
3293
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
3294
3295
  	module_memfree(mod->init_layout.base);
  	module_memfree(mod->core_layout.base);
d913188c7   Rusty Russell   module: layout_an...
3296
  }
74e08fcf7   Jonas Bonn   modules: add defa...
3297
3298
3299
3300
3301
3302
  int __weak module_finalize(const Elf_Ehdr *hdr,
  			   const Elf_Shdr *sechdrs,
  			   struct module *me)
  {
  	return 0;
  }
811d66a0e   Rusty Russell   module: group pos...
3303
3304
  static int post_relocation(struct module *mod, const struct load_info *info)
  {
51f3d0f47   Rusty Russell   module: cleanup c...
3305
  	/* Sort exception table now relocations are done. */
811d66a0e   Rusty Russell   module: group pos...
3306
3307
3308
3309
3310
  	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...
3311
  	/* Setup kallsyms-specific fields. */
811d66a0e   Rusty Russell   module: group pos...
3312
3313
3314
3315
3316
  	add_kallsyms(mod, info);
  
  	/* Arch-specific module finalizing. */
  	return module_finalize(info->hdr, info->sechdrs, mod);
  }
9bb9c3be5   Rusty Russell   module: wait when...
3317
3318
3319
3320
3321
  /* 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...
3322
3323
3324
3325
3326
3327
  	/*
  	 * 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...
3328
  	mutex_lock(&module_mutex);
4f6de4d51   Mathias Krause   module: don't mod...
3329
  	mod = find_module_all(name, strlen(name), true);
6e6de3dee   Prarit Bhargava   kernel/module.c: ...
3330
  	ret = !mod || mod->state == MODULE_STATE_LIVE;
9bb9c3be5   Rusty Russell   module: wait when...
3331
3332
3333
3334
  	mutex_unlock(&module_mutex);
  
  	return ret;
  }
34e1169d9   Kees Cook   module: add sysca...
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
  /* 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 ...
3345
3346
  /* For freeing module_init on success, in case kallsyms traversing */
  struct mod_initfree {
1a7b7d922   Rick Edgecombe   modules: Use vmal...
3347
  	struct llist_node node;
c74963790   Rusty Russell   module: fix race ...
3348
3349
  	void *module_init;
  };
1a7b7d922   Rick Edgecombe   modules: Use vmal...
3350
  static void do_free_init(struct work_struct *w)
c74963790   Rusty Russell   module: fix race ...
3351
  {
1a7b7d922   Rick Edgecombe   modules: Use vmal...
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
  	struct llist_node *pos, *n, *list;
  	struct mod_initfree *initfree;
  
  	list = llist_del_all(&init_free_list);
  
  	synchronize_rcu();
  
  	llist_for_each_safe(pos, n, list) {
  		initfree = container_of(pos, struct mod_initfree, node);
  		module_memfree(initfree->module_init);
  		kfree(initfree);
  	}
c74963790   Rusty Russell   module: fix race ...
3364
  }
1a7b7d922   Rick Edgecombe   modules: Use vmal...
3365
3366
3367
3368
3369
3370
3371
  static int __init modules_wq_init(void)
  {
  	INIT_WORK(&init_free_wq, do_free_init);
  	init_llist_head(&init_free_list);
  	return 0;
  }
  module_init(modules_wq_init);
be02a1862   Jan Kiszka   kernel/module.c: ...
3372
3373
3374
3375
3376
3377
3378
  /*
   * 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...
3379
3380
  {
  	int ret = 0;
c74963790   Rusty Russell   module: fix race ...
3381
3382
3383
3384
3385
3386
3387
  	struct mod_initfree *freeinit;
  
  	freeinit = kmalloc(sizeof(*freeinit), GFP_KERNEL);
  	if (!freeinit) {
  		ret = -ENOMEM;
  		goto fail;
  	}
7523e4dc5   Rusty Russell   module: use a str...
3388
  	freeinit->module_init = mod->init_layout.base;
34e1169d9   Kees Cook   module: add sysca...
3389

774a1221e   Tejun Heo   module, async: as...
3390
3391
3392
3393
3394
  	/*
  	 * 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...
3395
3396
3397
3398
3399
  	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 ...
3400
  		goto fail_free_freeinit;
34e1169d9   Kees Cook   module: add sysca...
3401
3402
  	}
  	if (ret > 0) {
bddb12b32   Andrew Morton   kernel/module.c: ...
3403
3404
3405
3406
3407
3408
  		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...
3409
3410
3411
3412
3413
3414
3415
  		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...
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
  	/*
  	 * 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 ...
3433
  	if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
774a1221e   Tejun Heo   module, async: as...
3434
  		async_synchronize_full();
34e1169d9   Kees Cook   module: add sysca...
3435

aba4b5c22   Steven Rostedt (VMware)   ftrace: Save modu...
3436
  	ftrace_free_mem(mod, mod->init_layout.base, mod->init_layout.base +
3e234289f   Steven Rostedt (VMware)   ftrace: Allow mod...
3437
  			mod->init_layout.size);
34e1169d9   Kees Cook   module: add sysca...
3438
3439
3440
3441
3442
  	mutex_lock(&module_mutex);
  	/* Drop initial reference. */
  	module_put(mod);
  	trim_init_extable(mod);
  #ifdef CONFIG_KALLSYMS
8244062ef   Rusty Russell   modules: fix long...
3443
3444
  	/* 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...
3445
  #endif
444d13ff1   Jessica Yu   modules: add ro_a...
3446
  	module_enable_ro(mod, true);
93c2e105f   Peter Zijlstra   module: Optimize ...
3447
  	mod_tree_remove_init(mod);
d453cded0   Rusty Russell   module_arch_freei...
3448
  	module_arch_freeing_init(mod);
7523e4dc5   Rusty Russell   module: use a str...
3449
3450
3451
  	mod->init_layout.base = NULL;
  	mod->init_layout.size = 0;
  	mod->init_layout.ro_size = 0;
444d13ff1   Jessica Yu   modules: add ro_a...
3452
  	mod->init_layout.ro_after_init_size = 0;
7523e4dc5   Rusty Russell   module: use a str...
3453
  	mod->init_layout.text_size = 0;
c74963790   Rusty Russell   module: fix race ...
3454
3455
  	/*
  	 * We want to free module_init, but be aware that kallsyms may be
0be964be0   Peter Zijlstra   module: Sanitize ...
3456
  	 * walking this with preempt disabled.  In all the failure paths, we
cb2f55369   Paul E. McKenney   modules: Replace ...
3457
  	 * call synchronize_rcu(), but we don't want to slow down the success
1a7b7d922   Rick Edgecombe   modules: Use vmal...
3458
3459
3460
  	 * path. module_memfree() cannot be called in an interrupt, so do the
  	 * work and call synchronize_rcu() in a work queue.
  	 *
ae646f0b9   Jeffrey Hugo   init: fix false p...
3461
3462
3463
3464
  	 * 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
cb2f55369   Paul E. McKenney   modules: Replace ...
3465
  	 * rcu_barrier()
c74963790   Rusty Russell   module: fix race ...
3466
  	 */
1a7b7d922   Rick Edgecombe   modules: Use vmal...
3467
3468
  	if (llist_add(&freeinit->node, &init_free_list))
  		schedule_work(&init_free_wq);
34e1169d9   Kees Cook   module: add sysca...
3469
3470
3471
3472
  	mutex_unlock(&module_mutex);
  	wake_up_all(&module_wq);
  
  	return 0;
c74963790   Rusty Russell   module: fix race ...
3473
3474
3475
3476
3477
3478
  
  fail_free_freeinit:
  	kfree(freeinit);
  fail:
  	/* Try to protect us from buggy refcounters. */
  	mod->state = MODULE_STATE_GOING;
cb2f55369   Paul E. McKenney   modules: Replace ...
3479
  	synchronize_rcu();
c74963790   Rusty Russell   module: fix race ...
3480
3481
3482
  	module_put(mod);
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
7e545d6ec   Jessica Yu   livepatch/module:...
3483
  	klp_module_going(mod);
7dcd182be   Jessica Yu   ftrace/module: re...
3484
  	ftrace_release_mod(mod);
c74963790   Rusty Russell   module: fix race ...
3485
3486
3487
  	free_module(mod);
  	wake_up_all(&module_wq);
  	return ret;
34e1169d9   Kees Cook   module: add sysca...
3488
3489
3490
3491
3492
3493
3494
3495
3496
  }
  
  static int may_init_module(void)
  {
  	if (!capable(CAP_SYS_MODULE) || modules_disabled)
  		return -EPERM;
  
  	return 0;
  }
a3535c7e4   Rusty Russell   module: clean up ...
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
  /*
   * 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...
3511
3512
  	old = find_module_all(mod->name, strlen(mod->name), true);
  	if (old != NULL) {
6e6de3dee   Prarit Bhargava   kernel/module.c: ...
3513
  		if (old->state != MODULE_STATE_LIVE) {
a3535c7e4   Rusty Russell   module: clean up ...
3514
3515
  			/* Wait in case it fails to load. */
  			mutex_unlock(&module_mutex);
9cc019b8c   Peter Zijlstra   module: Replace o...
3516
3517
  			err = wait_event_interruptible(module_wq,
  					       finished_loading(mod->name));
a3535c7e4   Rusty Russell   module: clean up ...
3518
3519
3520
3521
3522
3523
3524
  			if (err)
  				goto out_unlocked;
  			goto again;
  		}
  		err = -EEXIST;
  		goto out;
  	}
4f666546d   Peter Zijlstra   module: Rework mo...
3525
  	mod_update_bounds(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3526
  	list_add_rcu(&mod->list, &modules);
93c2e105f   Peter Zijlstra   module: Optimize ...
3527
  	mod_tree_insert(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
  	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). */
2d25bc552   Jessica Yu   module: make it c...
3543
  	err = verify_exported_symbols(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3544
3545
3546
3547
3548
  	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...
3549
  	module_enable_ro(mod, false);
85c898db6   Rusty Russell   module: clean up ...
3550
  	module_enable_nx(mod);
2eef1399a   Yang Yingliang   modules: fix BUG ...
3551
  	module_enable_x(mod);
4982223e5   Rusty Russell   module: set nx be...
3552

a3535c7e4   Rusty Russell   module: clean up ...
3553
3554
3555
  	/* 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...
3556
  	mutex_unlock(&module_mutex);
4982223e5   Rusty Russell   module: set nx be...
3557
  	return 0;
a3535c7e4   Rusty Russell   module: clean up ...
3558
3559
3560
3561
3562
  
  out:
  	mutex_unlock(&module_mutex);
  	return err;
  }
4c973d162   Jessica Yu   modules: split pa...
3563
3564
  static int prepare_coming_module(struct module *mod)
  {
7e545d6ec   Jessica Yu   livepatch/module:...
3565
  	int err;
4c973d162   Jessica Yu   modules: split pa...
3566
  	ftrace_module_enable(mod);
7e545d6ec   Jessica Yu   livepatch/module:...
3567
3568
3569
  	err = klp_module_coming(mod);
  	if (err)
  		return err;
4c973d162   Jessica Yu   modules: split pa...
3570
3571
3572
3573
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_COMING, mod);
  	return 0;
  }
ecc861705   Luis R. Rodriguez   module: add extra...
3574
3575
  static int unknown_module_param_cb(char *param, char *val, const char *modname,
  				   void *arg)
54041d8a7   Rusty Russell   modules: don't fa...
3576
  {
f2411da74   Luis R. Rodriguez   driver-core: add ...
3577
3578
3579
3580
3581
3582
3583
  	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...
3584
  	/* Check for magic 'dyndbg' arg */
f2411da74   Luis R. Rodriguez   driver-core: add ...
3585
  	ret = ddebug_dyndbg_module_param_cb(param, val, modname);
bddb12b32   Andrew Morton   kernel/module.c: ...
3586
3587
3588
  	if (ret != 0)
  		pr_warn("%s: unknown parameter '%s' ignored
  ", modname, param);
54041d8a7   Rusty Russell   modules: don't fa...
3589
3590
  	return 0;
  }
d913188c7   Rusty Russell   module: layout_an...
3591
3592
  /* 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...
3593
3594
  static int load_module(struct load_info *info, const char __user *uargs,
  		       int flags)
d913188c7   Rusty Russell   module: layout_an...
3595
  {
a3535c7e4   Rusty Russell   module: clean up ...
3596
  	struct module *mod;
5fdc7db64   Jessica Yu   module: setup loa...
3597
  	long err = 0;
51e158c12   Rusty Russell   param: hand argum...
3598
  	char *after_dashes;
d913188c7   Rusty Russell   module: layout_an...
3599

5fdc7db64   Jessica Yu   module: setup loa...
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
  	err = elf_header_check(info);
  	if (err)
  		goto free_copy;
  
  	err = setup_load_info(info, flags);
  	if (err)
  		goto free_copy;
  
  	if (blacklisted(info->name)) {
  		err = -EPERM;
  		goto free_copy;
  	}
bca014caa   Ben Hutchings   module: Invalidat...
3612
  	err = module_sig_check(info, flags);
34e1169d9   Kees Cook   module: add sysca...
3613
3614
  	if (err)
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3615

5fdc7db64   Jessica Yu   module: setup loa...
3616
  	err = rewrite_section_headers(info, flags);
d913188c7   Rusty Russell   module: layout_an...
3617
  	if (err)
34e1169d9   Kees Cook   module: add sysca...
3618
  		goto free_copy;
d913188c7   Rusty Russell   module: layout_an...
3619

5fdc7db64   Jessica Yu   module: setup loa...
3620
3621
3622
3623
3624
  	/* Check module struct version now, before we try to use module. */
  	if (!check_modstruct_version(info, info->mod)) {
  		err = -ENOEXEC;
  		goto free_copy;
  	}
d913188c7   Rusty Russell   module: layout_an...
3625
  	/* Figure out module layout, and allocate all the memory. */
2f3238aeb   Rusty Russell   module: add flags...
3626
  	mod = layout_and_allocate(info, flags);
65b8a9b4d   Linus Torvalds   module: refactor ...
3627
3628
  	if (IS_ERR(mod)) {
  		err = PTR_ERR(mod);
d913188c7   Rusty Russell   module: layout_an...
3629
  		goto free_copy;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3630
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3631

ca86cad73   Richard Guy Briggs   audit: log module...
3632
  	audit_log_kern_module(mod->name);
a3535c7e4   Rusty Russell   module: clean up ...
3633
3634
3635
  	/* Reserve our place in the list. */
  	err = add_unformed_module(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3636
  		goto free_module;
1fb9341ac   Rusty Russell   module: put modul...
3637

106a4ee25   Rusty Russell   module: signature...
3638
  #ifdef CONFIG_MODULE_SIG
34e1169d9   Kees Cook   module: add sysca...
3639
  	mod->sig_ok = info->sig_ok;
64748a2c9   Rusty Russell   module: printk me...
3640
  	if (!mod->sig_ok) {
bddb12b32   Andrew Morton   kernel/module.c: ...
3641
  		pr_notice_once("%s: module verification failed: signature "
ab92ebbb8   Marcel Holtmann   module: Remove do...
3642
  			       "and/or required key missing - tainting "
bddb12b32   Andrew Morton   kernel/module.c: ...
3643
3644
  			       "kernel
  ", mod->name);
66cc69e34   Mathieu Desnoyers   Fix: module signa...
3645
  		add_taint_module(mod, TAINT_UNSIGNED_MODULE, LOCKDEP_STILL_OK);
64748a2c9   Rusty Russell   module: printk me...
3646
  	}
106a4ee25   Rusty Russell   module: signature...
3647
  #endif
8d8022e8a   Rusty Russell   module: do percpu...
3648
  	/* To avoid stressing percpu allocator, do this once we're unique. */
9eb76d779   Rusty Russell   module: cleanup c...
3649
  	err = percpu_modalloc(mod, info);
8d8022e8a   Rusty Russell   module: do percpu...
3650
3651
  	if (err)
  		goto unlink_mod;
49668688d   Rusty Russell   module: pass load...
3652
  	/* Now module is in final location, initialize linked lists, etc. */
9f85a4bbb   Rusty Russell   module: refactor ...
3653
3654
  	err = module_unload_init(mod);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3655
  		goto unlink_mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3656

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

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

49668688d   Rusty Russell   module: pass load...
3665
  	err = check_module_license_and_versions(mod);
22e268ebe   Rusty Russell   module: refactor ...
3666
3667
  	if (err)
  		goto free_unload;
9841d61d7   Dave Jones   [PATCH] Add taint...
3668

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

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

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

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

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

6526c534b   Rusty Russell   module: move modu...
3687
3688
3689
3690
3691
3692
  	/* 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...
3693

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

a949ae560   Steven Rostedt (Red Hat)   ftrace/module: Ha...
3696
3697
  	/* Ftrace init must be called in the MODULE_STATE_UNFORMED state */
  	ftrace_module_init(mod);
a3535c7e4   Rusty Russell   module: clean up ...
3698
3699
3700
  	/* Finally it's fully formed, ready to start executing. */
  	err = complete_formation(mod, info);
  	if (err)
1fb9341ac   Rusty Russell   module: put modul...
3701
  		goto ddebug_cleanup;
be593f4ce   Rusty Russell   module: verify_ex...
3702

4c973d162   Jessica Yu   modules: split pa...
3703
3704
3705
  	err = prepare_coming_module(mod);
  	if (err)
  		goto bug_cleanup;
51f3d0f47   Rusty Russell   module: cleanup c...
3706
  	/* Module is ready to execute: parsing args may do that. */
51e158c12   Rusty Russell   param: hand argum...
3707
  	after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
4355efbd8   Luis R. Rodriguez   modules: fix modp...
3708
  				  -32768, 32767, mod,
ecc861705   Luis R. Rodriguez   module: add extra...
3709
  				  unknown_module_param_cb);
51e158c12   Rusty Russell   param: hand argum...
3710
3711
  	if (IS_ERR(after_dashes)) {
  		err = PTR_ERR(after_dashes);
4c973d162   Jessica Yu   modules: split pa...
3712
  		goto coming_cleanup;
51e158c12   Rusty Russell   param: hand argum...
3713
3714
3715
3716
3717
  	} else if (after_dashes) {
  		pr_warn("%s: parameters '%s' after `--' ignored
  ",
  		       mod->name, after_dashes);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3718

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

1ce15ef4f   Jessica Yu   module: preserve ...
3724
3725
3726
3727
3728
  	if (is_livepatch_module(mod)) {
  		err = copy_module_elf(mod, info);
  		if (err < 0)
  			goto sysfs_cleanup;
  	}
48fd11880   Kevin Cernekee   module: Fix perfo...
3729
  	/* Get rid of temporary copy. */
34e1169d9   Kees Cook   module: add sysca...
3730
  	free_copy(info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3731
3732
  
  	/* Done! */
51f3d0f47   Rusty Russell   module: cleanup c...
3733
  	trace_module_load(mod);
34e1169d9   Kees Cook   module: add sysca...
3734
3735
  
  	return do_init_module(mod);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3736

1ce15ef4f   Jessica Yu   module: preserve ...
3737
3738
   sysfs_cleanup:
  	mod_sysfs_teardown(mod);
4c973d162   Jessica Yu   modules: split pa...
3739
   coming_cleanup:
885a78d4a   Aaron Tomlin   module: Ensure a ...
3740
  	mod->state = MODULE_STATE_GOING;
a5544880a   Luis R. Rodriguez   module: fix memor...
3741
  	destroy_params(mod->kp, mod->num_kp);
4c973d162   Jessica Yu   modules: split pa...
3742
3743
  	blocking_notifier_call_chain(&module_notify_list,
  				     MODULE_STATE_GOING, mod);
7e545d6ec   Jessica Yu   livepatch/module:...
3744
  	klp_module_going(mod);
1fb9341ac   Rusty Russell   module: put modul...
3745
3746
   bug_cleanup:
  	/* module_bug_cleanup needs module_mutex protection */
75676500f   Rusty Russell   module: make lock...
3747
  	mutex_lock(&module_mutex);
5336377d6   Linus Torvalds   modules: Fix modu...
3748
  	module_bug_cleanup(mod);
ee61abb32   Linus Torvalds   module: fix missi...
3749
  	mutex_unlock(&module_mutex);
ff7e0055b   Andy Lutomirski   module: Clean up ...
3750

a3535c7e4   Rusty Russell   module: clean up ...
3751
   ddebug_cleanup:
1323eac7f   Namit Gupta   ftrace/module: Mo...
3752
  	ftrace_release_mod(mod);
527963127   Zhou Chengming   module: fix ddebu...
3753
  	dynamic_debug_remove(mod, info->debug);
cb2f55369   Paul E. McKenney   modules: Replace ...
3754
  	synchronize_rcu();
6526c534b   Rusty Russell   module: move modu...
3755
3756
  	kfree(mod->args);
   free_arch_cleanup:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3757
  	module_arch_cleanup(mod);
d913188c7   Rusty Russell   module: layout_an...
3758
   free_modinfo:
a263f7763   Rusty Russell   module: fix memor...
3759
  	free_modinfo(mod);
22e268ebe   Rusty Russell   module: refactor ...
3760
   free_unload:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3761
  	module_unload_free(mod);
1fb9341ac   Rusty Russell   module: put modul...
3762
3763
3764
3765
   unlink_mod:
  	mutex_lock(&module_mutex);
  	/* Unlink carefully: kallsyms could be walking list. */
  	list_del_rcu(&mod->list);
758556bdc   Peter Zijlstra   module: Fix load_...
3766
  	mod_tree_remove(mod);
1fb9341ac   Rusty Russell   module: put modul...
3767
  	wake_up_all(&module_wq);
0be964be0   Peter Zijlstra   module: Sanitize ...
3768
  	/* Wait for RCU-sched synchronizing before releasing mod->list. */
cb2f55369   Paul E. McKenney   modules: Replace ...
3769
  	synchronize_rcu();
1fb9341ac   Rusty Russell   module: put modul...
3770
  	mutex_unlock(&module_mutex);
d913188c7   Rusty Russell   module: layout_an...
3771
   free_module:
35a9393c9   Peter Zijlstra   lockdep: Fix the ...
3772
  	/* Free lock-classes; relies on the preceding sync_rcu() */
7523e4dc5   Rusty Russell   module: use a str...
3773
  	lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size);
35a9393c9   Peter Zijlstra   lockdep: Fix the ...
3774

34e1169d9   Kees Cook   module: add sysca...
3775
  	module_deallocate(mod, info);
d913188c7   Rusty Russell   module: layout_an...
3776
   free_copy:
34e1169d9   Kees Cook   module: add sysca...
3777
3778
  	free_copy(info);
  	return err;
b99b87f70   Peter Oberparleiter   kernel: construct...
3779
  }
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
3780
3781
  SYSCALL_DEFINE3(init_module, void __user *, umod,
  		unsigned long, len, const char __user *, uargs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3782
  {
34e1169d9   Kees Cook   module: add sysca...
3783
3784
  	int err;
  	struct load_info info = { };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3785

34e1169d9   Kees Cook   module: add sysca...
3786
3787
3788
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3789

34e1169d9   Kees Cook   module: add sysca...
3790
3791
3792
  	pr_debug("init_module: umod=%p, len=%lu, uargs=%p
  ",
  	       umod, len, uargs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3793

34e1169d9   Kees Cook   module: add sysca...
3794
3795
3796
  	err = copy_module_from_user(umod, len, &info);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3797

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

2f3238aeb   Rusty Russell   module: add flags...
3801
  SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)
34e1169d9   Kees Cook   module: add sysca...
3802
  {
34e1169d9   Kees Cook   module: add sysca...
3803
  	struct load_info info = { };
a1db74209   Mimi Zohar   module: replace c...
3804
3805
3806
  	loff_t size;
  	void *hdr;
  	int err;
94462ad3b   Steven Rostedt   module: Move RO/N...
3807

34e1169d9   Kees Cook   module: add sysca...
3808
3809
3810
  	err = may_init_module();
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3811

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

2f3238aeb   Rusty Russell   module: add flags...
3815
3816
3817
  	if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
  		      |MODULE_INIT_IGNORE_VERMAGIC))
  		return -EINVAL;
d6de2c80e   Linus Torvalds   async: Fix module...
3818

a1db74209   Mimi Zohar   module: replace c...
3819
3820
  	err = kernel_read_file_from_fd(fd, &hdr, &size, INT_MAX,
  				       READING_MODULE);
34e1169d9   Kees Cook   module: add sysca...
3821
3822
  	if (err)
  		return err;
a1db74209   Mimi Zohar   module: replace c...
3823
3824
  	info.hdr = hdr;
  	info.len = size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3825

2f3238aeb   Rusty Russell   module: add flags...
3826
  	return load_module(&info, uargs, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
  }
  
  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...
3841
3842
  	if (str[0] == '.' && str[1] == 'L')
  		return true;
6c34f1f54   Kyle McMartin   aarch64: filter $...
3843
  	return str[0] == '$' && strchr("axtd", str[1])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3844
3845
  	       && (str[2] == '\0' || str[2] == '.');
  }
2d25bc552   Jessica Yu   module: make it c...
3846
  static const char *kallsyms_symbol_name(struct mod_kallsyms *kallsyms, unsigned int symnum)
2e7bac536   Rusty Russell   module: wrapper f...
3847
  {
8244062ef   Rusty Russell   modules: fix long...
3848
  	return kallsyms->strtab + kallsyms->symtab[symnum].st_name;
2e7bac536   Rusty Russell   module: wrapper f...
3849
  }
2d25bc552   Jessica Yu   module: make it c...
3850
3851
3852
3853
3854
3855
3856
3857
  /*
   * Given a module and address, find the corresponding symbol and return its name
   * while providing its size and offset if needed.
   */
  static const char *find_kallsyms_symbol(struct module *mod,
  					unsigned long addr,
  					unsigned long *size,
  					unsigned long *offset)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3858
3859
  {
  	unsigned int i, best = 0;
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3860
  	unsigned long nextval, bestval;
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
3863
  
  	/* At worse, next value is at end of module */
a06f6211e   Masami Hiramatsu   module: add withi...
3864
  	if (within_module_init(addr, mod))
7523e4dc5   Rusty Russell   module: use a str...
3865
  		nextval = (unsigned long)mod->init_layout.base+mod->init_layout.text_size;
22a8bdeb5   Daniel Walker   whitespace fixes:...
3866
  	else
7523e4dc5   Rusty Russell   module: use a str...
3867
  		nextval = (unsigned long)mod->core_layout.base+mod->core_layout.text_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3868

93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3869
  	bestval = kallsyms_symbol_value(&kallsyms->symtab[best]);
25985edce   Lucas De Marchi   Fix common misspe...
3870
  	/* Scan for closest preceding symbol, and next symbol. (ELF
22a8bdeb5   Daniel Walker   whitespace fixes:...
3871
  	   starts real symbols at 1). */
8244062ef   Rusty Russell   modules: fix long...
3872
  	for (i = 1; i < kallsyms->num_symtab; i++) {
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3873
3874
3875
3876
  		const Elf_Sym *sym = &kallsyms->symtab[i];
  		unsigned long thisval = kallsyms_symbol_value(sym);
  
  		if (sym->st_shndx == SHN_UNDEF)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3877
3878
3879
3880
  			continue;
  
  		/* We ignore unnamed symbols: they're uninformative
  		 * and inserted at a whim. */
2d25bc552   Jessica Yu   module: make it c...
3881
3882
  		if (*kallsyms_symbol_name(kallsyms, i) == '\0'
  		    || is_arm_mapping_symbol(kallsyms_symbol_name(kallsyms, i)))
2e7bac536   Rusty Russell   module: wrapper f...
3883
  			continue;
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3884
  		if (thisval <= addr && thisval > bestval) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3885
  			best = i;
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3886
3887
3888
3889
  			bestval = thisval;
  		}
  		if (thisval > addr && thisval < nextval)
  			nextval = thisval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3890
3891
3892
3893
  	}
  
  	if (!best)
  		return NULL;
ffb451227   Alexey Dobriyan   Simplify kallsyms...
3894
  	if (size)
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3895
  		*size = nextval - bestval;
ffb451227   Alexey Dobriyan   Simplify kallsyms...
3896
  	if (offset)
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3897
  		*offset = addr - bestval;
2d25bc552   Jessica Yu   module: make it c...
3898
3899
  
  	return kallsyms_symbol_name(kallsyms, best);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3900
  }
b865ea643   Sergey Senozhatsky   sections: split d...
3901
3902
3903
3904
3905
  void * __weak dereference_module_function_descriptor(struct module *mod,
  						     void *ptr)
  {
  	return ptr;
  }
6dd06c9fb   Rusty Russell   module: make modu...
3906
3907
  /* 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...
3908
  const char *module_address_lookup(unsigned long addr,
6dd06c9fb   Rusty Russell   module: make modu...
3909
3910
3911
3912
  			    unsigned long *size,
  			    unsigned long *offset,
  			    char **modname,
  			    char *namebuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3913
  {
cb2a52052   Rusty Russell   modules: de-mutex...
3914
  	const char *ret = NULL;
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3915
  	struct module *mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3916

cb2a52052   Rusty Russell   modules: de-mutex...
3917
  	preempt_disable();
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3918
3919
3920
3921
  	mod = __module_address(addr);
  	if (mod) {
  		if (modname)
  			*modname = mod->name;
2d25bc552   Jessica Yu   module: make it c...
3922
3923
  
  		ret = find_kallsyms_symbol(mod, addr, size, offset);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3924
  	}
6dd06c9fb   Rusty Russell   module: make modu...
3925
3926
3927
3928
3929
  	/* 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...
3930
  	preempt_enable();
b7df4d1b2   Peter Zijlstra   module: Use __mod...
3931

92dfc9dc7   Andrew Morton   fix "modules: mak...
3932
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3933
  }
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3934
3935
3936
  int lookup_module_symbol_name(unsigned long addr, char *symname)
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3937
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3938
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3939
3940
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3941
  		if (within_module(addr, mod)) {
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3942
  			const char *sym;
2d25bc552   Jessica Yu   module: make it c...
3943
  			sym = find_kallsyms_symbol(mod, addr, NULL, NULL);
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3944
3945
  			if (!sym)
  				goto out;
2d25bc552   Jessica Yu   module: make it c...
3946

9281acea6   Tejun Heo   kallsyms: make KS...
3947
  			strlcpy(symname, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3948
  			preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3949
3950
3951
3952
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3953
  	preempt_enable();
9d65cb4a1   Alexey Dobriyan   Fix race between ...
3954
3955
  	return -ERANGE;
  }
a5c43dae7   Alexey Dobriyan   Fix race between ...
3956
3957
3958
3959
  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...
3960
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3961
  	list_for_each_entry_rcu(mod, &modules, list) {
0d21b0e34   Rusty Russell   module: add new s...
3962
3963
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
9b20a352d   Petr Mladek   module: add withi...
3964
  		if (within_module(addr, mod)) {
a5c43dae7   Alexey Dobriyan   Fix race between ...
3965
  			const char *sym;
2d25bc552   Jessica Yu   module: make it c...
3966
  			sym = find_kallsyms_symbol(mod, addr, size, offset);
a5c43dae7   Alexey Dobriyan   Fix race between ...
3967
3968
3969
  			if (!sym)
  				goto out;
  			if (modname)
9281acea6   Tejun Heo   kallsyms: make KS...
3970
  				strlcpy(modname, mod->name, MODULE_NAME_LEN);
a5c43dae7   Alexey Dobriyan   Fix race between ...
3971
  			if (name)
9281acea6   Tejun Heo   kallsyms: make KS...
3972
  				strlcpy(name, sym, KSYM_NAME_LEN);
cb2a52052   Rusty Russell   modules: de-mutex...
3973
  			preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3974
3975
3976
3977
  			return 0;
  		}
  	}
  out:
cb2a52052   Rusty Russell   modules: de-mutex...
3978
  	preempt_enable();
a5c43dae7   Alexey Dobriyan   Fix race between ...
3979
3980
  	return -ERANGE;
  }
ea07890a6   Alexey Dobriyan   Fix race between ...
3981
3982
  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
3983
3984
  {
  	struct module *mod;
cb2a52052   Rusty Russell   modules: de-mutex...
3985
  	preempt_disable();
d72b37513   Andi Kleen   Remove stop_machi...
3986
  	list_for_each_entry_rcu(mod, &modules, list) {
8244062ef   Rusty Russell   modules: fix long...
3987
  		struct mod_kallsyms *kallsyms;
0d21b0e34   Rusty Russell   module: add new s...
3988
3989
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
8244062ef   Rusty Russell   modules: fix long...
3990
3991
  		kallsyms = rcu_dereference_sched(mod->kallsyms);
  		if (symnum < kallsyms->num_symtab) {
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
3992
3993
3994
  			const Elf_Sym *sym = &kallsyms->symtab[symnum];
  
  			*value = kallsyms_symbol_value(sym);
1c7651f43   Eugene Loh   kallsyms: store t...
3995
  			*type = kallsyms->typetab[symnum];
2d25bc552   Jessica Yu   module: make it c...
3996
  			strlcpy(name, kallsyms_symbol_name(kallsyms, symnum), KSYM_NAME_LEN);
9281acea6   Tejun Heo   kallsyms: make KS...
3997
  			strlcpy(module_name, mod->name, MODULE_NAME_LEN);
ca4787b77   Tim Abbott   kernel/module.c: ...
3998
  			*exported = is_exported(name, *value, mod);
cb2a52052   Rusty Russell   modules: de-mutex...
3999
  			preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
4000
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4001
  		}
8244062ef   Rusty Russell   modules: fix long...
4002
  		symnum -= kallsyms->num_symtab;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4003
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
4004
  	preempt_enable();
ea07890a6   Alexey Dobriyan   Fix race between ...
4005
  	return -ERANGE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4006
  }
2d25bc552   Jessica Yu   module: make it c...
4007
4008
  /* Given a module and name of symbol, find and return the symbol's value */
  static unsigned long find_kallsyms_symbol_value(struct module *mod, const char *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4009
4010
  {
  	unsigned int i;
8244062ef   Rusty Russell   modules: fix long...
4011
  	struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4012

93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
4013
4014
  	for (i = 0; i < kallsyms->num_symtab; i++) {
  		const Elf_Sym *sym = &kallsyms->symtab[i];
2d25bc552   Jessica Yu   module: make it c...
4015
  		if (strcmp(name, kallsyms_symbol_name(kallsyms, i)) == 0 &&
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
4016
4017
4018
  		    sym->st_shndx != SHN_UNDEF)
  			return kallsyms_symbol_value(sym);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
  	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...
4030
  	preempt_disable();
175861882   Naveen N. Rao   kallsyms: Use bou...
4031
  	if ((colon = strnchr(name, MODULE_NAME_LEN, ':')) != NULL) {
4f6de4d51   Mathias Krause   module: don't mod...
4032
  		if ((mod = find_module_all(name, colon - name, false)) != NULL)
2d25bc552   Jessica Yu   module: make it c...
4033
  			ret = find_kallsyms_symbol_value(mod, colon+1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4034
  	} else {
0d21b0e34   Rusty Russell   module: add new s...
4035
4036
4037
  		list_for_each_entry_rcu(mod, &modules, list) {
  			if (mod->state == MODULE_STATE_UNFORMED)
  				continue;
2d25bc552   Jessica Yu   module: make it c...
4038
  			if ((ret = find_kallsyms_symbol_value(mod, name)) != 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4039
  				break;
0d21b0e34   Rusty Russell   module: add new s...
4040
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4041
  	}
cb2a52052   Rusty Russell   modules: de-mutex...
4042
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4043
4044
  	return ret;
  }
75a66614d   Anders Kaseorg   Ksplice: Add func...
4045
4046
4047
4048
4049
4050
4051
4052
  
  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 ...
4053
  	module_assert_mutex();
75a66614d   Anders Kaseorg   Ksplice: Add func...
4054
  	list_for_each_entry(mod, &modules, list) {
8244062ef   Rusty Russell   modules: fix long...
4055
4056
  		/* We hold module_mutex: no need for rcu_dereference_sched */
  		struct mod_kallsyms *kallsyms = mod->kallsyms;
0d21b0e34   Rusty Russell   module: add new s...
4057
4058
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
8244062ef   Rusty Russell   modules: fix long...
4059
  		for (i = 0; i < kallsyms->num_symtab; i++) {
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
4060
  			const Elf_Sym *sym = &kallsyms->symtab[i];
9f2d1e68c   Jessica Yu   module: exclude S...
4061

93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
4062
  			if (sym->st_shndx == SHN_UNDEF)
9f2d1e68c   Jessica Yu   module: exclude S...
4063
  				continue;
2d25bc552   Jessica Yu   module: make it c...
4064
  			ret = fn(data, kallsyms_symbol_name(kallsyms, i),
93d77e7f1   Vincent Whitchurch   ARM: module: Fix ...
4065
  				 mod, kallsyms_symbol_value(sym));
75a66614d   Anders Kaseorg   Ksplice: Add func...
4066
4067
4068
4069
4070
4071
  			if (ret != 0)
  				return ret;
  		}
  	}
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4072
  #endif /* CONFIG_KALLSYMS */
7fd8329ba   Petr Mladek   taint/module: Cle...
4073
4074
4075
4076
  /* 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...
4077
  static char *module_flags(struct module *mod, char *buf)
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
4078
4079
  {
  	int bx = 0;
0d21b0e34   Rusty Russell   module: add new s...
4080
  	BUG_ON(mod->state == MODULE_STATE_UNFORMED);
21aa9280b   Arjan van de Ven   debug: show being...
4081
4082
4083
  	if (mod->taints ||
  	    mod->state == MODULE_STATE_GOING ||
  	    mod->state == MODULE_STATE_COMING) {
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
4084
  		buf[bx++] = '(';
cca3e7073   Kay Sievers   modules: sysfs - ...
4085
  		bx += module_flags_taint(mod, buf + bx);
21aa9280b   Arjan van de Ven   debug: show being...
4086
4087
4088
4089
4090
4091
  		/* 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...
4092
4093
4094
4095
4096
4097
  		buf[bx++] = ')';
  	}
  	buf[bx] = '\0';
  
  	return buf;
  }
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
  #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
4115
4116
4117
  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...
4118
  	char buf[MODULE_FLAGS_BUF_SIZE];
668533dc0   Linus Torvalds   kallsyms: take ad...
4119
  	void *value;
fa3ba2e81   Florin Malita   [PATCH] fix Modul...
4120

0d21b0e34   Rusty Russell   module: add new s...
4121
4122
4123
  	/* We always ignore unformed modules. */
  	if (mod->state == MODULE_STATE_UNFORMED)
  		return 0;
2f0f2a334   Denys Vlasenko   module: turn long...
4124
  	seq_printf(m, "%s %u",
7523e4dc5   Rusty Russell   module: use a str...
4125
  		   mod->name, mod->init_layout.size + mod->core_layout.size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4126
4127
4128
4129
  	print_unload_info(m, mod);
  
  	/* Informative for users. */
  	seq_printf(m, " %s",
6da0b5651   Ionut Alexa   kernel:module Fix...
4130
4131
  		   mod->state == MODULE_STATE_GOING ? "Unloading" :
  		   mod->state == MODULE_STATE_COMING ? "Loading" :
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4132
4133
  		   "Live");
  	/* Used by oprofile and other similar tools. */
668533dc0   Linus Torvalds   kallsyms: take ad...
4134
4135
  	value = m->private ? NULL : mod->core_layout.base;
  	seq_printf(m, " 0x%px", value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4136

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

6da0b5651   Ionut Alexa   kernel:module Fix...
4141
4142
  	seq_puts(m, "
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4143
4144
4145
4146
4147
4148
4149
4150
  	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/...
4151
  static const struct seq_operations modules_op = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4152
4153
4154
4155
4156
  	.start	= m_start,
  	.next	= m_next,
  	.stop	= m_stop,
  	.show	= m_show
  };
516fb7f2e   Linus Torvalds   /proc/module: use...
4157
4158
4159
4160
4161
4162
4163
  /*
   * This also sets the "private" pointer to non-NULL if the
   * kernel pointers should be hidden (so you can just test
   * "m->private" to see if you should keep the values private).
   *
   * We use the same logic as for /proc/kallsyms.
   */
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
4164
4165
  static int modules_open(struct inode *inode, struct file *file)
  {
516fb7f2e   Linus Torvalds   /proc/module: use...
4166
4167
4168
4169
4170
4171
  	int err = seq_open(file, &modules_op);
  
  	if (!err) {
  		struct seq_file *m = file->private_data;
  		m->private = kallsyms_show_value() ? NULL : (void *)8ul;
  	}
3f553b308   Leon Yu   module: propagate...
4172
  	return err;
3b5d5c6b0   Alexey Dobriyan   proc: move /proc/...
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
  }
  
  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
4189
4190
4191
  /* 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
4192
4193
  	const struct exception_table_entry *e = NULL;
  	struct module *mod;
24da1cbff   Rusty Russell   modules: remove m...
4194
  	preempt_disable();
5ff22646d   Peter Zijlstra   module: Optimize ...
4195
4196
4197
  	mod = __module_address(addr);
  	if (!mod)
  		goto out;
22a8bdeb5   Daniel Walker   whitespace fixes:...
4198

5ff22646d   Peter Zijlstra   module: Optimize ...
4199
4200
4201
4202
  	if (!mod->num_exentries)
  		goto out;
  
  	e = search_extable(mod->extable,
a94c33dd1   Thomas Meyer   lib/extable.c: us...
4203
  			   mod->num_exentries,
5ff22646d   Peter Zijlstra   module: Optimize ...
4204
4205
  			   addr);
  out:
24da1cbff   Rusty Russell   modules: remove m...
4206
  	preempt_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4207

5ff22646d   Peter Zijlstra   module: Optimize ...
4208
4209
4210
4211
  	/*
  	 * 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
4212
4213
  	return e;
  }
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4214
  /*
e610499e2   Rusty Russell   module: __module_...
4215
4216
4217
4218
4219
   * 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: ...
4220
   */
e610499e2   Rusty Russell   module: __module_...
4221
  bool is_module_address(unsigned long addr)
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4222
  {
e610499e2   Rusty Russell   module: __module_...
4223
  	bool ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4224

24da1cbff   Rusty Russell   modules: remove m...
4225
  	preempt_disable();
e610499e2   Rusty Russell   module: __module_...
4226
  	ret = __module_address(addr) != NULL;
24da1cbff   Rusty Russell   modules: remove m...
4227
  	preempt_enable();
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4228

e610499e2   Rusty Russell   module: __module_...
4229
  	return ret;
4d435f9d8   Ingo Molnar   [PATCH] lockdep: ...
4230
  }
e610499e2   Rusty Russell   module: __module_...
4231
4232
4233
4234
4235
4236
4237
  /*
   * __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...
4238
  struct module *__module_address(unsigned long addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4239
4240
  {
  	struct module *mod;
3a642e99b   Rusty Russell   modules: Take a s...
4241
4242
  	if (addr < module_addr_min || addr > module_addr_max)
  		return NULL;
0be964be0   Peter Zijlstra   module: Sanitize ...
4243
  	module_assert_mutex_or_preempt();
6c9692e2d   Peter Zijlstra   module: Make the ...
4244
  	mod = mod_find(addr);
93c2e105f   Peter Zijlstra   module: Optimize ...
4245
4246
  	if (mod) {
  		BUG_ON(!within_module(addr, mod));
0d21b0e34   Rusty Russell   module: add new s...
4247
  		if (mod->state == MODULE_STATE_UNFORMED)
93c2e105f   Peter Zijlstra   module: Optimize ...
4248
  			mod = NULL;
0d21b0e34   Rusty Russell   module: add new s...
4249
  	}
93c2e105f   Peter Zijlstra   module: Optimize ...
4250
  	return mod;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4251
  }
c6b378019   Tim Abbott   module: Export sy...
4252
  EXPORT_SYMBOL_GPL(__module_address);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4253

e610499e2   Rusty Russell   module: __module_...
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
  /*
   * 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...
4285
4286
  		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_...
4287
4288
4289
4290
  			mod = NULL;
  	}
  	return mod;
  }
c6b378019   Tim Abbott   module: Export sy...
4291
  EXPORT_SYMBOL_GPL(__module_text_address);
e610499e2   Rusty Russell   module: __module_...
4292

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4293
4294
4295
4296
  /* Don't grab lock, we're oopsing. */
  void print_modules(void)
  {
  	struct module *mod;
7fd8329ba   Petr Mladek   taint/module: Cle...
4297
  	char buf[MODULE_FLAGS_BUF_SIZE];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4298

b231125af   Linus Torvalds   printk: add KERN_...
4299
  	printk(KERN_DEFAULT "Modules linked in:");
d72b37513   Andi Kleen   Remove stop_machi...
4300
4301
  	/* Most callers should already have preempt disabled, but make sure */
  	preempt_disable();
0d21b0e34   Rusty Russell   module: add new s...
4302
4303
4304
  	list_for_each_entry_rcu(mod, &modules, list) {
  		if (mod->state == MODULE_STATE_UNFORMED)
  			continue;
27bba4d6b   Jiri Slaby   module: use pr_cont
4305
  		pr_cont(" %s%s", mod->name, module_flags(mod, buf));
0d21b0e34   Rusty Russell   module: add new s...
4306
  	}
d72b37513   Andi Kleen   Remove stop_machi...
4307
  	preempt_enable();
e14af7eeb   Arjan van de Ven   debug: track and ...
4308
  	if (last_unloaded_module[0])
27bba4d6b   Jiri Slaby   module: use pr_cont
4309
4310
4311
  		pr_cont(" [last unloaded: %s]", last_unloaded_module);
  	pr_cont("
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4312
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4313
  #ifdef CONFIG_MODVERSIONS
8c8ef42ae   Rusty Russell   module: include o...
4314
4315
4316
4317
4318
4319
  /* 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 ...
4320
  		   struct tracepoint * const *tp)
8c8ef42ae   Rusty Russell   module: include o...
4321
4322
4323
  {
  }
  EXPORT_SYMBOL(module_layout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4324
  #endif