123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- #ifndef __ASMPARISC_ELF_H
- #define __ASMPARISC_ELF_H
- /*
- * ELF register definitions..
- */
- #include <asm/ptrace.h>
- #define EM_PARISC 15
- /* HPPA specific definitions. */
- /* Legal values for e_flags field of Elf32_Ehdr. */
- #define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
- #define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
- #define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
- #define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
- #define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
- prediction. */
- #define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
- #define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
- /* Defined values for `e_flags & EF_PARISC_ARCH' are: */
- #define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
- #define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
- #define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
- /* Additional section indices. */
- #define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
- symbols in ANSI C. */
- #define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
- /* Legal values for sh_type field of Elf32_Shdr. */
- #define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
- #define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
- #define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
- /* Legal values for sh_flags field of Elf32_Shdr. */
- #define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
- #define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
- #define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
- /* Legal values for ST_TYPE subfield of st_info (symbol type). */
- #define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
- #define STT_HP_OPAQUE (STT_LOOS + 0x1)
- #define STT_HP_STUB (STT_LOOS + 0x2)
- /* HPPA relocs. */
- #define R_PARISC_NONE 0 /* No reloc. */
- #define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
- #define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
- #define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
- #define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
- #define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */
- #define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
- #define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
- #define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
- #define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
- #define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
- #define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */
- #define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */
- #define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
- #define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
- #define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
- #define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
- #define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
- #define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
- #define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
- #define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
- #define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
- #define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
- #define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
- #define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
- #define R_PARISC_FPTR64 64 /* 64 bits function address. */
- #define R_PARISC_PLABEL32 65 /* 32 bits function address. */
- #define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
- #define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
- #define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
- #define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
- #define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
- #define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
- #define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
- #define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
- #define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
- #define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
- #define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
- #define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
- #define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
- #define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
- #define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
- #define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
- #define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
- #define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
- #define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
- #define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
- #define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
- #define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
- #define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
- #define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
- #define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
- #define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
- #define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
- #define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
- #define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
- #define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
- #define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
- #define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
- #define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
- #define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
- #define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
- #define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
- #define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
- #define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
- #define R_PARISC_LORESERVE 128
- #define R_PARISC_COPY 128 /* Copy relocation. */
- #define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
- #define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
- #define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
- #define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
- #define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
- #define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
- #define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
- #define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
- #define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
- #define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
- #define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
- #define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
- #define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
- #define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
- #define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
- #define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
- #define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
- #define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
- #define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
- #define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
- #define R_PARISC_HIRESERVE 255
- #define PA_PLABEL_FDESC 0x02 /* bit set if PLABEL points to
- * a function descriptor, not
- * an address */
- /* The following are PA function descriptors
- *
- * addr: the absolute address of the function
- * gp: either the data pointer (r27) for non-PIC code or the
- * the PLT pointer (r19) for PIC code */
- /* Format for the Elf32 Function descriptor */
- typedef struct elf32_fdesc {
- __u32 addr;
- __u32 gp;
- } Elf32_Fdesc;
- /* Format for the Elf64 Function descriptor */
- typedef struct elf64_fdesc {
- __u64 dummy[2]; /* FIXME: nothing uses these, why waste
- * the space */
- __u64 addr;
- __u64 gp;
- } Elf64_Fdesc;
- #ifdef __KERNEL__
- #ifdef CONFIG_64BIT
- #define Elf_Fdesc Elf64_Fdesc
- #else
- #define Elf_Fdesc Elf32_Fdesc
- #endif /*CONFIG_64BIT*/
- #endif /*__KERNEL__*/
- /* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
- #define PT_HP_TLS (PT_LOOS + 0x0)
- #define PT_HP_CORE_NONE (PT_LOOS + 0x1)
- #define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
- #define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
- #define PT_HP_CORE_COMM (PT_LOOS + 0x4)
- #define PT_HP_CORE_PROC (PT_LOOS + 0x5)
- #define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
- #define PT_HP_CORE_STACK (PT_LOOS + 0x7)
- #define PT_HP_CORE_SHM (PT_LOOS + 0x8)
- #define PT_HP_CORE_MMF (PT_LOOS + 0x9)
- #define PT_HP_PARALLEL (PT_LOOS + 0x10)
- #define PT_HP_FASTBIND (PT_LOOS + 0x11)
- #define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
- #define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
- #define PT_HP_STACK (PT_LOOS + 0x14)
- #define PT_PARISC_ARCHEXT 0x70000000
- #define PT_PARISC_UNWIND 0x70000001
- /* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
- #define PF_PARISC_SBP 0x08000000
- #define PF_HP_PAGE_SIZE 0x00100000
- #define PF_HP_FAR_SHARED 0x00200000
- #define PF_HP_NEAR_SHARED 0x00400000
- #define PF_HP_CODE 0x01000000
- #define PF_HP_MODIFY 0x02000000
- #define PF_HP_LAZYSWAP 0x04000000
- #define PF_HP_SBP 0x08000000
- /*
- * The following definitions are those for 32-bit ELF binaries on a 32-bit
- * kernel and for 64-bit binaries on a 64-bit kernel. To run 32-bit binaries
- * on a 64-bit kernel, arch/parisc/kernel/binfmt_elf32.c defines these
- * macros appropriately and then #includes binfmt_elf.c, which then includes
- * this file.
- */
- #ifndef ELF_CLASS
- /*
- * This is used to ensure we don't load something for the wrong architecture.
- *
- * Note that this header file is used by default in fs/binfmt_elf.c. So
- * the following macros are for the default case. However, for the 64
- * bit kernel we also support 32 bit parisc binaries. To do that
- * arch/parisc/kernel/binfmt_elf32.c defines its own set of these
- * macros, and then it includes fs/binfmt_elf.c to provide an alternate
- * elf binary handler for 32 bit binaries (on the 64 bit kernel).
- */
- #ifdef CONFIG_64BIT
- #define ELF_CLASS ELFCLASS64
- #else
- #define ELF_CLASS ELFCLASS32
- #endif
- typedef unsigned long elf_greg_t;
- /*
- * This yields a string that ld.so will use to load implementation
- * specific libraries for optimization. This is more specific in
- * intent than poking at uname or /proc/cpuinfo.
- */
- #define ELF_PLATFORM ("PARISC\0")
- #define SET_PERSONALITY(ex) \
- set_personality((current->personality & ~PER_MASK) | PER_LINUX); \
- current->thread.map_base = DEFAULT_MAP_BASE; \
- current->thread.task_size = DEFAULT_TASK_SIZE \
- /*
- * Fill in general registers in a core dump. This saves pretty
- * much the same registers as hp-ux, although in a different order.
- * Registers marked # below are not currently saved in pt_regs, so
- * we use their current values here.
- *
- * gr0..gr31
- * sr0..sr7
- * iaoq0..iaoq1
- * iasq0..iasq1
- * cr11 (sar)
- * cr19 (iir)
- * cr20 (isr)
- * cr21 (ior)
- * # cr22 (ipsw)
- * # cr0 (recovery counter)
- * # cr24..cr31 (temporary registers)
- * # cr8,9,12,13 (protection IDs)
- * # cr10 (scr/ccr)
- * # cr15 (ext int enable mask)
- *
- */
- #define ELF_CORE_COPY_REGS(dst, pt) \
- memset(dst, 0, sizeof(dst)); /* don't leak any "random" bits */ \
- memcpy(dst + 0, pt->gr, 32 * sizeof(elf_greg_t)); \
- memcpy(dst + 32, pt->sr, 8 * sizeof(elf_greg_t)); \
- memcpy(dst + 40, pt->iaoq, 2 * sizeof(elf_greg_t)); \
- memcpy(dst + 42, pt->iasq, 2 * sizeof(elf_greg_t)); \
- dst[44] = pt->sar; dst[45] = pt->iir; \
- dst[46] = pt->isr; dst[47] = pt->ior; \
- dst[48] = mfctl(22); dst[49] = mfctl(0); \
- dst[50] = mfctl(24); dst[51] = mfctl(25); \
- dst[52] = mfctl(26); dst[53] = mfctl(27); \
- dst[54] = mfctl(28); dst[55] = mfctl(29); \
- dst[56] = mfctl(30); dst[57] = mfctl(31); \
- dst[58] = mfctl( 8); dst[59] = mfctl( 9); \
- dst[60] = mfctl(12); dst[61] = mfctl(13); \
- dst[62] = mfctl(10); dst[63] = mfctl(15);
- #endif /* ! ELF_CLASS */
- #define ELF_NGREG 80 /* We only need 64 at present, but leave space
- for expansion. */
- typedef elf_greg_t elf_gregset_t[ELF_NGREG];
- #define ELF_NFPREG 32
- typedef double elf_fpreg_t;
- typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
- struct task_struct;
- extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);
- #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)
- struct pt_regs; /* forward declaration... */
- #define elf_check_arch(x) ((x)->e_machine == EM_PARISC && (x)->e_ident[EI_CLASS] == ELF_CLASS)
- /*
- * These are used to set parameters in the core dumps.
- */
- #define ELF_DATA ELFDATA2MSB
- #define ELF_ARCH EM_PARISC
- #define ELF_OSABI ELFOSABI_LINUX
- /* %r23 is set by ld.so to a pointer to a function which might be
- registered using atexit. This provides a means for the dynamic
- linker to call DT_FINI functions for shared libraries that have
- been loaded before the code runs.
- So that we can use the same startup file with static executables,
- we start programs with a value of 0 to indicate that there is no
- such function. */
- #define ELF_PLAT_INIT(_r, load_addr) _r->gr[23] = 0
- #define ELF_EXEC_PAGESIZE 4096
- /* This is the location that an ET_DYN program is loaded if exec'ed. Typical
- use of this is to invoke "./ld.so someprog" to test out a new version of
- the loader. We need to make sure that it is out of the way of the program
- that it will "exec", and that there is sufficient room for the brk.
- (2 * TASK_SIZE / 3) turns into something undefined when run through a
- 32 bit preprocessor and in some cases results in the kernel trying to map
- ld.so to the kernel virtual base. Use a sane value instead. /Jes
- */
- #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x01000000)
- /* This yields a mask that user programs can use to figure out what
- instruction set this CPU supports. This could be done in user space,
- but it's not easy, and we've already done it here. */
- #define ELF_HWCAP 0
- #define STACK_RND_MASK (is_32bit_task() ? \
- 0x7ff >> (PAGE_SHIFT - 12) : \
- 0x3ffff >> (PAGE_SHIFT - 12))
- struct mm_struct;
- extern unsigned long arch_randomize_brk(struct mm_struct *);
- #define arch_randomize_brk arch_randomize_brk
- #endif
|