Skip to content

Commit

Permalink
C6X: add support to build with BINFMT_ELF_FDPIC
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mark Salter committed May 15, 2012
1 parent 18d1470 commit fce2447
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 2 deletions.
14 changes: 13 additions & 1 deletion arch/c6x/include/asm/elf.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,19 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
*/
#define elf_check_arch(x) ((x)->e_machine == EM_TI_C6000)

#define elf_check_const_displacement(x) (1)
#define elf_check_fdpic(x) (1)
#define elf_check_const_displacement(x) (0)

#define ELF_FDPIC_PLAT_INIT(_regs, _exec_map, _interp_map, _dynamic_addr) \
do { \
_regs->b4 = (_exec_map); \
_regs->a6 = (_interp_map); \
_regs->b6 = (_dynamic_addr); \
} while (0)

#define ELF_FDPIC_CORE_EFLAGS 0

#define ELF_CORE_COPY_FPREGS(...) 0 /* No FPU regs to copy */

/*
* These are used to set parameters in the core dumps.
Expand Down
4 changes: 4 additions & 0 deletions arch/c6x/include/asm/mmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@

typedef struct {
unsigned long end_brk;
#ifdef CONFIG_BINFMT_ELF_FDPIC
unsigned long exec_fdpic_loadmap;
unsigned long interp_fdpic_loadmap;
#endif
} mm_context_t;

#endif /* _ASM_C6X_MMU_H */
5 changes: 5 additions & 0 deletions arch/c6x/include/asm/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@
#define PT_DP PT_B14 /* Data Segment Pointer (B14) */
#define PT_SP PT_B15 /* Stack Pointer (B15) */

#define PTRACE_GETFDPIC 31 /* get the ELF fdpic loadmap address */

#define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */
#define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */

#ifndef __ASSEMBLY__

#ifdef _BIG_ENDIAN
Expand Down
2 changes: 1 addition & 1 deletion fs/Kconfig.binfmt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ config ARCH_BINFMT_ELF_RANDOMIZE_PIE
config BINFMT_ELF_FDPIC
bool "Kernel support for FDPIC ELF binaries"
default y
depends on (FRV || BLACKFIN || (SUPERH32 && !MMU))
depends on (FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X)
help
ELF FDPIC binaries are based on ELF, but allow the individual load
segments of a binary to be located in memory independently of each
Expand Down

0 comments on commit fce2447

Please sign in to comment.