Commit e3ddb8bb authored by Max Filippov's avatar Max Filippov

xtensa: add FDPIC and static PIE support for noMMU

Define ELFOSABI_XTENSA_FDPIC and use it as an OSABI tag in the ELF
header to distinguish FDPIC ELF files from regular ELF files.
Define ELF_FDPIC_PLAT_INIT and put executable map, interpreter map and
executable dynamic section addresses into registers a4..a6.
Update start_thread macro to preserve register values in the current
register window.
Add definitions for PTRACE_GETFDPIC, PTRACE_GETFDPIC_EXEC and
PTRACE_GETFDPIC_INTERP.
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent ccd2d9df
...@@ -93,6 +93,10 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; ...@@ -93,6 +93,10 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
#define elf_check_arch(x) ( ( (x)->e_machine == EM_XTENSA ) || \ #define elf_check_arch(x) ( ( (x)->e_machine == EM_XTENSA ) || \
( (x)->e_machine == EM_XTENSA_OLD ) ) ( (x)->e_machine == EM_XTENSA_OLD ) )
#define ELFOSABI_XTENSA_FDPIC 65
#define elf_check_fdpic(x) ((x)->e_ident[EI_OSABI] == ELFOSABI_XTENSA_FDPIC)
#define ELF_FDPIC_CORE_EFLAGS 0
/* /*
* These are used to set parameters in the core dumps. * These are used to set parameters in the core dumps.
*/ */
...@@ -164,6 +168,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; ...@@ -164,6 +168,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
(_r)->areg[14] = 0; (_r)->areg[15] = 0; \ (_r)->areg[14] = 0; (_r)->areg[15] = 0; \
} while (0) } while (0)
#define ELF_FDPIC_PLAT_INIT(_r, _exec_map_addr, _interp_map_addr, dynamic_addr) \
do { \
(_r)->areg[4] = _exec_map_addr; \
(_r)->areg[5] = _interp_map_addr; \
(_r)->areg[6] = dynamic_addr; \
} while (0)
typedef struct { typedef struct {
xtregs_opt_t opt; xtregs_opt_t opt;
xtregs_user_t user; xtregs_user_t user;
......
...@@ -205,9 +205,12 @@ struct thread_struct { ...@@ -205,9 +205,12 @@ struct thread_struct {
#define start_thread(regs, new_pc, new_sp) \ #define start_thread(regs, new_pc, new_sp) \
do { \ do { \
unsigned long syscall = (regs)->syscall; \ unsigned long syscall = (regs)->syscall; \
unsigned long current_aregs[16]; \
memcpy(current_aregs, (regs)->areg, sizeof(current_aregs)); \
memset((regs), 0, sizeof(*(regs))); \ memset((regs), 0, sizeof(*(regs))); \
(regs)->pc = (new_pc); \ (regs)->pc = (new_pc); \
(regs)->ps = USER_PS_VALUE; \ (regs)->ps = USER_PS_VALUE; \
memcpy((regs)->areg, current_aregs, sizeof(current_aregs)); \
(regs)->areg[1] = (new_sp); \ (regs)->areg[1] = (new_sp); \
(regs)->areg[0] = 0; \ (regs)->areg[0] = 0; \
(regs)->wmask = 1; \ (regs)->wmask = 1; \
......
...@@ -37,6 +37,10 @@ ...@@ -37,6 +37,10 @@
#define PTRACE_SETXTREGS 19 #define PTRACE_SETXTREGS 19
#define PTRACE_GETHBPREGS 20 #define PTRACE_GETHBPREGS 20
#define PTRACE_SETHBPREGS 21 #define PTRACE_SETHBPREGS 21
#define PTRACE_GETFDPIC 22
#define PTRACE_GETFDPIC_EXEC 0
#define PTRACE_GETFDPIC_INTERP 1
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
......
...@@ -58,7 +58,7 @@ config ARCH_USE_GNU_PROPERTY ...@@ -58,7 +58,7 @@ config ARCH_USE_GNU_PROPERTY
config BINFMT_ELF_FDPIC config BINFMT_ELF_FDPIC
bool "Kernel support for FDPIC ELF binaries" bool "Kernel support for FDPIC ELF binaries"
default y if !BINFMT_ELF default y if !BINFMT_ELF
depends on ARM || ((M68K || SUPERH) && !MMU) depends on ARM || ((M68K || SUPERH || XTENSA) && !MMU)
select ELFCORE select ELFCORE
help help
ELF FDPIC binaries are based on ELF, but allow the individual load ELF FDPIC binaries are based on ELF, but allow the individual load
......
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