^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2005-2017 Andes Technology Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #ifndef __ASMNDS32_ELF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #define __ASMNDS32_ELF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * ELF register definitions..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/fpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/elf-em.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) typedef unsigned long elf_greg_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) typedef unsigned long elf_freg_t[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) extern unsigned int elf_hwcap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define R_NDS32_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define R_NDS32_16_RELA 19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define R_NDS32_32_RELA 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define R_NDS32_9_PCREL_RELA 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define R_NDS32_15_PCREL_RELA 23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define R_NDS32_17_PCREL_RELA 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define R_NDS32_25_PCREL_RELA 25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define R_NDS32_HI20_RELA 26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define R_NDS32_LO12S3_RELA 27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define R_NDS32_LO12S2_RELA 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define R_NDS32_LO12S1_RELA 29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define R_NDS32_LO12S0_RELA 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define R_NDS32_SDA15S3_RELA 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define R_NDS32_SDA15S2_RELA 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define R_NDS32_SDA15S1_RELA 33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define R_NDS32_SDA15S0_RELA 34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define R_NDS32_GOT20 37
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define R_NDS32_25_PLTREL 38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define R_NDS32_COPY 39
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define R_NDS32_GLOB_DAT 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define R_NDS32_JMP_SLOT 41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define R_NDS32_RELATIVE 42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define R_NDS32_GOTOFF 43
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define R_NDS32_GOTPC20 44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define R_NDS32_GOT_HI20 45
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define R_NDS32_GOT_LO12 46
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define R_NDS32_GOTPC_HI20 47
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define R_NDS32_GOTPC_LO12 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define R_NDS32_GOTOFF_HI20 49
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define R_NDS32_GOTOFF_LO12 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define R_NDS32_INSN16 51
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define R_NDS32_LABEL 52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define R_NDS32_LONGCALL1 53
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define R_NDS32_LONGCALL2 54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define R_NDS32_LONGCALL3 55
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define R_NDS32_LONGJUMP1 56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define R_NDS32_LONGJUMP2 57
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define R_NDS32_LONGJUMP3 58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define R_NDS32_LOADSTORE 59
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define R_NDS32_9_FIXED_RELA 60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define R_NDS32_15_FIXED_RELA 61
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define R_NDS32_17_FIXED_RELA 62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define R_NDS32_25_FIXED_RELA 63
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define R_NDS32_PLTREL_HI20 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define R_NDS32_PLTREL_LO12 65
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define R_NDS32_PLT_GOTREL_HI20 66
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define R_NDS32_PLT_GOTREL_LO12 67
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define R_NDS32_LO12S0_ORI_RELA 72
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define R_NDS32_DWARF2_OP1_RELA 77
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define R_NDS32_DWARF2_OP2_RELA 78
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define R_NDS32_DWARF2_LEB_RELA 79
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define R_NDS32_WORD_9_PCREL_RELA 94
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define R_NDS32_LONGCALL4 107
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define R_NDS32_RELA_NOP_MIX 192
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define R_NDS32_RELA_NOP_MAX 255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define ELF_NGREG (sizeof (struct user_pt_regs) / sizeof(elf_greg_t))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define ELF_CORE_COPY_REGS(dest, regs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *(struct user_pt_regs *)&(dest) = (regs)->user_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) typedef elf_greg_t elf_gregset_t[ELF_NGREG];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* Core file format: The core file is written in such a way that gdb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) can understand it and provide useful information to the user (under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) linux we use the 'trad-core' bfd). There are quite a number of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) obstacles to being able to view the contents of the floating point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) registers, and until these are solved you will not be able to view the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) contents of them. Actually, you can read in the core file and look at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) the contents of the user struct to find out what the floating point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) registers contain.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) The actual file contents are as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) UPAGE: 1 page consisting of a user struct that tells gdb what is present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) in the file. Directly after this is a copy of the task_struct, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) is currently not used by gdb, but it may come in useful at some point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) All of the registers are stored as part of the upage. The upage should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) always be only one page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) DATA: The data area is stored. We use current->end_text to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) current->brk to pick up all of the user variables, plus any memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) that may have been malloced. No attempt is made to determine if a page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) is demand-zero or if a page is totally unused, we just cover the entire
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) range. All of the addresses are rounded in such a way that an integral
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) number of pages is written.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) STACK: We need the stack information in order to get a meaningful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) backtrace. We need to write the data from (esp) to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) current->start_stack, so we round each of these off in order to be able
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) to write an integer number of pages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) The minimum core file size is 3 pages, or 12288 bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct user_fp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) unsigned long long fd_regs[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) unsigned long fpcsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) typedef struct user_fp elf_fpregset_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct elf32_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define elf_check_arch(x) ((x)->e_machine == EM_NDS32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * These are used to set parameters in the core dumps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define ELF_CLASS ELFCLASS32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #ifdef __NDS32_EB__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define ELF_DATA ELFDATA2MSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define ELF_DATA ELFDATA2LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define ELF_ARCH EM_NDS32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define USE_ELF_CORE_DUMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define ELF_EXEC_PAGESIZE PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* This is the location that an ET_DYN program is loaded if exec'ed. Typical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) use of this is to invoke "./ld.so someprog" to test out a new version of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) the loader. We need to make sure that it is out of the way of the program
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) that it will "exec", and that there is sufficient room for the brk. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* When the program starts, a1 contains a pointer to a function to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) registered with atexit, as per the SVR4 ABI. A value of 0 means we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) have no such handler. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define ELF_PLAT_INIT(_r, load_addr) (_r)->uregs[0] = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* This yields a mask that user programs can use to figure out what
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) instruction set this cpu supports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define ELF_HWCAP (elf_hwcap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define ELF_PLATFORM (NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* Old NetWinder binaries were compiled in such a way that the iBCS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) heuristic always trips on them. Until these binaries become uncommon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) enough not to care, don't trust the `ibcs' flag here. In any case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) there is no other ELF system currently supported by iBCS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) @@ Could print a warning message to encourage users to upgrade. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define SET_PERSONALITY(ex) set_personality(PER_LINUX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #if IS_ENABLED(CONFIG_FPU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define FPU_AUX_ENT NEW_AUX_ENT(AT_FPUCW, FPCSR_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define FPU_AUX_ENT NEW_AUX_ENT(AT_IGNORE, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define ARCH_DLINFO \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /* Optional FPU initialization */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) FPU_AUX_ENT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) NEW_AUX_ENT(AT_SYSINFO_EHDR, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) (elf_addr_t)current->mm->context.vdso); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) struct linux_binprm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) int arch_setup_additional_pages(struct linux_binprm *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #endif