/* Run-time dynamic linker data structures for loaded ELF shared objects.
   Copyright (C) 2000, 2002, 2003, 2006, 2007 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#ifndef _MIPS_LDSODEFS_H
#define _MIPS_LDSODEFS_H 1

#include <elf.h>

struct La_mips_32_regs;
struct La_mips_32_retval;
struct La_mips_64_regs;
struct La_mips_64_retval;

#define ARCH_PLTENTER_MEMBERS						    \
    Elf32_Addr (*mips_o32_gnu_pltenter) (Elf32_Sym *, unsigned int,	    \
					 uintptr_t *, uintptr_t *,	    \
					 const struct La_mips_32_regs *,    \
					 unsigned int *, const char *name,  \
					 long int *framesizep);		    \
    Elf32_Addr (*mips_n32_gnu_pltenter) (Elf32_Sym *, unsigned int,	    \
					 uintptr_t *, uintptr_t *,	    \
					 const struct La_mips_64_regs *,    \
					 unsigned int *, const char *name,  \
					 long int *framesizep);		    \
    Elf64_Addr (*mips_n64_gnu_pltenter) (Elf64_Sym *, unsigned int,	    \
					 uintptr_t *, uintptr_t *,	    \
					 const struct La_mips_64_regs *,    \
					 unsigned int *, const char *name,  \
					 long int *framesizep);

#define ARCH_PLTEXIT_MEMBERS						    \
    unsigned int (*mips_o32_gnu_pltexit) (Elf32_Sym *, unsigned int,	    \
					  uintptr_t *, uintptr_t *,	    \
					  const struct La_mips_32_regs *,   \
					  struct La_mips_32_retval *,	    \
					  const char *);		    \
    unsigned int (*mips_n32_gnu_pltexit) (Elf32_Sym *, unsigned int,	    \
					  uintptr_t *, uintptr_t *,	    \
					  const struct La_mips_64_regs *,   \
					  struct La_mips_64_retval *,	    \
					  const char *);		    \
    unsigned int (*mips_n64_gnu_pltexit) (Elf64_Sym *, unsigned int,	    \
					  uintptr_t *, uintptr_t *,	    \
					  const struct La_mips_64_regs *,   \
					  struct La_mips_64_retval *,	    \
					  const char *);

/* The MIPS ABI specifies that the dynamic section has to be read-only.  */

#define DL_RO_DYN_SECTION 1

#include_next <ldsodefs.h>

/* The 64-bit MIPS ELF ABI uses an unusual reloc format.  Each
   relocation entry specifies up to three actual relocations, all at
   the same address.  The first relocation which required a symbol
   uses the symbol in the r_sym field.  The second relocation which
   requires a symbol uses the symbol in the r_ssym field.  If all
   three relocations require a symbol, the third one uses a zero
   value.

   We define these structures in internal headers because we're not
   sure we want to make them part of the ABI yet.  Eventually, some of
   this may move into elf/elf.h.  */

/* An entry in a 64 bit SHT_REL section.  */

typedef struct
{
  Elf32_Word    r_sym;		/* Symbol index */
  unsigned char r_ssym;		/* Special symbol for 2nd relocation */
  unsigned char r_type3;	/* 3rd relocation type */
  unsigned char r_type2;	/* 2nd relocation type */
  unsigned char r_type1;	/* 1st relocation type */
} _Elf64_Mips_R_Info;

typedef union
{
  Elf64_Xword	r_info_number;
  _Elf64_Mips_R_Info r_info_fields;
} _Elf64_Mips_R_Info_union;

typedef struct
{
  Elf64_Addr	r_offset;		/* Address */
  _Elf64_Mips_R_Info_union r_info;	/* Relocation type and symbol index */
} Elf64_Mips_Rel;

typedef struct
{
  Elf64_Addr	r_offset;		/* Address */
  _Elf64_Mips_R_Info_union r_info;	/* Relocation type and symbol index */
  Elf64_Sxword	r_addend;		/* Addend */
} Elf64_Mips_Rela;

#define ELF64_MIPS_R_SYM(i) \
  ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
#define ELF64_MIPS_R_TYPE(i) \
  (((_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1 \
   | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \
		   ).r_info_fields.r_type2 << 8) \
   | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \
		   ).r_info_fields.r_type3 << 16) \
   | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \
		   ).r_info_fields.r_ssym << 24))
#define ELF64_MIPS_R_INFO(sym, type) \
  (__extension__ (_Elf64_Mips_R_Info_union) \
   (__extension__ (_Elf64_Mips_R_Info) \
   { (sym), ELF64_MIPS_R_SSYM (type), \
       ELF64_MIPS_R_TYPE3 (type), \
       ELF64_MIPS_R_TYPE2 (type), \
       ELF64_MIPS_R_TYPE1 (type) \
   }).r_info_number)
/* These macros decompose the value returned by ELF64_MIPS_R_TYPE, and
   compose it back into a value that it can be used as an argument to
   ELF64_MIPS_R_INFO.  */
#define ELF64_MIPS_R_SSYM(i) (((i) >> 24) & 0xff)
#define ELF64_MIPS_R_TYPE3(i) (((i) >> 16) & 0xff)
#define ELF64_MIPS_R_TYPE2(i) (((i) >> 8) & 0xff)
#define ELF64_MIPS_R_TYPE1(i) ((i) & 0xff)
#define ELF64_MIPS_R_TYPEENC(type1, type2, type3, ssym) \
  ((type1) \
   | ((Elf32_Word)(type2) << 8) \
   | ((Elf32_Word)(type3) << 16) \
   | ((Elf32_Word)(ssym) << 24))

#undef ELF64_R_SYM
#define ELF64_R_SYM(i) ELF64_MIPS_R_SYM (i)
#undef ELF64_R_TYPE
#define ELF64_R_TYPE(i) ELF64_MIPS_R_TYPE (i)
#undef ELF64_R_INFO
#define ELF64_R_INFO(sym, type) ELF64_MIPS_R_INFO ((sym), (type))

#endif
