1 #include <linux/config.h>
3 #include <linux/module.h>
4 #include <asm/uaccess.h>
5 #include <linux/vmalloc.h>
6 #include <linux/smp_lock.h>
7 #include <asm/pgalloc.h>
8 #include <linux/init.h>
11 * Originally by Anonymous (as far as I know...)
12 * Linux version by Bas Laarhoven <bas@vimec.nl>
13 * 0.99.14 version by Jon Tombs <jon@gtex02.us.es>,
14 * Heavily modified by Bjorn Ekwall <bj0rn@blox.se> May 1994 (C)
15 * Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996
17 * This source is covered by the GNU GPL, the same as all kernel sources.
20 #ifdef CONFIG_MODULES /* a *big* #ifdef block... */
22 extern struct module_symbol __start___ksymtab
[];
23 extern struct module_symbol __stop___ksymtab
[];
25 extern const struct exception_table_entry __start___ex_table
[];
26 extern const struct exception_table_entry __stop___ex_table
[];
28 static struct module kernel_module
=
30 sizeof(struct module
), /* size_of_struct */
34 {ATOMIC_INIT(1)}, /* usecount */
35 MOD_RUNNING
, /* flags */
36 0, /* nsyms -- to filled in in init_modules */
38 __start___ksymtab
, /* syms */
43 __start___ex_table
, /* ex_table_start */
44 __stop___ex_table
, /* ex_table_end */
48 struct module
*module_list
= &kernel_module
;
50 static long get_mod_name(const char *user_name
, char **buf
);
51 static void put_mod_name(char *buf
);
52 static struct module
*find_module(const char *name
);
53 static void free_module(struct module
*, int tag_freed
);
60 void __init
init_modules(void)
62 kernel_module
.nsyms
= __stop___ksymtab
- __start___ksymtab
;
65 __asm__("stq $29,%0" : "=m"(kernel_module
.gp
));
70 * Copy the name of a module from user space.
74 get_mod_name(const char *user_name
, char **buf
)
79 page
= __get_free_page(GFP_KERNEL
);
83 retval
= strncpy_from_user((char *)page
, user_name
, PAGE_SIZE
);
85 if (retval
< PAGE_SIZE
) {
89 retval
= -ENAMETOOLONG
;
98 put_mod_name(char *buf
)
100 free_page((unsigned long)buf
);
104 * Allocate space for a module.
107 asmlinkage
unsigned long
108 sys_create_module(const char *name_user
, size_t size
)
114 if (!capable(CAP_SYS_MODULE
))
117 if ((namelen
= get_mod_name(name_user
, &name
)) < 0) {
121 if (size
< sizeof(struct module
)+namelen
) {
125 if (find_module(name
) != NULL
) {
129 if ((mod
= (struct module
*)module_map(size
)) == NULL
) {
134 memset(mod
, 0, sizeof(*mod
));
135 mod
->size_of_struct
= sizeof(*mod
);
136 mod
->next
= module_list
;
137 mod
->name
= (char *)(mod
+ 1);
139 memcpy((char*)(mod
+1), name
, namelen
+1);
143 module_list
= mod
; /* link it in */
155 * Initialize a module.
159 sys_init_module(const char *name_user
, struct module
*mod_user
)
161 struct module mod_tmp
, *mod
;
163 long namelen
, n_namelen
, i
, error
;
164 unsigned long mod_user_size
;
165 struct module_ref
*dep
;
167 if (!capable(CAP_SYS_MODULE
))
170 if ((namelen
= get_mod_name(name_user
, &name
)) < 0) {
174 if ((mod
= find_module(name
)) == NULL
) {
179 /* Check module header size. We allow a bit of slop over the
180 size we are familiar with to cope with a version of insmod
181 for a newer kernel. But don't over do it. */
182 if ((error
= get_user(mod_user_size
, &mod_user
->size_of_struct
)) != 0)
184 if (mod_user_size
< (unsigned long)&((struct module
*)0L)->persist_start
185 || mod_user_size
> sizeof(struct module
) + 16*sizeof(void*)) {
186 printk(KERN_ERR
"init_module: Invalid module header size.\n"
187 KERN_ERR
"A new version of the modutils is likely "
193 /* Hold the current contents while we play with the user's idea
197 error
= copy_from_user(mod
, mod_user
, sizeof(struct module
));
203 /* Sanity check the size of the module. */
206 if (mod
->size
> mod_tmp
.size
) {
207 printk(KERN_ERR
"init_module: Size of initialized module "
208 "exceeds size of created module.\n");
212 /* Make sure all interesting pointers are sane. */
214 #define bound(p, n, m) ((unsigned long)(p) >= (unsigned long)(m+1) && \
215 (unsigned long)((p)+(n)) <= (unsigned long)(m) + (m)->size)
217 if (!bound(mod
->name
, namelen
, mod
)) {
218 printk(KERN_ERR
"init_module: mod->name out of bounds.\n");
221 if (mod
->nsyms
&& !bound(mod
->syms
, mod
->nsyms
, mod
)) {
222 printk(KERN_ERR
"init_module: mod->syms out of bounds.\n");
225 if (mod
->ndeps
&& !bound(mod
->deps
, mod
->ndeps
, mod
)) {
226 printk(KERN_ERR
"init_module: mod->deps out of bounds.\n");
229 if (mod
->init
&& !bound(mod
->init
, 0, mod
)) {
230 printk(KERN_ERR
"init_module: mod->init out of bounds.\n");
233 if (mod
->cleanup
&& !bound(mod
->cleanup
, 0, mod
)) {
234 printk(KERN_ERR
"init_module: mod->cleanup out of bounds.\n");
237 if (mod
->ex_table_start
> mod
->ex_table_end
238 || (mod
->ex_table_start
&&
239 !((unsigned long)mod
->ex_table_start
>= (unsigned long)(mod
+1)
240 && ((unsigned long)mod
->ex_table_end
241 < (unsigned long)mod
+ mod
->size
)))
242 || (((unsigned long)mod
->ex_table_start
243 - (unsigned long)mod
->ex_table_end
)
244 % sizeof(struct exception_table_entry
))) {
245 printk(KERN_ERR
"init_module: mod->ex_table_* invalid.\n");
248 if (mod
->flags
& ~MOD_AUTOCLEAN
) {
249 printk(KERN_ERR
"init_module: mod->flags invalid.\n");
253 if (!bound(mod
->gp
- 0x8000, 0, mod
)) {
254 printk(KERN_ERR
"init_module: mod->gp out of bounds.\n");
258 if (mod_member_present(mod
, can_unload
)
259 && mod
->can_unload
&& !bound(mod
->can_unload
, 0, mod
)) {
260 printk(KERN_ERR
"init_module: mod->can_unload out of bounds.\n");
266 /* Check that the user isn't doing something silly with the name. */
268 if ((n_namelen
= get_mod_name(mod
->name
- (unsigned long)mod
269 + (unsigned long)mod_user
,
274 if (namelen
!= n_namelen
|| strcmp(n_name
, mod_tmp
.name
) != 0) {
275 printk(KERN_ERR
"init_module: changed module name to "
277 n_name
, mod_tmp
.name
);
281 /* Ok, that's about all the sanity we can stomach; copy the rest. */
283 if (copy_from_user(mod
+1, mod_user
+1, mod
->size
-sizeof(*mod
))) {
288 /* On some machines it is necessary to do something here
289 to make the I and D caches consistent. */
290 flush_icache_range((unsigned long)mod
, (unsigned long)mod
+ mod
->size
);
292 /* Update module references. */
293 mod
->next
= mod_tmp
.next
;
295 for (i
= 0, dep
= mod
->deps
; i
< mod
->ndeps
; ++i
, ++dep
) {
296 struct module
*o
, *d
= dep
->dep
;
298 /* Make sure the indicated dependencies are really modules. */
300 printk(KERN_ERR
"init_module: self-referential "
301 "dependency in mod->deps.\n");
305 for (o
= module_list
; o
!= &kernel_module
; o
= o
->next
)
306 if (o
== d
) goto found_dep
;
308 printk(KERN_ERR
"init_module: found dependency that is "
309 "(no longer?) a module.\n");
314 dep
->next_ref
= d
->refs
;
316 /* Being referenced by a dependent module counts as a
317 use as far as kmod is concerned. */
318 d
->flags
|= MOD_USED_ONCE
;
321 /* Free our temporary memory. */
322 put_mod_name(n_name
);
325 /* Initialize the module. */
326 atomic_set(&mod
->uc
.usecount
,1);
327 if (mod
->init
&& mod
->init() != 0) {
328 atomic_set(&mod
->uc
.usecount
,0);
332 atomic_dec(&mod
->uc
.usecount
);
334 /* And set it running. */
335 mod
->flags
|= MOD_RUNNING
;
340 put_mod_name(n_name
);
351 sys_delete_module(const char *name_user
)
353 struct module
*mod
, *next
;
356 int something_changed
;
358 if (!capable(CAP_SYS_MODULE
))
363 if ((error
= get_mod_name(name_user
, &name
)) < 0)
371 if ((mod
= find_module(name
)) == NULL
) {
377 if (mod
->refs
!= NULL
|| __MOD_IN_USE(mod
))
385 /* Do automatic reaping */
387 something_changed
= 0;
388 for (mod
= module_list
; mod
!= &kernel_module
; mod
= next
) {
390 if (mod
->refs
== NULL
391 && (mod
->flags
& MOD_AUTOCLEAN
)
392 && (mod
->flags
& MOD_RUNNING
)
393 && !(mod
->flags
& MOD_DELETED
)
394 && (mod
->flags
& MOD_USED_ONCE
)
395 && !__MOD_IN_USE(mod
)) {
396 if ((mod
->flags
& MOD_VISITED
)
397 && !(mod
->flags
& MOD_JUST_FREED
)) {
398 mod
->flags
&= ~MOD_VISITED
;
401 something_changed
= 1;
405 if (something_changed
)
407 for (mod
= module_list
; mod
!= &kernel_module
; mod
= mod
->next
)
408 mod
->flags
&= ~MOD_JUST_FREED
;
415 /* Query various bits about modules. */
418 qm_modules(char *buf
, size_t bufsize
, size_t *ret
)
421 size_t nmod
, space
, len
;
425 for (mod
=module_list
; mod
!= &kernel_module
; mod
=mod
->next
, ++nmod
) {
426 len
= strlen(mod
->name
)+1;
428 goto calc_space_needed
;
429 if (copy_to_user(buf
, mod
->name
, len
))
436 if (put_user(nmod
, ret
))
443 while ((mod
= mod
->next
) != &kernel_module
)
444 space
+= strlen(mod
->name
)+1;
446 if (put_user(space
, ret
))
453 qm_deps(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
455 size_t i
, space
, len
;
457 if (mod
== &kernel_module
)
459 if ((mod
->flags
& (MOD_RUNNING
| MOD_DELETED
)) != MOD_RUNNING
)
460 if (put_user(0, ret
))
466 for (i
= 0; i
< mod
->ndeps
; ++i
) {
467 const char *dep_name
= mod
->deps
[i
].dep
->name
;
469 len
= strlen(dep_name
)+1;
471 goto calc_space_needed
;
472 if (copy_to_user(buf
, dep_name
, len
))
479 if (put_user(i
, ret
))
486 while (++i
< mod
->ndeps
)
487 space
+= strlen(mod
->deps
[i
].dep
->name
)+1;
489 if (put_user(space
, ret
))
496 qm_refs(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
498 size_t nrefs
, space
, len
;
499 struct module_ref
*ref
;
501 if (mod
== &kernel_module
)
503 if ((mod
->flags
& (MOD_RUNNING
| MOD_DELETED
)) != MOD_RUNNING
)
504 if (put_user(0, ret
))
510 for (nrefs
= 0, ref
= mod
->refs
; ref
; ++nrefs
, ref
= ref
->next_ref
) {
511 const char *ref_name
= ref
->ref
->name
;
513 len
= strlen(ref_name
)+1;
515 goto calc_space_needed
;
516 if (copy_to_user(buf
, ref_name
, len
))
523 if (put_user(nrefs
, ret
))
530 while ((ref
= ref
->next_ref
) != NULL
)
531 space
+= strlen(ref
->ref
->name
)+1;
533 if (put_user(space
, ret
))
540 qm_symbols(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
542 size_t i
, space
, len
;
543 struct module_symbol
*s
;
547 if ((mod
->flags
& (MOD_RUNNING
| MOD_DELETED
)) != MOD_RUNNING
)
548 if (put_user(0, ret
))
553 space
= mod
->nsyms
* 2*sizeof(void *);
559 goto calc_space_needed
;
561 if (!access_ok(VERIFY_WRITE
, buf
, space
))
565 vals
= (unsigned long *)buf
;
568 for (; i
< mod
->nsyms
; ++i
, ++s
, vals
+= 2) {
569 len
= strlen(s
->name
)+1;
571 goto calc_space_needed
;
573 if (copy_to_user(strings
, s
->name
, len
)
574 || __put_user(s
->value
, vals
+0)
575 || __put_user(space
, vals
+1))
583 if (put_user(i
, ret
))
589 for (; i
< mod
->nsyms
; ++i
, ++s
)
590 space
+= strlen(s
->name
)+1;
592 if (put_user(space
, ret
))
599 qm_info(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
603 if (mod
== &kernel_module
)
606 if (sizeof(struct module_info
) <= bufsize
) {
607 struct module_info info
;
608 info
.addr
= (unsigned long)mod
;
609 info
.size
= mod
->size
;
610 info
.flags
= mod
->flags
;
611 info
.usecount
= (mod_member_present(mod
, can_unload
)
612 && mod
->can_unload
? -1 : atomic_read(&mod
->uc
.usecount
));
614 if (copy_to_user(buf
, &info
, sizeof(struct module_info
)))
619 if (put_user(sizeof(struct module_info
), ret
))
626 sys_query_module(const char *name_user
, int which
, char *buf
, size_t bufsize
,
633 if (name_user
== NULL
)
634 mod
= &kernel_module
;
639 if ((namelen
= get_mod_name(name_user
, &name
)) < 0) {
645 mod
= &kernel_module
;
646 else if ((mod
= find_module(name
)) == NULL
) {
659 err
= qm_modules(buf
, bufsize
, ret
);
662 err
= qm_deps(mod
, buf
, bufsize
, ret
);
665 err
= qm_refs(mod
, buf
, bufsize
, ret
);
668 err
= qm_symbols(mod
, buf
, bufsize
, ret
);
671 err
= qm_info(mod
, buf
, bufsize
, ret
);
683 * Copy the kernel symbol table to user space. If the argument is
684 * NULL, just return the size of the table.
686 * This call is obsolete. New programs should use query_module+QM_SYMBOLS
687 * which does not arbitrarily limit the length of symbols.
691 sys_get_kernel_syms(struct kernel_sym
*table
)
695 struct kernel_sym ksym
;
698 for (mod
= module_list
, i
= 0; mod
; mod
= mod
->next
) {
699 /* include the count for the module name! */
706 /* So that we don't give the user our stack content */
707 memset (&ksym
, 0, sizeof (ksym
));
709 for (mod
= module_list
, i
= 0; mod
; mod
= mod
->next
) {
710 struct module_symbol
*msym
;
713 if ((mod
->flags
& (MOD_RUNNING
|MOD_DELETED
)) != MOD_RUNNING
)
716 /* magic: write module info as a pseudo symbol */
717 ksym
.value
= (unsigned long)mod
;
719 strncpy(ksym
.name
+1, mod
->name
, sizeof(ksym
.name
)-1);
720 ksym
.name
[sizeof(ksym
.name
)-1] = '\0';
722 if (copy_to_user(table
, &ksym
, sizeof(ksym
)) != 0)
729 for (j
= 0, msym
= mod
->syms
; j
< mod
->nsyms
; ++j
, ++msym
) {
730 ksym
.value
= msym
->value
;
731 strncpy(ksym
.name
, msym
->name
, sizeof(ksym
.name
));
732 ksym
.name
[sizeof(ksym
.name
)-1] = '\0';
734 if (copy_to_user(table
, &ksym
, sizeof(ksym
)) != 0)
745 * Look for a module by name, ignoring modules marked for deletion.
748 static struct module
*
749 find_module(const char *name
)
753 for (mod
= module_list
; mod
; mod
= mod
->next
) {
754 if (mod
->flags
& MOD_DELETED
)
756 if (!strcmp(mod
->name
, name
))
764 * Free the given module.
768 free_module(struct module
*mod
, int tag_freed
)
770 struct module_ref
*dep
;
773 /* Let the module clean up. */
775 mod
->flags
|= MOD_DELETED
;
776 if (mod
->flags
& MOD_RUNNING
)
780 mod
->flags
&= ~MOD_RUNNING
;
783 /* Remove the module from the dependency lists. */
785 for (i
= 0, dep
= mod
->deps
; i
< mod
->ndeps
; ++i
, ++dep
) {
786 struct module_ref
**pp
;
787 for (pp
= &dep
->dep
->refs
; *pp
!= dep
; pp
= &(*pp
)->next_ref
)
790 if (tag_freed
&& dep
->dep
->refs
== NULL
)
791 dep
->dep
->flags
|= MOD_JUST_FREED
;
794 /* And from the main module list. */
796 if (mod
== module_list
) {
797 module_list
= mod
->next
;
800 for (p
= module_list
; p
->next
!= mod
; p
= p
->next
)
805 /* And free the memory. */
811 * Called by the /proc file system to return a current list of modules.
814 int get_module_list(char *p
)
816 size_t left
= PAGE_SIZE
;
819 struct module_ref
*ref
;
821 for (mod
= module_list
; mod
!= &kernel_module
; mod
= mod
->next
) {
825 #define safe_copy_str(str, len) \
829 memcpy(p, str, len); p += len, left -= len; \
831 #define safe_copy_cstr(str) safe_copy_str(str, sizeof(str)-1)
833 len
= strlen(mod
->name
);
834 safe_copy_str(mod
->name
, len
);
836 if ((len
= 20 - len
) > 0) {
844 len
= sprintf(tmpstr
, "%8lu", mod
->size
);
845 safe_copy_str(tmpstr
, len
);
847 if (mod
->flags
& MOD_RUNNING
) {
848 len
= sprintf(tmpstr
, "%4ld",
849 (mod_member_present(mod
, can_unload
)
851 ? -1L : (long)atomic_read(&mod
->uc
.usecount
)));
852 safe_copy_str(tmpstr
, len
);
855 if (mod
->flags
& MOD_DELETED
)
856 safe_copy_cstr(" (deleted)");
857 else if (mod
->flags
& MOD_RUNNING
) {
858 if (mod
->flags
& MOD_AUTOCLEAN
)
859 safe_copy_cstr(" (autoclean)");
860 if (!(mod
->flags
& MOD_USED_ONCE
))
861 safe_copy_cstr(" (unused)");
863 safe_copy_cstr(" (uninitialized)");
865 if ((ref
= mod
->refs
) != NULL
) {
866 safe_copy_cstr(" [");
870 safe_copy_str(q
, len
);
872 if ((ref
= ref
->next_ref
) != NULL
)
879 safe_copy_cstr("\n");
882 #undef safe_copy_cstr
886 return PAGE_SIZE
- left
;
890 * Called by the /proc file system to return a current list of ksyms.
894 get_ksyms_list(char *buf
, char **start
, off_t offset
, int length
)
898 int len
= 0; /* code from net/ipv4/proc.c */
902 for (mod
= module_list
; mod
; mod
= mod
->next
) {
904 struct module_symbol
*sym
;
906 if (!(mod
->flags
& MOD_RUNNING
) || (mod
->flags
& MOD_DELETED
))
909 for (i
= mod
->nsyms
, sym
= mod
->syms
; i
> 0; --i
, ++sym
) {
912 len
+= sprintf(p
, "%0*lx %s\t[%s]\n",
913 (int)(2*sizeof(void*)),
914 sym
->value
, sym
->name
,
917 len
+= sprintf(p
, "%0*lx %s\n",
918 (int)(2*sizeof(void*)),
919 sym
->value
, sym
->name
);
927 if (pos
> offset
+length
)
932 *start
= buf
+ (offset
- begin
);
933 len
-= (offset
- begin
);
940 * Gets the address for a symbol in the given module. If modname is
941 * NULL, it looks for the name in any registered symbol table. If the
942 * modname is an empty string, it looks for the symbol in kernel exported
946 get_module_symbol(char *modname
, char *symname
)
949 struct module_symbol
*sym
;
952 for (mp
= module_list
; mp
; mp
= mp
->next
) {
953 if (((modname
== NULL
) || (strcmp(mp
->name
, modname
) == 0)) &&
954 (mp
->flags
& (MOD_RUNNING
| MOD_DELETED
)) == MOD_RUNNING
&&
956 for (i
= mp
->nsyms
, sym
= mp
->syms
;
959 if (strcmp(sym
->name
, symname
) == 0) {
968 #else /* CONFIG_MODULES */
970 /* Dummy syscalls for people who don't want modules */
972 asmlinkage
unsigned long
973 sys_create_module(const char *name_user
, size_t size
)
979 sys_init_module(const char *name_user
, struct module
*mod_user
)
985 sys_delete_module(const char *name_user
)
991 sys_query_module(const char *name_user
, int which
, char *buf
, size_t bufsize
,
994 /* Let the program know about the new interface. Not that
995 it'll do them much good. */
1003 sys_get_kernel_syms(struct kernel_sym
*table
)
1008 #endif /* CONFIG_MODULES */