Blame include/coff/i960.h

Packit bbfece
/* coff information for 80960.  Origins: Intel corp, natch.
Packit bbfece
   
Packit bbfece
   Copyright (C) 2001-2018 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
   
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
   
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
Packit bbfece
   MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
/* NOTE: Tagentries (cf TAGBITS) are no longer used by the 960 */
Packit bbfece
Packit bbfece
/********************** FILE HEADER **********************/
Packit bbfece
Packit bbfece
struct external_filehdr
Packit bbfece
{
Packit bbfece
  char f_magic[2];	/* magic number			*/
Packit bbfece
  char f_nscns[2];	/* number of sections		*/
Packit bbfece
  char f_timdat[4];	/* time & date stamp		*/
Packit bbfece
  char f_symptr[4];	/* file pointer to symtab	*/
Packit bbfece
  char f_nsyms[4];	/* number of symtab entries	*/
Packit bbfece
  char f_opthdr[2];	/* sizeof(optional hdr)		*/
Packit bbfece
  char f_flags[2];	/* flags			*/
Packit bbfece
};
Packit bbfece
Packit bbfece
#define OMAGIC      (0407)	/* old impure format. data immediately
Packit bbfece
                                   follows text. both sections are rw. */
Packit bbfece
#define NMAGIC      (0410)	/* split i&d, read-only text */
Packit bbfece
Packit bbfece
/*
Packit bbfece
*	Intel 80960 (I960) processor flags.
Packit bbfece
*	F_I960TYPE == mask for processor type field. 
Packit bbfece
*/
Packit bbfece
Packit bbfece
#define	F_I960TYPE	(0xf000)
Packit bbfece
#define	F_I960CORE	(0x1000)
Packit bbfece
#define	F_I960KB	(0x2000)
Packit bbfece
#define	F_I960SB	(0x2000)
Packit bbfece
#define	F_I960MC	(0x3000)
Packit bbfece
#define	F_I960XA	(0x4000)
Packit bbfece
#define	F_I960CA	(0x5000)
Packit bbfece
#define	F_I960KA	(0x6000)
Packit bbfece
#define	F_I960SA	(0x6000)
Packit bbfece
#define F_I960JX	(0x7000)
Packit bbfece
#define F_I960HX	(0x8000)
Packit bbfece
Packit bbfece
Packit bbfece
/** i80960 Magic Numbers
Packit bbfece
*/
Packit bbfece
Packit bbfece
#define I960ROMAGIC	(0x160)	/* read-only text segments */
Packit bbfece
#define I960RWMAGIC	(0x161)	/* read-write text segments */
Packit bbfece
Packit bbfece
#define I960BADMAG(x) (((x).f_magic!=I960ROMAGIC) && ((x).f_magic!=I960RWMAGIC))
Packit bbfece
Packit bbfece
#define	FILHDR	struct external_filehdr
Packit bbfece
#define	FILHSZ	20
Packit bbfece
Packit bbfece
/********************** AOUT "OPTIONAL HEADER" **********************/
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  unsigned long	phys_addr;
Packit bbfece
  unsigned long	bitarray;
Packit bbfece
} TAGBITS;
Packit bbfece
Packit bbfece
typedef struct 
Packit bbfece
{
Packit bbfece
  char 	magic[2];		/* type of file				*/
Packit bbfece
  char	vstamp[2];		/* version stamp			*/
Packit bbfece
  char	tsize[4];		/* text size in bytes, padded to FW bdry*/
Packit bbfece
  char	dsize[4];		/* initialized data "  "		*/
Packit bbfece
  char	bsize[4];		/* uninitialized data "   "		*/
Packit bbfece
  char	entry[4];		/* entry pt.				*/
Packit bbfece
  char 	text_start[4];		/* base of text used for this file */
Packit bbfece
  char 	data_start[4];		/* base of data used for this file */
Packit bbfece
  char	tagentries[4];		/* number of tag entries to follow */
Packit bbfece
}
Packit bbfece
AOUTHDR;
Packit bbfece
Packit bbfece
/* return a pointer to the tag bits array */
Packit bbfece
Packit bbfece
#define TAGPTR(aout) ((TAGBITS *) (&(aout.tagentries)+1))
Packit bbfece
Packit bbfece
/* compute size of a header */
Packit bbfece
Packit bbfece
/*#define AOUTSZ(aout) (sizeof(AOUTHDR)+(aout.tagentries*sizeof(TAGBITS)))*/
Packit bbfece
#define AOUTSZ 32
Packit bbfece
#define AOUTHDRSZ 32
Packit bbfece
Packit bbfece
Packit bbfece
/********************** SECTION HEADER **********************/
Packit bbfece
Packit bbfece
struct external_scnhdr
Packit bbfece
{
Packit bbfece
  char		s_name[8];	/* section name			*/
Packit bbfece
  char		s_paddr[4];	/* physical address, aliased s_nlib */
Packit bbfece
  char		s_vaddr[4];	/* virtual address		*/
Packit bbfece
  char		s_size[4];	/* section size			*/
Packit bbfece
  char		s_scnptr[4];	/* file ptr to raw data for section */
Packit bbfece
  char		s_relptr[4];	/* file ptr to relocation	*/
Packit bbfece
  char		s_lnnoptr[4];	/* file ptr to line numbers	*/
Packit bbfece
  char		s_nreloc[2];	/* number of relocation entries	*/
Packit bbfece
  char		s_nlnno[2];	/* number of line number entries*/
Packit bbfece
  char		s_flags[4];	/* flags			*/
Packit bbfece
  char 		s_align[4];	/* section alignment		*/
Packit bbfece
};
Packit bbfece
Packit bbfece
Packit bbfece
#define	SCNHDR	struct external_scnhdr
Packit bbfece
#define	SCNHSZ	44
Packit bbfece
Packit bbfece
/*
Packit bbfece
 * names of "special" sections
Packit bbfece
 */
Packit bbfece
#define _TEXT   ".text"
Packit bbfece
#define _DATA   ".data"
Packit bbfece
#define _BSS    ".bss"
Packit bbfece
Packit bbfece
/********************** LINE NUMBERS **********************/
Packit bbfece
Packit bbfece
/* 1 line number entry for every "breakpointable" source line in a section.
Packit bbfece
 * Line numbers are grouped on a per function basis; first entry in a function
Packit bbfece
 * grouping will have l_lnno = 0 and in place of physical address will be the
Packit bbfece
 * symbol table index of the function name.
Packit bbfece
 */
Packit bbfece
struct external_lineno
Packit bbfece
{
Packit bbfece
  union
Packit bbfece
  {
Packit bbfece
    char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
Packit bbfece
    char l_paddr[4];	/* (physical) address of line number	*/
Packit bbfece
  } l_addr;
Packit bbfece
Packit bbfece
  char l_lnno[2];		/* line number		*/
Packit bbfece
  char padding[2];	/* force alignment	*/
Packit bbfece
};
Packit bbfece
Packit bbfece
Packit bbfece
#define	LINENO	struct external_lineno
Packit bbfece
#define	LINESZ	8
Packit bbfece
Packit bbfece
/********************** SYMBOLS **********************/
Packit bbfece
Packit bbfece
#define E_SYMNMLEN	8	/* # characters in a symbol name	*/
Packit bbfece
#define E_FILNMLEN	14	/* # characters in a file name		*/
Packit bbfece
#define E_DIMNUM	4	/* # array dimensions in auxiliary entry */
Packit bbfece
Packit bbfece
struct external_syment 
Packit bbfece
{
Packit bbfece
  union
Packit bbfece
  {
Packit bbfece
    char e_name[E_SYMNMLEN];
Packit bbfece
Packit bbfece
    struct
Packit bbfece
    {
Packit bbfece
      char e_zeroes[4];
Packit bbfece
      char e_offset[4];
Packit bbfece
    } e;
Packit bbfece
  } e;
Packit bbfece
Packit bbfece
  char e_value[4];
Packit bbfece
  char e_scnum[2];
Packit bbfece
  char e_flags[2];
Packit bbfece
  char e_type[4];
Packit bbfece
  char e_sclass[1];
Packit bbfece
  char e_numaux[1];
Packit bbfece
  char pad2[2];
Packit bbfece
};
Packit bbfece
Packit bbfece
#define N_BTMASK	(0x1f)
Packit bbfece
#define N_TMASK		(0x60)
Packit bbfece
#define N_BTSHFT	(5)
Packit bbfece
#define N_TSHIFT	(2)
Packit bbfece
  
Packit bbfece
union external_auxent
Packit bbfece
{
Packit bbfece
  struct
Packit bbfece
  {
Packit bbfece
    char x_tagndx[4];	/* str, un, or enum tag indx */
Packit bbfece
Packit bbfece
    union
Packit bbfece
    {
Packit bbfece
      struct
Packit bbfece
      {
Packit bbfece
	char  x_lnno[2]; /* declaration line number */
Packit bbfece
	char  x_size[2]; /* str/union/array size */
Packit bbfece
      } x_lnsz;
Packit bbfece
Packit bbfece
      char x_fsize[4];	/* size of function */
Packit bbfece
Packit bbfece
    } x_misc;
Packit bbfece
Packit bbfece
    union
Packit bbfece
    {
Packit bbfece
      struct 		/* if ISFCN, tag, or .bb */
Packit bbfece
      {
Packit bbfece
	char x_lnnoptr[4];	/* ptr to fcn line # */
Packit bbfece
	char x_endndx[4];	/* entry ndx past block end */
Packit bbfece
      } x_fcn;
Packit bbfece
Packit bbfece
      struct 		/* if ISARY, up to 4 dimen. */
Packit bbfece
      {
Packit bbfece
	char x_dimen[E_DIMNUM][2];
Packit bbfece
      } x_ary;
Packit bbfece
Packit bbfece
    } x_fcnary;
Packit bbfece
Packit bbfece
    char x_tvndx[2];		/* tv index */
Packit bbfece
Packit bbfece
  } x_sym;
Packit bbfece
Packit bbfece
  union
Packit bbfece
  {
Packit bbfece
    char x_fname[E_FILNMLEN];
Packit bbfece
Packit bbfece
    struct
Packit bbfece
    {
Packit bbfece
      char x_zeroes[4];
Packit bbfece
      char x_offset[4];
Packit bbfece
    } x_n;
Packit bbfece
Packit bbfece
  } x_file;
Packit bbfece
Packit bbfece
  struct
Packit bbfece
  {
Packit bbfece
    char x_scnlen[4];			/* section length */
Packit bbfece
    char x_nreloc[2];	/* # relocation entries */
Packit bbfece
    char x_nlinno[2];	/* # line numbers */
Packit bbfece
Packit bbfece
  } x_scn;
Packit bbfece
Packit bbfece
  struct
Packit bbfece
  {
Packit bbfece
    char x_tvfill[4];	/* tv fill value */
Packit bbfece
    char x_tvlen[2];	/* length of .tv */
Packit bbfece
    char x_tvran[2][2];	/* tv range */
Packit bbfece
Packit bbfece
  } x_tv;		/* info about .tv section (in auxent of symbol .tv)) */
Packit bbfece
Packit bbfece
  /******************************************
Packit bbfece
   *  I960-specific *2nd* aux. entry formats
Packit bbfece
   ******************************************/
Packit bbfece
  struct
Packit bbfece
  {
Packit bbfece
    /* This is a very old typo that keeps getting propagated. */
Packit bbfece
#define x_stdindx x_stindx
Packit bbfece
    char x_stindx[4];	/* sys. table entry */
Packit bbfece
  } x_sc;	/* system call entry */
Packit bbfece
Packit bbfece
  struct
Packit bbfece
  {
Packit bbfece
    char x_balntry[4]; /* BAL entry point */
Packit bbfece
  } x_bal; /* BAL-callable function */
Packit bbfece
Packit bbfece
  struct
Packit bbfece
  {
Packit bbfece
    char x_timestamp[4];	        /* time stamp */
Packit bbfece
    char 	x_idstring[20];	        /* producer identity string */
Packit bbfece
Packit bbfece
  } x_ident;	                        /* Producer ident info */
Packit bbfece
};
Packit bbfece
Packit bbfece
#define	SYMENT	struct external_syment
Packit bbfece
#define	SYMESZ	24
Packit bbfece
#define	AUXENT	union external_auxent
Packit bbfece
#define	AUXESZ	24
Packit bbfece
Packit bbfece
#	define _ETEXT	"_etext"
Packit bbfece
Packit bbfece
/********************** RELOCATION DIRECTIVES **********************/
Packit bbfece
Packit bbfece
struct external_reloc
Packit bbfece
{
Packit bbfece
  char r_vaddr[4];
Packit bbfece
  char r_symndx[4];
Packit bbfece
  char r_type[2];
Packit bbfece
  char pad[2];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* r_type values for the i960.  */
Packit bbfece
Packit bbfece
/* The i960 uses R_RELLONG, which is defined in internal.h as 0x11.
Packit bbfece
   It is an absolute 32 bit relocation.  */
Packit bbfece
Packit bbfece
#define R_IPRMED 	(0x19)	/* 24-bit ip-relative relocation */
Packit bbfece
#define R_OPTCALL	(0x1b)	/* 32-bit optimizable call (leafproc/sysproc) */
Packit bbfece
#define R_OPTCALLX	(0x1c)	/* 64-bit optimizable call (leafproc/sysproc) */
Packit bbfece
Packit bbfece
/* The following relocation types are defined use by relaxing linkers,
Packit bbfece
   which convert 32 bit calls (which require a 64 bit instruction)
Packit bbfece
   into 24 bit calls (which require a 32 bit instruction) when
Packit bbfece
   possible.  It will be possible whenever the target of the call is
Packit bbfece
   within a 24 bit range of the call instruction.
Packit bbfece
Packit bbfece
   It is always safe to ignore these relocations.  They only serve to
Packit bbfece
   mark points which the relaxing linker will have to consider.  The
Packit bbfece
   assembler must ensure that the correct code is generated even if
Packit bbfece
   the relocations are ignored.  In particular, this means that the
Packit bbfece
   R_IPR13 relocation may not appear with an external symbol.  */
Packit bbfece
Packit bbfece
#define R_IPR13		(0x1d)	/* 13 bit ip-relative branch */
Packit bbfece
#define R_ALIGN		(0x1e)  /* alignment marker.  This has no
Packit bbfece
				   associated symbol.  Instead, the
Packit bbfece
				   r_symndx field indicates the
Packit bbfece
				   require alignment at this point in
Packit bbfece
				   the file.  It must be a power of 2.  */
Packit bbfece
Packit bbfece
#define RELOC struct external_reloc
Packit bbfece
#define RELSZ 12
Packit bbfece