1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 27f30491cSTony Luck #ifndef _ASM_IA64_ELF_H 37f30491cSTony Luck #define _ASM_IA64_ELF_H 47f30491cSTony Luck 57f30491cSTony Luck /* 67f30491cSTony Luck * ELF-specific definitions. 77f30491cSTony Luck * 87f30491cSTony Luck * Copyright (C) 1998-1999, 2002-2004 Hewlett-Packard Co 97f30491cSTony Luck * David Mosberger-Tang <davidm@hpl.hp.com> 107f30491cSTony Luck */ 117f30491cSTony Luck 127f30491cSTony Luck 137f30491cSTony Luck #include <asm/fpu.h> 147f30491cSTony Luck #include <asm/page.h> 157f30491cSTony Luck #include <asm/auxvec.h> 167f30491cSTony Luck 177f30491cSTony Luck /* 187f30491cSTony Luck * This is used to ensure we don't load something for the wrong architecture. 197f30491cSTony Luck */ 207f30491cSTony Luck #define elf_check_arch(x) ((x)->e_machine == EM_IA_64) 217f30491cSTony Luck 227f30491cSTony Luck /* 237f30491cSTony Luck * These are used to set parameters in the core dumps. 247f30491cSTony Luck */ 257f30491cSTony Luck #define ELF_CLASS ELFCLASS64 267f30491cSTony Luck #define ELF_DATA ELFDATA2LSB 277f30491cSTony Luck #define ELF_ARCH EM_IA_64 287f30491cSTony Luck 297f30491cSTony Luck #define CORE_DUMP_USE_REGSET 307f30491cSTony Luck 317f30491cSTony Luck /* Least-significant four bits of ELF header's e_flags are OS-specific. The bits are 327f30491cSTony Luck interpreted as follows by Linux: */ 337f30491cSTony Luck #define EF_IA_64_LINUX_EXECUTABLE_STACK 0x1 /* is stack (& heap) executable by default? */ 347f30491cSTony Luck 357f30491cSTony Luck #define ELF_EXEC_PAGESIZE PAGE_SIZE 367f30491cSTony Luck 377f30491cSTony Luck /* 387f30491cSTony Luck * This is the location that an ET_DYN program is loaded if exec'ed. 397f30491cSTony Luck * Typical use of this is to invoke "./ld.so someprog" to test out a 407f30491cSTony Luck * new version of the loader. We need to make sure that it is out of 417f30491cSTony Luck * the way of the program that it will "exec", and that there is 427f30491cSTony Luck * sufficient room for the brk. 437f30491cSTony Luck */ 447f30491cSTony Luck #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x800000000UL) 457f30491cSTony Luck 467f30491cSTony Luck #define PT_IA_64_UNWIND 0x70000001 477f30491cSTony Luck 487f30491cSTony Luck /* IA-64 relocations: */ 497f30491cSTony Luck #define R_IA64_NONE 0x00 /* none */ 507f30491cSTony Luck #define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */ 517f30491cSTony Luck #define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */ 527f30491cSTony Luck #define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */ 537f30491cSTony Luck #define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */ 547f30491cSTony Luck #define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */ 557f30491cSTony Luck #define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */ 567f30491cSTony Luck #define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */ 577f30491cSTony Luck #define R_IA64_GPREL22 0x2a /* @gprel(sym+add), add imm22 */ 587f30491cSTony Luck #define R_IA64_GPREL64I 0x2b /* @gprel(sym+add), mov imm64 */ 597f30491cSTony Luck #define R_IA64_GPREL32MSB 0x2c /* @gprel(sym+add), data4 MSB */ 607f30491cSTony Luck #define R_IA64_GPREL32LSB 0x2d /* @gprel(sym+add), data4 LSB */ 617f30491cSTony Luck #define R_IA64_GPREL64MSB 0x2e /* @gprel(sym+add), data8 MSB */ 627f30491cSTony Luck #define R_IA64_GPREL64LSB 0x2f /* @gprel(sym+add), data8 LSB */ 637f30491cSTony Luck #define R_IA64_LTOFF22 0x32 /* @ltoff(sym+add), add imm22 */ 647f30491cSTony Luck #define R_IA64_LTOFF64I 0x33 /* @ltoff(sym+add), mov imm64 */ 657f30491cSTony Luck #define R_IA64_PLTOFF22 0x3a /* @pltoff(sym+add), add imm22 */ 667f30491cSTony Luck #define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym+add), mov imm64 */ 677f30491cSTony Luck #define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym+add), data8 MSB */ 687f30491cSTony Luck #define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym+add), data8 LSB */ 697f30491cSTony Luck #define R_IA64_FPTR64I 0x43 /* @fptr(sym+add), mov imm64 */ 707f30491cSTony Luck #define R_IA64_FPTR32MSB 0x44 /* @fptr(sym+add), data4 MSB */ 717f30491cSTony Luck #define R_IA64_FPTR32LSB 0x45 /* @fptr(sym+add), data4 LSB */ 727f30491cSTony Luck #define R_IA64_FPTR64MSB 0x46 /* @fptr(sym+add), data8 MSB */ 737f30491cSTony Luck #define R_IA64_FPTR64LSB 0x47 /* @fptr(sym+add), data8 LSB */ 747f30491cSTony Luck #define R_IA64_PCREL60B 0x48 /* @pcrel(sym+add), brl */ 757f30491cSTony Luck #define R_IA64_PCREL21B 0x49 /* @pcrel(sym+add), ptb, call */ 767f30491cSTony Luck #define R_IA64_PCREL21M 0x4a /* @pcrel(sym+add), chk.s */ 777f30491cSTony Luck #define R_IA64_PCREL21F 0x4b /* @pcrel(sym+add), fchkf */ 787f30491cSTony Luck #define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym+add), data4 MSB */ 797f30491cSTony Luck #define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym+add), data4 LSB */ 807f30491cSTony Luck #define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym+add), data8 MSB */ 817f30491cSTony Luck #define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym+add), data8 LSB */ 827f30491cSTony Luck #define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */ 837f30491cSTony Luck #define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */ 847f30491cSTony Luck #define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), 4 MSB */ 857f30491cSTony Luck #define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), 4 LSB */ 867f30491cSTony Luck #define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), 8 MSB */ 877f30491cSTony Luck #define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), 8 LSB */ 887f30491cSTony Luck #define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym+add), data4 MSB */ 897f30491cSTony Luck #define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym+add), data4 LSB */ 907f30491cSTony Luck #define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym+add), data8 MSB */ 917f30491cSTony Luck #define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym+add), data8 LSB */ 927f30491cSTony Luck #define R_IA64_SECREL32MSB 0x64 /* @secrel(sym+add), data4 MSB */ 937f30491cSTony Luck #define R_IA64_SECREL32LSB 0x65 /* @secrel(sym+add), data4 LSB */ 947f30491cSTony Luck #define R_IA64_SECREL64MSB 0x66 /* @secrel(sym+add), data8 MSB */ 957f30491cSTony Luck #define R_IA64_SECREL64LSB 0x67 /* @secrel(sym+add), data8 LSB */ 967f30491cSTony Luck #define R_IA64_REL32MSB 0x6c /* data 4 + REL */ 977f30491cSTony Luck #define R_IA64_REL32LSB 0x6d /* data 4 + REL */ 987f30491cSTony Luck #define R_IA64_REL64MSB 0x6e /* data 8 + REL */ 997f30491cSTony Luck #define R_IA64_REL64LSB 0x6f /* data 8 + REL */ 1007f30491cSTony Luck #define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */ 1017f30491cSTony Luck #define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */ 1027f30491cSTony Luck #define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */ 1037f30491cSTony Luck #define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */ 1047f30491cSTony Luck #define R_IA64_PCREL21BI 0x79 /* @pcrel(sym+add), ptb, call */ 1057f30491cSTony Luck #define R_IA64_PCREL22 0x7a /* @pcrel(sym+add), imm22 */ 1067f30491cSTony Luck #define R_IA64_PCREL64I 0x7b /* @pcrel(sym+add), imm64 */ 1077f30491cSTony Luck #define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */ 1087f30491cSTony Luck #define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */ 1097f30491cSTony Luck #define R_IA64_COPY 0x84 /* dynamic reloc, data copy */ 1107f30491cSTony Luck #define R_IA64_SUB 0x85 /* -symbol + addend, add imm22 */ 1117f30491cSTony Luck #define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */ 1127f30491cSTony Luck #define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */ 1137f30491cSTony Luck #define R_IA64_TPREL14 0x91 /* @tprel(sym+add), add imm14 */ 1147f30491cSTony Luck #define R_IA64_TPREL22 0x92 /* @tprel(sym+add), add imm22 */ 1157f30491cSTony Luck #define R_IA64_TPREL64I 0x93 /* @tprel(sym+add), add imm64 */ 1167f30491cSTony Luck #define R_IA64_TPREL64MSB 0x96 /* @tprel(sym+add), data8 MSB */ 1177f30491cSTony Luck #define R_IA64_TPREL64LSB 0x97 /* @tprel(sym+add), data8 LSB */ 1187f30491cSTony Luck #define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), add imm22 */ 1197f30491cSTony Luck #define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym+add), data8 MSB */ 1207f30491cSTony Luck #define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym+add), data8 LSB */ 1217f30491cSTony Luck #define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(s+a)), imm22 */ 1227f30491cSTony Luck #define R_IA64_DTPREL14 0xb1 /* @dtprel(sym+add), imm14 */ 1237f30491cSTony Luck #define R_IA64_DTPREL22 0xb2 /* @dtprel(sym+add), imm22 */ 1247f30491cSTony Luck #define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym+add), imm64 */ 1257f30491cSTony Luck #define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym+add), data4 MSB */ 1267f30491cSTony Luck #define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym+add), data4 LSB */ 1277f30491cSTony Luck #define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym+add), data8 MSB */ 1287f30491cSTony Luck #define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym+add), data8 LSB */ 1297f30491cSTony Luck #define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */ 1307f30491cSTony Luck 1317f30491cSTony Luck /* IA-64 specific section flags: */ 1327f30491cSTony Luck #define SHF_IA_64_SHORT 0x10000000 /* section near gp */ 1337f30491cSTony Luck 1347f30491cSTony Luck /* 1357f30491cSTony Luck * We use (abuse?) this macro to insert the (empty) vm_area that is 1367f30491cSTony Luck * used to map the register backing store. I don't see any better 1377f30491cSTony Luck * place to do this, but we should discuss this with Linus once we can 1387f30491cSTony Luck * talk to him... 1397f30491cSTony Luck */ 1407f30491cSTony Luck extern void ia64_init_addr_space (void); 1417f30491cSTony Luck #define ELF_PLAT_INIT(_r, load_addr) ia64_init_addr_space() 1427f30491cSTony Luck 1437f30491cSTony Luck /* ELF register definitions. This is needed for core dump support. */ 1447f30491cSTony Luck 1457f30491cSTony Luck /* 1467f30491cSTony Luck * elf_gregset_t contains the application-level state in the following order: 1477f30491cSTony Luck * r0-r31 1487f30491cSTony Luck * NaT bits (for r0-r31; bit N == 1 iff rN is a NaT) 1497f30491cSTony Luck * predicate registers (p0-p63) 1507f30491cSTony Luck * b0-b7 1517f30491cSTony Luck * ip cfm psr 1527f30491cSTony Luck * ar.rsc ar.bsp ar.bspstore ar.rnat 1537f30491cSTony Luck * ar.ccv ar.unat ar.fpsr ar.pfs ar.lc ar.ec ar.csd ar.ssd 1547f30491cSTony Luck */ 1557f30491cSTony Luck #define ELF_NGREG 128 /* we really need just 72 but let's leave some headroom... */ 1567f30491cSTony Luck #define ELF_NFPREG 128 /* f0 and f1 could be omitted, but so what... */ 1577f30491cSTony Luck 1587f30491cSTony Luck /* elf_gregset_t register offsets */ 1597f30491cSTony Luck #define ELF_GR_0_OFFSET 0 1607f30491cSTony Luck #define ELF_NAT_OFFSET (32 * sizeof(elf_greg_t)) 1617f30491cSTony Luck #define ELF_PR_OFFSET (33 * sizeof(elf_greg_t)) 1627f30491cSTony Luck #define ELF_BR_0_OFFSET (34 * sizeof(elf_greg_t)) 1637f30491cSTony Luck #define ELF_CR_IIP_OFFSET (42 * sizeof(elf_greg_t)) 1647f30491cSTony Luck #define ELF_CFM_OFFSET (43 * sizeof(elf_greg_t)) 1657f30491cSTony Luck #define ELF_CR_IPSR_OFFSET (44 * sizeof(elf_greg_t)) 1667f30491cSTony Luck #define ELF_GR_OFFSET(i) (ELF_GR_0_OFFSET + i * sizeof(elf_greg_t)) 1677f30491cSTony Luck #define ELF_BR_OFFSET(i) (ELF_BR_0_OFFSET + i * sizeof(elf_greg_t)) 1687f30491cSTony Luck #define ELF_AR_RSC_OFFSET (45 * sizeof(elf_greg_t)) 1697f30491cSTony Luck #define ELF_AR_BSP_OFFSET (46 * sizeof(elf_greg_t)) 1707f30491cSTony Luck #define ELF_AR_BSPSTORE_OFFSET (47 * sizeof(elf_greg_t)) 1717f30491cSTony Luck #define ELF_AR_RNAT_OFFSET (48 * sizeof(elf_greg_t)) 1727f30491cSTony Luck #define ELF_AR_CCV_OFFSET (49 * sizeof(elf_greg_t)) 1737f30491cSTony Luck #define ELF_AR_UNAT_OFFSET (50 * sizeof(elf_greg_t)) 1747f30491cSTony Luck #define ELF_AR_FPSR_OFFSET (51 * sizeof(elf_greg_t)) 1757f30491cSTony Luck #define ELF_AR_PFS_OFFSET (52 * sizeof(elf_greg_t)) 1767f30491cSTony Luck #define ELF_AR_LC_OFFSET (53 * sizeof(elf_greg_t)) 1777f30491cSTony Luck #define ELF_AR_EC_OFFSET (54 * sizeof(elf_greg_t)) 1787f30491cSTony Luck #define ELF_AR_CSD_OFFSET (55 * sizeof(elf_greg_t)) 1797f30491cSTony Luck #define ELF_AR_SSD_OFFSET (56 * sizeof(elf_greg_t)) 1807f30491cSTony Luck #define ELF_AR_END_OFFSET (57 * sizeof(elf_greg_t)) 1817f30491cSTony Luck 1827f30491cSTony Luck typedef unsigned long elf_greg_t; 1837f30491cSTony Luck typedef elf_greg_t elf_gregset_t[ELF_NGREG]; 1847f30491cSTony Luck 1857f30491cSTony Luck typedef struct ia64_fpreg elf_fpreg_t; 1867f30491cSTony Luck typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; 1877f30491cSTony Luck 1887f30491cSTony Luck 1897f30491cSTony Luck 1907f30491cSTony Luck struct pt_regs; /* forward declaration... */ 1917f30491cSTony Luck extern void ia64_elf_core_copy_regs (struct pt_regs *src, elf_gregset_t dst); 1927f30491cSTony Luck #define ELF_CORE_COPY_REGS(_dest,_regs) ia64_elf_core_copy_regs(_regs, _dest); 1937f30491cSTony Luck 1947f30491cSTony Luck /* This macro yields a bitmask that programs can use to figure out 1957f30491cSTony Luck what instruction set this CPU supports. */ 1967f30491cSTony Luck #define ELF_HWCAP 0 1977f30491cSTony Luck 1987f30491cSTony Luck /* This macro yields a string that ld.so will use to load 1997f30491cSTony Luck implementation specific libraries for optimization. Not terribly 2007f30491cSTony Luck relevant until we have real hardware to play with... */ 2017f30491cSTony Luck #define ELF_PLATFORM NULL 2027f30491cSTony Luck 2037f30491cSTony Luck #define elf_read_implies_exec(ex, executable_stack) \ 2047f30491cSTony Luck ((executable_stack!=EXSTACK_DISABLE_X) && ((ex).e_flags & EF_IA_64_LINUX_EXECUTABLE_STACK) != 0) 2057f30491cSTony Luck 2067f30491cSTony Luck struct task_struct; 2077f30491cSTony Luck 2087f30491cSTony Luck #define GATE_EHDR ((const struct elfhdr *) GATE_ADDR) 2097f30491cSTony Luck 2107f30491cSTony Luck /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ 2117f30491cSTony Luck #define ARCH_DLINFO \ 2127f30491cSTony Luck do { \ 2137f30491cSTony Luck extern char __kernel_syscall_via_epc[]; \ 2147f30491cSTony Luck NEW_AUX_ENT(AT_SYSINFO, (unsigned long) __kernel_syscall_via_epc); \ 2157f30491cSTony Luck NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR); \ 2167f30491cSTony Luck } while (0) 2177f30491cSTony Luck 2184611a771SJames Bottomley /* 2194611a771SJames Bottomley * format for entries in the Global Offset Table 2204611a771SJames Bottomley */ 2214611a771SJames Bottomley struct got_entry { 2224611a771SJames Bottomley uint64_t val; 2234611a771SJames Bottomley }; 2244611a771SJames Bottomley 2254611a771SJames Bottomley /* 2264611a771SJames Bottomley * Layout of the Function Descriptor 2274611a771SJames Bottomley */ 2284611a771SJames Bottomley struct fdesc { 229*41a88b45SChristophe Leroy uint64_t addr; 2304611a771SJames Bottomley uint64_t gp; 2314611a771SJames Bottomley }; 2324611a771SJames Bottomley 2337f30491cSTony Luck #endif /* _ASM_IA64_ELF_H */ 234