aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Salter <msalter@redhat.com>2012-04-23 10:02:08 -0400
committerMark Salter <msalter@redhat.com>2012-05-15 09:17:34 -0400
commitfce244762775f662f5a278a05a6e494b6e4f2774 (patch)
tree4cc7c031181760963f73570c12cec1449011dbb8
parent18d14704d66f651395a68c8a70c86f0a22bccb31 (diff)
C6X: add support to build with BINFMT_ELF_FDPIC
C6x userspace supports a shared library mechanism called DSBT for systems with no MMU. DSBT is similar to FDPIC in allowing shared text segments and private copies of data segments without an MMU. Both methods access data using a base register and offset. With FDPIC, the caller of an external function sets up the base register for the callee. With DSBT, the called function sets up its own base register. Other details differ but both userspaces need the same thing from the kernel loader: a map of where each ELF segment was loaded. The FDPIC loader already provides this, so DSBT just uses it. This patch enables BINFMT_ELF_FDPIC by default for C6X and provides the necessary architecture hooks for the generic loader. Signed-off-by: Mark Salter <msalter@redhat.com>
-rw-r--r--arch/c6x/include/asm/elf.h14
-rw-r--r--arch/c6x/include/asm/mmu.h4
-rw-r--r--arch/c6x/include/asm/ptrace.h5
-rw-r--r--fs/Kconfig.binfmt2
4 files changed, 23 insertions, 2 deletions
diff --git a/arch/c6x/include/asm/elf.h b/arch/c6x/include/asm/elf.h
index d57865ba2c44..f4552db20b4a 100644
--- a/arch/c6x/include/asm/elf.h
+++ b/arch/c6x/include/asm/elf.h
@@ -30,7 +30,19 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
30 */ 30 */
31#define elf_check_arch(x) ((x)->e_machine == EM_TI_C6000) 31#define elf_check_arch(x) ((x)->e_machine == EM_TI_C6000)
32 32
33#define elf_check_const_displacement(x) (1) 33#define elf_check_fdpic(x) (1)
34#define elf_check_const_displacement(x) (0)
35
36#define ELF_FDPIC_PLAT_INIT(_regs, _exec_map, _interp_map, _dynamic_addr) \
37do { \
38 _regs->b4 = (_exec_map); \
39 _regs->a6 = (_interp_map); \
40 _regs->b6 = (_dynamic_addr); \
41} while (0)
42
43#define ELF_FDPIC_CORE_EFLAGS 0
44
45#define ELF_CORE_COPY_FPREGS(...) 0 /* No FPU regs to copy */
34 46
35/* 47/*
36 * These are used to set parameters in the core dumps. 48 * These are used to set parameters in the core dumps.
diff --git a/arch/c6x/include/asm/mmu.h b/arch/c6x/include/asm/mmu.h
index 41592bf16067..4467e770a1ce 100644
--- a/arch/c6x/include/asm/mmu.h
+++ b/arch/c6x/include/asm/mmu.h
@@ -13,6 +13,10 @@
13 13
14typedef struct { 14typedef struct {
15 unsigned long end_brk; 15 unsigned long end_brk;
16#ifdef CONFIG_BINFMT_ELF_FDPIC
17 unsigned long exec_fdpic_loadmap;
18 unsigned long interp_fdpic_loadmap;
19#endif
16} mm_context_t; 20} mm_context_t;
17 21
18#endif /* _ASM_C6X_MMU_H */ 22#endif /* _ASM_C6X_MMU_H */
diff --git a/arch/c6x/include/asm/ptrace.h b/arch/c6x/include/asm/ptrace.h
index 21e8d7931fe7..b04ff5964258 100644
--- a/arch/c6x/include/asm/ptrace.h
+++ b/arch/c6x/include/asm/ptrace.h
@@ -97,6 +97,11 @@
97#define PT_DP PT_B14 /* Data Segment Pointer (B14) */ 97#define PT_DP PT_B14 /* Data Segment Pointer (B14) */
98#define PT_SP PT_B15 /* Stack Pointer (B15) */ 98#define PT_SP PT_B15 /* Stack Pointer (B15) */
99 99
100#define PTRACE_GETFDPIC 31 /* get the ELF fdpic loadmap address */
101
102#define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */
103#define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */
104
100#ifndef __ASSEMBLY__ 105#ifndef __ASSEMBLY__
101 106
102#ifdef _BIG_ENDIAN 107#ifdef _BIG_ENDIAN
diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
index e95d1b64082c..022574202749 100644
--- a/fs/Kconfig.binfmt
+++ b/fs/Kconfig.binfmt
@@ -33,7 +33,7 @@ config ARCH_BINFMT_ELF_RANDOMIZE_PIE
33config BINFMT_ELF_FDPIC 33config BINFMT_ELF_FDPIC
34 bool "Kernel support for FDPIC ELF binaries" 34 bool "Kernel support for FDPIC ELF binaries"
35 default y 35 default y
36 depends on (FRV || BLACKFIN || (SUPERH32 && !MMU)) 36 depends on (FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X)
37 help 37 help
38 ELF FDPIC binaries are based on ELF, but allow the individual load 38 ELF FDPIC binaries are based on ELF, but allow the individual load
39 segments of a binary to be located in memory independently of each 39 segments of a binary to be located in memory independently of each