Add support for OpenRISC 32-bit embedded processor
This commit is contained in:
		
							
								
								
									
										287
									
								
								include/coff/or32.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								include/coff/or32.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,287 @@ | ||||
| /* COFF specification for OpenRISC 1000. | ||||
|    Copyright (C) 1993-2000, 2002 Free Software Foundation, Inc. | ||||
|    Contributed by David Wood @ New York University. | ||||
|    Modified by Johan Rydberg, <johan.rydberg@netinsight.se> | ||||
|  | ||||
|    This file is part of BFD, the Binary File Descriptor library. | ||||
|  | ||||
|    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. | ||||
|  | ||||
|    This program 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. | ||||
|  | ||||
|    You should have received a copy of the GNU General Public License | ||||
|    along with this program; if not, write to the Free Software | ||||
|    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ | ||||
|  | ||||
| #ifndef OR32 | ||||
| # define OR32 | ||||
| #endif | ||||
|  | ||||
| /* File Header and related definitions.  */ | ||||
| struct external_filehdr | ||||
| { | ||||
|   char f_magic[2];	/* magic number		    */ | ||||
|   char f_nscns[2];	/* number of sections	    */ | ||||
|   char f_timdat[4];     /* time & date stamp	    */ | ||||
|   char f_symptr[4];     /* file pointer to symtab   */ | ||||
|   char f_nsyms[4];	/* number of symtab entries */ | ||||
|   char f_opthdr[2];     /* sizeof(optional hdr)	    */ | ||||
|   char f_flags[2];	/* flags		    */ | ||||
| }; | ||||
|  | ||||
| #define FILHDR  struct external_filehdr | ||||
| #define FILHSZ	20 | ||||
|  | ||||
| /* Magic numbers for OpenRISC 1000. As it is know we use the | ||||
|    numbers for Am29000. | ||||
|  | ||||
|    (AT&T will assign the "real" magic number).  */ | ||||
| #define SIPFBOMAGIC     0572    /* Am29000 (Byte 0 is MSB).  */ | ||||
| #define SIPRBOMAGIC     0573    /* Am29000 (Byte 0 is LSB).  */ | ||||
|  | ||||
| #define OR32_MAGIC_BIG 		SIPFBOMAGIC	 | ||||
| #define OR32_MAGIC_LITTLE	SIPRBOMAGIC	 | ||||
| #define OR32BADMAG(x)     (((x).f_magic!=OR32_MAGIC_BIG) && \ | ||||
| 			                      ((x).f_magic!=OR32_MAGIC_LITTLE)) | ||||
|  | ||||
| #define OMAGIC OR32_MAGIC_BIG | ||||
|  | ||||
| /* Optional (a.out) header.  */ | ||||
| typedef	struct external_aouthdr  | ||||
| { | ||||
|   char  magic[2];         /* type of file                     */ | ||||
|   char  vstamp[2];	  /* version stamp                    */ | ||||
|   char  tsize[4];	  /* text size in bytes, padded to FW bdry */ | ||||
|   char  dsize[4];	  /* initialized data "  "            */ | ||||
|   char  bsize[4];	  /* uninitialized data "   "         */ | ||||
|   char  entry[4];	  /* entry pt.                        */ | ||||
|   char  text_start[4];	  /* base of text used for this file  */ | ||||
|   char  data_start[4];	  /* base of data used for this file  */ | ||||
| } AOUTHDR; | ||||
|  | ||||
| #define AOUTSZ      28 | ||||
| #define AOUTHDRSZ   28 | ||||
|  | ||||
| /* aouthdr magic numbers.  */ | ||||
| #define NMAGIC    0410	  /* separate i/d executable.  */ | ||||
| #define SHMAGIC   0406	  /* NYU/Ultra3 shared data executable  | ||||
|                              (writable text).  */ | ||||
|  | ||||
| #define _ETEXT   	"_etext" | ||||
|  | ||||
| /* Section header and related definitions.  */ | ||||
| struct external_scnhdr  | ||||
| { | ||||
|   char	    s_name[8];      /* section name                   */ | ||||
|   char	    s_paddr[4];     /* physical address, aliased s_nlib */ | ||||
|   char	    s_vaddr[4];     /* virtual address                */ | ||||
|   char	    s_size[4];      /* section size                   */ | ||||
|   char	    s_scnptr[4];    /* file ptr to raw data for section */ | ||||
|   char	    s_relptr[4];    /* file ptr to relocation         */ | ||||
|   char	    s_lnnoptr[4];   /* file ptr to line numbers       */ | ||||
|   char	    s_nreloc[2];    /* number of relocation entries   */ | ||||
|   char	    s_nlnno[2];     /* number of line number entries  */ | ||||
|   char	    s_flags[4];     /* flags                          */ | ||||
| }; | ||||
|  | ||||
| #define	SCNHDR	struct external_scnhdr | ||||
| #define	SCNHSZ	40 | ||||
|  | ||||
| /* Names of "special" sections:  */ | ||||
| #define _TEXT   ".text" | ||||
| #define _DATA   ".data" | ||||
| #define _BSS    ".bss" | ||||
| #define _LIT    ".lit" | ||||
|  | ||||
| /* Section types - with additional section type for global  | ||||
|    registers which will be relocatable for the OpenRISC 1000. | ||||
|  | ||||
|    In instances where it is necessary for a linker to produce an | ||||
|    output file which contains text or data not based at virtual | ||||
|    address 0, e.g. for a ROM, then the linker should accept | ||||
|    address base information as command input and use PAD sections | ||||
|    to skip over unused addresses.  */ | ||||
| #define	STYP_BSSREG 0x1200	/* Global register area (like STYP_INFO) */ | ||||
| #define STYP_ENVIR  0x2200	/* Environment (like STYP_INFO) */ | ||||
| #define STYP_ABS    0x4000	/* Absolute (allocated, not reloc, loaded) */ | ||||
|  | ||||
| /* Relocation information declaration and related definitions:  */ | ||||
| struct external_reloc | ||||
| { | ||||
|   char r_vaddr[4];    /* (virtual) address of reference */ | ||||
|   char r_symndx[4];   /* index into symbol table */ | ||||
|   char r_type[2];     /* relocation type */ | ||||
| }; | ||||
|  | ||||
| #define	RELOC		struct external_reloc | ||||
| #define	RELSZ		10		/* sizeof (RELOC) */  | ||||
|  | ||||
| /* Relocation types for the OpenRISC 1000: */ | ||||
|  | ||||
| #define	R_ABS     0     /* reference is absolute */ | ||||
| #define	R_IREL    030	/* instruction relative (jmp/call) */ | ||||
| #define	R_IABS    031	/* instruction absolute (jmp/call) */ | ||||
| #define	R_ILOHALF 032	/* instruction low half  (const)  */ | ||||
| #define	R_IHIHALF 033	/* instruction high half (consth) part 1 */ | ||||
| #define	R_IHCONST 034	/* instruction high half (consth) part 2 */ | ||||
|                         /* constant offset of R_IHIHALF relocation */ | ||||
| #define	R_BYTE    035	/* relocatable byte value */ | ||||
| #define R_HWORD   036	/* relocatable halfword value */ | ||||
| #define R_WORD    037	/* relocatable word value */ | ||||
|  | ||||
| #define	R_IGLBLRC 040	/* instruction global register RC */ | ||||
| #define	R_IGLBLRA 041	/* instruction global register RA */ | ||||
| #define	R_IGLBLRB 042	/* instruction global register RB */ | ||||
|   | ||||
| /* | ||||
|   NOTE: | ||||
|   All the "I" forms refer to 29000 instruction formats.  The linker is  | ||||
|   expected to know how the numeric information is split and/or aligned | ||||
|   within the instruction word(s).  R_BYTE works for instructions, too. | ||||
|  | ||||
|   If the parameter to a CONSTH instruction is a relocatable type, two  | ||||
|   relocation records are written.  The first has an r_type of R_IHIHALF  | ||||
|   (33 octal) and a normal r_vaddr and r_symndx.  The second relocation  | ||||
|   record has an r_type of R_IHCONST (34 octal), a normal r_vaddr (which  | ||||
|   is redundant), and an r_symndx containing the 32-bit constant offset  | ||||
|   to the relocation instead of the actual symbol table index.  This  | ||||
|   second record is always written, even if the constant offset is zero. | ||||
|   The constant fields of the instruction are set to zero.  */ | ||||
|  | ||||
| /* Line number entry declaration and related definitions:  */ | ||||
| struct external_lineno  | ||||
| { | ||||
|   union | ||||
|   { | ||||
|     char l_symndx[4];  /* function name symbol index, iff l_lnno == 0*/ | ||||
|     char l_paddr[4];   /* (physical) address of line number    */ | ||||
|   } | ||||
|   l_addr; | ||||
|  | ||||
|   char l_lnno[2];      /* line number	  */ | ||||
| }; | ||||
|  | ||||
| #define	LINENO		struct external_lineno | ||||
| #define	LINESZ		6		  /* sizeof (LINENO) */ | ||||
|  | ||||
| /* Symbol entry declaration and related definitions:  */ | ||||
| #define	E_SYMNMLEN	8	  /* Number of characters in a symbol name */ | ||||
|  | ||||
| struct external_syment | ||||
| { | ||||
|   union | ||||
|   { | ||||
|     char e_name[E_SYMNMLEN]; | ||||
|     struct | ||||
|     { | ||||
|       char e_zeroes[4]; | ||||
|       char e_offset[4]; | ||||
|     } | ||||
|     e; | ||||
|   } | ||||
|   e; | ||||
|  | ||||
|   char e_value[4]; | ||||
|   char e_scnum[2]; | ||||
|   char e_type[2]; | ||||
|   char e_sclass[1]; | ||||
|   char e_numaux[1]; | ||||
| }; | ||||
|  | ||||
| #define	SYMENT	struct external_syment | ||||
| #define	SYMESZ 	18 | ||||
|  | ||||
| /* Storage class definitions - new classes for global registers:  */ | ||||
| #define C_GLBLREG	19		/* global register */ | ||||
| #define C_EXTREG	20		/* external global register */ | ||||
| #define	C_DEFREG	21		/* ext. def. of global register */ | ||||
|  | ||||
| /* Derived symbol mask/shifts:  */ | ||||
| #define N_BTMASK	(0xf) | ||||
| #define N_BTSHFT	(4) | ||||
| #define N_TMASK		(0x30) | ||||
| #define N_TSHIFT	(2) | ||||
|  | ||||
| /* Auxiliary symbol table entry declaration and related  | ||||
|    definitions.  */ | ||||
| #define E_FILNMLEN  14  /* # characters in a file name	  */ | ||||
| #define E_DIMNUM    4   /* # array dimensions in auxiliary entry */ | ||||
|  | ||||
| union external_auxent | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     char x_tagndx[4];       /* str, un, or enum tag indx */ | ||||
|     union | ||||
|     { | ||||
|       struct | ||||
|       { | ||||
| 	char  x_lnno[2];    /* declaration line number */ | ||||
|         char  x_size[2];    /* str/union/array size */ | ||||
|       } | ||||
|       x_lnsz; | ||||
|  | ||||
|       char x_fsize[4];      /* size of function */ | ||||
|     } | ||||
|     x_misc; | ||||
|  | ||||
|     union | ||||
|     { | ||||
|       struct 		          /* if ISFCN, tag, or .bb */ | ||||
|       { | ||||
| 	char x_lnnoptr[4];  /* ptr to fcn line # */ | ||||
|         char x_endndx[4];   /* entry ndx past block end */ | ||||
|       } | ||||
|       x_fcn; | ||||
|  | ||||
|       struct   	          /* if ISARY, up to 4 dimen. */ | ||||
|       { | ||||
| 	char x_dimen[E_DIMNUM][2]; | ||||
|       } | ||||
|       x_ary; | ||||
|     } | ||||
|     x_fcnary; | ||||
|  | ||||
|     char x_tvndx[2];        /* tv index */ | ||||
|   } | ||||
|   x_sym; | ||||
|  | ||||
|   union | ||||
|   { | ||||
|     char x_fname[E_FILNMLEN]; | ||||
|  | ||||
|     struct | ||||
|     { | ||||
|       char x_zeroes[4]; | ||||
|       char x_offset[4]; | ||||
|     } | ||||
|     x_n; | ||||
|   } | ||||
|   x_file; | ||||
|  | ||||
|   struct | ||||
|   { | ||||
|     char x_scnlen[4];       /* section length */ | ||||
|     char x_nreloc[2];       /* # relocation entries */ | ||||
|     char x_nlinno[2];       /* # line numbers */ | ||||
|   } | ||||
|   x_scn; | ||||
|  | ||||
|   struct | ||||
|   { | ||||
|     char x_tvfill[4];       /* tv fill value */ | ||||
|     char x_tvlen[2];        /* length of .tv */ | ||||
|     char x_tvran[2][2];     /* tv range */ | ||||
|   } | ||||
|   x_tv;                   /* info about .tv section  | ||||
| 			     (in auxent of symbol .tv)) */ | ||||
| }; | ||||
|  | ||||
| #define	AUXENT		union external_auxent | ||||
| #define	AUXESZ		18	 | ||||
		Reference in New Issue
	
	Block a user