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