159477Swpaul/* ECOFF support on Alpha machines. 259477Swpaul coff/ecoff.h must be included before this file. 359477Swpaul 459477Swpaul Copyright (C) 2001-2022 Free Software Foundation, Inc. 559477Swpaul 659477Swpaul This program is free software; you can redistribute it and/or modify 759477Swpaul it under the terms of the GNU General Public License as published by 859477Swpaul the Free Software Foundation; either version 3 of the License, or 959477Swpaul (at your option) any later version. 1059477Swpaul 1159477Swpaul This program is distributed in the hope that it will be useful, 1259477Swpaul but WITHOUT ANY WARRANTY; without even the implied warranty of 1359477Swpaul MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1459477Swpaul GNU General Public License for more details. 1559477Swpaul 1659477Swpaul You should have received a copy of the GNU General Public License 1759477Swpaul along with this program; if not, write to the Free Software 1859477Swpaul Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 1959477Swpaul MA 02110-1301, USA. */ 2059477Swpaul 2159477Swpaul/********************** FILE HEADER **********************/ 2259477Swpaul 2359477Swpaulstruct external_filehdr 2459477Swpaul{ 2559477Swpaul unsigned char f_magic[2]; /* magic number */ 2659477Swpaul unsigned char f_nscns[2]; /* number of sections */ 2759477Swpaul unsigned char f_timdat[4]; /* time & date stamp */ 2859477Swpaul unsigned char f_symptr[8]; /* file pointer to symtab */ 2959477Swpaul unsigned char f_nsyms[4]; /* number of symtab entries */ 3059477Swpaul unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ 3159477Swpaul unsigned char f_flags[2]; /* flags */ 3259477Swpaul}; 3359477Swpaul 3459477Swpaul/* Magic numbers are defined in coff/ecoff.h. */ 3559477Swpaul#define ALPHA_ECOFF_BADMAG(x) \ 3659477Swpaul ((x).f_magic != ALPHA_MAGIC && (x).f_magic != ALPHA_MAGIC_BSD) 3759477Swpaul 3859477Swpaul#define ALPHA_ECOFF_COMPRESSEDMAG(x) \ 3959477Swpaul ((x).f_magic == ALPHA_MAGIC_COMPRESSED) 4059477Swpaul 4159477Swpaul/* The object type is encoded in the f_flags. */ 4259477Swpaul#define F_ALPHA_OBJECT_TYPE_MASK 0x3000 4359477Swpaul#define F_ALPHA_NO_SHARED 0x1000 4459477Swpaul#define F_ALPHA_SHARABLE 0x2000 4559477Swpaul#define F_ALPHA_CALL_SHARED 0x3000 4659477Swpaul 4783029Swpaul#define FILHDR struct external_filehdr 4859477Swpaul#define FILHSZ 24 4959477Swpaul 5059477Swpaul/********************** AOUT "OPTIONAL HEADER" **********************/ 5159477Swpaul 5259477Swpaultypedef struct external_aouthdr 5359477Swpaul{ 5459477Swpaul unsigned char magic[2]; /* type of file */ 5559477Swpaul unsigned char vstamp[2]; /* version stamp */ 5659477Swpaul unsigned char bldrev[2]; /* ?? */ 5759477Swpaul unsigned char padding[2]; /* pad to quadword boundary */ 5859477Swpaul unsigned char tsize[8]; /* text size in bytes */ 5959477Swpaul unsigned char dsize[8]; /* initialized data " " */ 6059477Swpaul unsigned char bsize[8]; /* uninitialized data " " */ 6159477Swpaul unsigned char entry[8]; /* entry pt. */ 6259477Swpaul unsigned char text_start[8]; /* base of text used for this file */ 6359477Swpaul unsigned char data_start[8]; /* base of data used for this file */ 6459477Swpaul unsigned char bss_start[8]; /* base of bss used for this file */ 6592739Salfred unsigned char gprmask[4]; /* bitmask of general registers used */ 6692739Salfred unsigned char fprmask[4]; /* bitmask of floating point registers used */ 6792739Salfred unsigned char gp_value[8]; /* value for gp register */ 6859477Swpaul} AOUTHDR; 6959477Swpaul 7059477Swpaul/* compute size of a header */ 7159477Swpaul 7259477Swpaul#define AOUTSZ 80 7359477Swpaul#define AOUTHDRSZ 80 7459477Swpaul 7559477Swpaul/********************** SECTION HEADER **********************/ 7659477Swpaul 7759477Swpaulstruct external_scnhdr 7859477Swpaul{ 7959477Swpaul unsigned char s_name[8]; /* section name */ 8059477Swpaul unsigned char s_paddr[8]; /* physical address, aliased s_nlib */ 8159477Swpaul unsigned char s_vaddr[8]; /* virtual address */ 8259477Swpaul unsigned char s_size[8]; /* section size */ 8359477Swpaul unsigned char s_scnptr[8]; /* file ptr to raw data for section */ 8459477Swpaul unsigned char s_relptr[8]; /* file ptr to relocation */ 8559477Swpaul unsigned char s_lnnoptr[8]; /* file ptr to line numbers */ 8659477Swpaul unsigned char s_nreloc[2]; /* number of relocation entries */ 8759477Swpaul unsigned char s_nlnno[2]; /* number of line number entries*/ 8884145Sjlemon unsigned char s_flags[4]; /* flags */ 8984145Sjlemon}; 9092739Salfred 9192739Salfred#define SCNHDR struct external_scnhdr 9259477Swpaul#define SCNHSZ 64 9359477Swpaul 9459477Swpaul/********************** RELOCATION DIRECTIVES **********************/ 9559477Swpaul 9659477Swpaulstruct external_reloc 9759477Swpaul{ 9859477Swpaul unsigned char r_vaddr[8]; 9959477Swpaul unsigned char r_symndx[4]; 10083029Swpaul unsigned char r_bits[4]; 10183029Swpaul}; 10283029Swpaul 10383029Swpaul#define RELOC struct external_reloc 10483029Swpaul#define RELSZ 16 10559477Swpaul 10683029Swpaul/* Constants to unpack the r_bits field. The Alpha seems to always be 10783029Swpaul little endian, so I haven't bothered to define big endian variants 10883029Swpaul of these. */ 10983029Swpaul 11083029Swpaul#define RELOC_BITS0_TYPE_LITTLE 0xff 11159477Swpaul#define RELOC_BITS0_TYPE_SH_LITTLE 0 11283029Swpaul 11383029Swpaul#define RELOC_BITS1_EXTERN_LITTLE 0x01 11483029Swpaul 11583029Swpaul#define RELOC_BITS1_OFFSET_LITTLE 0x7e 11683029Swpaul#define RELOC_BITS1_OFFSET_SH_LITTLE 1 11783029Swpaul 11892931Swpaul#define RELOC_BITS1_RESERVED_LITTLE 0x80 11992931Swpaul#define RELOC_BITS1_RESERVED_SH_LITTLE 7 12092931Swpaul#define RELOC_BITS2_RESERVED_LITTLE 0xff 12192931Swpaul#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE 1 12292931Swpaul#define RELOC_BITS3_RESERVED_LITTLE 0x03 12392931Swpaul#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE 9 12483029Swpaul 12559477Swpaul#define RELOC_BITS3_SIZE_LITTLE 0xfc 12659477Swpaul#define RELOC_BITS3_SIZE_SH_LITTLE 2 12759477Swpaul 12859477Swpaul/* The r_type field in a reloc is one of the following values. */ 12959477Swpaul#define ALPHA_R_IGNORE 0 13059477Swpaul#define ALPHA_R_REFLONG 1 13159477Swpaul#define ALPHA_R_REFQUAD 2 13259477Swpaul#define ALPHA_R_GPREL32 3 13359477Swpaul#define ALPHA_R_LITERAL 4 13459477Swpaul#define ALPHA_R_LITUSE 5 13559477Swpaul#define ALPHA_R_GPDISP 6 13659477Swpaul#define ALPHA_R_BRADDR 7 13759477Swpaul#define ALPHA_R_HINT 8 13859477Swpaul#define ALPHA_R_SREL16 9 13959477Swpaul#define ALPHA_R_SREL32 10 14059477Swpaul#define ALPHA_R_SREL64 11 14159477Swpaul#define ALPHA_R_OP_PUSH 12 14259477Swpaul#define ALPHA_R_OP_STORE 13 14359477Swpaul#define ALPHA_R_OP_PSUB 14 14459477Swpaul#define ALPHA_R_OP_PRSHIFT 15 14559477Swpaul#define ALPHA_R_GPVALUE 16 14659477Swpaul#define ALPHA_R_GPRELHIGH 17 14759477Swpaul#define ALPHA_R_GPRELLOW 18 14859477Swpaul#define ALPHA_R_IMMED 19 14959477Swpaul 15059477Swpaul/* Overloaded reloc value used by Net- and OpenBSD. */ 15159477Swpaul#define ALPHA_R_LITERALSLEAZY 17 15259477Swpaul 15359477Swpaul/* With ALPHA_R_LITUSE, the r_size field is one of the following values. */ 15459477Swpaul#define ALPHA_R_LU_BASE 1 15559477Swpaul#define ALPHA_R_LU_BYTOFF 2 15659477Swpaul#define ALPHA_R_LU_JSR 3 15759477Swpaul 15859477Swpaul/* With ALPHA_R_IMMED, the r_size field is one of the following values. */ 15959477Swpaul#define ALPHA_R_IMMED_GP_16 1 16059477Swpaul#define ALPHA_R_IMMED_GP_HI32 2 16183029Swpaul#define ALPHA_R_IMMED_SCN_HI32 3 16295667Sphk#define ALPHA_R_IMMED_BR_HI32 4 16395667Sphk#define ALPHA_R_IMMED_LO32 5 16459477Swpaul 16595667Sphk/********************** SYMBOLIC INFORMATION **********************/ 16659477Swpaul 16759477Swpaul/* Written by John Gilmore. */ 16883029Swpaul 16959477Swpaul/* ECOFF uses COFF-like section structures, but its own symbol format. 17059477Swpaul This file defines the symbol format in fields whose size and alignment 17159477Swpaul will not vary on different host systems. */ 17259477Swpaul 17359477Swpaul/* File header as a set of bytes */ 17459477Swpaul 17559477Swpaulstruct hdr_ext 17659477Swpaul{ 17759477Swpaul unsigned char h_magic[2]; 17859477Swpaul unsigned char h_vstamp[2]; 17959477Swpaul unsigned char h_ilineMax[4]; 18059477Swpaul unsigned char h_idnMax[4]; 18159477Swpaul unsigned char h_ipdMax[4]; 18259477Swpaul unsigned char h_isymMax[4]; 18359477Swpaul unsigned char h_ioptMax[4]; 18459477Swpaul unsigned char h_iauxMax[4]; 18559477Swpaul unsigned char h_issMax[4]; 18659477Swpaul unsigned char h_issExtMax[4]; 18759477Swpaul unsigned char h_ifdMax[4]; 18859477Swpaul unsigned char h_crfd[4]; 18959477Swpaul unsigned char h_iextMax[4]; 19069925Swpaul unsigned char h_cbLine[8]; 19169925Swpaul unsigned char h_cbLineOffset[8]; 19283029Swpaul unsigned char h_cbDnOffset[8]; 19359477Swpaul unsigned char h_cbPdOffset[8]; 19459477Swpaul unsigned char h_cbSymOffset[8]; 19559477Swpaul unsigned char h_cbOptOffset[8]; 19659477Swpaul unsigned char h_cbAuxOffset[8]; 19759477Swpaul unsigned char h_cbSsOffset[8]; 19884145Sjlemon unsigned char h_cbSsExtOffset[8]; 19984145Sjlemon unsigned char h_cbFdOffset[8]; 20059477Swpaul unsigned char h_cbRfdOffset[8]; 20159477Swpaul unsigned char h_cbExtOffset[8]; 20259477Swpaul}; 20359477Swpaul 20459477Swpaul/* File descriptor external record */ 20559477Swpaul 20683029Swpaulstruct fdr_ext 20759477Swpaul{ 20859477Swpaul unsigned char f_adr[8]; 20959477Swpaul unsigned char f_cbLineOffset[8]; 21059477Swpaul unsigned char f_cbLine[8]; 21159477Swpaul unsigned char f_cbSs[8]; 21259477Swpaul unsigned char f_rss[4]; 21359477Swpaul unsigned char f_issBase[4]; 21459477Swpaul unsigned char f_isymBase[4]; 21559477Swpaul unsigned char f_csym[4]; 21659477Swpaul unsigned char f_ilineBase[4]; 21759477Swpaul unsigned char f_cline[4]; 21859477Swpaul unsigned char f_ioptBase[4]; 21959477Swpaul unsigned char f_copt[4]; 22059477Swpaul unsigned char f_ipdFirst[4]; 22159477Swpaul unsigned char f_cpd[4]; 22259477Swpaul unsigned char f_iauxBase[4]; 22359477Swpaul unsigned char f_caux[4]; 22459477Swpaul unsigned char f_rfdBase[4]; 22559477Swpaul unsigned char f_crfd[4]; 22659477Swpaul unsigned char f_bits1[1]; 22759477Swpaul unsigned char f_bits2[3]; 22859477Swpaul unsigned char f_padding[4]; 22959477Swpaul}; 23059477Swpaul 23159477Swpaul#define FDR_BITS1_LANG_BIG 0xF8 23259477Swpaul#define FDR_BITS1_LANG_SH_BIG 3 23359477Swpaul#define FDR_BITS1_LANG_LITTLE 0x1F 23459477Swpaul#define FDR_BITS1_LANG_SH_LITTLE 0 23559477Swpaul 23659477Swpaul#define FDR_BITS1_FMERGE_BIG 0x04 23759477Swpaul#define FDR_BITS1_FMERGE_LITTLE 0x20 23859477Swpaul 23959477Swpaul#define FDR_BITS1_FREADIN_BIG 0x02 24059477Swpaul#define FDR_BITS1_FREADIN_LITTLE 0x40 24159477Swpaul 24259477Swpaul#define FDR_BITS1_FBIGENDIAN_BIG 0x01 24359477Swpaul#define FDR_BITS1_FBIGENDIAN_LITTLE 0x80 24459477Swpaul 24559477Swpaul#define FDR_BITS2_GLEVEL_BIG 0xC0 24659477Swpaul#define FDR_BITS2_GLEVEL_SH_BIG 6 24759477Swpaul#define FDR_BITS2_GLEVEL_LITTLE 0x03 24859477Swpaul#define FDR_BITS2_GLEVEL_SH_LITTLE 0 24959477Swpaul 25059477Swpaul/* We ignore the `reserved' field in bits2. */ 25159477Swpaul 25283029Swpaul/* Procedure descriptor external record */ 25383029Swpaul 25483029Swpaulstruct pdr_ext { 25583029Swpaul unsigned char p_adr[8]; 25683029Swpaul unsigned char p_cbLineOffset[8]; 25783029Swpaul unsigned char p_isym[4]; 25883029Swpaul unsigned char p_iline[4]; 25983029Swpaul unsigned char p_regmask[4]; 26059477Swpaul unsigned char p_regoffset[4]; 26159477Swpaul unsigned char p_iopt[4]; 26283029Swpaul unsigned char p_fregmask[4]; 26359477Swpaul unsigned char p_fregoffset[4]; 26483029Swpaul unsigned char p_frameoffset[4]; 26559477Swpaul unsigned char p_lnLow[4]; 26659477Swpaul unsigned char p_lnHigh[4]; 26759477Swpaul unsigned char p_gp_prologue[1]; 26883029Swpaul unsigned char p_bits1[1]; 26983029Swpaul unsigned char p_bits2[1]; 27083029Swpaul unsigned char p_localoff[1]; 27159477Swpaul unsigned char p_framereg[2]; 27259477Swpaul unsigned char p_pcreg[2]; 27359477Swpaul}; 27459477Swpaul 27559477Swpaul#define PDR_BITS1_GP_USED_BIG 0x80 27659477Swpaul#define PDR_BITS1_REG_FRAME_BIG 0x40 27759477Swpaul#define PDR_BITS1_PROF_BIG 0x20 27859477Swpaul#define PDR_BITS1_RESERVED_BIG 0x1f 27959477Swpaul#define PDR_BITS1_RESERVED_SH_LEFT_BIG 8 28059477Swpaul#define PDR_BITS2_RESERVED_BIG 0xff 28159477Swpaul#define PDR_BITS2_RESERVED_SH_BIG 0 28259477Swpaul 28359477Swpaul#define PDR_BITS1_GP_USED_LITTLE 0x01 28459477Swpaul#define PDR_BITS1_REG_FRAME_LITTLE 0x02 28559477Swpaul#define PDR_BITS1_PROF_LITTLE 0x04 28659477Swpaul#define PDR_BITS1_RESERVED_LITTLE 0xf8 28783597Swpaul#define PDR_BITS1_RESERVED_SH_LITTLE 3 28883597Swpaul#define PDR_BITS2_RESERVED_LITTLE 0xff 28983597Swpaul#define PDR_BITS2_RESERVED_SH_LEFT_LITTLE 5 29083597Swpaul 29183597Swpaul/* Line numbers */ 29259477Swpaul 29359477Swpaulstruct line_ext { 29459477Swpaul unsigned char l_line[4]; 29559477Swpaul}; 29659477Swpaul 29759477Swpaul/* Symbol external record */ 29859477Swpaul 29959477Swpaulstruct sym_ext { 30059477Swpaul unsigned char s_value[8]; 30159477Swpaul unsigned char s_iss[4]; 30259477Swpaul unsigned char s_bits1[1]; 30359477Swpaul unsigned char s_bits2[1]; 30459477Swpaul unsigned char s_bits3[1]; 30559477Swpaul unsigned char s_bits4[1]; 30659477Swpaul}; 30759477Swpaul 30859477Swpaul#define SYM_BITS1_ST_BIG 0xFC 30959477Swpaul#define SYM_BITS1_ST_SH_BIG 2 31059477Swpaul#define SYM_BITS1_ST_LITTLE 0x3F 31159477Swpaul#define SYM_BITS1_ST_SH_LITTLE 0 31284145Sjlemon 31359477Swpaul#define SYM_BITS1_SC_BIG 0x03 31484145Sjlemon#define SYM_BITS1_SC_SH_LEFT_BIG 3 31584145Sjlemon#define SYM_BITS1_SC_LITTLE 0xC0 31659477Swpaul#define SYM_BITS1_SC_SH_LITTLE 6 31759477Swpaul 31859477Swpaul#define SYM_BITS2_SC_BIG 0xE0 31959477Swpaul#define SYM_BITS2_SC_SH_BIG 5 32059477Swpaul#define SYM_BITS2_SC_LITTLE 0x07 32159477Swpaul#define SYM_BITS2_SC_SH_LEFT_LITTLE 2 32259477Swpaul 32359477Swpaul#define SYM_BITS2_RESERVED_BIG 0x10 32459477Swpaul#define SYM_BITS2_RESERVED_LITTLE 0x08 32559477Swpaul 32684145Sjlemon#define SYM_BITS2_INDEX_BIG 0x0F 32784145Sjlemon#define SYM_BITS2_INDEX_SH_LEFT_BIG 16 32884145Sjlemon#define SYM_BITS2_INDEX_LITTLE 0xF0 32984145Sjlemon#define SYM_BITS2_INDEX_SH_LITTLE 4 33084145Sjlemon 33184145Sjlemon#define SYM_BITS3_INDEX_SH_LEFT_BIG 8 33284145Sjlemon#define SYM_BITS3_INDEX_SH_LEFT_LITTLE 4 33359477Swpaul 33459477Swpaul#define SYM_BITS4_INDEX_SH_LEFT_BIG 0 33584145Sjlemon#define SYM_BITS4_INDEX_SH_LEFT_LITTLE 12 33659477Swpaul 33759477Swpaul/* External symbol external record */ 33859477Swpaul 33959477Swpaulstruct ext_ext { 34059477Swpaul struct sym_ext es_asym; 34159477Swpaul unsigned char es_bits1[1]; 34259477Swpaul unsigned char es_bits2[3]; 34384145Sjlemon unsigned char es_ifd[4]; 34459477Swpaul}; 34559477Swpaul 34659477Swpaul#define EXT_BITS1_JMPTBL_BIG 0x80 34784145Sjlemon#define EXT_BITS1_JMPTBL_LITTLE 0x01 34859477Swpaul 34959477Swpaul#define EXT_BITS1_COBOL_MAIN_BIG 0x40 35059477Swpaul#define EXT_BITS1_COBOL_MAIN_LITTLE 0x02 35159477Swpaul 35283029Swpaul#define EXT_BITS1_WEAKEXT_BIG 0x20 35383029Swpaul#define EXT_BITS1_WEAKEXT_LITTLE 0x04 35459477Swpaul 35559477Swpaul/* Dense numbers external record */ 35659477Swpaul 35759477Swpaulstruct dnr_ext { 35859477Swpaul unsigned char d_rfd[4]; 35959477Swpaul unsigned char d_index[4]; 36059477Swpaul}; 36159477Swpaul 36259477Swpaul/* Relative file descriptor */ 36359477Swpaul 36459477Swpaulstruct rfd_ext { 36559477Swpaul unsigned char rfd[4]; 36659477Swpaul}; 36759477Swpaul 36859477Swpaul/* Optimizer symbol external record */ 36959477Swpaul 37059477Swpaulstruct opt_ext { 37159477Swpaul unsigned char o_bits1[1]; 37259477Swpaul unsigned char o_bits2[1]; 37359477Swpaul unsigned char o_bits3[1]; 37483029Swpaul unsigned char o_bits4[1]; 37583029Swpaul struct rndx_ext o_rndx; 37683029Swpaul unsigned char o_offset[4]; 37783029Swpaul}; 37883029Swpaul 37983029Swpaul#define OPT_BITS2_VALUE_SH_LEFT_BIG 16 38083029Swpaul#define OPT_BITS2_VALUE_SH_LEFT_LITTLE 0 38183029Swpaul 38283029Swpaul#define OPT_BITS3_VALUE_SH_LEFT_BIG 8 38383029Swpaul#define OPT_BITS3_VALUE_SH_LEFT_LITTLE 8 38483029Swpaul 38583029Swpaul#define OPT_BITS4_VALUE_SH_LEFT_BIG 0 38683029Swpaul#define OPT_BITS4_VALUE_SH_LEFT_LITTLE 16 38783029Swpaul