1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __ASM_CSKY_ELF_H 5*4882a593Smuzhiyun #define __ASM_CSKY_ELF_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <asm/ptrace.h> 8*4882a593Smuzhiyun #include <abi/regdef.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define ELF_ARCH EM_CSKY 11*4882a593Smuzhiyun #define EM_CSKY_OLD 39 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* CSKY Relocations */ 14*4882a593Smuzhiyun #define R_CSKY_NONE 0 15*4882a593Smuzhiyun #define R_CSKY_32 1 16*4882a593Smuzhiyun #define R_CSKY_PCIMM8BY4 2 17*4882a593Smuzhiyun #define R_CSKY_PCIMM11BY2 3 18*4882a593Smuzhiyun #define R_CSKY_PCIMM4BY2 4 19*4882a593Smuzhiyun #define R_CSKY_PC32 5 20*4882a593Smuzhiyun #define R_CSKY_PCRELJSR_IMM11BY2 6 21*4882a593Smuzhiyun #define R_CSKY_GNU_VTINHERIT 7 22*4882a593Smuzhiyun #define R_CSKY_GNU_VTENTRY 8 23*4882a593Smuzhiyun #define R_CSKY_RELATIVE 9 24*4882a593Smuzhiyun #define R_CSKY_COPY 10 25*4882a593Smuzhiyun #define R_CSKY_GLOB_DAT 11 26*4882a593Smuzhiyun #define R_CSKY_JUMP_SLOT 12 27*4882a593Smuzhiyun #define R_CSKY_ADDR_HI16 24 28*4882a593Smuzhiyun #define R_CSKY_ADDR_LO16 25 29*4882a593Smuzhiyun #define R_CSKY_PCRELJSR_IMM26BY2 40 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun typedef unsigned long elf_greg_t; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun typedef struct user_fp elf_fpregset_t; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* 36*4882a593Smuzhiyun * In gdb/bfd elf32-csky.c, csky_elf_grok_prstatus() use fixed size of 37*4882a593Smuzhiyun * elf_prstatus. It's 148 for abiv1 and 220 for abiv2, the size is enough 38*4882a593Smuzhiyun * for coredump and no need full sizeof(struct pt_regs). 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun #define ELF_NGREG ((sizeof(struct pt_regs) / sizeof(elf_greg_t)) - 2) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun typedef elf_greg_t elf_gregset_t[ELF_NGREG]; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * This is used to ensure we don't load something for the wrong architecture. 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun #define elf_check_arch(x) (((x)->e_machine == ELF_ARCH) || \ 48*4882a593Smuzhiyun ((x)->e_machine == EM_CSKY_OLD)) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * These are used to set parameters in the core dumps. 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun #define USE_ELF_CORE_DUMP 54*4882a593Smuzhiyun #define ELF_EXEC_PAGESIZE 4096 55*4882a593Smuzhiyun #define ELF_CLASS ELFCLASS32 56*4882a593Smuzhiyun #define ELF_PLAT_INIT(_r, load_addr) { _r->a0 = 0; } 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #ifdef __cskyBE__ 59*4882a593Smuzhiyun #define ELF_DATA ELFDATA2MSB 60*4882a593Smuzhiyun #else 61*4882a593Smuzhiyun #define ELF_DATA ELFDATA2LSB 62*4882a593Smuzhiyun #endif 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* 65*4882a593Smuzhiyun * This is the location that an ET_DYN program is loaded if exec'ed. Typical 66*4882a593Smuzhiyun * use of this is to invoke "./ld.so someprog" to test out a new version of 67*4882a593Smuzhiyun * the loader. We need to make sure that it is out of the way of the program 68*4882a593Smuzhiyun * that it will "exec", and that there is sufficient room for the brk. 69*4882a593Smuzhiyun */ 70*4882a593Smuzhiyun #define ELF_ET_DYN_BASE 0x0UL 71*4882a593Smuzhiyun #include <abi/elf.h> 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* Similar, but for a thread other than current. */ 74*4882a593Smuzhiyun struct task_struct; 75*4882a593Smuzhiyun extern int dump_task_regs(struct task_struct *tsk, elf_gregset_t *elf_regs); 76*4882a593Smuzhiyun #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define ELF_HWCAP (0) 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * This yields a string that ld.so will use to load implementation specific 82*4882a593Smuzhiyun * libraries for optimization. This is more specific in intent than poking 83*4882a593Smuzhiyun * at uname or /proc/cpuinfo. 84*4882a593Smuzhiyun */ 85*4882a593Smuzhiyun #define ELF_PLATFORM (NULL) 86*4882a593Smuzhiyun #define SET_PERSONALITY(ex) set_personality(PER_LINUX) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 89*4882a593Smuzhiyun struct linux_binprm; 90*4882a593Smuzhiyun extern int arch_setup_additional_pages(struct linux_binprm *bprm, 91*4882a593Smuzhiyun int uses_interp); 92*4882a593Smuzhiyun #endif /* __ASM_CSKY_ELF_H */ 93