196f1050d3df105c9ae6c6ac224f370199ea82fcdRobin Getz/* 296f1050d3df105c9ae6c6ac224f370199ea82fcdRobin Getz * Copyright 2004-2009 Analog Devices Inc. 396f1050d3df105c9ae6c6ac224f370199ea82fcdRobin Getz * 496f1050d3df105c9ae6c6ac224f370199ea82fcdRobin Getz * Licensed under the GPL-2 or later. 596f1050d3df105c9ae6c6ac224f370199ea82fcdRobin Getz */ 61394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 71394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifndef __ASMBFIN_ELF_H 81394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define __ASMBFIN_ELF_H 91394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 101394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* 111394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * ELF register definitions.. 121394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 131394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#include <asm/ptrace.h> 151394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#include <asm/user.h> 161394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 171394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* Processor specific flags for the ELF header e_flags field. */ 181394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define EF_BFIN_PIC 0x00000001 /* -fpic */ 191394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define EF_BFIN_FDPIC 0x00000002 /* -mfdpic */ 201394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define EF_BFIN_CODE_IN_L1 0x00000010 /* --code-in-l1 */ 211394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define EF_BFIN_DATA_IN_L1 0x00000020 /* --data-in-l1 */ 22262c3825a9f3eb0f4f30ebb4b1ee57397bcb3ffcSonic Zhang#define EF_BFIN_CODE_IN_L2 0x00000040 /* --code-in-l2 */ 23262c3825a9f3eb0f4f30ebb4b1ee57397bcb3ffcSonic Zhang#define EF_BFIN_DATA_IN_L2 0x00000080 /* --data-in-l2 */ 241394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 25e50e2f25c5b90abd00a1e5871c45094cf5207afcMike Frysinger#if 1 /* core dumps not supported, but linux/elfcore.h needs these */ 261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wutypedef unsigned long elf_greg_t; 271394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 28e50e2f25c5b90abd00a1e5871c45094cf5207afcMike Frysinger#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) 291394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wutypedef elf_greg_t elf_gregset_t[ELF_NGREG]; 301394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 313b67d91b3e2c789952379f5157704c2162330492Mike Frysingertypedef struct { } elf_fpregset_t; 32e50e2f25c5b90abd00a1e5871c45094cf5207afcMike Frysinger#endif 33e50e2f25c5b90abd00a1e5871c45094cf5207afcMike Frysinger 341394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* 351394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * This is used to ensure we don't load something for the wrong architecture. 361394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 371394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define elf_check_arch(x) ((x)->e_machine == EM_BLACKFIN) 381394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 391394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define elf_check_fdpic(x) ((x)->e_flags & EF_BFIN_FDPIC /* && !((x)->e_flags & EF_FRV_NON_PIC_RELOCS) */) 401394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define elf_check_const_displacement(x) ((x)->e_flags & EF_BFIN_PIC) 411394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 421394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* EM_BLACKFIN defined in linux/elf.h */ 431394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 441394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* 451394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * These are used to set parameters in the core dumps. 461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_CLASS ELFCLASS32 481394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_DATA ELFDATA2LSB 491394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_ARCH EM_BLACKFIN 501394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 511394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_PLAT_INIT(_r) _r->p1 = 0 521394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 531394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_FDPIC_PLAT_INIT(_regs, _exec_map_addr, _interp_map_addr, _dynamic_addr) \ 541394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wudo { \ 551394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu _regs->r7 = 0; \ 561394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu _regs->p0 = _exec_map_addr; \ 571394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu _regs->p1 = _interp_map_addr; \ 581394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu _regs->p2 = _dynamic_addr; \ 591394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} while(0) 601394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 61e50e2f25c5b90abd00a1e5871c45094cf5207afcMike Frysinger#if 0 62e50e2f25c5b90abd00a1e5871c45094cf5207afcMike Frysinger#define CORE_DUMP_USE_REGSET 63e50e2f25c5b90abd00a1e5871c45094cf5207afcMike Frysinger#endif 641394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_FDPIC_CORE_EFLAGS EF_BFIN_FDPIC 651394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_EXEC_PAGESIZE 4096 661394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 67595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_UNUSED0 0 /* relocation type 0 is not defined */ 68595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL5M2 1 /* LSETUP part a */ 69595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_UNUSED1 2 /* relocation type 2 is not defined */ 70595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL10 3 /* type 3, if cc jump <target> */ 71595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL12_JUMP 4 /* type 4, jump <target> */ 72595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_RIMM16 5 /* type 0x5, rN = <target> */ 73595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_LUIMM16 6 /* # 0x6, preg.l=<target> Load imm 16 to lower half */ 74595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_HUIMM16 7 /* # 0x7, preg.h=<target> Load imm 16 to upper half */ 75595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL12_JUMP_S 8 /* # 0x8 jump.s <target> */ 76595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL24_JUMP_X 9 /* # 0x9 jump.x <target> */ 77595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL24 10 /* # 0xa call <target> , not expandable */ 78595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_UNUSEDB 11 /* # 0xb not generated */ 79595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_UNUSEDC 12 /* # 0xc not used */ 80595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL24_JUMP_L 13 /* 0xd jump.l <target> */ 81595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL24_CALL_X 14 /* 0xE, call.x <target> if <target> is above 24 bit limit call through P1 */ 82595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_VAR_EQ_SYMB 15 /* 0xf, linker should treat it same as 0x12 */ 83595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_BYTE_DATA 16 /* 0x10, .byte var = symbol */ 84595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_BYTE2_DATA 17 /* 0x11, .byte2 var = symbol */ 85595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_BYTE4_DATA 18 /* 0x12, .byte4 var = symbol and .var var=symbol */ 86595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PCREL11 19 /* 0x13, lsetup part b */ 87595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_UNUSED14 20 /* 0x14, undefined */ 88595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_UNUSED15 21 /* not generated by VDSP 3.5 */ 891394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 901394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* arithmetic relocations */ 91595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PUSH 0xE0 92595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_CONST 0xE1 93595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_ADD 0xE2 94595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_SUB 0xE3 95595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_MULT 0xE4 96595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_DIV 0xE5 97595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_MOD 0xE6 98595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_LSHIFT 0xE7 99595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_RSHIFT 0xE8 100595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_AND 0xE9 101595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_OR 0xEA 102595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_XOR 0xEB 103595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_LAND 0xEC 104595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_LOR 0xED 105595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_LEN 0xEE 106595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_NEG 0xEF 107595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_COMP 0xF0 108595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_PAGE 0xF1 109595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_HWPAGE 0xF2 110595d681f2c0610223bbe79189b0896f1b8c24f8aMike Frysinger#define R_BFIN_ADDR 0xF3 1111394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1121394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* This is the location that an ET_DYN program is loaded if exec'ed. Typical 1131394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu use of this is to invoke "./ld.so someprog" to test out a new version of 1141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu the loader. We need to make sure that it is out of the way of the program 1151394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu that it will "exec", and that there is sufficient room for the brk. */ 1161394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1171394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_ET_DYN_BASE 0xD0000000UL 1181394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1191394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_CORE_COPY_REGS(pr_reg, regs) \ 1201394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu memcpy((char *) &pr_reg, (char *)regs, \ 1211394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sizeof(struct pt_regs)); 12288a0ade952647fa76c70b12f1b2f095712976833Mike Frysinger#define ELF_CORE_COPY_FPREGS(...) 0 /* Blackfin has no FPU */ 1231394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1241394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* This yields a mask that user programs can use to figure out what 1251394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu instruction set this cpu supports. */ 1261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1271394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_HWCAP (0) 1281394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1291394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* This yields a string that ld.so will use to load implementation 1301394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu specific libraries for optimization. This is more specific in 1311394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu intent than poking at uname or /proc/cpuinfo. */ 1321394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1331394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define ELF_PLATFORM (NULL) 1341394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1351394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 136