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
)
115 if (!capable(CAP_SYS_MODULE
)) {
119 if ((namelen
= get_mod_name(name_user
, &name
)) < 0) {
123 if (size
< sizeof(struct module
)+namelen
) {
127 if (find_module(name
) != NULL
) {
131 if ((mod
= (struct module
*)module_map(size
)) == NULL
) {
136 memset(mod
, 0, sizeof(*mod
));
137 mod
->size_of_struct
= sizeof(*mod
);
138 mod
->next
= module_list
;
139 mod
->name
= (char *)(mod
+ 1);
141 memcpy((char*)(mod
+1), name
, namelen
+1);
145 module_list
= mod
; /* link it in */
157 * Initialize a module.
161 sys_init_module(const char *name_user
, struct module
*mod_user
)
163 struct module mod_tmp
, *mod
;
165 long namelen
, n_namelen
, i
, error
= -EPERM
;
166 unsigned long mod_user_size
;
167 struct module_ref
*dep
;
170 if (!capable(CAP_SYS_MODULE
))
172 if ((namelen
= get_mod_name(name_user
, &name
)) < 0) {
176 if ((mod
= find_module(name
)) == NULL
) {
181 /* Check module header size. We allow a bit of slop over the
182 size we are familiar with to cope with a version of insmod
183 for a newer kernel. But don't over do it. */
184 if ((error
= get_user(mod_user_size
, &mod_user
->size_of_struct
)) != 0)
186 if (mod_user_size
< (unsigned long)&((struct module
*)0L)->persist_start
187 || mod_user_size
> sizeof(struct module
) + 16*sizeof(void*)) {
188 printk(KERN_ERR
"init_module: Invalid module header size.\n"
189 KERN_ERR
"A new version of the modutils is likely "
195 /* Hold the current contents while we play with the user's idea
199 error
= copy_from_user(mod
, mod_user
, sizeof(struct module
));
205 /* Sanity check the size of the module. */
208 if (mod
->size
> mod_tmp
.size
) {
209 printk(KERN_ERR
"init_module: Size of initialized module "
210 "exceeds size of created module.\n");
214 /* Make sure all interesting pointers are sane. */
216 #define bound(p, n, m) ((unsigned long)(p) >= (unsigned long)(m+1) && \
217 (unsigned long)((p)+(n)) <= (unsigned long)(m) + (m)->size)
219 if (!bound(mod
->name
, namelen
, mod
)) {
220 printk(KERN_ERR
"init_module: mod->name out of bounds.\n");
223 if (mod
->nsyms
&& !bound(mod
->syms
, mod
->nsyms
, mod
)) {
224 printk(KERN_ERR
"init_module: mod->syms out of bounds.\n");
227 if (mod
->ndeps
&& !bound(mod
->deps
, mod
->ndeps
, mod
)) {
228 printk(KERN_ERR
"init_module: mod->deps out of bounds.\n");
231 if (mod
->init
&& !bound(mod
->init
, 0, mod
)) {
232 printk(KERN_ERR
"init_module: mod->init out of bounds.\n");
235 if (mod
->cleanup
&& !bound(mod
->cleanup
, 0, mod
)) {
236 printk(KERN_ERR
"init_module: mod->cleanup out of bounds.\n");
239 if (mod
->ex_table_start
> mod
->ex_table_end
240 || (mod
->ex_table_start
&&
241 !((unsigned long)mod
->ex_table_start
>= (unsigned long)(mod
+1)
242 && ((unsigned long)mod
->ex_table_end
243 < (unsigned long)mod
+ mod
->size
)))
244 || (((unsigned long)mod
->ex_table_start
245 - (unsigned long)mod
->ex_table_end
)
246 % sizeof(struct exception_table_entry
))) {
247 printk(KERN_ERR
"init_module: mod->ex_table_* invalid.\n");
250 if (mod
->flags
& ~MOD_AUTOCLEAN
) {
251 printk(KERN_ERR
"init_module: mod->flags invalid.\n");
255 if (!bound(mod
->gp
- 0x8000, 0, mod
)) {
256 printk(KERN_ERR
"init_module: mod->gp out of bounds.\n");
260 if (mod_member_present(mod
, can_unload
)
261 && mod
->can_unload
&& !bound(mod
->can_unload
, 0, mod
)) {
262 printk(KERN_ERR
"init_module: mod->can_unload out of bounds.\n");
268 /* Check that the user isn't doing something silly with the name. */
270 if ((n_namelen
= get_mod_name(mod
->name
- (unsigned long)mod
271 + (unsigned long)mod_user
,
276 if (namelen
!= n_namelen
|| strcmp(n_name
, mod_tmp
.name
) != 0) {
277 printk(KERN_ERR
"init_module: changed module name to "
279 n_name
, mod_tmp
.name
);
283 /* Ok, that's about all the sanity we can stomach; copy the rest. */
285 if (copy_from_user(mod
+1, mod_user
+1, mod
->size
-sizeof(*mod
))) {
290 /* On some machines it is necessary to do something here
291 to make the I and D caches consistent. */
292 flush_icache_range((unsigned long)mod
, (unsigned long)mod
+ mod
->size
);
294 /* Update module references. */
295 mod
->next
= mod_tmp
.next
;
297 for (i
= 0, dep
= mod
->deps
; i
< mod
->ndeps
; ++i
, ++dep
) {
298 struct module
*o
, *d
= dep
->dep
;
300 /* Make sure the indicated dependencies are really modules. */
302 printk(KERN_ERR
"init_module: self-referential "
303 "dependency in mod->deps.\n");
307 for (o
= module_list
; o
!= &kernel_module
; o
= o
->next
)
308 if (o
== d
) goto found_dep
;
310 printk(KERN_ERR
"init_module: found dependency that is "
311 "(no longer?) a module.\n");
316 dep
->next_ref
= d
->refs
;
318 /* Being referenced by a dependent module counts as a
319 use as far as kmod is concerned. */
320 d
->flags
|= MOD_USED_ONCE
;
323 /* Free our temporary memory. */
324 put_mod_name(n_name
);
327 /* Initialize the module. */
328 atomic_set(&mod
->uc
.usecount
,1);
329 if (mod
->init
&& mod
->init() != 0) {
330 atomic_set(&mod
->uc
.usecount
,0);
334 atomic_dec(&mod
->uc
.usecount
);
336 /* And set it running. */
337 mod
->flags
|= MOD_RUNNING
;
342 put_mod_name(n_name
);
353 sys_delete_module(const char *name_user
)
355 struct module
*mod
, *next
;
358 int something_changed
;
361 if (!capable(CAP_SYS_MODULE
))
365 if ((error
= get_mod_name(name_user
, &name
)) < 0)
373 if ((mod
= find_module(name
)) == NULL
) {
379 if (mod
->refs
!= NULL
|| __MOD_IN_USE(mod
))
387 /* Do automatic reaping */
389 something_changed
= 0;
390 for (mod
= module_list
; mod
!= &kernel_module
; mod
= next
) {
392 if (mod
->refs
== NULL
393 && (mod
->flags
& MOD_AUTOCLEAN
)
394 && (mod
->flags
& MOD_RUNNING
)
395 && !(mod
->flags
& MOD_DELETED
)
396 && (mod
->flags
& MOD_USED_ONCE
)
397 && !__MOD_IN_USE(mod
)) {
398 if ((mod
->flags
& MOD_VISITED
)
399 && !(mod
->flags
& MOD_JUST_FREED
)) {
400 mod
->flags
&= ~MOD_VISITED
;
403 something_changed
= 1;
407 if (something_changed
)
409 for (mod
= module_list
; mod
!= &kernel_module
; mod
= mod
->next
)
410 mod
->flags
&= ~MOD_JUST_FREED
;
417 /* Query various bits about modules. */
420 qm_modules(char *buf
, size_t bufsize
, size_t *ret
)
423 size_t nmod
, space
, len
;
427 for (mod
=module_list
; mod
!= &kernel_module
; mod
=mod
->next
, ++nmod
) {
428 len
= strlen(mod
->name
)+1;
430 goto calc_space_needed
;
431 if (copy_to_user(buf
, mod
->name
, len
))
438 if (put_user(nmod
, ret
))
445 while ((mod
= mod
->next
) != &kernel_module
)
446 space
+= strlen(mod
->name
)+1;
448 if (put_user(space
, ret
))
455 qm_deps(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
457 size_t i
, space
, len
;
459 if (mod
== &kernel_module
)
461 if ((mod
->flags
& (MOD_RUNNING
| MOD_DELETED
)) != MOD_RUNNING
)
462 if (put_user(0, ret
))
468 for (i
= 0; i
< mod
->ndeps
; ++i
) {
469 const char *dep_name
= mod
->deps
[i
].dep
->name
;
471 len
= strlen(dep_name
)+1;
473 goto calc_space_needed
;
474 if (copy_to_user(buf
, dep_name
, len
))
481 if (put_user(i
, ret
))
488 while (++i
< mod
->ndeps
)
489 space
+= strlen(mod
->deps
[i
].dep
->name
)+1;
491 if (put_user(space
, ret
))
498 qm_refs(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
500 size_t nrefs
, space
, len
;
501 struct module_ref
*ref
;
503 if (mod
== &kernel_module
)
505 if ((mod
->flags
& (MOD_RUNNING
| MOD_DELETED
)) != MOD_RUNNING
)
506 if (put_user(0, ret
))
512 for (nrefs
= 0, ref
= mod
->refs
; ref
; ++nrefs
, ref
= ref
->next_ref
) {
513 const char *ref_name
= ref
->ref
->name
;
515 len
= strlen(ref_name
)+1;
517 goto calc_space_needed
;
518 if (copy_to_user(buf
, ref_name
, len
))
525 if (put_user(nrefs
, ret
))
532 while ((ref
= ref
->next_ref
) != NULL
)
533 space
+= strlen(ref
->ref
->name
)+1;
535 if (put_user(space
, ret
))
542 qm_symbols(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
544 size_t i
, space
, len
;
545 struct module_symbol
*s
;
549 if ((mod
->flags
& (MOD_RUNNING
| MOD_DELETED
)) != MOD_RUNNING
)
550 if (put_user(0, ret
))
555 space
= mod
->nsyms
* 2*sizeof(void *);
561 goto calc_space_needed
;
563 if (!access_ok(VERIFY_WRITE
, buf
, space
))
567 vals
= (unsigned long *)buf
;
570 for (; i
< mod
->nsyms
; ++i
, ++s
, vals
+= 2) {
571 len
= strlen(s
->name
)+1;
573 goto calc_space_needed
;
575 if (copy_to_user(strings
, s
->name
, len
)
576 || __put_user(s
->value
, vals
+0)
577 || __put_user(space
, vals
+1))
585 if (put_user(i
, ret
))
591 for (; i
< mod
->nsyms
; ++i
, ++s
)
592 space
+= strlen(s
->name
)+1;
594 if (put_user(space
, ret
))
601 qm_info(struct module
*mod
, char *buf
, size_t bufsize
, size_t *ret
)
605 if (mod
== &kernel_module
)
608 if (sizeof(struct module_info
) <= bufsize
) {
609 struct module_info info
;
610 info
.addr
= (unsigned long)mod
;
611 info
.size
= mod
->size
;
612 info
.flags
= mod
->flags
;
613 info
.usecount
= (mod_member_present(mod
, can_unload
)
614 && mod
->can_unload
? -1 : atomic_read(&mod
->uc
.usecount
));
616 if (copy_to_user(buf
, &info
, sizeof(struct module_info
)))
621 if (put_user(sizeof(struct module_info
), ret
))
628 sys_query_module(const char *name_user
, int which
, char *buf
, size_t bufsize
,
635 if (name_user
== NULL
)
636 mod
= &kernel_module
;
641 if ((namelen
= get_mod_name(name_user
, &name
)) < 0) {
647 mod
= &kernel_module
;
648 else if ((mod
= find_module(name
)) == NULL
) {
661 err
= qm_modules(buf
, bufsize
, ret
);
664 err
= qm_deps(mod
, buf
, bufsize
, ret
);
667 err
= qm_refs(mod
, buf
, bufsize
, ret
);
670 err
= qm_symbols(mod
, buf
, bufsize
, ret
);
673 err
= qm_info(mod
, buf
, bufsize
, ret
);
685 * Copy the kernel symbol table to user space. If the argument is
686 * NULL, just return the size of the table.
688 * This call is obsolete. New programs should use query_module+QM_SYMBOLS
689 * which does not arbitrarily limit the length of symbols.
693 sys_get_kernel_syms(struct kernel_sym
*table
)
697 struct kernel_sym ksym
;
700 for (mod
= module_list
, i
= 0; mod
; mod
= mod
->next
) {
701 /* include the count for the module name! */
708 /* So that we don't give the user our stack content */
709 memset (&ksym
, 0, sizeof (ksym
));
711 for (mod
= module_list
, i
= 0; mod
; mod
= mod
->next
) {
712 struct module_symbol
*msym
;
715 if ((mod
->flags
& (MOD_RUNNING
|MOD_DELETED
)) != MOD_RUNNING
)
718 /* magic: write module info as a pseudo symbol */
719 ksym
.value
= (unsigned long)mod
;
721 strncpy(ksym
.name
+1, mod
->name
, sizeof(ksym
.name
)-1);
722 ksym
.name
[sizeof(ksym
.name
)-1] = '\0';
724 if (copy_to_user(table
, &ksym
, sizeof(ksym
)) != 0)
731 for (j
= 0, msym
= mod
->syms
; j
< mod
->nsyms
; ++j
, ++msym
) {
732 ksym
.value
= msym
->value
;
733 strncpy(ksym
.name
, msym
->name
, sizeof(ksym
.name
));
734 ksym
.name
[sizeof(ksym
.name
)-1] = '\0';
736 if (copy_to_user(table
, &ksym
, sizeof(ksym
)) != 0)
747 * Look for a module by name, ignoring modules marked for deletion.
750 static struct module
*
751 find_module(const char *name
)
755 for (mod
= module_list
; mod
; mod
= mod
->next
) {
756 if (mod
->flags
& MOD_DELETED
)
758 if (!strcmp(mod
->name
, name
))
766 * Free the given module.
770 free_module(struct module
*mod
, int tag_freed
)
772 struct module_ref
*dep
;
775 /* Let the module clean up. */
777 mod
->flags
|= MOD_DELETED
;
778 if (mod
->flags
& MOD_RUNNING
)
782 mod
->flags
&= ~MOD_RUNNING
;
785 /* Remove the module from the dependency lists. */
787 for (i
= 0, dep
= mod
->deps
; i
< mod
->ndeps
; ++i
, ++dep
) {
788 struct module_ref
**pp
;
789 for (pp
= &dep
->dep
->refs
; *pp
!= dep
; pp
= &(*pp
)->next_ref
)
792 if (tag_freed
&& dep
->dep
->refs
== NULL
)
793 dep
->dep
->flags
|= MOD_JUST_FREED
;
796 /* And from the main module list. */
798 if (mod
== module_list
) {
799 module_list
= mod
->next
;
802 for (p
= module_list
; p
->next
!= mod
; p
= p
->next
)
807 /* And free the memory. */
813 * Called by the /proc file system to return a current list of modules.
816 int get_module_list(char *p
)
818 size_t left
= PAGE_SIZE
;
821 struct module_ref
*ref
;
823 for (mod
= module_list
; mod
!= &kernel_module
; mod
= mod
->next
) {
827 #define safe_copy_str(str, len) \
831 memcpy(p, str, len); p += len, left -= len; \
833 #define safe_copy_cstr(str) safe_copy_str(str, sizeof(str)-1)
835 len
= strlen(mod
->name
);
836 safe_copy_str(mod
->name
, len
);
838 if ((len
= 20 - len
) > 0) {
846 len
= sprintf(tmpstr
, "%8lu", mod
->size
);
847 safe_copy_str(tmpstr
, len
);
849 if (mod
->flags
& MOD_RUNNING
) {
850 len
= sprintf(tmpstr
, "%4ld",
851 (mod_member_present(mod
, can_unload
)
853 ? -1L : (long)atomic_read(&mod
->uc
.usecount
)));
854 safe_copy_str(tmpstr
, len
);
857 if (mod
->flags
& MOD_DELETED
)
858 safe_copy_cstr(" (deleted)");
859 else if (mod
->flags
& MOD_RUNNING
) {
860 if (mod
->flags
& MOD_AUTOCLEAN
)
861 safe_copy_cstr(" (autoclean)");
862 if (!(mod
->flags
& MOD_USED_ONCE
))
863 safe_copy_cstr(" (unused)");
865 safe_copy_cstr(" (uninitialized)");
867 if ((ref
= mod
->refs
) != NULL
) {
868 safe_copy_cstr(" [");
872 safe_copy_str(q
, len
);
874 if ((ref
= ref
->next_ref
) != NULL
)
881 safe_copy_cstr("\n");
884 #undef safe_copy_cstr
888 return PAGE_SIZE
- left
;
892 * Called by the /proc file system to return a current list of ksyms.
896 get_ksyms_list(char *buf
, char **start
, off_t offset
, int length
)
900 int len
= 0; /* code from net/ipv4/proc.c */
904 for (mod
= module_list
; mod
; mod
= mod
->next
) {
906 struct module_symbol
*sym
;
908 if (!(mod
->flags
& MOD_RUNNING
) || (mod
->flags
& MOD_DELETED
))
911 for (i
= mod
->nsyms
, sym
= mod
->syms
; i
> 0; --i
, ++sym
) {
914 len
+= sprintf(p
, "%0*lx %s\t[%s]\n",
915 (int)(2*sizeof(void*)),
916 sym
->value
, sym
->name
,
919 len
+= sprintf(p
, "%0*lx %s\n",
920 (int)(2*sizeof(void*)),
921 sym
->value
, sym
->name
);
929 if (pos
> offset
+length
)
934 *start
= buf
+ (offset
- begin
);
935 len
-= (offset
- begin
);
942 * Gets the address for a symbol in the given module. If modname is
943 * NULL, it looks for the name in any registered symbol table. If the
944 * modname is an empty string, it looks for the symbol in kernel exported
948 get_module_symbol(char *modname
, char *symname
)
951 struct module_symbol
*sym
;
954 for (mp
= module_list
; mp
; mp
= mp
->next
) {
955 if (((modname
== NULL
) || (strcmp(mp
->name
, modname
) == 0)) &&
956 (mp
->flags
& (MOD_RUNNING
| MOD_DELETED
)) == MOD_RUNNING
&&
958 for (i
= mp
->nsyms
, sym
= mp
->syms
;
961 if (strcmp(sym
->name
, symname
) == 0) {
970 #else /* CONFIG_MODULES */
972 /* Dummy syscalls for people who don't want modules */
974 asmlinkage
unsigned long
975 sys_create_module(const char *name_user
, size_t size
)
981 sys_init_module(const char *name_user
, struct module
*mod_user
)
987 sys_delete_module(const char *name_user
)
993 sys_query_module(const char *name_user
, int which
, char *buf
, size_t bufsize
,
996 /* Let the program know about the new interface. Not that
997 it'll do them much good. */
1005 sys_get_kernel_syms(struct kernel_sym
*table
)
1010 #endif /* CONFIG_MODULES */