Commit fcda12e7 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus

* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus:
  modpost: Fix modpost's license checking V3
  module: add /sys/module/<name>/uevent files
  module: change attr callbacks to take struct module_kobject
  modules: make arch's use default loader hooks
  modules: add default loader hook implementations
  param: fix return value handling in param_set_*
parents 5fabc487 62a26356
...@@ -29,20 +29,6 @@ ...@@ -29,20 +29,6 @@
#define DEBUGP(fmt...) #define DEBUGP(fmt...)
#endif #endif
void *
module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc(size);
}
void
module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* Allocate the GOT at the end of the core sections. */ /* Allocate the GOT at the end of the core sections. */
struct got_entry { struct got_entry {
...@@ -155,14 +141,6 @@ module_frob_arch_sections(Elf64_Ehdr *hdr, Elf64_Shdr *sechdrs, ...@@ -155,14 +141,6 @@ module_frob_arch_sections(Elf64_Ehdr *hdr, Elf64_Shdr *sechdrs,
return 0; return 0;
} }
int
apply_relocate(Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
unsigned int relsec, struct module *me)
{
printk(KERN_ERR "module %s: REL relocation unsupported\n", me->name);
return -ENOEXEC;
}
int int
apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab, apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec, unsigned int symindex, unsigned int relsec,
...@@ -302,15 +280,3 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab, ...@@ -302,15 +280,3 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
return 0; return 0;
} }
int
module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
void
module_arch_cleanup(struct module *mod)
{
}
...@@ -43,25 +43,7 @@ void *module_alloc(unsigned long size) ...@@ -43,25 +43,7 @@ void *module_alloc(unsigned long size)
GFP_KERNEL, PAGE_KERNEL_EXEC, -1, GFP_KERNEL, PAGE_KERNEL_EXEC, -1,
__builtin_return_address(0)); __builtin_return_address(0));
} }
#else /* CONFIG_MMU */ #endif
void *module_alloc(unsigned long size)
{
return size == 0 ? NULL : vmalloc(size);
}
#endif /* !CONFIG_MMU */
void module_free(struct module *module, void *region)
{
vfree(region);
}
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int int
apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
...@@ -265,15 +247,6 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -265,15 +247,6 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
return 0; return 0;
} }
int
apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec, struct module *module)
{
printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
module->name);
return -ENOEXEC;
}
struct mod_unwind_map { struct mod_unwind_map {
const Elf_Shdr *unw_sec; const Elf_Shdr *unw_sec;
const Elf_Shdr *txt_sec; const Elf_Shdr *txt_sec;
......
...@@ -19,13 +19,6 @@ ...@@ -19,13 +19,6 @@
#include <linux/moduleloader.h> #include <linux/moduleloader.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc(size);
}
void module_free(struct module *mod, void *module_region) void module_free(struct module *mod, void *module_region)
{ {
vfree(mod->arch.syminfo); vfree(mod->arch.syminfo);
...@@ -299,15 +292,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, ...@@ -299,15 +292,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
return ret; return ret;
} }
int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relindex,
struct module *module)
{
printk(KERN_ERR "module %s: REL relocations are not supported\n",
module->name);
return -ENOEXEC;
}
int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
struct module *module) struct module *module)
{ {
...@@ -316,7 +300,3 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, ...@@ -316,7 +300,3 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
return 0; return 0;
} }
void module_arch_cleanup(struct module *module)
{
}
...@@ -16,19 +16,6 @@ ...@@ -16,19 +16,6 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc(size);
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* Transfer the section to the L1 memory */ /* Transfer the section to the L1 memory */
int int
module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
...@@ -150,14 +137,6 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, ...@@ -150,14 +137,6 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
return 0; return 0;
} }
int
apply_relocate(Elf_Shdr * sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec, struct module *mod)
{
pr_err(".rel unsupported\n");
return -ENOEXEC;
}
/*************************************************************************/ /*************************************************************************/
/* FUNCTION : apply_relocate_add */ /* FUNCTION : apply_relocate_add */
/* ABSTRACT : Blackfin specific relocation handling for the loadable */ /* ABSTRACT : Blackfin specific relocation handling for the loadable */
......
...@@ -30,45 +30,19 @@ ...@@ -30,45 +30,19 @@
#endif #endif
#ifdef CONFIG_ETRAX_KMALLOCED_MODULES #ifdef CONFIG_ETRAX_KMALLOCED_MODULES
#define MALLOC_MODULE(size) kmalloc(size, GFP_KERNEL)
#define FREE_MODULE(region) kfree(region)
#else
#define MALLOC_MODULE(size) vmalloc_exec(size)
#define FREE_MODULE(region) vfree(region)
#endif
void *module_alloc(unsigned long size) void *module_alloc(unsigned long size)
{ {
if (size == 0) if (size == 0)
return NULL; return NULL;
return MALLOC_MODULE(size); return kmalloc(size, GFP_KERNEL);
} }
/* Free memory returned from module_alloc */ /* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region) void module_free(struct module *mod, void *module_region)
{ {
FREE_MODULE(module_region); kfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: REL relocation unsupported\n", me->name);
return -ENOEXEC;
} }
#endif
int apply_relocate_add(Elf32_Shdr *sechdrs, int apply_relocate_add(Elf32_Shdr *sechdrs,
const char *strtab, const char *strtab,
...@@ -108,14 +82,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -108,14 +82,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
return 0; return 0;
} }
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
void module_arch_cleanup(struct module *mod)
{
}
...@@ -22,57 +22,6 @@ ...@@ -22,57 +22,6 @@
#define DEBUGP(fmt...) #define DEBUGP(fmt...)
#endif #endif
void *module_alloc(unsigned long size) /* TODO: At least one of apply_relocate or apply_relocate_add must be
{ * implemented in order to get working module support.
if (size == 0) */
return NULL;
return vmalloc_exec(size);
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", me->name);
return -ENOEXEC;
}
int apply_relocate_add(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", me->name);
return -ENOEXEC;
}
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
void module_arch_cleanup(struct module *mod)
{
}
...@@ -11,40 +11,6 @@ ...@@ -11,40 +11,6 @@
#define DEBUGP(fmt...) #define DEBUGP(fmt...)
#endif #endif
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc(size);
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
}
int apply_relocate_add(Elf32_Shdr *sechdrs, int apply_relocate_add(Elf32_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -107,14 +73,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -107,14 +73,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
me->name, rela[i].r_offset); me->name, rela[i].r_offset);
return -ENOEXEC; return -ENOEXEC;
} }
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
void module_arch_cleanup(struct module *mod)
{
}
...@@ -304,14 +304,6 @@ plt_target (struct plt_entry *plt) ...@@ -304,14 +304,6 @@ plt_target (struct plt_entry *plt)
#endif /* !USE_BRL */ #endif /* !USE_BRL */
void *
module_alloc (unsigned long size)
{
if (!size)
return NULL;
return vmalloc(size);
}
void void
module_free (struct module *mod, void *module_region) module_free (struct module *mod, void *module_region)
{ {
...@@ -853,14 +845,6 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind ...@@ -853,14 +845,6 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
return 0; return 0;
} }
int
apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
unsigned int relsec, struct module *mod)
{
printk(KERN_ERR "module %s: REL relocs in section %u unsupported\n", mod->name, relsec);
return -ENOEXEC;
}
/* /*
* Modules contain a single unwind table which covers both the core and the init text * Modules contain a single unwind table which covers both the core and the init text
* sections but since the two are not contiguous, we need to split this table up such that * sections but since the two are not contiguous, we need to split this table up such that
......
...@@ -28,33 +28,6 @@ ...@@ -28,33 +28,6 @@
#define DEBUGP(fmt...) #define DEBUGP(fmt...)
#endif #endif
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
#ifdef CONFIG_MMU
return vmalloc_exec(size);
#else
return vmalloc(size);
#endif
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
#define COPY_UNALIGNED_WORD(sw, tw, align) \ #define COPY_UNALIGNED_WORD(sw, tw, align) \
{ \ { \
void *__s = &(sw), *__t = &(tw); \ void *__s = &(sw), *__t = &(tw); \
...@@ -243,14 +216,3 @@ int apply_relocate(Elf32_Shdr *sechdrs, ...@@ -243,14 +216,3 @@ int apply_relocate(Elf32_Shdr *sechdrs,
return 0; return 0;
} }
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
void module_arch_cleanup(struct module *mod)
{
}
...@@ -19,29 +19,6 @@ ...@@ -19,29 +19,6 @@
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc(size);
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -131,10 +108,6 @@ int module_finalize(const Elf_Ehdr *hdr, ...@@ -131,10 +108,6 @@ int module_finalize(const Elf_Ehdr *hdr,
return 0; return 0;
} }
void module_arch_cleanup(struct module *mod)
{
}
#endif /* CONFIG_MODULES */ #endif /* CONFIG_MODULES */
void module_fixup(struct module *mod, struct m68k_fixup_info *start, void module_fixup(struct module *mod, struct m68k_fixup_info *start,
......
...@@ -11,29 +11,6 @@ ...@@ -11,29 +11,6 @@
#define DEBUGP(fmt...) #define DEBUGP(fmt...)
#endif #endif
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc(size);
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -113,14 +90,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -113,14 +90,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
} }
return 0; return 0;
} }
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
void module_arch_cleanup(struct module *mod)
{
}
...@@ -18,37 +18,6 @@ ...@@ -18,37 +18,6 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
void *module_alloc(unsigned long size)
{
void *ret;
ret = (size == 0) ? NULL : vmalloc(size);
pr_debug("module_alloc (%08lx@%08lx)\n", size, (unsigned long int)ret);
return ret;
}
void module_free(struct module *module, void *region)
{
pr_debug("module_free(%s,%08lx)\n", module->name,
(unsigned long)region);
vfree(region);
}
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec, struct module *module)
{
printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
module->name);
return -ENOEXEC;
}
int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec, struct module *module) unsigned int symindex, unsigned int relsec, struct module *module)
{ {
...@@ -155,7 +124,3 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, ...@@ -155,7 +124,3 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
flush_dcache(); flush_dcache();
return 0; return 0;
} }
void module_arch_cleanup(struct module *mod)
{
}
...@@ -45,30 +45,14 @@ static struct mips_hi16 *mips_hi16_list; ...@@ -45,30 +45,14 @@ static struct mips_hi16 *mips_hi16_list;
static LIST_HEAD(dbe_list); static LIST_HEAD(dbe_list);
static DEFINE_SPINLOCK(dbe_lock); static DEFINE_SPINLOCK(dbe_lock);
#ifdef MODULE_START
void *module_alloc(unsigned long size) void *module_alloc(unsigned long size)
{ {
#ifdef MODULE_START
return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END, return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END,
GFP_KERNEL, PAGE_KERNEL, -1, GFP_KERNEL, PAGE_KERNEL, -1,
__builtin_return_address(0)); __builtin_return_address(0));
#else
if (size == 0)
return NULL;
return vmalloc(size);
#endif
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
char *secstrings, struct module *mod)
{
return 0;
} }
#endif
static int apply_r_mips_none(struct module *me, u32 *location, Elf_Addr v) static int apply_r_mips_none(struct module *me, u32 *location, Elf_Addr v)
{ {
......
...@@ -32,36 +32,6 @@ ...@@ -32,36 +32,6 @@
#define DEBUGP(fmt, ...) #define DEBUGP(fmt, ...)
#endif #endif
/*
* allocate storage for a module
*/
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc_exec(size);
}
/*
* free memory returned from module_alloc()
*/
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/*
* allow the arch to fix up the section table
* - we don't need anything special
*/
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
static void reloc_put16(uint8_t *p, uint32_t val) static void reloc_put16(uint8_t *p, uint32_t val)
{ {
p[0] = val & 0xff; p[0] = val & 0xff;
...@@ -80,20 +50,6 @@ static void reloc_put32(uint8_t *p, uint32_t val) ...@@ -80,20 +50,6 @@ static void reloc_put32(uint8_t *p, uint32_t val)
reloc_put16(p+2, val >> 16); reloc_put16(p+2, val >> 16);
} }
/*
* apply a REL relocation
*/
int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
}
/* /*
* apply a RELA relocation * apply a RELA relocation
*/ */
...@@ -198,20 +154,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -198,20 +154,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
} }
return 0; return 0;
} }
/*
* finish loading the module
*/
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
/*
* finish clearing the module
*/
void module_arch_cleanup(struct module *mod)
{
}
...@@ -540,18 +540,6 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, ...@@ -540,18 +540,6 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
return (Elf_Addr)stub; return (Elf_Addr)stub;
} }
int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
/* parisc should not need this ... */
printk(KERN_ERR "module %s: RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
}
#ifndef CONFIG_64BIT #ifndef CONFIG_64BIT
int apply_relocate_add(Elf_Shdr *sechdrs, int apply_relocate_add(Elf_Shdr *sechdrs,
const char *strtab, const char *strtab,
......
...@@ -31,20 +31,6 @@ ...@@ -31,20 +31,6 @@
LIST_HEAD(module_bug_list); LIST_HEAD(module_bug_list);
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc_exec(size);
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, static const Elf_Shdr *find_section(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *name) const char *name)
...@@ -93,7 +79,3 @@ int module_finalize(const Elf_Ehdr *hdr, ...@@ -93,7 +79,3 @@ int module_finalize(const Elf_Ehdr *hdr,
return 0; return 0;
} }
void module_arch_cleanup(struct module *mod)
{
}
...@@ -174,17 +174,6 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr, ...@@ -174,17 +174,6 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr,
return 0; return 0;
} }
int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *module)
{
printk(KERN_ERR "%s: Non-ADD RELOCATION unsupported\n",
module->name);
return -ENOEXEC;
}
static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val) static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val)
{ {
if (entry->jump[0] == 0x3d600000 + ((val + 0x8000) >> 16) if (entry->jump[0] == 0x3d600000 + ((val + 0x8000) >> 16)
......
...@@ -243,16 +243,6 @@ int module_frob_arch_sections(Elf64_Ehdr *hdr, ...@@ -243,16 +243,6 @@ int module_frob_arch_sections(Elf64_Ehdr *hdr,
return 0; return 0;
} }
int apply_relocate(Elf64_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "%s: Non-ADD RELOCATION unsupported\n", me->name);
return -ENOEXEC;
}
/* r2 is the TOC pointer: it actually points 0x8000 into the TOC (this /* r2 is the TOC pointer: it actually points 0x8000 into the TOC (this
gives the value maximum span in an instruction which uses a signed gives the value maximum span in an instruction which uses a signed
offset) */ offset) */
......
...@@ -45,13 +45,6 @@ ...@@ -45,13 +45,6 @@
#define PLT_ENTRY_SIZE 20 #define PLT_ENTRY_SIZE 20
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc(size);
}
/* Free memory returned from module_alloc */ /* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region) void module_free(struct module *mod, void *module_region)
{ {
...@@ -176,15 +169,6 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, ...@@ -176,15 +169,6 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
return 0; return 0;
} }
int
apply_relocate(Elf_Shdr *sechdrs, const char *strtab, unsigned int symindex,
unsigned int relsec, struct module *me)
{
printk(KERN_ERR "module %s: RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
}
static int static int
apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
struct module *me) struct module *me)
...@@ -409,7 +393,3 @@ int module_finalize(const Elf_Ehdr *hdr, ...@@ -409,7 +393,3 @@ int module_finalize(const Elf_Ehdr *hdr,
me->arch.syminfo = NULL; me->arch.syminfo = NULL;
return 0; return 0;
} }
void module_arch_cleanup(struct module *mod)
{
}
...@@ -27,23 +27,6 @@ ...@@ -27,23 +27,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
void *module_alloc(unsigned long size)
{
return size ? vmalloc(size) : NULL;
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
char *secstrings, struct module *mod)
{
return 0;
}
int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, int apply_relocate(Elf_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relindex, unsigned int symindex, unsigned int relindex,
struct module *me) struct module *me)
...@@ -146,6 +129,9 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, ...@@ -146,6 +129,9 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec, unsigned int symindex, unsigned int relsec,
struct module *me) struct module *me)
{ {
/* Non-standard return value... most other arch's return -ENOEXEC
* for an unsupported relocation variant
*/
return 0; return 0;
} }
...@@ -154,12 +140,3 @@ const struct exception_table_entry *search_module_dbetables(unsigned long addr) ...@@ -154,12 +140,3 @@ const struct exception_table_entry *search_module_dbetables(unsigned long addr)
{ {
return NULL; return NULL;
} }
/* Put in dbe list if necessary. */
int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
void module_arch_cleanup(struct module *mod) {}
...@@ -34,30 +34,6 @@ ...@@ -34,30 +34,6 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <asm/dwarf.h> #include <asm/dwarf.h>
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc_exec(size);
}
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate_add(Elf32_Shdr *sechdrs, int apply_relocate_add(Elf32_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -133,17 +109,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -133,17 +109,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
return 0; return 0;
} }
int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: REL RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
}
int module_finalize(const Elf_Ehdr *hdr, int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs, const Elf_Shdr *sechdrs,
struct module *me) struct module *me)
......
...@@ -68,12 +68,6 @@ void *module_alloc(unsigned long size) ...@@ -68,12 +68,6 @@ void *module_alloc(unsigned long size)
return ret; return ret;
} }
/* Free memory returned from module_core_alloc/module_init_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* Make generic code ignore STT_REGISTER dummy undefined symbols. */ /* Make generic code ignore STT_REGISTER dummy undefined symbols. */
int module_frob_arch_sections(Elf_Ehdr *hdr, int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs, Elf_Shdr *sechdrs,
...@@ -107,17 +101,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, ...@@ -107,17 +101,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr,
return 0; return 0;
} }
int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: non-ADD RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
}
int apply_relocate_add(Elf_Shdr *sechdrs, int apply_relocate_add(Elf_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -239,15 +222,4 @@ int module_finalize(const Elf_Ehdr *hdr, ...@@ -239,15 +222,4 @@ int module_finalize(const Elf_Ehdr *hdr,
return 0; return 0;
} }
#else
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
#endif /* CONFIG_SPARC64 */ #endif /* CONFIG_SPARC64 */
void module_arch_cleanup(struct module *mod)
{
}
...@@ -98,25 +98,6 @@ void module_free(struct module *mod, void *module_region) ...@@ -98,25 +98,6 @@ void module_free(struct module *mod, void *module_region)
*/ */
} }
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
pr_err("module %s: .rel relocation unsupported\n", me->name);
return -ENOEXEC;
}
#ifdef __tilegx__ #ifdef __tilegx__
/* /*
* Validate that the high 16 bits of "value" is just the sign-extension of * Validate that the high 16 bits of "value" is just the sign-extension of
...@@ -249,15 +230,3 @@ int apply_relocate_add(Elf_Shdr *sechdrs, ...@@ -249,15 +230,3 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
} }
return 0; return 0;
} }
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
/* FIXME: perhaps remove the "writable" bit from the TLB? */
return 0;
}
void module_arch_cleanup(struct module *mod)
{
}
...@@ -37,19 +37,6 @@ void *module_alloc(unsigned long size) ...@@ -37,19 +37,6 @@ void *module_alloc(unsigned long size)
return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC); return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC);
} }
void module_free(struct module *module, void *region)
{
vfree(region);
}
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
int int
apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
unsigned int relindex, struct module *module) unsigned int relindex, struct module *module)
...@@ -128,25 +115,3 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -128,25 +115,3 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
} }
return 0; return 0;
} }
int
apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec,
struct module *module)
{
printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
module->name);
return -ENOEXEC;
}
int
module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
struct module *module)
{
return 0;
}
void
module_arch_cleanup(struct module *mod)
{
}
...@@ -45,21 +45,6 @@ void *module_alloc(unsigned long size) ...@@ -45,21 +45,6 @@ void *module_alloc(unsigned long size)
-1, __builtin_return_address(0)); -1, __builtin_return_address(0));
} }
/* Free memory returned from module_alloc */
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
/* We don't need anything special. */
int module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab, const char *strtab,
...@@ -100,17 +85,6 @@ int apply_relocate(Elf32_Shdr *sechdrs, ...@@ -100,17 +85,6 @@ int apply_relocate(Elf32_Shdr *sechdrs,
} }
return 0; return 0;
} }
int apply_relocate_add(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
}
#else /*X86_64*/ #else /*X86_64*/
int apply_relocate_add(Elf64_Shdr *sechdrs, int apply_relocate_add(Elf64_Shdr *sechdrs,
const char *strtab, const char *strtab,
...@@ -181,17 +155,6 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -181,17 +155,6 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
me->name); me->name);
return -ENOEXEC; return -ENOEXEC;
} }
int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
printk(KERN_ERR "non add relocation not supported\n");
return -ENOSYS;
}
#endif #endif
int module_finalize(const Elf_Ehdr *hdr, int module_finalize(const Elf_Ehdr *hdr,
......
...@@ -24,26 +24,6 @@ ...@@ -24,26 +24,6 @@
#undef DEBUG_RELOCATE #undef DEBUG_RELOCATE
void *module_alloc(unsigned long size)
{
if (size == 0)
return NULL;
return vmalloc_exec(size);
}
void module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
int module_frob_arch_sections(Elf32_Ehdr *hdr,
Elf32_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
static int static int
decode_calln_opcode (unsigned char *location) decode_calln_opcode (unsigned char *location)
{ {
...@@ -66,18 +46,6 @@ decode_l32r_opcode (unsigned char *location) ...@@ -66,18 +46,6 @@ decode_l32r_opcode (unsigned char *location)
#endif #endif
} }
int apply_relocate(Elf32_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *mod)
{
printk(KERN_ERR "module %s: REL RELOCATION unsupported\n",
mod->name);
return -ENOEXEC;
}
int apply_relocate_add(Elf32_Shdr *sechdrs, int apply_relocate_add(Elf32_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -222,14 +190,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -222,14 +190,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
} }
return 0; return 0;
} }
int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *mod)
{
return 0;
}
void module_arch_cleanup(struct module *mod)
{
}
...@@ -48,10 +48,18 @@ struct modversion_info ...@@ -48,10 +48,18 @@ struct modversion_info
struct module; struct module;
struct module_kobject {
struct kobject kobj;
struct module *mod;
struct kobject *drivers_dir;
struct module_param_attrs *mp;
};
struct module_attribute { struct module_attribute {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct module_attribute *, struct module *, char *); ssize_t (*show)(struct module_attribute *, struct module_kobject *,
ssize_t (*store)(struct module_attribute *, struct module *, char *);
ssize_t (*store)(struct module_attribute *, struct module_kobject *,
const char *, size_t count); const char *, size_t count);
void (*setup)(struct module *, const char *); void (*setup)(struct module *, const char *);
int (*test)(struct module *); int (*test)(struct module *);
...@@ -65,15 +73,9 @@ struct module_version_attribute { ...@@ -65,15 +73,9 @@ struct module_version_attribute {
} __attribute__ ((__aligned__(sizeof(void *)))); } __attribute__ ((__aligned__(sizeof(void *))));
extern ssize_t __modver_version_show(struct module_attribute *, extern ssize_t __modver_version_show(struct module_attribute *,
struct module *, char *); struct module_kobject *, char *);
struct module_kobject extern struct module_attribute module_uevent;
{
struct kobject kobj;
struct module *mod;
struct kobject *drivers_dir;
struct module_param_attrs *mp;
};
/* These are either module local, or the kernel's dummy ones. */ /* These are either module local, or the kernel's dummy ones. */
extern int init_module(void); extern int init_module(void);
......
...@@ -5,7 +5,12 @@ ...@@ -5,7 +5,12 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/elf.h> #include <linux/elf.h>
/* These must be implemented by the specific architecture */ /* These may be implemented by architectures that need to hook into the
* module loader code. Architectures that don't need to do anything special
* can just rely on the 'weak' default hooks defined in kernel/module.c.
* Note, however, that at least one of apply_relocate or apply_relocate_add
* must be implemented by each architecture.
*/
/* Adjust arch-specific sections. Return 0 on success. */ /* Adjust arch-specific sections. Return 0 on success. */
int module_frob_arch_sections(Elf_Ehdr *hdr, int module_frob_arch_sections(Elf_Ehdr *hdr,
......
...@@ -545,9 +545,9 @@ static void setup_modinfo_##field(struct module *mod, const char *s) \ ...@@ -545,9 +545,9 @@ static void setup_modinfo_##field(struct module *mod, const char *s) \
mod->field = kstrdup(s, GFP_KERNEL); \ mod->field = kstrdup(s, GFP_KERNEL); \
} \ } \
static ssize_t show_modinfo_##field(struct module_attribute *mattr, \ static ssize_t show_modinfo_##field(struct module_attribute *mattr, \
struct module *mod, char *buffer) \ struct module_kobject *mk, char *buffer) \
{ \ { \
return sprintf(buffer, "%s\n", mod->field); \ return sprintf(buffer, "%s\n", mk->mod->field); \
} \ } \
static int modinfo_##field##_exists(struct module *mod) \ static int modinfo_##field##_exists(struct module *mod) \
{ \ { \
...@@ -902,9 +902,9 @@ void symbol_put_addr(void *addr) ...@@ -902,9 +902,9 @@ void symbol_put_addr(void *addr)
EXPORT_SYMBOL_GPL(symbol_put_addr); EXPORT_SYMBOL_GPL(symbol_put_addr);
static ssize_t show_refcnt(struct module_attribute *mattr, static ssize_t show_refcnt(struct module_attribute *mattr,
struct module *mod, char *buffer) struct module_kobject *mk, char *buffer)
{ {
return sprintf(buffer, "%u\n", module_refcount(mod)); return sprintf(buffer, "%u\n", module_refcount(mk->mod));
} }
static struct module_attribute refcnt = { static struct module_attribute refcnt = {
...@@ -952,11 +952,11 @@ static inline int module_unload_init(struct module *mod) ...@@ -952,11 +952,11 @@ static inline int module_unload_init(struct module *mod)
#endif /* CONFIG_MODULE_UNLOAD */ #endif /* CONFIG_MODULE_UNLOAD */
static ssize_t show_initstate(struct module_attribute *mattr, static ssize_t show_initstate(struct module_attribute *mattr,
struct module *mod, char *buffer) struct module_kobject *mk, char *buffer)
{ {
const char *state = "unknown"; const char *state = "unknown";
switch (mod->state) { switch (mk->mod->state) {
case MODULE_STATE_LIVE: case MODULE_STATE_LIVE:
state = "live"; state = "live";
break; break;
...@@ -975,10 +975,27 @@ static struct module_attribute initstate = { ...@@ -975,10 +975,27 @@ static struct module_attribute initstate = {
.show = show_initstate, .show = show_initstate,
}; };
static ssize_t store_uevent(struct module_attribute *mattr,
struct module_kobject *mk,
const char *buffer, size_t count)
{
enum kobject_action action;
if (kobject_action_type(buffer, count, &action) == 0)
kobject_uevent(&mk->kobj, action);
return count;
}
struct module_attribute module_uevent = {
.attr = { .name = "uevent", .mode = 0200 },
.store = store_uevent,
};
static struct module_attribute *modinfo_attrs[] = { static struct module_attribute *modinfo_attrs[] = {
&modinfo_version, &modinfo_version,
&modinfo_srcversion, &modinfo_srcversion,
&initstate, &initstate,
&module_uevent,
#ifdef CONFIG_MODULE_UNLOAD #ifdef CONFIG_MODULE_UNLOAD
&refcnt, &refcnt,
#endif #endif
...@@ -1187,7 +1204,7 @@ struct module_sect_attrs ...@@ -1187,7 +1204,7 @@ struct module_sect_attrs
}; };
static ssize_t module_sect_show(struct module_attribute *mattr, static ssize_t module_sect_show(struct module_attribute *mattr,
struct module *mod, char *buf) struct module_kobject *mk, char *buf)
{ {
struct module_sect_attr *sattr = struct module_sect_attr *sattr =
container_of(mattr, struct module_sect_attr, mattr); container_of(mattr, struct module_sect_attr, mattr);
...@@ -1697,6 +1714,15 @@ static void unset_module_core_ro_nx(struct module *mod) { } ...@@ -1697,6 +1714,15 @@ static void unset_module_core_ro_nx(struct module *mod) { }
static void unset_module_init_ro_nx(struct module *mod) { } static void unset_module_init_ro_nx(struct module *mod) { }
#endif #endif
void __weak module_free(struct module *mod, void *module_region)
{
vfree(module_region);
}
void __weak module_arch_cleanup(struct module *mod)
{
}
/* Free a module, remove from lists, etc. */ /* Free a module, remove from lists, etc. */
static void free_module(struct module *mod) static void free_module(struct module *mod)
{ {
...@@ -1851,6 +1877,26 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) ...@@ -1851,6 +1877,26 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
return ret; return ret;
} }
int __weak apply_relocate(Elf_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
pr_err("module %s: REL relocation unsupported\n", me->name);
return -ENOEXEC;
}
int __weak apply_relocate_add(Elf_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
pr_err("module %s: RELA relocation unsupported\n", me->name);
return -ENOEXEC;
}
static int apply_relocations(struct module *mod, const struct load_info *info) static int apply_relocations(struct module *mod, const struct load_info *info)
{ {
unsigned int i; unsigned int i;
...@@ -2235,6 +2281,11 @@ static void dynamic_debug_remove(struct _ddebug *debug) ...@@ -2235,6 +2281,11 @@ static void dynamic_debug_remove(struct _ddebug *debug)
ddebug_remove_module(debug->modname); ddebug_remove_module(debug->modname);
} }
void * __weak module_alloc(unsigned long size)
{
return size == 0 ? NULL : vmalloc_exec(size);
}
static void *module_alloc_update_bounds(unsigned long size) static void *module_alloc_update_bounds(unsigned long size)
{ {
void *ret = module_alloc(size); void *ret = module_alloc(size);
...@@ -2645,6 +2696,14 @@ static void flush_module_icache(const struct module *mod) ...@@ -2645,6 +2696,14 @@ static void flush_module_icache(const struct module *mod)
set_fs(old_fs); set_fs(old_fs);
} }
int __weak module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
static struct module *layout_and_allocate(struct load_info *info) static struct module *layout_and_allocate(struct load_info *info)
{ {
/* Module within temporary copy. */ /* Module within temporary copy. */
...@@ -2716,6 +2775,13 @@ static void module_deallocate(struct module *mod, struct load_info *info) ...@@ -2716,6 +2775,13 @@ static void module_deallocate(struct module *mod, struct load_info *info)
module_free(mod, mod->module_core); module_free(mod, mod->module_core);
} }
int __weak module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
static int post_relocation(struct module *mod, const struct load_info *info) static int post_relocation(struct module *mod, const struct load_info *info)
{ {
/* Sort exception table now relocations are done. */ /* Sort exception table now relocations are done. */
......
...@@ -225,8 +225,8 @@ int parse_args(const char *name, ...@@ -225,8 +225,8 @@ int parse_args(const char *name,
int ret; \ int ret; \
\ \
ret = strtolfn(val, 0, &l); \ ret = strtolfn(val, 0, &l); \
if (ret == -EINVAL || ((type)l != l)) \ if (ret < 0 || ((type)l != l)) \
return -EINVAL; \ return ret < 0 ? ret : -EINVAL; \
*((type *)kp->arg) = l; \ *((type *)kp->arg) = l; \
return 0; \ return 0; \
} \ } \
...@@ -511,7 +511,7 @@ struct module_param_attrs ...@@ -511,7 +511,7 @@ struct module_param_attrs
#define to_param_attr(n) container_of(n, struct param_attribute, mattr) #define to_param_attr(n) container_of(n, struct param_attribute, mattr)
static ssize_t param_attr_show(struct module_attribute *mattr, static ssize_t param_attr_show(struct module_attribute *mattr,
struct module *mod, char *buf) struct module_kobject *mk, char *buf)
{ {
int count; int count;
struct param_attribute *attribute = to_param_attr(mattr); struct param_attribute *attribute = to_param_attr(mattr);
...@@ -531,7 +531,7 @@ static ssize_t param_attr_show(struct module_attribute *mattr, ...@@ -531,7 +531,7 @@ static ssize_t param_attr_show(struct module_attribute *mattr,
/* sysfs always hands a nul-terminated string in buf. We rely on that. */ /* sysfs always hands a nul-terminated string in buf. We rely on that. */
static ssize_t param_attr_store(struct module_attribute *mattr, static ssize_t param_attr_store(struct module_attribute *mattr,
struct module *owner, struct module_kobject *km,
const char *buf, size_t len) const char *buf, size_t len)
{ {
int err; int err;
...@@ -730,6 +730,10 @@ static struct module_kobject * __init locate_module_kobject(const char *name) ...@@ -730,6 +730,10 @@ static struct module_kobject * __init locate_module_kobject(const char *name)
mk->kobj.kset = module_kset; mk->kobj.kset = module_kset;
err = kobject_init_and_add(&mk->kobj, &module_ktype, NULL, err = kobject_init_and_add(&mk->kobj, &module_ktype, NULL,
"%s", name); "%s", name);
#ifdef CONFIG_MODULES
if (!err)
err = sysfs_create_file(&mk->kobj, &module_uevent.attr);
#endif
if (err) { if (err) {
kobject_put(&mk->kobj); kobject_put(&mk->kobj);
printk(KERN_ERR printk(KERN_ERR
...@@ -807,7 +811,7 @@ static void __init param_sysfs_builtin(void) ...@@ -807,7 +811,7 @@ static void __init param_sysfs_builtin(void)
} }
ssize_t __modver_version_show(struct module_attribute *mattr, ssize_t __modver_version_show(struct module_attribute *mattr,
struct module *mod, char *buf) struct module_kobject *mk, char *buf)
{ {
struct module_version_attribute *vattr = struct module_version_attribute *vattr =
container_of(mattr, struct module_version_attribute, mattr); container_of(mattr, struct module_version_attribute, mattr);
...@@ -852,7 +856,7 @@ static ssize_t module_attr_show(struct kobject *kobj, ...@@ -852,7 +856,7 @@ static ssize_t module_attr_show(struct kobject *kobj,
if (!attribute->show) if (!attribute->show)
return -EIO; return -EIO;
ret = attribute->show(attribute, mk->mod, buf); ret = attribute->show(attribute, mk, buf);
return ret; return ret;
} }
...@@ -871,7 +875,7 @@ static ssize_t module_attr_store(struct kobject *kobj, ...@@ -871,7 +875,7 @@ static ssize_t module_attr_store(struct kobject *kobj,
if (!attribute->store) if (!attribute->store)
return -EIO; return -EIO;
ret = attribute->store(attribute, mk->mod, buf, len); ret = attribute->store(attribute, mk, buf, len);
return ret; return ret;
} }
......
...@@ -254,6 +254,28 @@ static enum export export_no(const char *s) ...@@ -254,6 +254,28 @@ static enum export export_no(const char *s)
return export_unknown; return export_unknown;
} }
static const char *sec_name(struct elf_info *elf, int secindex);
#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
{
const char *secname = sec_name(elf, sec);
if (strstarts(secname, "___ksymtab+"))
return export_plain;
else if (strstarts(secname, "___ksymtab_unused+"))
return export_unused;
else if (strstarts(secname, "___ksymtab_gpl+"))
return export_gpl;
else if (strstarts(secname, "___ksymtab_unused_gpl+"))
return export_unused_gpl;
else if (strstarts(secname, "___ksymtab_gpl_future+"))
return export_gpl_future;
else
return export_unknown;
}
static enum export export_from_sec(struct elf_info *elf, unsigned int sec) static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
{ {
if (sec == elf->export_sec) if (sec == elf->export_sec)
...@@ -563,7 +585,12 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -563,7 +585,12 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
Elf_Sym *sym, const char *symname) Elf_Sym *sym, const char *symname)
{ {
unsigned int crc; unsigned int crc;
enum export export = export_from_sec(info, get_secindex(info, sym)); enum export export;
if (!is_vmlinux(mod->name) && strncmp(symname, "__ksymtab", 9) == 0)
export = export_from_secname(info, get_secindex(info, sym));
else
export = export_from_sec(info, get_secindex(info, sym));
switch (sym->st_shndx) { switch (sym->st_shndx) {
case SHN_COMMON: case SHN_COMMON:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment