/* elf.h: FR-V ELF definitions
 *
 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells (dhowells@redhat.com)
 * - Derived from include/asm-m68knommu/elf.h
 *
 * This program 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
 * 2 of the License, or (at your option) any later version.
 */
#ifndef __ASM_ELF_H
#define __ASM_ELF_H

#include <asm/ptrace.h>
#include <asm/user.h>

struct elf32_hdr;

/*
 * ELF header e_flags defines.
 */
#define EF_FRV_GPR_MASK         0x00000003 /* mask for # of gprs */
#define EF_FRV_GPR32		0x00000001 /* Only uses GR on 32-register */
#define EF_FRV_GPR64		0x00000002 /* Only uses GR on 64-register */
#define EF_FRV_FPR_MASK         0x0000000c /* mask for # of fprs */
#define EF_FRV_FPR32		0x00000004 /* Only uses FR on 32-register */
#define EF_FRV_FPR64		0x00000008 /* Only uses FR on 64-register */
#define EF_FRV_FPR_NONE		0x0000000C /* Uses software floating-point */
#define EF_FRV_DWORD_MASK       0x00000030 /* mask for dword support */
#define EF_FRV_DWORD_YES	0x00000010 /* Assumes stack aligned to 8-byte boundaries. */
#define EF_FRV_DWORD_NO		0x00000020 /* Assumes stack aligned to 4-byte boundaries. */
#define EF_FRV_DOUBLE		0x00000040 /* Uses double instructions. */
#define EF_FRV_MEDIA		0x00000080 /* Uses media instructions. */
#define EF_FRV_PIC		0x00000100 /* Uses position independent code. */
#define EF_FRV_NON_PIC_RELOCS	0x00000200 /* Does not use position Independent code. */
#define EF_FRV_MULADD           0x00000400 /* -mmuladd */
#define EF_FRV_BIGPIC           0x00000800 /* -fPIC */
#define EF_FRV_LIBPIC           0x00001000 /* -mlibrary-pic */
#define EF_FRV_G0               0x00002000 /* -G 0, no small data ptr */
#define EF_FRV_NOPACK           0x00004000 /* -mnopack */
#define EF_FRV_FDPIC            0x00008000 /* -mfdpic */
#define EF_FRV_CPU_MASK         0xff000000 /* specific cpu bits */
#define EF_FRV_CPU_GENERIC	0x00000000 /* Set CPU type is FR-V */
#define EF_FRV_CPU_FR500	0x01000000 /* Set CPU type is FR500 */
#define EF_FRV_CPU_FR300	0x02000000 /* Set CPU type is FR300 */
#define EF_FRV_CPU_SIMPLE       0x03000000 /* SIMPLE */
#define EF_FRV_CPU_TOMCAT       0x04000000 /* Tomcat, FR500 prototype */
#define EF_FRV_CPU_FR400	0x05000000 /* Set CPU type is FR400 */
#define EF_FRV_CPU_FR550        0x06000000 /* Set CPU type is FR550 */
#define EF_FRV_CPU_FR405	0x07000000 /* Set CPU type is FR405 */
#define EF_FRV_CPU_FR450	0x08000000 /* Set CPU type is FR450 */

/*
 * FR-V ELF relocation types
 */


/*
 * ELF register definitions..
 */
typedef unsigned long elf_greg_t;

#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t))
typedef elf_greg_t elf_gregset_t[ELF_NGREG];

typedef struct user_fpmedia_regs elf_fpregset_t;

/*
 * This is used to ensure we don't load something for the wrong architecture.
 */
extern int elf_check_arch(const struct elf32_hdr *hdr);

#define elf_check_fdpic(x) ((x)->e_flags & EF_FRV_FDPIC && !((x)->e_flags & EF_FRV_NON_PIC_RELOCS))
#define elf_check_const_displacement(x) ((x)->e_flags & EF_FRV_PIC)

/*
 * These are used to set parameters in the core dumps.
 */
#define ELF_CLASS	ELFCLASS32
#define ELF_DATA	ELFDATA2MSB
#define ELF_ARCH	EM_FRV

#define ELF_PLAT_INIT(_r)			\
do {						\
	__kernel_frame0_ptr->gr16	= 0;	\
	__kernel_frame0_ptr->gr17	= 0;	\
	__kernel_frame0_ptr->gr18	= 0;	\
	__kernel_frame0_ptr->gr19	= 0;	\
	__kernel_frame0_ptr->gr20	= 0;	\
	__kernel_frame0_ptr->gr21	= 0;	\
	__kernel_frame0_ptr->gr22	= 0;	\
	__kernel_frame0_ptr->gr23	= 0;	\
	__kernel_frame0_ptr->gr24	= 0;	\
	__kernel_frame0_ptr->gr25	= 0;	\
	__kernel_frame0_ptr->gr26	= 0;	\
	__kernel_frame0_ptr->gr27	= 0;	\
	__kernel_frame0_ptr->gr29	= 0;	\
} while(0)

#define ELF_FDPIC_PLAT_INIT(_regs, _exec_map_addr, _interp_map_addr, _dynamic_addr)	\
do {											\
	__kernel_frame0_ptr->gr16	= _exec_map_addr;				\
	__kernel_frame0_ptr->gr17	= _interp_map_addr;				\
	__kernel_frame0_ptr->gr18	= _dynamic_addr;				\
	__kernel_frame0_ptr->gr19	= 0;						\
	__kernel_frame0_ptr->gr20	= 0;						\
	__kernel_frame0_ptr->gr21	= 0;						\
	__kernel_frame0_ptr->gr22	= 0;						\
	__kernel_frame0_ptr->gr23	= 0;						\
	__kernel_frame0_ptr->gr24	= 0;						\
	__kernel_frame0_ptr->gr25	= 0;						\
	__kernel_frame0_ptr->gr26	= 0;						\
	__kernel_frame0_ptr->gr27	= 0;						\
	__kernel_frame0_ptr->gr29	= 0;						\
} while(0)

#define USE_ELF_CORE_DUMP
#define ELF_FDPIC_CORE_EFLAGS	EF_FRV_FDPIC
#define ELF_EXEC_PAGESIZE	16384

/* 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         0x08000000UL

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

#define ELF_HWCAP	(0)

/* 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  (NULL)

#define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)

#endif
