Lines Matching +full:foo +full:- +full:supply
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
85 (PFN_DOWN((unsigned long)(BASE) + (SIZE) - 1) - \
90 #define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1))
116 static unsigned long module_addr_min = -1UL, module_addr_max = 0;
147 if (mod && mod->state == MODULE_STATE_COMING) in strong_try_module_get()
148 return -EBUSY; in strong_try_module_get()
152 return -ENOENT; in strong_try_module_get()
158 mod->taints |= (1U << flag); in add_taint_module()
177 for (i = 1; i < info->hdr->e_shnum; i++) { in find_sec()
178 Elf_Shdr *shdr = &info->sechdrs[i]; in find_sec()
180 if ((shdr->sh_flags & SHF_ALLOC) in find_sec()
181 && strcmp(info->secstrings + shdr->sh_name, name) == 0) in find_sec()
191 return (void *)info->sechdrs[find_sec(info, name)].sh_addr; in section_addr()
203 *num = info->sechdrs[sec].sh_size / object_size; in section_objs()
204 return (void *)info->sechdrs[sec].sh_addr; in section_objs()
281 { mod->syms, mod->syms + mod->num_syms, mod->crcs, in each_symbol_section()
283 { mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms, in each_symbol_section()
284 mod->gpl_crcs, in each_symbol_section()
286 { mod->gpl_future_syms, in each_symbol_section()
287 mod->gpl_future_syms + mod->num_gpl_future_syms, in each_symbol_section()
288 mod->gpl_future_crcs, in each_symbol_section()
291 { mod->unused_syms, in each_symbol_section()
292 mod->unused_syms + mod->num_unused_syms, in each_symbol_section()
293 mod->unused_crcs, in each_symbol_section()
295 { mod->unused_gpl_syms, in each_symbol_section()
296 mod->unused_gpl_syms + mod->num_unused_gpl_syms, in each_symbol_section()
297 mod->unused_gpl_crcs, in each_symbol_section()
327 if (!fsa->gplok) { in check_symbol()
328 if (syms->licence == GPL_ONLY) in check_symbol()
330 if (syms->licence == WILL_BE_GPL_ONLY && fsa->warn) { in check_symbol()
332 "by a non-GPL module, which will not " in check_symbol()
333 "be allowed in the future\n", fsa->name); in check_symbol()
335 "Documentation/feature-removal-schedule.txt " in check_symbol()
341 if (syms->unused && fsa->warn) { in check_symbol()
343 "however this module is using it.\n", fsa->name); in check_symbol()
354 fsa->owner = owner; in check_symbol()
355 fsa->crc = symversion(syms->crcs, symnum); in check_symbol()
356 fsa->sym = &syms->start[symnum]; in check_symbol()
365 return strcmp(a, b->name); in cmp_name()
375 sym = bsearch(fsa->name, syms->start, syms->stop - syms->start, in find_symbol_in_section()
378 if (sym != NULL && check_symbol(syms, owner, sym - syms->start, data)) in find_symbol_in_section()
417 if (strcmp(mod->name, name) == 0) in find_module()
428 return mod->percpu; in mod_percpu()
435 printk(KERN_WARNING "%s: per-cpu alignment %li > %li\n", in percpu_modalloc()
436 mod->name, align, PAGE_SIZE); in percpu_modalloc()
440 mod->percpu = __alloc_reserved_percpu(size, align); in percpu_modalloc()
441 if (!mod->percpu) { in percpu_modalloc()
444 mod->name, size); in percpu_modalloc()
445 return -ENOMEM; in percpu_modalloc()
447 mod->percpu_size = size; in percpu_modalloc()
453 free_percpu(mod->percpu); in percpu_modfree()
467 memcpy(per_cpu_ptr(mod->percpu, cpu), from, size); in percpu_modcopy()
471 * is_module_percpu_address - test whether address is from module static percpu
487 if (!mod->percpu_size) in is_module_percpu_address()
490 void *start = per_cpu_ptr(mod->percpu, cpu); in is_module_percpu_address()
493 (void *)addr < start + mod->percpu_size) { in is_module_percpu_address()
513 return -ENOMEM; in percpu_modalloc()
538 mod->field = kstrdup(s, GFP_KERNEL); \
543 return sprintf(buffer, "%s\n", mk->mod->field); \
547 return mod->field != NULL; \
551 kfree(mod->field); \
552 mod->field = NULL; \
574 mod->refptr = alloc_percpu(struct module_ref); in module_unload_init()
575 if (!mod->refptr) in module_unload_init()
576 return -ENOMEM; in module_unload_init()
578 INIT_LIST_HEAD(&mod->source_list); in module_unload_init()
579 INIT_LIST_HEAD(&mod->target_list); in module_unload_init()
582 __this_cpu_write(mod->refptr->incs, 1); in module_unload_init()
584 mod->waiter = current; in module_unload_init()
594 list_for_each_entry(use, &b->source_list, source_list) { in already_uses()
595 if (use->source == a) { in already_uses()
596 pr_debug("%s uses %s!\n", a->name, b->name); in already_uses()
600 pr_debug("%s does not use %s!\n", a->name, b->name); in already_uses()
606 * - we add 'a' as a "source", 'b' as a "target" of module use
607 * - the module_use is added to the list of 'b' sources (so
615 pr_debug("Allocating new usage for %s.\n", a->name); in add_module_usage()
618 printk(KERN_WARNING "%s: out of memory loading\n", a->name); in add_module_usage()
619 return -ENOMEM; in add_module_usage()
622 use->source = a; in add_module_usage()
623 use->target = b; in add_module_usage()
624 list_add(&use->source_list, &b->source_list); in add_module_usage()
625 list_add(&use->target_list, &a->target_list); in add_module_usage()
657 list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) { in module_unload_free()
658 struct module *i = use->target; in module_unload_free()
659 pr_debug("%s unusing %s\n", mod->name, i->name); in module_unload_free()
661 list_del(&use->source_list); in module_unload_free()
662 list_del(&use->target_list); in module_unload_free()
667 free_percpu(mod->refptr); in module_unload_free()
698 if (module_refcount(sref->mod) != 0) { in __try_stop_module()
699 if (!(*sref->forced = try_force_unload(sref->flags))) in __try_stop_module()
700 return -EWOULDBLOCK; in __try_stop_module()
704 sref->mod->state = MODULE_STATE_GOING; in __try_stop_module()
716 mod->state = MODULE_STATE_GOING; in try_stop_module()
728 decs += per_cpu_ptr(mod->refptr, cpu)->decs; in module_refcount()
733 * This 2-count scheme avoids the situation where the refcount in module_refcount()
744 incs += per_cpu_ptr(mod->refptr, cpu)->incs; in module_refcount()
745 return incs - decs; in module_refcount()
763 current->state = TASK_RUNNING; in wait_for_zero_refcount()
775 return -EPERM; in SYSCALL_DEFINE2()
777 if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) in SYSCALL_DEFINE2()
778 return -EFAULT; in SYSCALL_DEFINE2()
779 name[MODULE_NAME_LEN-1] = '\0'; in SYSCALL_DEFINE2()
782 return -EINTR; in SYSCALL_DEFINE2()
786 ret = -ENOENT; in SYSCALL_DEFINE2()
790 if (!list_empty(&mod->source_list)) { in SYSCALL_DEFINE2()
792 ret = -EWOULDBLOCK; in SYSCALL_DEFINE2()
797 if (mod->state != MODULE_STATE_LIVE) { in SYSCALL_DEFINE2()
799 waiter --RR */ in SYSCALL_DEFINE2()
800 pr_debug("%s already dying\n", mod->name); in SYSCALL_DEFINE2()
801 ret = -EBUSY; in SYSCALL_DEFINE2()
806 if (mod->init && !mod->exit) { in SYSCALL_DEFINE2()
810 ret = -EBUSY; in SYSCALL_DEFINE2()
815 /* Set this up before setting mod->state */ in SYSCALL_DEFINE2()
816 mod->waiter = current; in SYSCALL_DEFINE2()
829 if (mod->exit != NULL) in SYSCALL_DEFINE2()
830 mod->exit(); in SYSCALL_DEFINE2()
836 strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); in SYSCALL_DEFINE2()
853 between this and the old multi-field proc format. */ in print_unload_info()
854 list_for_each_entry(use, &mod->source_list, source_list) { in print_unload_info()
856 seq_printf(m, "%s,", use->source->name); in print_unload_info()
859 if (mod->init != NULL && mod->exit == NULL) { in print_unload_info()
865 seq_printf(m, "-"); in print_unload_info()
900 return sprintf(buffer, "%lu\n", module_refcount(mk->mod)); in show_refcnt()
911 __this_cpu_inc(module->refptr->decs); in module_put()
916 wake_up_process(module->waiter); in module_put()
926 seq_printf(m, " - -"); in print_unload_info()
949 if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE)) in module_flags_taint()
951 if (mod->taints & (1 << TAINT_OOT_MODULE)) in module_flags_taint()
953 if (mod->taints & (1 << TAINT_FORCED_MODULE)) in module_flags_taint()
955 if (mod->taints & (1 << TAINT_CRAP)) in module_flags_taint()
970 switch (mk->mod->state) { in show_initstate()
994 kobject_uevent(&mk->kobj, action); in store_uevent()
1004 return sprintf(buffer, "%u\n", mk->mod->core_size); in show_coresize()
1013 return sprintf(buffer, "%u\n", mk->mod->init_size); in show_initsize()
1024 l = module_flags_taint(mk->mod, buffer); in show_taint()
1053 mod->name, reason); in try_to_force_load()
1057 return -ENOEXEC; in try_to_force_load()
1062 /* If the arch applies (non-zero) relocations to kernel kcrctab, unapply it. */
1068 return crc - (unsigned long)reloc_start; in maybe_relocated()
1083 /* Exporting module didn't supply crcs? OK, we're already tainted. */ in check_version()
1087 /* No versions at all? modprobe --force does this. */ in check_version()
1107 mod->name, symname); in check_version()
1112 mod->name, symname); in check_version()
1179 !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true); in resolve_symbol()
1183 if (!check_version(info->sechdrs, info->index.vers, name, mod, crc, in resolve_symbol()
1185 sym = ERR_PTR(-EINVAL); in resolve_symbol()
1213 || PTR_ERR(ksym) != -EBUSY, in resolve_symbol_wait()
1216 mod->name, owner); in resolve_symbol_wait()
1222 * /sys/module/foo/sections stuff
1230 return !(sect->sh_flags & SHF_ALLOC) || sect->sh_size == 0; in sect_empty()
1252 return sprintf(buf, "0x%pK\n", (void *)sattr->address); in module_sect_show()
1259 for (section = 0; section < sect_attrs->nsections; section++) in free_sect_attrs()
1260 kfree(sect_attrs->attrs[section].name); in free_sect_attrs()
1272 for (i = 0; i < info->hdr->e_shnum; i++) in add_sect_attrs()
1273 if (!sect_empty(&info->sechdrs[i])) in add_sect_attrs()
1276 + nloaded * sizeof(sect_attrs->attrs[0]), in add_sect_attrs()
1277 sizeof(sect_attrs->grp.attrs[0])); in add_sect_attrs()
1278 size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]); in add_sect_attrs()
1284 sect_attrs->grp.name = "sections"; in add_sect_attrs()
1285 sect_attrs->grp.attrs = (void *)sect_attrs + size[0]; in add_sect_attrs()
1287 sect_attrs->nsections = 0; in add_sect_attrs()
1288 sattr = §_attrs->attrs[0]; in add_sect_attrs()
1289 gattr = §_attrs->grp.attrs[0]; in add_sect_attrs()
1290 for (i = 0; i < info->hdr->e_shnum; i++) { in add_sect_attrs()
1291 Elf_Shdr *sec = &info->sechdrs[i]; in add_sect_attrs()
1294 sattr->address = sec->sh_addr; in add_sect_attrs()
1295 sattr->name = kstrdup(info->secstrings + sec->sh_name, in add_sect_attrs()
1297 if (sattr->name == NULL) in add_sect_attrs()
1299 sect_attrs->nsections++; in add_sect_attrs()
1300 sysfs_attr_init(&sattr->mattr.attr); in add_sect_attrs()
1301 sattr->mattr.show = module_sect_show; in add_sect_attrs()
1302 sattr->mattr.store = NULL; in add_sect_attrs()
1303 sattr->mattr.attr.name = sattr->name; in add_sect_attrs()
1304 sattr->mattr.attr.mode = S_IRUGO; in add_sect_attrs()
1305 *(gattr++) = &(sattr++)->mattr.attr; in add_sect_attrs()
1309 if (sysfs_create_group(&mod->mkobj.kobj, §_attrs->grp)) in add_sect_attrs()
1312 mod->sect_attrs = sect_attrs; in add_sect_attrs()
1320 if (mod->sect_attrs) { in remove_sect_attrs()
1321 sysfs_remove_group(&mod->mkobj.kobj, in remove_sect_attrs()
1322 &mod->sect_attrs->grp); in remove_sect_attrs()
1325 free_sect_attrs(mod->sect_attrs); in remove_sect_attrs()
1326 mod->sect_attrs = NULL; in remove_sect_attrs()
1331 * /sys/module/foo/notes/.section.name gives contents of SHT_NOTE sections.
1347 memcpy(buf, bin_attr->private + pos, count); in module_notes_read()
1354 if (notes_attrs->dir) { in free_notes_attrs()
1355 while (i-- > 0) in free_notes_attrs()
1356 sysfs_remove_bin_file(notes_attrs->dir, in free_notes_attrs()
1357 ¬es_attrs->attrs[i]); in free_notes_attrs()
1358 kobject_put(notes_attrs->dir); in free_notes_attrs()
1370 if (!mod->sect_attrs) in add_notes_attrs()
1375 for (i = 0; i < info->hdr->e_shnum; i++) in add_notes_attrs()
1376 if (!sect_empty(&info->sechdrs[i]) && in add_notes_attrs()
1377 (info->sechdrs[i].sh_type == SHT_NOTE)) in add_notes_attrs()
1384 + notes * sizeof(notes_attrs->attrs[0]), in add_notes_attrs()
1389 notes_attrs->notes = notes; in add_notes_attrs()
1390 nattr = ¬es_attrs->attrs[0]; in add_notes_attrs()
1391 for (loaded = i = 0; i < info->hdr->e_shnum; ++i) { in add_notes_attrs()
1392 if (sect_empty(&info->sechdrs[i])) in add_notes_attrs()
1394 if (info->sechdrs[i].sh_type == SHT_NOTE) { in add_notes_attrs()
1396 nattr->attr.name = mod->sect_attrs->attrs[loaded].name; in add_notes_attrs()
1397 nattr->attr.mode = S_IRUGO; in add_notes_attrs()
1398 nattr->size = info->sechdrs[i].sh_size; in add_notes_attrs()
1399 nattr->private = (void *) info->sechdrs[i].sh_addr; in add_notes_attrs()
1400 nattr->read = module_notes_read; in add_notes_attrs()
1406 notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj); in add_notes_attrs()
1407 if (!notes_attrs->dir) in add_notes_attrs()
1411 if (sysfs_create_bin_file(notes_attrs->dir, in add_notes_attrs()
1412 ¬es_attrs->attrs[i])) in add_notes_attrs()
1415 mod->notes_attrs = notes_attrs; in add_notes_attrs()
1424 if (mod->notes_attrs) in remove_notes_attrs()
1425 free_notes_attrs(mod->notes_attrs, mod->notes_attrs->notes); in remove_notes_attrs()
1456 list_for_each_entry(use, &mod->target_list, target_list) { in add_usage_links()
1457 nowarn = sysfs_create_link(use->target->holders_dir, in add_usage_links()
1458 &mod->mkobj.kobj, mod->name); in add_usage_links()
1470 list_for_each_entry(use, &mod->target_list, target_list) in del_usage_links()
1471 sysfs_remove_link(use->target->holders_dir, mod->name); in del_usage_links()
1483 mod->modinfo_attrs = kzalloc((sizeof(struct module_attribute) * in module_add_modinfo_attrs()
1486 if (!mod->modinfo_attrs) in module_add_modinfo_attrs()
1487 return -ENOMEM; in module_add_modinfo_attrs()
1489 temp_attr = mod->modinfo_attrs; in module_add_modinfo_attrs()
1491 if (!attr->test || in module_add_modinfo_attrs()
1492 (attr->test && attr->test(mod))) { in module_add_modinfo_attrs()
1494 sysfs_attr_init(&temp_attr->attr); in module_add_modinfo_attrs()
1495 error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr); in module_add_modinfo_attrs()
1507 for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) { in module_remove_modinfo_attrs()
1509 if (!attr->attr.name) in module_remove_modinfo_attrs()
1511 sysfs_remove_file(&mod->mkobj.kobj,&attr->attr); in module_remove_modinfo_attrs()
1512 if (attr->free) in module_remove_modinfo_attrs()
1513 attr->free(mod); in module_remove_modinfo_attrs()
1515 kfree(mod->modinfo_attrs); in module_remove_modinfo_attrs()
1525 mod->name); in mod_sysfs_init()
1526 err = -EINVAL; in mod_sysfs_init()
1530 kobj = kset_find_obj(module_kset, mod->name); in mod_sysfs_init()
1532 printk(KERN_ERR "%s: module is already loaded\n", mod->name); in mod_sysfs_init()
1534 err = -EINVAL; in mod_sysfs_init()
1538 mod->mkobj.mod = mod; in mod_sysfs_init()
1540 memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj)); in mod_sysfs_init()
1541 mod->mkobj.kobj.kset = module_kset; in mod_sysfs_init()
1542 err = kobject_init_and_add(&mod->mkobj.kobj, &module_ktype, NULL, in mod_sysfs_init()
1543 "%s", mod->name); in mod_sysfs_init()
1545 kobject_put(&mod->mkobj.kobj); in mod_sysfs_init()
1563 mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj); in mod_sysfs_setup()
1564 if (!mod->holders_dir) { in mod_sysfs_setup()
1565 err = -ENOMEM; in mod_sysfs_setup()
1581 kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD); in mod_sysfs_setup()
1587 kobject_put(mod->holders_dir); in mod_sysfs_setup()
1589 kobject_put(&mod->mkobj.kobj); in mod_sysfs_setup()
1598 kobject_put(&mod->mkobj.kobj); in mod_sysfs_fini()
1630 kobject_put(mod->mkobj.drivers_dir); in mod_sysfs_teardown()
1631 kobject_put(mod->holders_dir); in mod_sysfs_teardown()
1637 * - this defends against kallsyms not taking locks
1642 list_del(&mod->list); in __unlink_module()
1649 * LKM RO/NX protection: protect module's text/ro-data
1658 set(begin_pfn << PAGE_SHIFT, end_pfn - begin_pfn); in set_page_attributes()
1671 * Set RO for module text and RO-data: in set_section_ro_nx()
1672 * - Always protect first page. in set_section_ro_nx()
1673 * - Do not protect last partial page. in set_section_ro_nx()
1680 * - Do not protect first partial page. in set_section_ro_nx()
1681 * - Always protect last page. in set_section_ro_nx()
1687 set_memory_nx(begin_pfn << PAGE_SHIFT, end_pfn - begin_pfn); in set_section_ro_nx()
1693 set_page_attributes(mod->module_core + mod->core_text_size, in unset_module_core_ro_nx()
1694 mod->module_core + mod->core_size, in unset_module_core_ro_nx()
1696 set_page_attributes(mod->module_core, in unset_module_core_ro_nx()
1697 mod->module_core + mod->core_ro_size, in unset_module_core_ro_nx()
1703 set_page_attributes(mod->module_init + mod->init_text_size, in unset_module_init_ro_nx()
1704 mod->module_init + mod->init_size, in unset_module_init_ro_nx()
1706 set_page_attributes(mod->module_init, in unset_module_init_ro_nx()
1707 mod->module_init + mod->init_ro_size, in unset_module_init_ro_nx()
1718 if ((mod->module_core) && (mod->core_text_size)) { in set_all_modules_text_rw()
1719 set_page_attributes(mod->module_core, in set_all_modules_text_rw()
1720 mod->module_core + mod->core_text_size, in set_all_modules_text_rw()
1723 if ((mod->module_init) && (mod->init_text_size)) { in set_all_modules_text_rw()
1724 set_page_attributes(mod->module_init, in set_all_modules_text_rw()
1725 mod->module_init + mod->init_text_size, in set_all_modules_text_rw()
1739 if ((mod->module_core) && (mod->core_text_size)) { in set_all_modules_text_ro()
1740 set_page_attributes(mod->module_core, in set_all_modules_text_ro()
1741 mod->module_core + mod->core_text_size, in set_all_modules_text_ro()
1744 if ((mod->module_init) && (mod->init_text_size)) { in set_all_modules_text_ro()
1745 set_page_attributes(mod->module_init, in set_all_modules_text_ro()
1746 mod->module_init + mod->init_text_size, in set_all_modules_text_ro()
1779 ddebug_remove_module(mod->name); in free_module()
1781 /* Arch-specific cleanup. */ in free_module()
1788 destroy_params(mod->kp, mod->num_kp); in free_module()
1792 module_free(mod, mod->module_init); in free_module()
1793 kfree(mod->args); in free_module()
1796 /* Free lock-classes: */ in free_module()
1797 lockdep_free_key_range(mod->module_core, mod->core_size); in free_module()
1801 module_free(mod, mod->module_core); in free_module()
1804 update_protections(current->mm); in free_module()
1819 return sym ? (void *)sym->value : NULL; in __symbol_get()
1838 { mod->syms, mod->num_syms }, in verify_export_symbols()
1839 { mod->gpl_syms, mod->num_gpl_syms }, in verify_export_symbols()
1840 { mod->gpl_future_syms, mod->num_gpl_future_syms }, in verify_export_symbols()
1842 { mod->unused_syms, mod->num_unused_syms }, in verify_export_symbols()
1843 { mod->unused_gpl_syms, mod->num_unused_gpl_syms }, in verify_export_symbols()
1849 if (find_symbol(s->name, &owner, NULL, true, false)) { in verify_export_symbols()
1853 mod->name, s->name, module_name(owner)); in verify_export_symbols()
1854 return -ENOEXEC; in verify_export_symbols()
1864 Elf_Shdr *symsec = &info->sechdrs[info->index.sym]; in simplify_symbols()
1865 Elf_Sym *sym = (void *)symsec->sh_addr; in simplify_symbols()
1871 for (i = 1; i < symsec->sh_size / sizeof(Elf_Sym); i++) { in simplify_symbols()
1872 const char *name = info->strtab + sym[i].st_name; in simplify_symbols()
1876 /* We compiled with -fno-common. These are not in simplify_symbols()
1879 printk("%s: please compile with -fno-common\n", in simplify_symbols()
1880 mod->name); in simplify_symbols()
1881 ret = -ENOEXEC; in simplify_symbols()
1894 sym[i].st_value = ksym->value; in simplify_symbols()
1903 mod->name, name, PTR_ERR(ksym)); in simplify_symbols()
1904 ret = PTR_ERR(ksym) ?: -ENOENT; in simplify_symbols()
1909 if (sym[i].st_shndx == info->index.pcpu) in simplify_symbols()
1912 secbase = info->sechdrs[sym[i].st_shndx].sh_addr; in simplify_symbols()
1927 pr_err("module %s: REL relocation unsupported\n", me->name); in apply_relocate()
1928 return -ENOEXEC; in apply_relocate()
1937 pr_err("module %s: RELA relocation unsupported\n", me->name); in apply_relocate_add()
1938 return -ENOEXEC; in apply_relocate_add()
1947 for (i = 1; i < info->hdr->e_shnum; i++) { in apply_relocations()
1948 unsigned int infosec = info->sechdrs[i].sh_info; in apply_relocations()
1951 if (infosec >= info->hdr->e_shnum) in apply_relocations()
1954 /* Don't bother with non-allocated sections */ in apply_relocations()
1955 if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC)) in apply_relocations()
1958 if (info->sechdrs[i].sh_type == SHT_REL) in apply_relocations()
1959 err = apply_relocate(info->sechdrs, info->strtab, in apply_relocations()
1960 info->index.sym, i, mod); in apply_relocations()
1961 else if (info->sechdrs[i].sh_type == SHT_RELA) in apply_relocations()
1962 err = apply_relocate_add(info->sechdrs, info->strtab, in apply_relocations()
1963 info->index.sym, i, mod); in apply_relocations()
1985 ret = ALIGN(*size, sechdr->sh_addralign ?: 1); in get_offset()
1986 *size = ret + sechdr->sh_size; in get_offset()
1991 might -- code, read-only data, read-write data, small data. Tally
2007 for (i = 0; i < info->hdr->e_shnum; i++) in layout_sections()
2008 info->sechdrs[i].sh_entsize = ~0UL; in layout_sections()
2012 for (i = 0; i < info->hdr->e_shnum; ++i) { in layout_sections()
2013 Elf_Shdr *s = &info->sechdrs[i]; in layout_sections()
2014 const char *sname = info->secstrings + s->sh_name; in layout_sections()
2016 if ((s->sh_flags & masks[m][0]) != masks[m][0] in layout_sections()
2017 || (s->sh_flags & masks[m][1]) in layout_sections()
2018 || s->sh_entsize != ~0UL in layout_sections()
2021 s->sh_entsize = get_offset(mod, &mod->core_size, s, i); in layout_sections()
2026 mod->core_size = debug_align(mod->core_size); in layout_sections()
2027 mod->core_text_size = mod->core_size; in layout_sections()
2029 case 1: /* RO: text and ro-data */ in layout_sections()
2030 mod->core_size = debug_align(mod->core_size); in layout_sections()
2031 mod->core_ro_size = mod->core_size; in layout_sections()
2034 mod->core_size = debug_align(mod->core_size); in layout_sections()
2041 for (i = 0; i < info->hdr->e_shnum; ++i) { in layout_sections()
2042 Elf_Shdr *s = &info->sechdrs[i]; in layout_sections()
2043 const char *sname = info->secstrings + s->sh_name; in layout_sections()
2045 if ((s->sh_flags & masks[m][0]) != masks[m][0] in layout_sections()
2046 || (s->sh_flags & masks[m][1]) in layout_sections()
2047 || s->sh_entsize != ~0UL in layout_sections()
2050 s->sh_entsize = (get_offset(mod, &mod->init_size, s, i) in layout_sections()
2056 mod->init_size = debug_align(mod->init_size); in layout_sections()
2057 mod->init_text_size = mod->init_size; in layout_sections()
2059 case 1: /* RO: text and ro-data */ in layout_sections()
2060 mod->init_size = debug_align(mod->init_size); in layout_sections()
2061 mod->init_ro_size = mod->init_size; in layout_sections()
2064 mod->init_size = debug_align(mod->init_size); in layout_sections()
2078 "kernel.\n", mod->name, license); in set_license()
2086 /* Skip non-zero chars */ in next_string()
2089 if ((*secsize)-- <= 1) in next_string()
2096 if ((*secsize)-- <= 1) in next_string()
2106 Elf_Shdr *infosec = &info->sechdrs[info->index.info]; in get_modinfo()
2107 unsigned long size = infosec->sh_size; in get_modinfo()
2109 for (p = (char *)infosec->sh_addr; p; p = next_string(p, &size)) { in get_modinfo()
2122 if (attr->setup) in setup_modinfo()
2123 attr->setup(mod, get_modinfo(info, attr->attr.name)); in setup_modinfo()
2133 if (attr->free) in free_modinfo()
2134 attr->free(mod); in free_modinfo()
2145 return bsearch(name, start, stop - start, in lookup_symbol()
2156 ks = lookup_symbol(name, mod->syms, mod->syms + mod->num_syms); in is_exported()
2157 return ks != NULL && ks->value == value; in is_exported()
2163 const Elf_Shdr *sechdrs = info->sechdrs; in elf_type()
2165 if (ELF_ST_BIND(sym->st_info) == STB_WEAK) { in elf_type()
2166 if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT) in elf_type()
2171 if (sym->st_shndx == SHN_UNDEF) in elf_type()
2173 if (sym->st_shndx == SHN_ABS) in elf_type()
2175 if (sym->st_shndx >= SHN_LORESERVE) in elf_type()
2177 if (sechdrs[sym->st_shndx].sh_flags & SHF_EXECINSTR) in elf_type()
2179 if (sechdrs[sym->st_shndx].sh_flags & SHF_ALLOC in elf_type()
2180 && sechdrs[sym->st_shndx].sh_type != SHT_NOBITS) { in elf_type()
2181 if (!(sechdrs[sym->st_shndx].sh_flags & SHF_WRITE)) in elf_type()
2183 else if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL) in elf_type()
2188 if (sechdrs[sym->st_shndx].sh_type == SHT_NOBITS) { in elf_type()
2189 if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL) in elf_type()
2194 if (strstarts(info->secstrings + sechdrs[sym->st_shndx].sh_name, in elf_type()
2206 if (src->st_shndx == SHN_UNDEF in is_core_symbol()
2207 || src->st_shndx >= shnum in is_core_symbol()
2208 || !src->st_name) in is_core_symbol()
2211 sec = sechdrs + src->st_shndx; in is_core_symbol()
2212 if (!(sec->sh_flags & SHF_ALLOC) in is_core_symbol()
2214 || !(sec->sh_flags & SHF_EXECINSTR) in is_core_symbol()
2216 || (sec->sh_entsize & INIT_OFFSET_MASK)) in is_core_symbol()
2226 * linux-kernel thread starting with
2231 Elf_Shdr *symsect = info->sechdrs + info->index.sym; in layout_symtab()
2232 Elf_Shdr *strsect = info->sechdrs + info->index.str; in layout_symtab()
2237 symsect->sh_flags |= SHF_ALLOC; in layout_symtab()
2238 symsect->sh_entsize = get_offset(mod, &mod->init_size, symsect, in layout_symtab()
2239 info->index.sym) | INIT_OFFSET_MASK; in layout_symtab()
2240 pr_debug("\t%s\n", info->secstrings + symsect->sh_name); in layout_symtab()
2242 src = (void *)info->hdr + symsect->sh_offset; in layout_symtab()
2243 nsrc = symsect->sh_size / sizeof(*src); in layout_symtab()
2247 if (is_core_symbol(src, info->sechdrs, info->hdr->e_shnum)) { in layout_symtab()
2248 strtab_size += strlen(&info->strtab[src->st_name]) + 1; in layout_symtab()
2253 info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1); in layout_symtab()
2254 info->stroffs = mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym); in layout_symtab()
2255 mod->core_size += strtab_size; in layout_symtab()
2258 strsect->sh_flags |= SHF_ALLOC; in layout_symtab()
2259 strsect->sh_entsize = get_offset(mod, &mod->init_size, strsect, in layout_symtab()
2260 info->index.str) | INIT_OFFSET_MASK; in layout_symtab()
2261 pr_debug("\t%s\n", info->secstrings + strsect->sh_name); in layout_symtab()
2270 Elf_Shdr *symsec = &info->sechdrs[info->index.sym]; in add_kallsyms()
2272 mod->symtab = (void *)symsec->sh_addr; in add_kallsyms()
2273 mod->num_symtab = symsec->sh_size / sizeof(Elf_Sym); in add_kallsyms()
2274 /* Make sure we get permanent strtab: don't use info->strtab. */ in add_kallsyms()
2275 mod->strtab = (void *)info->sechdrs[info->index.str].sh_addr; in add_kallsyms()
2278 for (i = 0; i < mod->num_symtab; i++) in add_kallsyms()
2279 mod->symtab[i].st_info = elf_type(&mod->symtab[i], info); in add_kallsyms()
2281 mod->core_symtab = dst = mod->module_core + info->symoffs; in add_kallsyms()
2282 mod->core_strtab = s = mod->module_core + info->stroffs; in add_kallsyms()
2283 src = mod->symtab; in add_kallsyms()
2286 for (ndst = i = 1; i < mod->num_symtab; ++i, ++src) { in add_kallsyms()
2287 if (!is_core_symbol(src, info->sechdrs, info->hdr->e_shnum)) in add_kallsyms()
2291 dst[ndst++].st_name = s - mod->core_strtab; in add_kallsyms()
2292 s += strlcpy(s, &mod->strtab[src->st_name], KSYM_NAME_LEN) + 1; in add_kallsyms()
2294 mod->core_num_syms = ndst; in add_kallsyms()
2311 if (ddebug_add_module(debug, num, debug->modname)) in dynamic_debug_setup()
2313 debug->modname); in dynamic_debug_setup()
2320 ddebug_remove_module(debug->modname); in dynamic_debug_remove()
2353 for (i = 1; i < info->hdr->e_shnum; i++) { in kmemleak_load_module()
2354 const char *name = info->secstrings + info->sechdrs[i].sh_name; in kmemleak_load_module()
2355 if (!(info->sechdrs[i].sh_flags & SHF_ALLOC)) in kmemleak_load_module()
2360 kmemleak_scan_area((void *)info->sechdrs[i].sh_addr, in kmemleak_load_module()
2361 info->sechdrs[i].sh_size, GFP_KERNEL); in kmemleak_load_module()
2371 /* Sets info->hdr and info->len. */
2380 return -ENOEXEC; in copy_and_check()
2385 return -ENOMEM; in copy_and_check()
2388 err = -EFAULT; in copy_and_check()
2394 if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0 in copy_and_check()
2395 || hdr->e_type != ET_REL in copy_and_check()
2397 || hdr->e_shentsize != sizeof(Elf_Shdr)) { in copy_and_check()
2398 err = -ENOEXEC; in copy_and_check()
2402 if (len < hdr->e_shoff + hdr->e_shnum * sizeof(Elf_Shdr)) { in copy_and_check()
2403 err = -ENOEXEC; in copy_and_check()
2407 info->hdr = hdr; in copy_and_check()
2408 info->len = len; in copy_and_check()
2418 vfree(info->hdr); in free_copy()
2426 info->sechdrs[0].sh_addr = 0; in rewrite_section_headers()
2428 for (i = 1; i < info->hdr->e_shnum; i++) { in rewrite_section_headers()
2429 Elf_Shdr *shdr = &info->sechdrs[i]; in rewrite_section_headers()
2430 if (shdr->sh_type != SHT_NOBITS in rewrite_section_headers()
2431 && info->len < shdr->sh_offset + shdr->sh_size) { in rewrite_section_headers()
2433 info->len); in rewrite_section_headers()
2434 return -ENOEXEC; in rewrite_section_headers()
2439 shdr->sh_addr = (size_t)info->hdr + shdr->sh_offset; in rewrite_section_headers()
2443 if (strstarts(info->secstrings+shdr->sh_name, ".exit")) in rewrite_section_headers()
2444 shdr->sh_flags &= ~(unsigned long)SHF_ALLOC; in rewrite_section_headers()
2449 info->index.vers = find_sec(info, "__versions"); in rewrite_section_headers()
2450 info->index.info = find_sec(info, ".modinfo"); in rewrite_section_headers()
2451 info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC; in rewrite_section_headers()
2452 info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC; in rewrite_section_headers()
2471 info->sechdrs = (void *)info->hdr + info->hdr->e_shoff; in setup_load_info()
2472 info->secstrings = (void *)info->hdr in setup_load_info()
2473 + info->sechdrs[info->hdr->e_shstrndx].sh_offset; in setup_load_info()
2480 for (i = 1; i < info->hdr->e_shnum; i++) { in setup_load_info()
2481 if (info->sechdrs[i].sh_type == SHT_SYMTAB) { in setup_load_info()
2482 info->index.sym = i; in setup_load_info()
2483 info->index.str = info->sechdrs[i].sh_link; in setup_load_info()
2484 info->strtab = (char *)info->hdr in setup_load_info()
2485 + info->sechdrs[info->index.str].sh_offset; in setup_load_info()
2490 info->index.mod = find_sec(info, ".gnu.linkonce.this_module"); in setup_load_info()
2491 if (!info->index.mod) { in setup_load_info()
2493 return ERR_PTR(-ENOEXEC); in setup_load_info()
2496 mod = (void *)info->sechdrs[info->index.mod].sh_addr; in setup_load_info()
2498 if (info->index.sym == 0) { in setup_load_info()
2500 mod->name); in setup_load_info()
2501 return ERR_PTR(-ENOEXEC); in setup_load_info()
2504 info->index.pcpu = find_pcpusec(info); in setup_load_info()
2507 if (!check_modstruct_version(info->sechdrs, info->index.vers, mod)) in setup_load_info()
2508 return ERR_PTR(-ENOEXEC); in setup_load_info()
2518 /* This is allowed: modprobe --force will invalidate it. */ in check_modinfo()
2523 } else if (!same_magic(modmagic, vermagic, info->index.vers)) { in check_modinfo()
2525 mod->name, modmagic, vermagic); in check_modinfo()
2526 return -ENOEXEC; in check_modinfo()
2536 mod->name); in check_modinfo()
2547 mod->kp = section_objs(info, "__param", in find_module_sections()
2548 sizeof(*mod->kp), &mod->num_kp); in find_module_sections()
2549 mod->syms = section_objs(info, "__ksymtab", in find_module_sections()
2550 sizeof(*mod->syms), &mod->num_syms); in find_module_sections()
2551 mod->crcs = section_addr(info, "__kcrctab"); in find_module_sections()
2552 mod->gpl_syms = section_objs(info, "__ksymtab_gpl", in find_module_sections()
2553 sizeof(*mod->gpl_syms), in find_module_sections()
2554 &mod->num_gpl_syms); in find_module_sections()
2555 mod->gpl_crcs = section_addr(info, "__kcrctab_gpl"); in find_module_sections()
2556 mod->gpl_future_syms = section_objs(info, in find_module_sections()
2558 sizeof(*mod->gpl_future_syms), in find_module_sections()
2559 &mod->num_gpl_future_syms); in find_module_sections()
2560 mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future"); in find_module_sections()
2563 mod->unused_syms = section_objs(info, "__ksymtab_unused", in find_module_sections()
2564 sizeof(*mod->unused_syms), in find_module_sections()
2565 &mod->num_unused_syms); in find_module_sections()
2566 mod->unused_crcs = section_addr(info, "__kcrctab_unused"); in find_module_sections()
2567 mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl", in find_module_sections()
2568 sizeof(*mod->unused_gpl_syms), in find_module_sections()
2569 &mod->num_unused_gpl_syms); in find_module_sections()
2570 mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl"); in find_module_sections()
2573 mod->ctors = section_objs(info, ".ctors", in find_module_sections()
2574 sizeof(*mod->ctors), &mod->num_ctors); in find_module_sections()
2578 mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs", in find_module_sections()
2579 sizeof(*mod->tracepoints_ptrs), in find_module_sections()
2580 &mod->num_tracepoints); in find_module_sections()
2583 mod->jump_entries = section_objs(info, "__jump_table", in find_module_sections()
2584 sizeof(*mod->jump_entries), in find_module_sections()
2585 &mod->num_jump_entries); in find_module_sections()
2588 mod->trace_events = section_objs(info, "_ftrace_events", in find_module_sections()
2589 sizeof(*mod->trace_events), in find_module_sections()
2590 &mod->num_trace_events); in find_module_sections()
2595 kmemleak_scan_area(mod->trace_events, sizeof(*mod->trace_events) * in find_module_sections()
2596 mod->num_trace_events, GFP_KERNEL); in find_module_sections()
2599 mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt", in find_module_sections()
2600 sizeof(*mod->trace_bprintk_fmt_start), in find_module_sections()
2601 &mod->num_trace_bprintk_fmt); in find_module_sections()
2606 kmemleak_scan_area(mod->trace_bprintk_fmt_start, in find_module_sections()
2607 sizeof(*mod->trace_bprintk_fmt_start) * in find_module_sections()
2608 mod->num_trace_bprintk_fmt, GFP_KERNEL); in find_module_sections()
2612 mod->ftrace_callsites = section_objs(info, "__mcount_loc", in find_module_sections()
2613 sizeof(*mod->ftrace_callsites), in find_module_sections()
2614 &mod->num_ftrace_callsites); in find_module_sections()
2617 mod->extable = section_objs(info, "__ex_table", in find_module_sections()
2618 sizeof(*mod->extable), &mod->num_exentries); in find_module_sections()
2622 mod->name); in find_module_sections()
2624 info->debug = section_objs(info, "__verbose", in find_module_sections()
2625 sizeof(*info->debug), &info->num_debug); in find_module_sections()
2634 ptr = module_alloc_update_bounds(mod->core_size); in move_module()
2642 return -ENOMEM; in move_module()
2644 memset(ptr, 0, mod->core_size); in move_module()
2645 mod->module_core = ptr; in move_module()
2647 ptr = module_alloc_update_bounds(mod->init_size); in move_module()
2655 if (!ptr && mod->init_size) { in move_module()
2656 module_free(mod, mod->module_core); in move_module()
2657 return -ENOMEM; in move_module()
2659 memset(ptr, 0, mod->init_size); in move_module()
2660 mod->module_init = ptr; in move_module()
2664 for (i = 0; i < info->hdr->e_shnum; i++) { in move_module()
2666 Elf_Shdr *shdr = &info->sechdrs[i]; in move_module()
2668 if (!(shdr->sh_flags & SHF_ALLOC)) in move_module()
2671 if (shdr->sh_entsize & INIT_OFFSET_MASK) in move_module()
2672 dest = mod->module_init in move_module()
2673 + (shdr->sh_entsize & ~INIT_OFFSET_MASK); in move_module()
2675 dest = mod->module_core + shdr->sh_entsize; in move_module()
2677 if (shdr->sh_type != SHT_NOBITS) in move_module()
2678 memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size); in move_module()
2680 shdr->sh_addr = (unsigned long)dest; in move_module()
2682 (long)shdr->sh_addr, info->secstrings + shdr->sh_name); in move_module()
2693 * using GPL-only symbols it needs. in check_module_license_and_versions()
2695 if (strcmp(mod->name, "ndiswrapper") == 0) in check_module_license_and_versions()
2699 if (strcmp(mod->name, "driverloader") == 0) in check_module_license_and_versions()
2703 if ((mod->num_syms && !mod->crcs) in check_module_license_and_versions()
2704 || (mod->num_gpl_syms && !mod->gpl_crcs) in check_module_license_and_versions()
2705 || (mod->num_gpl_future_syms && !mod->gpl_future_crcs) in check_module_license_and_versions()
2707 || (mod->num_unused_syms && !mod->unused_crcs) in check_module_license_and_versions()
2708 || (mod->num_unused_gpl_syms && !mod->unused_gpl_crcs) in check_module_license_and_versions()
2731 if (mod->module_init) in flush_module_icache()
2732 flush_icache_range((unsigned long)mod->module_init, in flush_module_icache()
2733 (unsigned long)mod->module_init in flush_module_icache()
2734 + mod->init_size); in flush_module_icache()
2735 flush_icache_range((unsigned long)mod->module_core, in flush_module_icache()
2736 (unsigned long)mod->module_core + mod->core_size); in flush_module_icache()
2765 err = module_frob_arch_sections(info->hdr, info->sechdrs, in layout_and_allocate()
2766 info->secstrings, mod); in layout_and_allocate()
2770 pcpusec = &info->sechdrs[info->index.pcpu]; in layout_and_allocate()
2771 if (pcpusec->sh_size) { in layout_and_allocate()
2774 pcpusec->sh_size, pcpusec->sh_addralign); in layout_and_allocate()
2777 pcpusec->sh_flags &= ~(unsigned long)SHF_ALLOC; in layout_and_allocate()
2792 mod = (void *)info->sechdrs[info->index.mod].sh_addr; in layout_and_allocate()
2806 module_free(mod, mod->module_init); in module_deallocate()
2807 module_free(mod, mod->module_core); in module_deallocate()
2820 sort_extable(mod->extable, mod->extable + mod->num_exentries); in post_relocation()
2823 percpu_modcopy(mod, (void *)info->sechdrs[info->index.pcpu].sh_addr, in post_relocation()
2824 info->sechdrs[info->index.pcpu].sh_size); in post_relocation()
2826 /* Setup kallsyms-specific fields. */ in post_relocation()
2829 /* Arch-specific module finalizing. */ in post_relocation()
2830 return module_finalize(info->hdr, info->sechdrs, mod); in post_relocation()
2890 mod->args = strndup_user(uargs, ~0UL >> 1); in load_module()
2891 if (IS_ERR(mod->args)) { in load_module()
2892 err = PTR_ERR(mod->args); in load_module()
2897 mod->state = MODULE_STATE_COMING; in load_module()
2907 if (find_module(mod->name)) { in load_module()
2908 err = -EEXIST; in load_module()
2921 list_add_rcu(&mod->list, &modules); in load_module()
2925 err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, NULL); in load_module()
2930 err = mod_sysfs_setup(mod, &info, mod->kp, mod->num_kp); in load_module()
2944 list_del_rcu(&mod->list); in load_module()
2952 kfree(mod->args); in load_module()
2972 for (i = 0; i < mod->num_ctors; i++) in do_mod_ctors()
2973 mod->ctors[i](); in do_mod_ctors()
2986 return -EPERM; in SYSCALL_DEFINE3()
2997 set_section_ro_nx(mod->module_core, in SYSCALL_DEFINE3()
2998 mod->core_text_size, in SYSCALL_DEFINE3()
2999 mod->core_ro_size, in SYSCALL_DEFINE3()
3000 mod->core_size); in SYSCALL_DEFINE3()
3003 set_section_ro_nx(mod->module_init, in SYSCALL_DEFINE3()
3004 mod->init_text_size, in SYSCALL_DEFINE3()
3005 mod->init_ro_size, in SYSCALL_DEFINE3()
3006 mod->init_size); in SYSCALL_DEFINE3()
3010 if (mod->init != NULL) in SYSCALL_DEFINE3()
3011 ret = do_one_initcall(mod->init); in SYSCALL_DEFINE3()
3015 mod->state = MODULE_STATE_GOING; in SYSCALL_DEFINE3()
3026 "%s: '%s'->init suspiciously returned %d, it should follow 0/-E convention\n" in SYSCALL_DEFINE3()
3028 __func__, mod->name, ret, in SYSCALL_DEFINE3()
3034 mod->state = MODULE_STATE_LIVE; in SYSCALL_DEFINE3()
3047 mod->num_symtab = mod->core_num_syms; in SYSCALL_DEFINE3()
3048 mod->symtab = mod->core_symtab; in SYSCALL_DEFINE3()
3049 mod->strtab = mod->core_strtab; in SYSCALL_DEFINE3()
3052 module_free(mod, mod->module_init); in SYSCALL_DEFINE3()
3053 mod->module_init = NULL; in SYSCALL_DEFINE3()
3054 mod->init_size = 0; in SYSCALL_DEFINE3()
3055 mod->init_ro_size = 0; in SYSCALL_DEFINE3()
3056 mod->init_text_size = 0; in SYSCALL_DEFINE3()
3088 nextval = (unsigned long)mod->module_init+mod->init_text_size; in get_ksymbol()
3090 nextval = (unsigned long)mod->module_core+mod->core_text_size; in get_ksymbol()
3094 for (i = 1; i < mod->num_symtab; i++) { in get_ksymbol()
3095 if (mod->symtab[i].st_shndx == SHN_UNDEF) in get_ksymbol()
3100 if (mod->symtab[i].st_value <= addr in get_ksymbol()
3101 && mod->symtab[i].st_value > mod->symtab[best].st_value in get_ksymbol()
3102 && *(mod->strtab + mod->symtab[i].st_name) != '\0' in get_ksymbol()
3103 && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) in get_ksymbol()
3105 if (mod->symtab[i].st_value > addr in get_ksymbol()
3106 && mod->symtab[i].st_value < nextval in get_ksymbol()
3107 && *(mod->strtab + mod->symtab[i].st_name) != '\0' in get_ksymbol()
3108 && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) in get_ksymbol()
3109 nextval = mod->symtab[i].st_value; in get_ksymbol()
3116 *size = nextval - mod->symtab[best].st_value; in get_ksymbol()
3118 *offset = addr - mod->symtab[best].st_value; in get_ksymbol()
3119 return mod->strtab + mod->symtab[best].st_name; in get_ksymbol()
3138 *modname = mod->name; in module_address_lookup()
3145 strncpy(namebuf, ret, KSYM_NAME_LEN - 1); in module_address_lookup()
3172 return -ERANGE; in lookup_module_symbol_name()
3190 strlcpy(modname, mod->name, MODULE_NAME_LEN); in lookup_module_symbol_attrs()
3199 return -ERANGE; in lookup_module_symbol_attrs()
3209 if (symnum < mod->num_symtab) { in module_get_kallsym()
3210 *value = mod->symtab[symnum].st_value; in module_get_kallsym()
3211 *type = mod->symtab[symnum].st_info; in module_get_kallsym()
3212 strlcpy(name, mod->strtab + mod->symtab[symnum].st_name, in module_get_kallsym()
3214 strlcpy(module_name, mod->name, MODULE_NAME_LEN); in module_get_kallsym()
3219 symnum -= mod->num_symtab; in module_get_kallsym()
3222 return -ERANGE; in module_get_kallsym()
3229 for (i = 0; i < mod->num_symtab; i++) in mod_find_symname()
3230 if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0 && in mod_find_symname()
3231 mod->symtab[i].st_info != 'U') in mod_find_symname()
3232 return mod->symtab[i].st_value; in mod_find_symname()
3268 for (i = 0; i < mod->num_symtab; i++) { in module_kallsyms_on_each_symbol()
3269 ret = fn(data, mod->strtab + mod->symtab[i].st_name, in module_kallsyms_on_each_symbol()
3270 mod, mod->symtab[i].st_value); in module_kallsyms_on_each_symbol()
3283 if (mod->taints || in module_flags()
3284 mod->state == MODULE_STATE_GOING || in module_flags()
3285 mod->state == MODULE_STATE_COMING) { in module_flags()
3288 /* Show a - for module-is-being-unloaded */ in module_flags()
3289 if (mod->state == MODULE_STATE_GOING) in module_flags()
3290 buf[bx++] = '-'; in module_flags()
3291 /* Show a + for module-is-being-loaded */ in module_flags()
3292 if (mod->state == MODULE_STATE_COMING) in module_flags()
3325 mod->name, mod->init_size + mod->core_size); in m_show()
3330 mod->state == MODULE_STATE_GOING ? "Unloading": in m_show()
3331 mod->state == MODULE_STATE_COMING ? "Loading": in m_show()
3334 seq_printf(m, " 0x%pK", mod->module_core); in m_show()
3337 if (mod->taints) in m_show()
3346 Where refcount is a number or -, and deps is a comma-separated list
3347 of depends or -.
3384 if (mod->num_exentries == 0) in search_module_extables()
3387 e = search_extable(mod->extable, in search_module_extables()
3388 mod->extable + mod->num_exentries - 1, in search_module_extables()
3401 * is_module_address - is this address inside a module?
3419 * __module_address - get the module which contains an address.
3441 * is_module_text_address - is this address inside module code?
3460 * __module_text_address - get the module whose code contains an address.
3471 if (!within(addr, mod->module_init, mod->init_text_size) in __module_text_address()
3472 && !within(addr, mod->module_core, mod->core_text_size)) in __module_text_address()
3489 printk(" %s%s", mod->name, module_flags(mod, buf)); in print_modules()