// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2005-2017 Andes Technology Corporation

#ifndef __ASMNDS32_ELF_H
#define __ASMNDS32_ELF_H

/*
 * ELF register definitions..
 */

#include <asm/ptrace.h>

typedef unsigned long elf_greg_t;
typedef unsigned long elf_freg_t[3];

extern unsigned int elf_hwcap;

#define EM_NDS32			167

#define R_NDS32_NONE			0
#define R_NDS32_16_RELA			19
#define R_NDS32_32_RELA			20
#define R_NDS32_9_PCREL_RELA		22
#define R_NDS32_15_PCREL_RELA		23
#define R_NDS32_17_PCREL_RELA		24
#define R_NDS32_25_PCREL_RELA		25
#define R_NDS32_HI20_RELA		26
#define R_NDS32_LO12S3_RELA		27
#define R_NDS32_LO12S2_RELA		28
#define R_NDS32_LO12S1_RELA		29
#define R_NDS32_LO12S0_RELA		30
#define R_NDS32_SDA15S3_RELA    	31
#define R_NDS32_SDA15S2_RELA    	32
#define R_NDS32_SDA15S1_RELA    	33
#define R_NDS32_SDA15S0_RELA    	34
#define R_NDS32_GOT20			37
#define R_NDS32_25_PLTREL		38
#define R_NDS32_COPY			39
#define R_NDS32_GLOB_DAT		40
#define R_NDS32_JMP_SLOT		41
#define R_NDS32_RELATIVE		42
#define R_NDS32_GOTOFF			43
#define R_NDS32_GOTPC20			44
#define R_NDS32_GOT_HI20		45
#define R_NDS32_GOT_LO12		46
#define R_NDS32_GOTPC_HI20		47
#define R_NDS32_GOTPC_LO12		48
#define R_NDS32_GOTOFF_HI20		49
#define R_NDS32_GOTOFF_LO12		50
#define R_NDS32_INSN16			51
#define R_NDS32_LABEL			52
#define R_NDS32_LONGCALL1		53
#define R_NDS32_LONGCALL2		54
#define R_NDS32_LONGCALL3		55
#define R_NDS32_LONGJUMP1		56
#define R_NDS32_LONGJUMP2		57
#define R_NDS32_LONGJUMP3		58
#define R_NDS32_LOADSTORE		59
#define R_NDS32_9_FIXED_RELA		60
#define R_NDS32_15_FIXED_RELA		61
#define R_NDS32_17_FIXED_RELA		62
#define R_NDS32_25_FIXED_RELA		63
#define R_NDS32_PLTREL_HI20		64
#define R_NDS32_PLTREL_LO12		65
#define R_NDS32_PLT_GOTREL_HI20		66
#define R_NDS32_PLT_GOTREL_LO12		67
#define R_NDS32_LO12S0_ORI_RELA		72
#define R_NDS32_DWARF2_OP1_RELA     	77
#define R_NDS32_DWARF2_OP2_RELA     	78
#define R_NDS32_DWARF2_LEB_RELA     	79
#define R_NDS32_WORD_9_PCREL_RELA	94
#define R_NDS32_LONGCALL4 		107
#define R_NDS32_RELA_NOP_MIX		192
#define R_NDS32_RELA_NOP_MAX		255

#define ELF_NGREG (sizeof (struct user_pt_regs) / sizeof(elf_greg_t))
#define ELF_CORE_COPY_REGS(dest, regs)	\
	*(struct user_pt_regs *)&(dest) = (regs)->user_regs;

typedef elf_greg_t elf_gregset_t[ELF_NGREG];

/* Core file format: The core file is written in such a way that gdb
   can understand it and provide useful information to the user (under
   linux we use the 'trad-core' bfd).  There are quite a number of
   obstacles to being able to view the contents of the floating point
   registers, and until these are solved you will not be able to view the
   contents of them.  Actually, you can read in the core file and look at
   the contents of the user struct to find out what the floating point
   registers contain.
   The actual file contents are as follows:
   UPAGE: 1 page consisting of a user struct that tells gdb what is present
   in the file.  Directly after this is a copy of the task_struct, which
   is currently not used by gdb, but it may come in useful at some point.
   All of the registers are stored as part of the upage.  The upage should
   always be only one page.
   DATA: The data area is stored.  We use current->end_text to
   current->brk to pick up all of the user variables, plus any memory
   that may have been malloced.  No attempt is made to determine if a page
   is demand-zero or if a page is totally unused, we just cover the entire
   range.  All of the addresses are rounded in such a way that an integral
   number of pages is written.
   STACK: We need the stack information in order to get a meaningful
   backtrace.  We need to write the data from (esp) to
   current->start_stack, so we round each of these off in order to be able
   to write an integer number of pages.
   The minimum core file size is 3 pages, or 12288 bytes.
*/

struct user_fp {
        unsigned long long fd_regs[32];
        unsigned long fpcsr;
};

typedef struct user_fp elf_fpregset_t;

struct elf32_hdr;
#define elf_check_arch(x)		((x)->e_machine == EM_NDS32)

/*
 * These are used to set parameters in the core dumps.
 */
#define ELF_CLASS	ELFCLASS32
#ifdef __NDS32_EB__
#define ELF_DATA	ELFDATA2MSB;
#else
#define ELF_DATA	ELFDATA2LSB;
#endif
#define ELF_ARCH	EM_NDS32
#define USE_ELF_CORE_DUMP
#define ELF_EXEC_PAGESIZE	PAGE_SIZE

/* 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.  */

#define ELF_ET_DYN_BASE	(2 * TASK_SIZE / 3)

/* When the program starts, a1 contains a pointer to a function to be
   registered with atexit, as per the SVR4 ABI.  A value of 0 means we
   have no such handler.  */
#define ELF_PLAT_INIT(_r, load_addr)	(_r)->uregs[0] = 0

/* This yields a mask that user programs can use to figure out what
   instruction set this cpu supports. */

#define ELF_HWCAP	(elf_hwcap)

#ifdef __KERNEL__

#define ELF_PLATFORM    (NULL)

/* Old NetWinder binaries were compiled in such a way that the iBCS
   heuristic always trips on them.  Until these binaries become uncommon
   enough not to care, don't trust the `ibcs' flag here.  In any case
   there is no other ELF system currently supported by iBCS.
   @@ Could print a warning message to encourage users to upgrade.  */
#define SET_PERSONALITY(ex)	set_personality(PER_LINUX)

#endif

#define ARCH_DLINFO						\
do {								\
	NEW_AUX_ENT(AT_SYSINFO_EHDR,				\
		    (elf_addr_t)current->mm->context.vdso);	\
} while (0)
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
struct linux_binprm;
int arch_setup_additional_pages(struct linux_binprm *, int);

#endif
