| /* This file is a modified version of 'a.out.h'.  It is to be used in all | 
 |    GNU tools modified to support the i80960 (or tools that operate on | 
 |    object files created by such tools). | 
 |  | 
 |    Copyright (C) 2001-2023 Free Software Foundation, Inc. | 
 |  | 
 |    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 3 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., 51 Franklin Street - Fifth Floor, Boston, | 
 |    MA 02110-1301, USA.  */ | 
 |   | 
 | /* All i80960 development is done in a CROSS-DEVELOPMENT environment.  I.e., | 
 |    object code is generated on, and executed under the direction of a symbolic | 
 |    debugger running on, a host system.  We do not want to be subject to the | 
 |    vagaries of which host it is or whether it supports COFF or a.out format, | 
 |    or anything else.  We DO want to: | 
 |    | 
 |   	o always generate the same format object files, regardless of host. | 
 |   | 
 |  	o have an 'a.out' header that we can modify for our own purposes | 
 |  	  (the 80960 is typically an embedded processor and may require | 
 |  	  enhanced linker support that the normal a.out.h header can't | 
 |  	  accommodate). | 
 |   | 
 |   As for byte-ordering, the following rules apply: | 
 |   | 
 |  	o Text and data that is actually downloaded to the target is always | 
 |  	  in i80960 (little-endian) order. | 
 |   | 
 |  	o All other numbers (in the header, symbols, relocation directives) | 
 |  	  are in host byte-order:  object files CANNOT be lifted from a | 
 |  	  little-end host and used on a big-endian (or vice versa) without | 
 |  	  modification. | 
 |   ==> THIS IS NO LONGER TRUE USING BFD.  WE CAN GENERATE ANY BYTE ORDER | 
 |       FOR THE HEADER, AND READ ANY BYTE ORDER.  PREFERENCE WOULD BE TO | 
 |       USE LITTLE-ENDIAN BYTE ORDER THROUGHOUT, REGARDLESS OF HOST.  <== | 
 |   | 
 |  	o The downloader ('comm960') takes care to generate a pseudo-header | 
 |  	  with correct (i80960) byte-ordering before shipping text and data | 
 |  	  off to the NINDY monitor in the target systems.  Symbols and | 
 |  	  relocation info are never sent to the target.  */ | 
 |  | 
 | #define BMAGIC	0415 | 
 | /* We don't accept the following (see N_BADMAG macro). | 
 |    They're just here so GNU code will compile.  */ | 
 | #define	OMAGIC	0407		/* old impure format */ | 
 | #define	NMAGIC	0410		/* read-only text */ | 
 | #define	ZMAGIC	0413		/* demand load format */ | 
 |  | 
 | /* FILE HEADER | 
 |   	All 'lengths' are given as a number of bytes. | 
 |   	All 'alignments' are for relinkable files only;  an alignment of | 
 |   		'n' indicates the corresponding segment must begin at an | 
 |   		address that is a multiple of (2**n).  */ | 
 | struct external_exec | 
 |   { | 
 |     /* Standard stuff */ | 
 |     unsigned char e_info[4];	/* Identifies this as a b.out file */ | 
 |     unsigned char e_text[4];	/* Length of text */ | 
 |     unsigned char e_data[4];	/* Length of data */ | 
 |     unsigned char e_bss[4];	/* Length of uninitialized data area */ | 
 |     unsigned char e_syms[4];	/* Length of symbol table */ | 
 |     unsigned char e_entry[4];	/* Runtime start address */ | 
 |     unsigned char e_trsize[4];	/* Length of text relocation info */ | 
 |     unsigned char e_drsize[4];	/* Length of data relocation info */ | 
 |  | 
 |     /* Added for i960 */ | 
 |     unsigned char e_tload[4];	/* Text runtime load address */ | 
 |     unsigned char e_dload[4];	/* Data runtime load address */ | 
 |     unsigned char e_talign[1];	/* Alignment of text segment */ | 
 |     unsigned char e_dalign[1];	/* Alignment of data segment */ | 
 |     unsigned char e_balign[1];	/* Alignment of bss segment */ | 
 |     unsigned char e_relaxable[1];/* Assembled with enough info to allow linker to relax */ | 
 |   }; | 
 |  | 
 | #define	EXEC_BYTES_SIZE	(sizeof (struct external_exec)) | 
 |  | 
 | /* These macros use the a_xxx field names, since they operate on the exec | 
 |    structure after it's been byte-swapped and realigned on the host machine.  */ | 
 | #define N_BADMAG(x)	(((x)->a_info)!=BMAGIC) | 
 | #define N_TXTOFF(x)	EXEC_BYTES_SIZE | 
 | #define N_DATOFF(x)	( N_TXTOFF(x) + (x)->a_text ) | 
 | #define N_TROFF(x)	( N_DATOFF(x) + (x)->a_data ) | 
 | #define N_TRELOFF	N_TROFF | 
 | #define N_DROFF(x)	( N_TROFF(x) + (x)->a_trsize ) | 
 | #define N_DRELOFF	N_DROFF | 
 | #define N_SYMOFF(x)	( N_DROFF(x) + (x)->a_drsize ) | 
 | #define N_STROFF(x)	( N_SYMOFF(x) + (x)->a_syms ) | 
 | #define N_DATADDR(x)	( (x)->a_dload ) | 
 |  | 
 | /* Address of text segment in memory after it is loaded.  */ | 
 | #if !defined (N_TXTADDR) | 
 | #define N_TXTADDR(x) 0 | 
 | #endif | 
 |  | 
 | /* A single entry in the symbol table.  */ | 
 | struct nlist | 
 |   { | 
 |     union | 
 |       { | 
 | 	char*          n_name; | 
 | 	struct nlist * n_next; | 
 | 	long	       n_strx;	/* Index into string table	*/ | 
 |       } n_un; | 
 |  | 
 |     unsigned char n_type;	/* See below				*/ | 
 |     char	  n_other;	/* Used in i80960 support -- see below	*/ | 
 |     short	  n_desc; | 
 |     unsigned long n_value; | 
 |   }; | 
 |  | 
 |  | 
 | /* Legal values of n_type.  */ | 
 | #define N_UNDF	0	/* Undefined symbol	*/ | 
 | #define N_ABS	2	/* Absolute symbol	*/ | 
 | #define N_TEXT	4	/* Text symbol		*/ | 
 | #define N_DATA	6	/* Data symbol		*/ | 
 | #define N_BSS	8	/* BSS symbol		*/ | 
 | #define N_FN	31	/* Filename symbol	*/ | 
 |  | 
 | #define N_EXT	1	/* External symbol (OR'd in with one of above)	*/ | 
 | #define N_TYPE	036	/* Mask for all the type bits			*/ | 
 | #define N_STAB	0340	/* Mask for all bits used for SDB entries 	*/ | 
 |  | 
 | /* MEANING OF 'n_other' | 
 |   | 
 |   If non-zero, the 'n_other' fields indicates either a leaf procedure or | 
 |   a system procedure, as follows: | 
 |   | 
 |  	1 <= n_other <= 32 : | 
 |  		The symbol is the entry point to a system procedure. | 
 |  		'n_value' is the address of the entry, as for any other | 
 |  		procedure.  The system procedure number (which can be used in | 
 |  		a 'calls' instruction) is (n_other-1).  These entries come from | 
 |  		'.sysproc' directives. | 
 |   | 
 |  	n_other == N_CALLNAME | 
 |  		the symbol is the 'call' entry point to a leaf procedure. | 
 |  		The *next* symbol in the symbol table must be the corresponding | 
 |  		'bal' entry point to the procedure (see following).  These | 
 |  		entries come from '.leafproc' directives in which two different | 
 |  		symbols are specified (the first one is represented here). | 
 |  	 | 
 |   | 
 |  	n_other == N_BALNAME | 
 |  		the symbol is the 'bal' entry point to a leaf procedure. | 
 |  		These entries result from '.leafproc' directives in which only | 
 |  		one symbol is specified, or in which the same symbol is | 
 |  		specified twice. | 
 |   | 
 |   Note that an N_CALLNAME entry *must* have a corresponding N_BALNAME entry, | 
 |   but not every N_BALNAME entry must have an N_CALLNAME entry.  */ | 
 | #define N_CALLNAME	((char)-1) | 
 | #define N_BALNAME	((char)-2) | 
 | #define IS_CALLNAME(x)	(N_CALLNAME == (x)) | 
 | #define IS_BALNAME(x)	(N_BALNAME == (x)) | 
 | #define IS_OTHER(x)	((x)>0 && (x) <=32) | 
 |  | 
 | #define b_out_relocation_info relocation_info | 
 | struct relocation_info | 
 |   { | 
 |     int	 r_address;	/* File address of item to be relocated.  */ | 
 |     unsigned | 
 | #define r_index r_symbolnum | 
 |     r_symbolnum:24,	/* Index of symbol on which relocation is based, | 
 | 			   if r_extern is set.  Otherwise set to | 
 | 			   either N_TEXT, N_DATA, or N_BSS to | 
 | 			   indicate section on which relocation is | 
 | 			   based.  */ | 
 |       r_pcrel:1,	/* 1 => relocate PC-relative; else absolute | 
 | 			   On i960, pc-relative implies 24-bit | 
 | 			   address, absolute implies 32-bit.  */ | 
 |       r_length:2,	/* Number of bytes to relocate: | 
 | 			   0 => 1 byte | 
 | 			   1 => 2 bytes -- used for 13 bit pcrel | 
 | 			   2 => 4 bytes.  */ | 
 |       r_extern:1, | 
 |       r_bsr:1,		/* Something for the GNU NS32K assembler.  */ | 
 |       r_disp:1,		/* Something for the GNU NS32K assembler.  */ | 
 |       r_callj:1,	/* 1 if relocation target is an i960 'callj'.  */ | 
 |       r_relaxable:1;	/* 1 if enough info is left to relax the data.  */ | 
 | }; |