Logo Search packages:      
Sourcecode: linux version File versions

elf.h

#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;

/* 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) \
      current->personality = 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 USE_ELF_CORE_DUMP
#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

#endif

Generated by  Doxygen 1.6.0   Back to index