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