xtensa: add FDPIC and static PIE support for noMMU
authorMax Filippov <jcmvbkbc@gmail.com>
Fri, 3 Jun 2022 18:31:14 +0000 (11:31 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Wed, 14 Sep 2022 01:28:00 +0000 (18:28 -0700)
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: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/include/asm/elf.h
arch/xtensa/include/asm/processor.h
arch/xtensa/include/uapi/asm/ptrace.h
fs/Kconfig.binfmt

index 9c21897..ffcf1ad 100644 (file)
@@ -93,6 +93,10 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
 #define elf_check_arch(x) ( ( (x)->e_machine == EM_XTENSA )  || \
                            ( (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.
  */
@@ -164,6 +168,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
                (_r)->areg[14] = 0; (_r)->areg[15] = 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 {
        xtregs_opt_t    opt;
        xtregs_user_t   user;
index 76bc631..b75ba16 100644 (file)
@@ -205,9 +205,12 @@ struct thread_struct {
 #define start_thread(regs, new_pc, new_sp) \
        do { \
                unsigned long syscall = (regs)->syscall; \
+               unsigned long current_aregs[16]; \
+               memcpy(current_aregs, (regs)->areg, sizeof(current_aregs)); \
                memset((regs), 0, sizeof(*(regs))); \
                (regs)->pc = (new_pc); \
                (regs)->ps = USER_PS_VALUE; \
+               memcpy((regs)->areg, current_aregs, sizeof(current_aregs)); \
                (regs)->areg[1] = (new_sp); \
                (regs)->areg[0] = 0; \
                (regs)->wmask = 1; \
index 50db3e0..9115e86 100644 (file)
 #define PTRACE_SETXTREGS       19
 #define PTRACE_GETHBPREGS      20
 #define PTRACE_SETHBPREGS      21
+#define PTRACE_GETFDPIC                22
+
+#define PTRACE_GETFDPIC_EXEC   0
+#define PTRACE_GETFDPIC_INTERP 1
 
 #ifndef __ASSEMBLY__
 
index 21e1545..9d131a5 100644 (file)
@@ -58,7 +58,7 @@ config ARCH_USE_GNU_PROPERTY
 config BINFMT_ELF_FDPIC
        bool "Kernel support for FDPIC ELF binaries"
        default y if !BINFMT_ELF
-       depends on ARM || ((M68K || SUPERH) && !MMU)
+       depends on ARM || ((M68K || SUPERH || XTENSA) && !MMU)
        select ELFCORE
        help
          ELF FDPIC binaries are based on ELF, but allow the individual load