/* DWARF2 EH unwinding support for Nios II Linux.
   Copyright (C) 2008-2023 Free Software Foundation, Inc.

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

This file 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
General Public License for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

#ifndef inhibit_libc

/* Do code reading to identify a signal frame, and set the frame
   state data appropriately.  See unwind-dw2.c for the structs.
   The corresponding bits in the Linux kernel are in
   arch/nios2/kernel/signal.c.  */

#include <signal.h>
#include <asm/unistd.h>

/* Exactly the same layout as the kernel structures, unique names.  */
struct nios2_mcontext {
  int version;
  int gregs[32];
};

struct nios2_ucontext {
  unsigned long uc_flags;
  ucontext_t *uc_link;
  stack_t uc_stack;
  struct nios2_mcontext uc_mcontext;
  sigset_t uc_sigmask;	/* mask last for extensibility */
};

#define MD_FALLBACK_FRAME_STATE_FOR nios2_fallback_frame_state

static _Unwind_Reason_Code
nios2_fallback_frame_state (struct _Unwind_Context *context,
			    _Unwind_FrameState *fs)
{
  u_int32_t *pc = (u_int32_t *) context->ra;
  _Unwind_Ptr new_cfa;

  /* The expected sequence of instructions is:
       movi r2,(rt_sigreturn)
       trap
     Check for the trap first.  */
  if (pc[1] != 0x003b683a)
    return _URC_END_OF_STACK;

#define NIOS2_REG(NUM,NAME)						\
  (fs->regs.how[NUM] = REG_SAVED_OFFSET,				\
   fs->regs.reg[NUM].loc.offset = (_Unwind_Ptr)&(regs->NAME) - new_cfa)

  if (pc[0] == (0x00800004 | (__NR_rt_sigreturn << 6)))
    {
      struct rt_sigframe {
	siginfo_t info;
	struct nios2_ucontext uc;
      } *rt_ = context->cfa;
      struct nios2_mcontext *regs = &rt_->uc.uc_mcontext;
      int i;

      /* MCONTEXT_VERSION is defined to 2 in the kernel.  */
      if (regs->version != 2)
	return _URC_END_OF_STACK;

      /* The CFA is the user's incoming stack pointer value.  */
      new_cfa = (_Unwind_Ptr)regs->gregs[28];
      fs->regs.cfa_how = CFA_REG_OFFSET;
      fs->regs.cfa_reg = __LIBGCC_STACK_POINTER_REGNUM__;
      fs->regs.cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa;

      /* The sequential registers.  */
      for (i = 1; i < 24; i++)
	NIOS2_REG (i, gregs[i-1]);
      
      /* The random registers.  The kernel stores these in a funny order
	 in the gregs array.  */
      NIOS2_REG (RA_REGNO, gregs[23]);
      NIOS2_REG (FP_REGNO, gregs[24]);
      NIOS2_REG (GP_REGNO, gregs[25]);
      NIOS2_REG (EA_REGNO, gregs[27]);
      
      fs->retaddr_column = EA_REGNO;
      fs->signal_frame = 1;
      
      return _URC_NO_REASON;
    }
#undef NIOS2_REG
  return _URC_END_OF_STACK;
}
#endif
