/* PLT trampoline.  MIPS version.
   Copyright (C) 1996-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>.

   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, see
   <http://www.gnu.org/licenses/>.  */

/*  FIXME: Profiling of shared libraries is not implemented yet.  */

#include <sysdep.h>
#include <link.h>
#include <elf.h>
#include <ldsodefs.h>
#include <dl-machine.h>
#include <sysdep-cancel.h>

/* Get link map for callers object containing STUB_PC.  */
static inline struct link_map *
elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
{
  extern int _dl_mips_gnu_objects;

  /* got[1] is reserved to keep its link map address for the shared
     object generated by the gnu linker.  If all are such objects, we
     can find the link map from current GPREG simply.  If not so, get
     the link map for caller's object containing STUB_PC.  */

  if (_dl_mips_gnu_objects)
    {
      ElfW(Addr) *got = elf_mips_got_from_gpreg (gpreg);
      ElfW(Word) g1;

      g1 = ((ElfW(Word) *) got)[1];

      if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0)
	{
	  struct link_map *l =
	    (struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK);
	  ElfW(Addr) base, limit;
	  const ElfW(Phdr) *p = l->l_phdr;
	  ElfW(Half) this, nent = l->l_phnum;

	  /* For the common case of a stub being called from the containing
	     object, STUB_PC will point to somewhere within the object that
	     is described by the link map fetched via got[1].  Otherwise we
	     have to scan all maps.  */
	  for (this = 0; this < nent; this++)
	    {
	      if (p[this].p_type == PT_LOAD)
		{
		  base = p[this].p_vaddr + l->l_addr;
		  limit = base + p[this].p_memsz;
		  if (stub_pc >= base && stub_pc < limit)
		    return l;
		}
	    }
	}
    }

    struct link_map *l;
    Lmid_t nsid;

    for (nsid = 0; nsid < DL_NNS; ++nsid)
      for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
	{
	  ElfW(Addr) base, limit;
	  const ElfW(Phdr) *p = l->l_phdr;
	  ElfW(Half) this, nent = l->l_phnum;

	  for (this = 0; this < nent; ++this)
	    {
	      if (p[this].p_type == PT_LOAD)
		{
		  base = p[this].p_vaddr + l->l_addr;
		  limit = base + p[this].p_memsz;
		  if (stub_pc >= base && stub_pc < limit)
		    return l;
		}
	    }
	}

  _dl_signal_error (0, NULL, NULL, "cannot find runtime link map");
  return NULL;
}

/* Define mips specific runtime resolver. The function __dl_runtime_resolve
   is called from assembler function _dl_runtime_resolve which converts
   special argument registers t7 ($15) and t8 ($24):
     t7  address to return to the caller of the function
     t8  index for this function symbol in .dynsym
   to usual c arguments.

   Other architectures call fixup from dl-runtime.c in
   _dl_runtime_resolve.  MIPS instead calls __dl_runtime_resolve.  We
   have to use our own version because of the way the got section is
   treated on MIPS (we've also got ELF_MACHINE_PLT defined).  */

/* The flag _dl_mips_gnu_objects is set if all dynamic objects are
   generated by the gnu linker. */
int _dl_mips_gnu_objects = 1;

/* This is called from assembly stubs below which the compiler can't see.  */
static ElfW(Addr)
__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr))
		  __attribute_used__;

static ElfW(Addr)
__dl_runtime_resolve (ElfW(Word) sym_index,
		      ElfW(Word) return_address,
		      ElfW(Addr) old_gpreg,
		      ElfW(Addr) stub_pc)
{
  struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc);
  const ElfW(Sym) *const symtab
    = (const ElfW(Sym) *) D_PTR (l, l_info[DT_SYMTAB]);
  const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
  ElfW(Addr) *got
    = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
  const ElfW(Word) local_gotno
    = (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;
  const ElfW(Word) gotsym
    = (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val;
  const ElfW(Sym) *sym = &symtab[sym_index];
  struct link_map *sym_map;
  ElfW(Addr) value;

  /* FIXME: The symbol versioning stuff is not tested yet.  */
  if (__builtin_expect (ELFW(ST_VISIBILITY) (sym->st_other), 0) == 0)
    {
      switch (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
	{
	default:
	  {
	    const ElfW(Half) *vernum =
	      (const void *) D_PTR (l, l_info[VERSYMIDX (DT_VERSYM)]);
	    ElfW(Half) ndx = vernum[sym_index] & 0x7fff;
	    const struct r_found_version *version = &l->l_versions[ndx];

	    if (version->hash != 0)
	      {
                /* We need to keep the scope around so do some locking.  This is
		   not necessary for objects which cannot be unloaded or when
		   we are not using any threads (yet).  */
		if (!RTLD_SINGLE_THREAD_P)
		  THREAD_GSCOPE_SET_FLAG ();

		sym_map = _dl_lookup_symbol_x (strtab + sym->st_name, l,
					       &sym, l->l_scope, version,
					       ELF_RTYPE_CLASS_PLT, 0, 0);

                /* We are done with the global scope.  */
		if (!RTLD_SINGLE_THREAD_P)
		  THREAD_GSCOPE_RESET_FLAG ();

		break;
	      }
	    /* Fall through.  */
	  }
	case 0:
	  {
          /* We need to keep the scope around so do some locking.  This is
	     not necessary for objects which cannot be unloaded or when
	     we are not using any threads (yet).  */
	  int flags = DL_LOOKUP_ADD_DEPENDENCY;
	  if (!RTLD_SINGLE_THREAD_P)
	    {
	      THREAD_GSCOPE_SET_FLAG ();
	      flags |= DL_LOOKUP_GSCOPE_LOCK;
	    }

	  sym_map = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym,
					 l->l_scope, 0, ELF_RTYPE_CLASS_PLT,
					 flags, 0);

          /* We are done with the global scope.  */
	  if (!RTLD_SINGLE_THREAD_P)
	    THREAD_GSCOPE_RESET_FLAG ();
	  }
	}

      /* Currently value contains the base load address of the object
	 that defines sym.  Now add in the symbol offset.  */
      value = (sym ? sym_map->l_addr + sym->st_value : 0);
    }
  else
    /* We already found the symbol.  The module (and therefore its load
       address) is also known.  */
    value = l->l_addr + sym->st_value;

  /* Apply the relocation with that value.  */
  *(got + local_gotno + sym_index - gotsym) = value;

  return value;
}

#if _MIPS_SIM == _ABIO32
#define ELF_DL_FRAME_SIZE 40

#define ELF_DL_SAVE_ARG_REGS "\
	sw	$15, 36($29)\n						      \
	sw	$4, 16($29)\n						      \
	sw	$5, 20($29)\n						      \
	sw	$6, 24($29)\n						      \
	sw	$7, 28($29)\n						      \
"

#define ELF_DL_RESTORE_ARG_REGS "\
	lw	$31, 36($29)\n						      \
	lw	$4, 16($29)\n						      \
	lw	$5, 20($29)\n						      \
	lw	$6, 24($29)\n						      \
	lw	$7, 28($29)\n						      \
"

/* The PLT resolver should also save and restore $2 and $3, which are used
   as arguments to MIPS16 stub functions.  */
#define ELF_DL_PLT_FRAME_SIZE 48

#define ELF_DL_PLT_SAVE_ARG_REGS \
	ELF_DL_SAVE_ARG_REGS "\
	sw	$2, 40($29)\n						      \
	sw	$3, 44($29)\n						      \
"

#define ELF_DL_PLT_RESTORE_ARG_REGS \
	ELF_DL_RESTORE_ARG_REGS "\
	lw	$2, 40($29)\n						      \
	lw	$3, 44($29)\n						      \
"

#define IFABIO32(X) X
#define IFNEWABI(X)

#else /* _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64 */

#define ELF_DL_FRAME_SIZE 80

#define ELF_DL_SAVE_ARG_REGS "\
	sd	$15, 72($29)\n						      \
	sd	$4, 8($29)\n						      \
	sd	$5, 16($29)\n						      \
	sd	$6, 24($29)\n						      \
	sd	$7, 32($29)\n						      \
	sd	$8, 40($29)\n						      \
	sd	$9, 48($29)\n						      \
	sd	$10, 56($29)\n						      \
	sd	$11, 64($29)\n						      \
"

#define ELF_DL_RESTORE_ARG_REGS "\
	ld	$31, 72($29)\n						      \
	ld	$4, 8($29)\n						      \
	ld	$5, 16($29)\n						      \
	ld	$6, 24($29)\n						      \
	ld	$7, 32($29)\n						      \
	ld	$8, 40($29)\n						      \
	ld	$9, 48($29)\n						      \
	ld	$10, 56($29)\n						      \
	ld	$11, 64($29)\n						      \
"

/* The PLT resolver should also save and restore $2 and $3, which are used
   as arguments to MIPS16 stub functions.  */
#define ELF_DL_PLT_FRAME_SIZE 96

#define ELF_DL_PLT_SAVE_ARG_REGS \
	ELF_DL_SAVE_ARG_REGS "\
	sd	$2, 80($29)\n						      \
	sd	$3, 88($29)\n						      \
"

#define ELF_DL_PLT_RESTORE_ARG_REGS \
	ELF_DL_RESTORE_ARG_REGS "\
	ld	$2, 80($29)\n						      \
	ld	$3, 88($29)\n						      \
"

#define IFABIO32(X)
#define IFNEWABI(X) X

#endif

#ifndef __mips16
asm ("\n\
	.text\n\
	.align	2\n\
	.set	nomips16\n\
	.globl	_dl_runtime_resolve\n\
	.type	_dl_runtime_resolve,@function\n\
	.ent	_dl_runtime_resolve\n\
_dl_runtime_resolve:\n\
	.frame	$29, " STRINGXP(ELF_DL_FRAME_SIZE) ", $31\n\
	.set noreorder\n\
	# Save GP.\n\
1:	move	$3, $28\n\
	# Save arguments and sp value in stack.\n\
	" STRINGXP(PTR_SUBIU) "  $29, " STRINGXP(ELF_DL_FRAME_SIZE) "\n\
	# Modify t9 ($25) so as to point .cpload instruction.\n\
	" IFABIO32(STRINGXP(PTR_ADDIU) "	$25, (2f-1b)\n") "\
	# Compute GP.\n\
2:	" STRINGXP(SETUP_GP) "\n\
	" STRINGXV(SETUP_GP64 (0, _dl_runtime_resolve)) "\n\
	.set reorder\n\
	# Save slot call pc.\n\
	move	$2, $31\n\
	" IFABIO32(STRINGXP(CPRESTORE(32))) "\n\
	" ELF_DL_SAVE_ARG_REGS "\
	move	$4, $24\n\
	move	$5, $15\n\
	move	$6, $3\n\
	move	$7, $2\n\
	jal	__dl_runtime_resolve\n\
	" ELF_DL_RESTORE_ARG_REGS "\
	" STRINGXP(RESTORE_GP64) "\n\
	" STRINGXP(PTR_ADDIU) "	$29, " STRINGXP(ELF_DL_FRAME_SIZE) "\n\
	move	$25, $2\n\
	jr	$25\n\
	.end	_dl_runtime_resolve\n\
	.previous\n\
");

/* Assembler veneer called from the PLT header code when using PLTs.

   Code in each PLT entry and the PLT header fills in the arguments to
   this function:

   - $15 (o32 t7, n32/n64 t3) - caller's return address
   - $24 (t8) - PLT entry index
   - $25 (t9) - address of _dl_runtime_pltresolve
   - o32 $28 (gp), n32/n64 $14 (t2) - address of .got.plt

   Different registers are used for .got.plt because the ABI was
   originally designed for o32, where gp was available (call
   clobbered).  On n32/n64 gp is call saved.

   _dl_fixup needs:

   - $4 (a0) - link map address
   - $5 (a1) - .rel.plt offset (== PLT entry index * 8)  */

asm ("\n\
	.text\n\
	.align	2\n\
	.set	nomips16\n\
	.globl	_dl_runtime_pltresolve\n\
	.type	_dl_runtime_pltresolve,@function\n\
	.ent	_dl_runtime_pltresolve\n\
_dl_runtime_pltresolve:\n\
	.frame	$29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) ", $31\n\
	.set noreorder\n\
	# Save arguments and sp value in stack.\n\
1:	" STRINGXP(PTR_SUBIU) "	$29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) "\n\
	" IFABIO32(STRINGXP(PTR_L) "	$13, " STRINGXP(PTRSIZE) "($28)") "\n\
	" IFNEWABI(STRINGXP(PTR_L) "	$13, " STRINGXP(PTRSIZE) "($14)") "\n\
	# Modify t9 ($25) so as to point .cpload instruction.\n\
	" IFABIO32(STRINGXP(PTR_ADDIU) "	$25, (2f-1b)\n") "\
	# Compute GP.\n\
2:	" STRINGXP(SETUP_GP) "\n\
	" STRINGXV(SETUP_GP64 (0, _dl_runtime_pltresolve)) "\n\
	.set reorder\n\
	" IFABIO32(STRINGXP(CPRESTORE(32))) "\n\
	" ELF_DL_PLT_SAVE_ARG_REGS "\
	move	$4, $13\n\
	sll	$5, $24, " STRINGXP(PTRLOG) " + 1\n\
	jal	_dl_fixup\n\
	move	$25, $2\n\
	" ELF_DL_PLT_RESTORE_ARG_REGS "\
	" STRINGXP(RESTORE_GP64) "\n\
	" STRINGXP(PTR_ADDIU) "	$29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) "\n\
	jr	$25\n\
	.end	_dl_runtime_pltresolve\n\
	.previous\n\
");

#elif _MIPS_SIM == _ABIO32 /* __mips16 */
/* MIPS16 version, O32 only.  */
asm ("\n\
	.text\n\
	.align	2\n\
	.set	mips16\n\
	.globl	_dl_runtime_resolve\n\
	.type	_dl_runtime_resolve,@function\n\
	.ent	_dl_runtime_resolve\n\
_dl_runtime_resolve:\n\
	.frame	$29, " STRINGXP (ELF_DL_FRAME_SIZE) ", $31\n\
	# Save arguments and sp value in stack.\n\t"
# if _MIPS_ISA >= _MIPS_ISA_MIPS32
	"save	" STRINGXP (ELF_DL_FRAME_SIZE) ", $4-$7, $ra\n\t"
# else
	"addiu	$sp, -" STRINGXP (ELF_DL_FRAME_SIZE) "\n\
	sw	$7, 32($sp)\n\
	sw	$6, 28($sp)\n\
	sw	$5, 24($sp)\n\
	sw	$4, 20($sp)\n\t"
# endif
	"# Preserve caller's $ra, for RESTORE instruction below.\n\
	move	$5, $15\n\
	sw	$5, 36($sp)\n\
	# Compute GP into $2.\n\
	li	$2, %hi(_gp_disp)\n\
	addiu	$3, $pc, %lo(_gp_disp)\n\
	sll	$2, 16\n\
	addu	$2, $3\n\
	lw	$3, %got(__dl_runtime_resolve)($2)\n\
	move	$4, $24\n\
	addiu	$3, %lo(__dl_runtime_resolve)\n\
	move	$7, $ra\n\
	move	$6, $28\n\
	move	$25, $3\n\
	jalr	$3\n\t"
# if _MIPS_ISA >= _MIPS_ISA_MIPS32
	"restore " STRINGXP(ELF_DL_FRAME_SIZE) ", $4-$7, $ra\n\t"
# else
	"# Restore $ra, move placed further down to hide latency.\n\
	lw	$4, 36($sp)\n\
	lw	$5, 24($sp)\n\
	lw	$6, 28($sp)\n\
	lw	$7, 32($sp)\n\
	move	$ra, $4\n\
	lw	$4, 20($sp)\n\
	addiu	$sp, " STRINGXP(ELF_DL_FRAME_SIZE) "\n\t"
# endif
	"move	$25, $2\n\
	jr	$2\n\
	.end	_dl_runtime_resolve\n\
	.previous\n\
");

asm ("\n\
	.text\n\
	.align	2\n\
	.set	mips16\n\
	.globl	_dl_runtime_pltresolve\n\
	.type	_dl_runtime_pltresolve,@function\n\
	.ent	_dl_runtime_pltresolve\n\
_dl_runtime_pltresolve:\n\
	.frame	$29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) ", $31\n\
	# Save arguments and sp value in stack.\n\t"
# if _MIPS_ISA >= _MIPS_ISA_MIPS32
	"save	" STRINGXP(ELF_DL_PLT_FRAME_SIZE) ", $4-$7, $ra\n\t"
# else
	"addiu	$sp, -" STRINGXP(ELF_DL_PLT_FRAME_SIZE) "\n\
	sw	$7, 40($sp)\n\
	sw	$6, 36($sp)\n\
	sw	$5, 32($sp)\n\
	sw	$4, 28($sp)\n\t"
# endif
	"# Preserve MIPS16 stub function arguments.\n\
	sw	$3, 20($sp)\n\
	sw	$2, 16($sp)\n\
	# Preserve caller's $ra, for RESTORE instruction below.\n\
	move	$3, $15\n\
	sw	$3, 44($sp)\n\
	# Compute GP into $2.\n\
	li	$2, %hi(_gp_disp)\n\
	addiu	$3, $pc, %lo(_gp_disp)\n\
	sll	$2, 16\n\
	addu	$2, $3\n\
	# Save GP value in slot.\n\
	sw	$2, 24($sp)\n\
	# Load _dl_fixup address.\n\
	lw	$6, %call16(_dl_fixup)($2)\n\
	# Load link map address.\n\
	move	$3, $28\n\
	lw	$4, " STRINGXP (PTRSIZE) "($3)\n\
	move	$5, $24\n\
	sll	$5, " STRINGXP (PTRLOG) " + 1\n\
	# Call _dl_fixup.\n\
	move	$25, $6\n\
	jalr	$6\n\
	move	$25, $2\n\
	# Reload GP value into $28.\n\
	lw	$3, 24($sp)\n\
	move	$28, $3\n\
	lw	$3, 16($sp)\n\
	move	$15, $3\n\
	lw	$3, 20($sp)\n\t"
# if _MIPS_ISA >= _MIPS_ISA_MIPS32
	"restore " STRINGXP (ELF_DL_PLT_FRAME_SIZE) ", $4-$7, $ra\n\t"
# else
	"# Restore $ra, move placed further down to hide latency.\n\
	lw	$4, 44($sp)\n\
	lw	$5, 32($sp)\n\
	lw	$6, 36($sp)\n\
	lw	$7, 40($sp)\n\
	move	$ra, $4\n\
	lw	$4, 28($sp)\n\
	addiu	$sp, " STRINGXP (ELF_DL_PLT_FRAME_SIZE) "\n\t"
# endif
	".set	noreorder\n\
	jr	$2\n\
	 move	$2, $15\n\
	.set	reorder\n\
	.end	_dl_runtime_pltresolve\n\
	.previous\n\
");

#else /* __mips16 && _MIPS_SIM != _ABIO32 */
# error "MIPS16 support for N32/N64 not implemented"

#endif /* __mips16 */
