forked from Minki/linux
fce2447627
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>
126 lines
3.2 KiB
C
126 lines
3.2 KiB
C
/*
|
|
* Port on Texas Instruments TMS320C6x architecture
|
|
*
|
|
* Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated
|
|
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#ifndef _ASM_C6X_ELF_H
|
|
#define _ASM_C6X_ELF_H
|
|
|
|
/*
|
|
* ELF register definitions..
|
|
*/
|
|
#include <asm/ptrace.h>
|
|
|
|
typedef unsigned long elf_greg_t;
|
|
typedef unsigned long elf_fpreg_t;
|
|
|
|
#define ELF_NGREG 58
|
|
#define ELF_NFPREG 1
|
|
|
|
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
|
typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
|
|
|
/*
|
|
* This is used to ensure we don't load something for the wrong architecture.
|
|
*/
|
|
#define elf_check_arch(x) ((x)->e_machine == EM_TI_C6000)
|
|
|
|
#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.
|
|
*/
|
|
#ifdef __LITTLE_ENDIAN__
|
|
#define ELF_DATA ELFDATA2LSB
|
|
#else
|
|
#define ELF_DATA ELFDATA2MSB
|
|
#endif
|
|
|
|
#define ELF_CLASS ELFCLASS32
|
|
#define ELF_ARCH EM_TI_C6000
|
|
|
|
/* Nothing for now. Need to setup DP... */
|
|
#define ELF_PLAT_INIT(_r)
|
|
|
|
#define USE_ELF_CORE_DUMP
|
|
#define ELF_EXEC_PAGESIZE 4096
|
|
|
|
#define ELF_CORE_COPY_REGS(_dest, _regs) \
|
|
memcpy((char *) &_dest, (char *) _regs, \
|
|
sizeof(struct pt_regs));
|
|
|
|
/* This yields a mask that user programs can use to figure out what
|
|
instruction set this cpu supports. */
|
|
|
|
#define ELF_HWCAP (0)
|
|
|
|
/* This yields a string that ld.so will use to load implementation
|
|
specific libraries for optimization. This is more specific in
|
|
intent than poking at uname or /proc/cpuinfo. */
|
|
|
|
#define ELF_PLATFORM (NULL)
|
|
|
|
#define SET_PERSONALITY(ex) set_personality(PER_LINUX)
|
|
|
|
/* C6X specific section types */
|
|
#define SHT_C6000_UNWIND 0x70000001
|
|
#define SHT_C6000_PREEMPTMAP 0x70000002
|
|
#define SHT_C6000_ATTRIBUTES 0x70000003
|
|
|
|
/* C6X specific DT_ tags */
|
|
#define DT_C6000_DSBT_BASE 0x70000000
|
|
#define DT_C6000_DSBT_SIZE 0x70000001
|
|
#define DT_C6000_PREEMPTMAP 0x70000002
|
|
#define DT_C6000_DSBT_INDEX 0x70000003
|
|
|
|
/* C6X specific relocs */
|
|
#define R_C6000_NONE 0
|
|
#define R_C6000_ABS32 1
|
|
#define R_C6000_ABS16 2
|
|
#define R_C6000_ABS8 3
|
|
#define R_C6000_PCR_S21 4
|
|
#define R_C6000_PCR_S12 5
|
|
#define R_C6000_PCR_S10 6
|
|
#define R_C6000_PCR_S7 7
|
|
#define R_C6000_ABS_S16 8
|
|
#define R_C6000_ABS_L16 9
|
|
#define R_C6000_ABS_H16 10
|
|
#define R_C6000_SBR_U15_B 11
|
|
#define R_C6000_SBR_U15_H 12
|
|
#define R_C6000_SBR_U15_W 13
|
|
#define R_C6000_SBR_S16 14
|
|
#define R_C6000_SBR_L16_B 15
|
|
#define R_C6000_SBR_L16_H 16
|
|
#define R_C6000_SBR_L16_W 17
|
|
#define R_C6000_SBR_H16_B 18
|
|
#define R_C6000_SBR_H16_H 19
|
|
#define R_C6000_SBR_H16_W 20
|
|
#define R_C6000_SBR_GOT_U15_W 21
|
|
#define R_C6000_SBR_GOT_L16_W 22
|
|
#define R_C6000_SBR_GOT_H16_W 23
|
|
#define R_C6000_DSBT_INDEX 24
|
|
#define R_C6000_PREL31 25
|
|
#define R_C6000_COPY 26
|
|
#define R_C6000_ALIGN 253
|
|
#define R_C6000_FPHEAD 254
|
|
#define R_C6000_NOCMP 255
|
|
|
|
#endif /*_ASM_C6X_ELF_H */
|