Commit 786d35d4 authored by David Howells's avatar David Howells Committed by Rusty Russell

Make most arch asm/module.h files use asm-generic/module.h

Use the mapping of Elf_[SPE]hdr, Elf_Addr, Elf_Sym, Elf_Dyn, Elf_Rel/Rela,
ELF_R_TYPE() and ELF_R_SYM() to either the 32-bit version or the 64-bit version
into asm-generic/module.h for all arches bar MIPS.

Also, use the generic definition mod_arch_specific where possible.

To this end, I've defined three new config bools:

 (*) HAVE_MOD_ARCH_SPECIFIC

     Arches define this if they don't want to use the empty generic
     mod_arch_specific struct.

 (*) MODULES_USE_ELF_RELA

     Arches define this if their modules can contain RELA records.  This causes
     the Elf_Rela mapping to be emitted and allows apply_relocate_add() to be
     defined by the arch rather than have the core emit an error message.

 (*) MODULES_USE_ELF_REL

     Arches define this if their modules can contain REL records.  This causes
     the Elf_Rel mapping to be emitted and allows apply_relocate() to be
     defined by the arch rather than have the core emit an error message.

Note that it is possible to allow both REL and RELA records: m68k and mips are
two arches that do this.

With this, some arch asm/module.h files can be deleted entirely and replaced
with a generic-y marker in the arch Kbuild file.

Additionally, I have removed the bits from m32r and score that handle the
unsupported type of relocation record as that's now handled centrally.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Acked-by: default avatarSam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 6ede8123
...@@ -281,4 +281,23 @@ config SECCOMP_FILTER ...@@ -281,4 +281,23 @@ config SECCOMP_FILTER
See Documentation/prctl/seccomp_filter.txt for details. See Documentation/prctl/seccomp_filter.txt for details.
config HAVE_MOD_ARCH_SPECIFIC
bool
help
The arch uses struct mod_arch_specific to store data. Many arches
just need a simple module loader without arch specific data - those
should not enable this.
config MODULES_USE_ELF_RELA
bool
help
Modules only use ELF RELA relocations. Modules with ELF REL
relocations will give an error.
config MODULES_USE_ELF_REL
bool
help
Modules only use ELF REL relocations. Modules with ELF RELA
relocations will give an error.
source "kernel/gcov/Kconfig" source "kernel/gcov/Kconfig"
...@@ -20,6 +20,8 @@ config ALPHA ...@@ -20,6 +20,8 @@ config ALPHA
select GENERIC_CMOS_UPDATE select GENERIC_CMOS_UPDATE
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
help help
The Alpha is a 64-bit general-purpose processor designed and The Alpha is a 64-bit general-purpose processor designed and
marketed by the Digital Equipment Corporation of blessed memory, marketed by the Digital Equipment Corporation of blessed memory,
......
#ifndef _ALPHA_MODULE_H #ifndef _ALPHA_MODULE_H
#define _ALPHA_MODULE_H #define _ALPHA_MODULE_H
#include <asm-generic/module.h>
struct mod_arch_specific struct mod_arch_specific
{ {
unsigned int gotsecindex; unsigned int gotsecindex;
}; };
#define Elf_Sym Elf64_Sym
#define Elf_Shdr Elf64_Shdr
#define Elf_Ehdr Elf64_Ehdr
#define Elf_Phdr Elf64_Phdr
#define Elf_Dyn Elf64_Dyn
#define Elf_Rel Elf64_Rel
#define Elf_Rela Elf64_Rela
#define ARCH_SHF_SMALL SHF_ALPHA_GPREL #define ARCH_SHF_SMALL SHF_ALPHA_GPREL
#ifdef MODULE #ifdef MODULE
......
...@@ -49,6 +49,8 @@ config ARM ...@@ -49,6 +49,8 @@ config ARM
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
select MODULES_USE_ELF_REL
help help
The ARM series is a line of low-power-consumption RISC chip designs The ARM series is a line of low-power-consumption RISC chip designs
licensed by ARM Ltd and targeted at embedded applications and licensed by ARM Ltd and targeted at embedded applications and
......
#ifndef _ASM_ARM_MODULE_H #ifndef _ASM_ARM_MODULE_H
#define _ASM_ARM_MODULE_H #define _ASM_ARM_MODULE_H
#define Elf_Shdr Elf32_Shdr #include <asm-generic/module.h>
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
struct unwind_table; struct unwind_table;
...@@ -16,13 +14,11 @@ enum { ...@@ -16,13 +14,11 @@ enum {
ARM_SEC_DEVEXIT, ARM_SEC_DEVEXIT,
ARM_SEC_MAX, ARM_SEC_MAX,
}; };
#endif
struct mod_arch_specific { struct mod_arch_specific {
#ifdef CONFIG_ARM_UNWIND
struct unwind_table *unwind[ARM_SEC_MAX]; struct unwind_table *unwind[ARM_SEC_MAX];
#endif
}; };
#endif
/* /*
* Add the ARM architecture version to the version magic string * Add the ARM architecture version to the version magic string
......
...@@ -15,6 +15,8 @@ config AVR32 ...@@ -15,6 +15,8 @@ config AVR32
select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_IPC_PARSE_VERSION
select ARCH_HAVE_NMI_SAFE_CMPXCHG select ARCH_HAVE_NMI_SAFE_CMPXCHG
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
help help
AVR32 is a high-performance 32-bit RISC microprocessor core, AVR32 is a high-performance 32-bit RISC microprocessor core,
designed for cost-sensitive embedded applications, with particular designed for cost-sensitive embedded applications, with particular
......
#ifndef __ASM_AVR32_MODULE_H #ifndef __ASM_AVR32_MODULE_H
#define __ASM_AVR32_MODULE_H #define __ASM_AVR32_MODULE_H
#include <asm-generic/module.h>
struct mod_arch_syminfo { struct mod_arch_syminfo {
unsigned long got_offset; unsigned long got_offset;
int got_initialized; int got_initialized;
...@@ -17,10 +19,6 @@ struct mod_arch_specific { ...@@ -17,10 +19,6 @@ struct mod_arch_specific {
struct mod_arch_syminfo *syminfo; struct mod_arch_syminfo *syminfo;
}; };
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#define MODULE_PROC_FAMILY "AVR32v1" #define MODULE_PROC_FAMILY "AVR32v1"
#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY #define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
......
...@@ -42,6 +42,8 @@ config BLACKFIN ...@@ -42,6 +42,8 @@ config BLACKFIN
select HAVE_NMI_WATCHDOG if NMI_WATCHDOG select HAVE_NMI_WATCHDOG if NMI_WATCHDOG
select GENERIC_SMP_IDLE_THREAD select GENERIC_SMP_IDLE_THREAD
select ARCH_USES_GETTIMEOFFSET if !GENERIC_CLOCKEVENTS select ARCH_USES_GETTIMEOFFSET if !GENERIC_CLOCKEVENTS
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
config GENERIC_CSUM config GENERIC_CSUM
def_bool y def_bool y
......
...@@ -7,9 +7,7 @@ ...@@ -7,9 +7,7 @@
#ifndef _ASM_BFIN_MODULE_H #ifndef _ASM_BFIN_MODULE_H
#define _ASM_BFIN_MODULE_H #define _ASM_BFIN_MODULE_H
#define Elf_Shdr Elf32_Shdr #include <asm-generic/module.h>
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
struct mod_arch_specific { struct mod_arch_specific {
Elf_Shdr *text_l1; Elf_Shdr *text_l1;
......
...@@ -17,6 +17,7 @@ config C6X ...@@ -17,6 +17,7 @@ config C6X
select OF select OF
select OF_EARLY_FLATTREE select OF_EARLY_FLATTREE
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select MODULES_USE_ELF_RELA
config MMU config MMU
def_bool n def_bool n
......
...@@ -13,17 +13,7 @@ ...@@ -13,17 +13,7 @@
#ifndef _ASM_C6X_MODULE_H #ifndef _ASM_C6X_MODULE_H
#define _ASM_C6X_MODULE_H #define _ASM_C6X_MODULE_H
#define Elf_Shdr Elf32_Shdr #include <asm-generic/module.h>
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#define Elf_Addr Elf32_Addr
#define Elf_Word Elf32_Word
/*
* This file contains the C6x architecture specific module code.
*/
struct mod_arch_specific {
};
struct loaded_sections { struct loaded_sections {
unsigned int new_vaddr; unsigned int new_vaddr;
......
...@@ -47,6 +47,7 @@ config CRIS ...@@ -47,6 +47,7 @@ config CRIS
select GENERIC_IOMAP select GENERIC_IOMAP
select GENERIC_SMP_IDLE_THREAD if ETRAX_ARCH_V32 select GENERIC_SMP_IDLE_THREAD if ETRAX_ARCH_V32
select GENERIC_CMOS_UPDATE select GENERIC_CMOS_UPDATE
select MODULES_USE_ELF_RELA
config HZ config HZ
int int
......
...@@ -7,3 +7,5 @@ header-y += ethernet.h ...@@ -7,3 +7,5 @@ header-y += ethernet.h
header-y += etraxgpio.h header-y += etraxgpio.h
header-y += rs485.h header-y += rs485.h
header-y += sync_serial.h header-y += sync_serial.h
generic-y += module.h
#ifndef _ASM_CRIS_MODULE_H
#define _ASM_CRIS_MODULE_H
/* cris is simple */
struct mod_arch_specific { };
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#endif /* _ASM_CRIS_MODULE_H */
...@@ -11,13 +11,7 @@ ...@@ -11,13 +11,7 @@
#ifndef _ASM_MODULE_H #ifndef _ASM_MODULE_H
#define _ASM_MODULE_H #define _ASM_MODULE_H
struct mod_arch_specific #include <asm-generic/module.h>
{
};
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
/* /*
* Include the architecture version. * Include the architecture version.
......
...@@ -6,6 +6,7 @@ config H8300 ...@@ -6,6 +6,7 @@ config H8300
select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_IPC_PARSE_VERSION
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select MODULES_USE_ELF_RELA
config SYMBOL_PREFIX config SYMBOL_PREFIX
string string
......
include include/asm-generic/Kbuild.asm include include/asm-generic/Kbuild.asm
generic-y += module.h
#ifndef _ASM_H8300_MODULE_H
#define _ASM_H8300_MODULE_H
/*
* This file contains the H8/300 architecture specific module code.
*/
struct mod_arch_specific { };
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#endif /* _ASM_H8/300_MODULE_H */
...@@ -30,6 +30,7 @@ config HEXAGON ...@@ -30,6 +30,7 @@ config HEXAGON
select KTIME_SCALAR select KTIME_SCALAR
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select GENERIC_CLOCKEVENTS_BROADCAST select GENERIC_CLOCKEVENTS_BROADCAST
select MODULES_USE_ELF_RELA
---help--- ---help---
Qualcomm Hexagon is a processor architecture designed for high Qualcomm Hexagon is a processor architecture designed for high
performance and low power across a wide variety of applications. performance and low power across a wide variety of applications.
......
...@@ -39,6 +39,8 @@ config IA64 ...@@ -39,6 +39,8 @@ config IA64
select ARCH_THREAD_INFO_ALLOCATOR select ARCH_THREAD_INFO_ALLOCATOR
select ARCH_CLOCKSOURCE_DATA select ARCH_CLOCKSOURCE_DATA
select GENERIC_TIME_VSYSCALL select GENERIC_TIME_VSYSCALL
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
default y default y
help help
The Itanium Processor Family is Intel's 64-bit successor to The Itanium Processor Family is Intel's 64-bit successor to
......
#ifndef _ASM_IA64_MODULE_H #ifndef _ASM_IA64_MODULE_H
#define _ASM_IA64_MODULE_H #define _ASM_IA64_MODULE_H
#include <asm-generic/module.h>
/* /*
* IA-64-specific support for kernel module loader. * IA-64-specific support for kernel module loader.
* *
...@@ -29,10 +31,6 @@ struct mod_arch_specific { ...@@ -29,10 +31,6 @@ struct mod_arch_specific {
unsigned int next_got_entry; /* index of next available got entry */ unsigned int next_got_entry; /* index of next available got entry */
}; };
#define Elf_Shdr Elf64_Shdr
#define Elf_Sym Elf64_Sym
#define Elf_Ehdr Elf64_Ehdr
#define MODULE_PROC_FAMILY "ia64" #define MODULE_PROC_FAMILY "ia64"
#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY \ #define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY \
"gcc-" __stringify(__GNUC__) "." __stringify(__GNUC_MINOR__) "gcc-" __stringify(__GNUC__) "." __stringify(__GNUC_MINOR__)
......
...@@ -13,6 +13,7 @@ config M32R ...@@ -13,6 +13,7 @@ config M32R
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select GENERIC_ATOMIC64 select GENERIC_ATOMIC64
select ARCH_USES_GETTIMEOFFSET select ARCH_USES_GETTIMEOFFSET
select MODULES_USE_ELF_RELA
config SBUS config SBUS
bool bool
......
include include/asm-generic/Kbuild.asm include include/asm-generic/Kbuild.asm
generic-y += module.h
#ifndef _ASM_M32R_MODULE_H
#define _ASM_M32R_MODULE_H
struct mod_arch_specific { };
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#endif /* _ASM_M32R_MODULE_H */
...@@ -201,18 +201,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -201,18 +201,3 @@ 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)
{
#if 0
printk(KERN_ERR "module %s: REL RELOCATION unsupported\n",
me->name);
return -ENOEXEC;
#endif
return 0;
}
...@@ -13,6 +13,9 @@ config M68K ...@@ -13,6 +13,9 @@ config M68K
select FPU if MMU select FPU if MMU
select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_IPC_PARSE_VERSION
select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_REL
select MODULES_USE_ELF_RELA
config RWSEM_GENERIC_SPINLOCK config RWSEM_GENERIC_SPINLOCK
bool bool
......
#ifndef _ASM_M68K_MODULE_H #ifndef _ASM_M68K_MODULE_H
#define _ASM_M68K_MODULE_H #define _ASM_M68K_MODULE_H
#include <asm-generic/module.h>
enum m68k_fixup_type { enum m68k_fixup_type {
m68k_fixup_memoffset, m68k_fixup_memoffset,
m68k_fixup_vnode_shift, m68k_fixup_vnode_shift,
...@@ -36,8 +38,4 @@ struct module; ...@@ -36,8 +38,4 @@ struct module;
extern void module_fixup(struct module *mod, struct m68k_fixup_info *start, extern void module_fixup(struct module *mod, struct m68k_fixup_info *start,
struct m68k_fixup_info *end); struct m68k_fixup_info *end);
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#endif /* _ASM_M68K_MODULE_H */ #endif /* _ASM_M68K_MODULE_H */
...@@ -24,6 +24,7 @@ config MICROBLAZE ...@@ -24,6 +24,7 @@ config MICROBLAZE
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select GENERIC_ATOMIC64 select GENERIC_ATOMIC64
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select MODULES_USE_ELF_RELA
config SWAP config SWAP
def_bool n def_bool n
......
...@@ -36,6 +36,9 @@ config MIPS ...@@ -36,6 +36,9 @@ config MIPS
select BUILDTIME_EXTABLE_SORT select BUILDTIME_EXTABLE_SORT
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select GENERIC_CMOS_UPDATE select GENERIC_CMOS_UPDATE
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_REL
select MODULES_USE_ELF_RELA if 64BIT
menu "Machine selection" menu "Machine selection"
......
...@@ -35,11 +35,14 @@ typedef struct { ...@@ -35,11 +35,14 @@ typedef struct {
} Elf64_Mips_Rela; } Elf64_Mips_Rela;
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
#define Elf_Shdr Elf32_Shdr #define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym #define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr #define Elf_Ehdr Elf32_Ehdr
#define Elf_Addr Elf32_Addr #define Elf_Addr Elf32_Addr
#define Elf_Rel Elf32_Rel
#define Elf_Rela Elf32_Rela
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
#define ELF_R_SYM(X) ELF32_R_SYM(X)
#define Elf_Mips_Rel Elf32_Rel #define Elf_Mips_Rel Elf32_Rel
#define Elf_Mips_Rela Elf32_Rela #define Elf_Mips_Rela Elf32_Rela
...@@ -50,11 +53,14 @@ typedef struct { ...@@ -50,11 +53,14 @@ typedef struct {
#endif #endif
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
#define Elf_Shdr Elf64_Shdr #define Elf_Shdr Elf64_Shdr
#define Elf_Sym Elf64_Sym #define Elf_Sym Elf64_Sym
#define Elf_Ehdr Elf64_Ehdr #define Elf_Ehdr Elf64_Ehdr
#define Elf_Addr Elf64_Addr #define Elf_Addr Elf64_Addr
#define Elf_Rel Elf64_Rel
#define Elf_Rela Elf64_Rela
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
#define ELF_R_SYM(X) ELF64_R_SYM(X)
#define Elf_Mips_Rel Elf64_Mips_Rel #define Elf_Mips_Rel Elf64_Mips_Rel
#define Elf_Mips_Rela Elf64_Mips_Rela #define Elf_Mips_Rela Elf64_Mips_Rela
......
...@@ -31,7 +31,7 @@ obj-$(CONFIG_SYNC_R4K) += sync-r4k.o ...@@ -31,7 +31,7 @@ obj-$(CONFIG_SYNC_R4K) += sync-r4k.o
obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_STACKTRACE) += stacktrace.o
obj-$(CONFIG_MODULES) += mips_ksyms.o module.o obj-$(CONFIG_MODULES) += mips_ksyms.o module.o
obj-$(CONFIG_MODULES) += module-rela.o obj-$(CONFIG_MODULES_USE_ELF_RELA) += module-rela.o
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
......
...@@ -8,6 +8,7 @@ config MN10300 ...@@ -8,6 +8,7 @@ config MN10300
select HAVE_ARCH_KGDB select HAVE_ARCH_KGDB
select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select MODULES_USE_ELF_RELA
config AM33_2 config AM33_2
def_bool n def_bool n
......
...@@ -12,12 +12,7 @@ ...@@ -12,12 +12,7 @@
#ifndef _ASM_MODULE_H #ifndef _ASM_MODULE_H
#define _ASM_MODULE_H #define _ASM_MODULE_H
struct mod_arch_specific { #include <asm-generic/module.h>
};
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
/* /*
* Include the MN10300 architecture version. * Include the MN10300 architecture version.
......
...@@ -21,6 +21,7 @@ config OPENRISC ...@@ -21,6 +21,7 @@ config OPENRISC
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select MODULES_USE_ELF_RELA
config MMU config MMU
def_bool y def_bool y
......
...@@ -19,6 +19,8 @@ config PARISC ...@@ -19,6 +19,8 @@ config PARISC
select ARCH_HAVE_NMI_SAFE_CMPXCHG select ARCH_HAVE_NMI_SAFE_CMPXCHG
select GENERIC_SMP_IDLE_THREAD select GENERIC_SMP_IDLE_THREAD
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
help help
The PA-RISC microprocessor is designed by Hewlett-Packard and used The PA-RISC microprocessor is designed by Hewlett-Packard and used
......
#ifndef _ASM_PARISC_MODULE_H #ifndef _ASM_PARISC_MODULE_H
#define _ASM_PARISC_MODULE_H #define _ASM_PARISC_MODULE_H
#include <asm-generic/module.h>
/* /*
* This file contains the parisc architecture specific module code. * This file contains the parisc architecture specific module code.
*/ */
#ifdef CONFIG_64BIT
#define Elf_Shdr Elf64_Shdr
#define Elf_Sym Elf64_Sym
#define Elf_Ehdr Elf64_Ehdr
#define Elf_Addr Elf64_Addr
#define Elf_Rela Elf64_Rela
#else
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#define Elf_Addr Elf32_Addr
#define Elf_Rela Elf32_Rela
#endif
struct unwind_table; struct unwind_table;
......
...@@ -139,6 +139,8 @@ config PPC ...@@ -139,6 +139,8 @@ config PPC
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
config EARLY_PRINTK config EARLY_PRINTK
bool bool
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/list.h> #include <linux/list.h>
#include <asm/bug.h> #include <asm/bug.h>
#include <asm-generic/module.h>
#ifndef __powerpc64__ #ifndef __powerpc64__
...@@ -60,16 +61,10 @@ struct mod_arch_specific { ...@@ -60,16 +61,10 @@ struct mod_arch_specific {
*/ */
#ifdef __powerpc64__ #ifdef __powerpc64__
# define Elf_Shdr Elf64_Shdr
# define Elf_Sym Elf64_Sym
# define Elf_Ehdr Elf64_Ehdr
# ifdef MODULE # ifdef MODULE
asm(".section .stubs,\"ax\",@nobits; .align 3; .previous"); asm(".section .stubs,\"ax\",@nobits; .align 3; .previous");
# endif # endif
#else #else
# define Elf_Shdr Elf32_Shdr
# define Elf_Sym Elf32_Sym
# define Elf_Ehdr Elf32_Ehdr
# ifdef MODULE # ifdef MODULE
asm(".section .plt,\"ax\",@nobits; .align 3; .previous"); asm(".section .plt,\"ax\",@nobits; .align 3; .previous");
asm(".section .init.plt,\"ax\",@nobits; .align 3; .previous"); asm(".section .init.plt,\"ax\",@nobits; .align 3; .previous");
......
...@@ -125,6 +125,8 @@ config S390 ...@@ -125,6 +125,8 @@ config S390
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select KTIME_SCALAR if 32BIT select KTIME_SCALAR if 32BIT
select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_SECCOMP_FILTER
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
config SCHED_OMIT_FRAME_POINTER config SCHED_OMIT_FRAME_POINTER
def_bool y def_bool y
......
#ifndef _ASM_S390_MODULE_H #ifndef _ASM_S390_MODULE_H
#define _ASM_S390_MODULE_H #define _ASM_S390_MODULE_H
#include <asm-generic/module.h>
/* /*
* This file contains the s390 architecture specific module code. * This file contains the s390 architecture specific module code.
*/ */
...@@ -28,19 +31,4 @@ struct mod_arch_specific ...@@ -28,19 +31,4 @@ struct mod_arch_specific
struct mod_arch_syminfo *syminfo; struct mod_arch_syminfo *syminfo;
}; };
#ifdef CONFIG_64BIT
#define ElfW(x) Elf64_ ## x
#define ELFW(x) ELF64_ ## x
#else
#define ElfW(x) Elf32_ ## x
#define ELFW(x) ELF32_ ## x
#endif
#define Elf_Addr ElfW(Addr)
#define Elf_Rela ElfW(Rela)
#define Elf_Shdr ElfW(Shdr)
#define Elf_Sym ElfW(Sym)
#define Elf_Ehdr ElfW(Ehdr)
#define ELF_R_SYM ELFW(R_SYM)
#define ELF_R_TYPE ELFW(R_TYPE)
#endif /* _ASM_S390_MODULE_H */ #endif /* _ASM_S390_MODULE_H */
...@@ -10,6 +10,8 @@ config SCORE ...@@ -10,6 +10,8 @@ config SCORE
select ARCH_DISCARD_MEMBLOCK select ARCH_DISCARD_MEMBLOCK
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_REL
choice choice
prompt "System type" prompt "System type"
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <linux/list.h> #include <linux/list.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm-generic/module.h>
struct mod_arch_specific { struct mod_arch_specific {
/* Data Bus Error exception tables */ /* Data Bus Error exception tables */
...@@ -13,11 +14,6 @@ struct mod_arch_specific { ...@@ -13,11 +14,6 @@ struct mod_arch_specific {
typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#define Elf_Addr Elf32_Addr
/* Given an address, look for it in the exception tables. */ /* Given an address, look for it in the exception tables. */
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
const struct exception_table_entry *search_module_dbetables(unsigned long addr); const struct exception_table_entry *search_module_dbetables(unsigned long addr);
......
...@@ -125,16 +125,6 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, ...@@ -125,16 +125,6 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab,
return 0; return 0;
} }
int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
unsigned int symindex, unsigned int relsec,
struct module *me)
{
/* Non-standard return value... most other arch's return -ENOEXEC
* for an unsupported relocation variant
*/
return 0;
}
/* Given an address, look for it in the module exception tables. */ /* Given an address, look for it in the module exception tables. */
const struct exception_table_entry *search_module_dbetables(unsigned long addr) const struct exception_table_entry *search_module_dbetables(unsigned long addr)
{ {
......
...@@ -35,6 +35,8 @@ config SUPERH ...@@ -35,6 +35,8 @@ config SUPERH
select GENERIC_CMOS_UPDATE if SH_SH03 || SH_DREAMCAST select GENERIC_CMOS_UPDATE if SH_SH03 || SH_DREAMCAST
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select HAVE_MOD_ARCH_SPECIFIC if DWARF_UNWINDER
select MODULES_USE_ELF_RELA
help help
The SuperH is a RISC processor targeted for use in embedded systems The SuperH is a RISC processor targeted for use in embedded systems
and consumer electronics; it was also used in the Sega Dreamcast and consumer electronics; it was also used in the Sega Dreamcast
......
#ifndef _ASM_SH_MODULE_H #ifndef _ASM_SH_MODULE_H
#define _ASM_SH_MODULE_H #define _ASM_SH_MODULE_H
struct mod_arch_specific { #include <asm-generic/module.h>
#ifdef CONFIG_DWARF_UNWINDER #ifdef CONFIG_DWARF_UNWINDER
struct mod_arch_specific {
struct list_head fde_list; struct list_head fde_list;
struct list_head cie_list; struct list_head cie_list;
#endif
}; };
#ifdef CONFIG_64BIT
#define Elf_Shdr Elf64_Shdr
#define Elf_Sym Elf64_Sym
#define Elf_Ehdr Elf64_Ehdr
#else
#define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#endif #endif
#ifdef CONFIG_CPU_LITTLE_ENDIAN #ifdef CONFIG_CPU_LITTLE_ENDIAN
......
...@@ -37,6 +37,7 @@ config SPARC ...@@ -37,6 +37,7 @@ config SPARC
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select MODULES_USE_ELF_RELA
config SPARC32 config SPARC32
def_bool !64BIT def_bool !64BIT
......
...@@ -21,4 +21,5 @@ generic-y += div64.h ...@@ -21,4 +21,5 @@ generic-y += div64.h
generic-y += local64.h generic-y += local64.h
generic-y += irq_regs.h generic-y += irq_regs.h
generic-y += local.h generic-y += local.h
generic-y += module.h
generic-y += word-at-a-time.h generic-y += word-at-a-time.h
#ifndef __SPARC_MODULE_H
#define __SPARC_MODULE_H
struct mod_arch_specific { };
/*
* Use some preprocessor magic to define the correct symbol
* for sparc32 and sparc64.
* Elf_Addr becomes Elf32_Addr for sparc32 and Elf64_Addr for sparc64
*/
#define ___ELF(a, b, c) a##b##c
#define __ELF(a, b, c) ___ELF(a, b, c)
#define _Elf(t) __ELF(Elf, CONFIG_BITS, t)
#define _ELF(t) __ELF(ELF, CONFIG_BITS, t)
#define Elf_Shdr _Elf(_Shdr)
#define Elf_Sym _Elf(_Sym)
#define Elf_Ehdr _Elf(_Ehdr)
#define Elf_Rela _Elf(_Rela)
#define Elf_Addr _Elf(_Addr)
#define ELF_R_SYM _ELF(_R_SYM)
#define ELF_R_TYPE _ELF(_R_TYPE)
#endif /* __SPARC_MODULE_H */
...@@ -17,6 +17,7 @@ config TILE ...@@ -17,6 +17,7 @@ config TILE
select SYS_HYPERVISOR select SYS_HYPERVISOR
select ARCH_HAVE_NMI_SAFE_CMPXCHG select ARCH_HAVE_NMI_SAFE_CMPXCHG
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select MODULES_USE_ELF_RELA
# FIXME: investigate whether we need/want these options. # FIXME: investigate whether we need/want these options.
# select HAVE_IOREMAP_PROT # select HAVE_IOREMAP_PROT
......
...@@ -14,6 +14,7 @@ config UNICORE32 ...@@ -14,6 +14,7 @@ config UNICORE32
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_FRAME_POINTERS
select GENERIC_IOMAP select GENERIC_IOMAP
select MODULES_USE_ELF_REL
help help
UniCore-32 is 32-bit Instruction Set Architecture, UniCore-32 is 32-bit Instruction Set Architecture,
including a series of low-power-consumption RISC chip including a series of low-power-consumption RISC chip
......
...@@ -97,6 +97,8 @@ config X86 ...@@ -97,6 +97,8 @@ config X86
select KTIME_SCALAR if X86_32 select KTIME_SCALAR if X86_32
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select MODULES_USE_ELF_REL if X86_32
select MODULES_USE_ELF_RELA if X86_64
config INSTRUCTION_DECODER config INSTRUCTION_DECODER
def_bool (KPROBES || PERF_EVENTS || UPROBES) def_bool (KPROBES || PERF_EVENTS || UPROBES)
......
...@@ -21,9 +21,11 @@ config 64BIT ...@@ -21,9 +21,11 @@ config 64BIT
config X86_32 config X86_32
def_bool !64BIT def_bool !64BIT
select HAVE_AOUT select HAVE_AOUT
select MODULES_USE_ELF_REL
config X86_64 config X86_64
def_bool 64BIT def_bool 64BIT
select MODULES_USE_ELF_RELA
config RWSEM_XCHGADD_ALGORITHM config RWSEM_XCHGADD_ALGORITHM
def_bool X86_XADD && 64BIT def_bool X86_XADD && 64BIT
......
...@@ -11,6 +11,7 @@ config XTENSA ...@@ -11,6 +11,7 @@ config XTENSA
select HAVE_GENERIC_HARDIRQS select HAVE_GENERIC_HARDIRQS
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select MODULES_USE_ELF_RELA
help help
Xtensa processors are 32-bit RISC machines designed by Tensilica Xtensa processors are 32-bit RISC machines designed by Tensilica
primarily for embedded systems. These processors are both primarily for embedded systems. These processors are both
......
...@@ -13,15 +13,8 @@ ...@@ -13,15 +13,8 @@
#ifndef _XTENSA_MODULE_H #ifndef _XTENSA_MODULE_H
#define _XTENSA_MODULE_H #define _XTENSA_MODULE_H
struct mod_arch_specific
{
/* No special elements, yet. */
};
#define MODULE_ARCH_VERMAGIC "xtensa-" __stringify(XCHAL_CORE_ID) " " #define MODULE_ARCH_VERMAGIC "xtensa-" __stringify(XCHAL_CORE_ID) " "
#define Elf_Shdr Elf32_Shdr #include <asm-generic/module.h>
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#endif /* _XTENSA_MODULE_H */ #endif /* _XTENSA_MODULE_H */
...@@ -5,18 +5,44 @@ ...@@ -5,18 +5,44 @@
* Many architectures just need a simple module * Many architectures just need a simple module
* loader without arch specific data. * loader without arch specific data.
*/ */
#ifndef CONFIG_HAVE_MOD_ARCH_SPECIFIC
struct mod_arch_specific struct mod_arch_specific
{ {
}; };
#endif
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
#define Elf_Shdr Elf64_Shdr #define Elf_Shdr Elf64_Shdr
#define Elf_Sym Elf64_Sym #define Elf_Phdr Elf64_Phdr
#define Elf_Ehdr Elf64_Ehdr #define Elf_Sym Elf64_Sym
#else #define Elf_Dyn Elf64_Dyn
#define Elf_Shdr Elf32_Shdr #define Elf_Ehdr Elf64_Ehdr
#define Elf_Sym Elf32_Sym #define Elf_Addr Elf64_Addr
#define Elf_Ehdr Elf32_Ehdr #ifdef CONFIG_MODULES_USE_ELF_REL
#define Elf_Rel Elf64_Rel
#endif
#ifdef CONFIG_MODULES_USE_ELF_RELA
#define Elf_Rela Elf64_Rela
#endif
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
#define ELF_R_SYM(X) ELF64_R_SYM(X)
#else /* CONFIG_64BIT */
#define Elf_Shdr Elf32_Shdr
#define Elf_Phdr Elf32_Phdr
#define Elf_Sym Elf32_Sym
#define Elf_Dyn Elf32_Dyn
#define Elf_Ehdr Elf32_Ehdr
#define Elf_Addr Elf32_Addr
#ifdef CONFIG_MODULES_USE_ELF_REL
#define Elf_Rel Elf32_Rel
#endif
#ifdef CONFIG_MODULES_USE_ELF_RELA
#define Elf_Rela Elf32_Rela
#endif
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
#define ELF_R_SYM(X) ELF32_R_SYM(X)
#endif #endif
#endif /* __ASM_GENERIC_MODULE_H */ #endif /* __ASM_GENERIC_MODULE_H */
...@@ -28,21 +28,49 @@ void *module_alloc(unsigned long size); ...@@ -28,21 +28,49 @@ void *module_alloc(unsigned long 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);
/* Apply the given relocation to the (simplified) ELF. Return -error /*
or 0. */ * Apply the given relocation to the (simplified) ELF. Return -error
* or 0.
*/
#ifdef CONFIG_MODULES_USE_ELF_REL
int apply_relocate(Elf_Shdr *sechdrs, int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
unsigned int relsec, unsigned int relsec,
struct module *mod); struct module *mod);
#else
static inline int apply_relocate(Elf_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
/* Apply the given add relocation to the (simplified) ELF. Return /*
-error or 0 */ * Apply the given add relocation to the (simplified) ELF. Return
* -error or 0
*/
#ifdef CONFIG_MODULES_USE_ELF_RELA
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,
unsigned int relsec, unsigned int relsec,
struct module *mod); struct module *mod);
#else
static inline int apply_relocate_add(Elf_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
/* Any final processing of module before access. Return -error or 0. */ /* Any final processing of module before access. Return -error or 0. */
int module_finalize(const Elf_Ehdr *hdr, int module_finalize(const Elf_Ehdr *hdr,
......
...@@ -1949,26 +1949,6 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) ...@@ -1949,26 +1949,6 @@ 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;
......
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