elf.h (5758B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * ELF definitions for the Hexagon architecture 4 * 5 * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. 6 */ 7 8#ifndef __ASM_ELF_H 9#define __ASM_ELF_H 10 11#include <asm/ptrace.h> 12#include <asm/user.h> 13#include <linux/elf-em.h> 14 15struct elf32_hdr; 16 17/* 18 * ELF header e_flags defines. 19 */ 20 21/* should have stuff like "CPU type" and maybe "ABI version", etc */ 22 23/* Hexagon relocations */ 24 /* V2 */ 25#define R_HEXAGON_NONE 0 26#define R_HEXAGON_B22_PCREL 1 27#define R_HEXAGON_B15_PCREL 2 28#define R_HEXAGON_B7_PCREL 3 29#define R_HEXAGON_LO16 4 30#define R_HEXAGON_HI16 5 31#define R_HEXAGON_32 6 32#define R_HEXAGON_16 7 33#define R_HEXAGON_8 8 34#define R_HEXAGON_GPREL16_0 9 35#define R_HEXAGON_GPREL16_1 10 36#define R_HEXAGON_GPREL16_2 11 37#define R_HEXAGON_GPREL16_3 12 38#define R_HEXAGON_HL16 13 39 /* V3 */ 40#define R_HEXAGON_B13_PCREL 14 41 /* V4 */ 42#define R_HEXAGON_B9_PCREL 15 43 /* V4 (extenders) */ 44#define R_HEXAGON_B32_PCREL_X 16 45#define R_HEXAGON_32_6_X 17 46 /* V4 (extended) */ 47#define R_HEXAGON_B22_PCREL_X 18 48#define R_HEXAGON_B15_PCREL_X 19 49#define R_HEXAGON_B13_PCREL_X 20 50#define R_HEXAGON_B9_PCREL_X 21 51#define R_HEXAGON_B7_PCREL_X 22 52#define R_HEXAGON_16_X 23 53#define R_HEXAGON_12_X 24 54#define R_HEXAGON_11_X 25 55#define R_HEXAGON_10_X 26 56#define R_HEXAGON_9_X 27 57#define R_HEXAGON_8_X 28 58#define R_HEXAGON_7_X 29 59#define R_HEXAGON_6_X 30 60 /* V2 PIC */ 61#define R_HEXAGON_32_PCREL 31 62#define R_HEXAGON_COPY 32 63#define R_HEXAGON_GLOB_DAT 33 64#define R_HEXAGON_JMP_SLOT 34 65#define R_HEXAGON_RELATIVE 35 66#define R_HEXAGON_PLT_B22_PCREL 36 67#define R_HEXAGON_GOTOFF_LO16 37 68#define R_HEXAGON_GOTOFF_HI16 38 69#define R_HEXAGON_GOTOFF_32 39 70#define R_HEXAGON_GOT_LO16 40 71#define R_HEXAGON_GOT_HI16 41 72#define R_HEXAGON_GOT_32 42 73#define R_HEXAGON_GOT_16 43 74 75/* 76 * ELF register definitions.. 77 */ 78typedef unsigned long elf_greg_t; 79 80typedef struct user_regs_struct elf_gregset_t; 81#define ELF_NGREG (sizeof(elf_gregset_t)/sizeof(unsigned long)) 82 83/* Placeholder */ 84typedef unsigned long elf_fpregset_t; 85 86/* 87 * Bypass the whole "regsets" thing for now and use the define. 88 */ 89 90#if CONFIG_HEXAGON_ARCH_VERSION >= 4 91#define CS_COPYREGS(DEST,REGS) \ 92do {\ 93 DEST.cs0 = REGS->cs0;\ 94 DEST.cs1 = REGS->cs1;\ 95} while (0) 96#else 97#define CS_COPYREGS(DEST,REGS) 98#endif 99 100#define ELF_CORE_COPY_REGS(DEST, REGS) \ 101do { \ 102 DEST.r0 = REGS->r00; \ 103 DEST.r1 = REGS->r01; \ 104 DEST.r2 = REGS->r02; \ 105 DEST.r3 = REGS->r03; \ 106 DEST.r4 = REGS->r04; \ 107 DEST.r5 = REGS->r05; \ 108 DEST.r6 = REGS->r06; \ 109 DEST.r7 = REGS->r07; \ 110 DEST.r8 = REGS->r08; \ 111 DEST.r9 = REGS->r09; \ 112 DEST.r10 = REGS->r10; \ 113 DEST.r11 = REGS->r11; \ 114 DEST.r12 = REGS->r12; \ 115 DEST.r13 = REGS->r13; \ 116 DEST.r14 = REGS->r14; \ 117 DEST.r15 = REGS->r15; \ 118 DEST.r16 = REGS->r16; \ 119 DEST.r17 = REGS->r17; \ 120 DEST.r18 = REGS->r18; \ 121 DEST.r19 = REGS->r19; \ 122 DEST.r20 = REGS->r20; \ 123 DEST.r21 = REGS->r21; \ 124 DEST.r22 = REGS->r22; \ 125 DEST.r23 = REGS->r23; \ 126 DEST.r24 = REGS->r24; \ 127 DEST.r25 = REGS->r25; \ 128 DEST.r26 = REGS->r26; \ 129 DEST.r27 = REGS->r27; \ 130 DEST.r28 = REGS->r28; \ 131 DEST.r29 = pt_psp(REGS); \ 132 DEST.r30 = REGS->r30; \ 133 DEST.r31 = REGS->r31; \ 134 DEST.sa0 = REGS->sa0; \ 135 DEST.lc0 = REGS->lc0; \ 136 DEST.sa1 = REGS->sa1; \ 137 DEST.lc1 = REGS->lc1; \ 138 DEST.m0 = REGS->m0; \ 139 DEST.m1 = REGS->m1; \ 140 DEST.usr = REGS->usr; \ 141 DEST.p3_0 = REGS->preds; \ 142 DEST.gp = REGS->gp; \ 143 DEST.ugp = REGS->ugp; \ 144 CS_COPYREGS(DEST,REGS); \ 145 DEST.pc = pt_elr(REGS); \ 146 DEST.cause = pt_cause(REGS); \ 147 DEST.badva = pt_badva(REGS); \ 148} while (0); 149 150/* 151 * This is used to ensure we don't load something for the wrong architecture. 152 * Checks the machine and ABI type. 153 */ 154#define elf_check_arch(hdr) ((hdr)->e_machine == EM_HEXAGON) 155 156/* 157 * These are used to set parameters in the core dumps. 158 */ 159#define ELF_CLASS ELFCLASS32 160#define ELF_DATA ELFDATA2LSB 161#define ELF_ARCH EM_HEXAGON 162 163#if CONFIG_HEXAGON_ARCH_VERSION == 2 164#define ELF_CORE_EFLAGS 0x1 165#endif 166 167#if CONFIG_HEXAGON_ARCH_VERSION == 3 168#define ELF_CORE_EFLAGS 0x2 169#endif 170 171#if CONFIG_HEXAGON_ARCH_VERSION == 4 172#define ELF_CORE_EFLAGS 0x3 173#endif 174 175/* 176 * Some architectures have ld.so set up a pointer to a function 177 * to be registered using atexit, to facilitate cleanup. So that 178 * static executables will be well-behaved, we would null the register 179 * in question here, in the pt_regs structure passed. For now, 180 * leave it a null macro. 181 */ 182#define ELF_PLAT_INIT(regs, load_addr) do { } while (0) 183 184#define CORE_DUMP_USE_REGSET 185 186/* Hrm is this going to cause problems for changing PAGE_SIZE? */ 187#define ELF_EXEC_PAGESIZE PAGE_SIZE 188 189/* 190 * This is the location that an ET_DYN program is loaded if exec'ed. Typical 191 * use of this is to invoke "./ld.so someprog" to test out a new version of 192 * the loader. We need to make sure that it is out of the way of the program 193 * that it will "exec", and that there is sufficient room for the brk. 194 */ 195#define ELF_ET_DYN_BASE 0x08000000UL 196 197/* 198 * This yields a mask that user programs can use to figure out what 199 * instruction set this cpu supports. 200 */ 201#define ELF_HWCAP (0) 202 203/* 204 * This yields a string that ld.so will use to load implementation 205 * specific libraries for optimization. This is more specific in 206 * intent than poking at uname or /proc/cpuinfo. 207 */ 208#define ELF_PLATFORM (NULL) 209 210#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 211struct linux_binprm; 212extern int arch_setup_additional_pages(struct linux_binprm *bprm, 213 int uses_interp); 214 215 216#endif