1 /* IBM RS/6000 "XCOFF" file definitions for BFD.
2    Copyright (C) 1990-2021 Free Software Foundation, Inc.
3    Written by Mimi Phuong-Thao Vo of IBM
4    and John Gilmore of Cygnus Support.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 /********************** FILE HEADER **********************/
22 
23 struct external_filehdr {
24 	char f_magic[2];	/* magic number			*/
25 	char f_nscns[2];	/* number of sections		*/
26 	char f_timdat[4];	/* time & date stamp		*/
27 	char f_symptr[4];	/* file pointer to symtab	*/
28 	char f_nsyms[4];	/* number of symtab entries	*/
29 	char f_opthdr[2];	/* sizeof(optional hdr)		*/
30 	char f_flags[2];	/* flags			*/
31 };
32 
33         /* IBM RS/6000 */
34 #define U802WRMAGIC     0730    /* writeable text segments **chh**      */
35 #define U802ROMAGIC     0735    /* readonly sharable text segments      */
36 #define U802TOCMAGIC    0737    /* readonly text segments and TOC       */
37 
38 #define BADMAG(x)	\
39 	((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
40 	 (x).f_magic != U802TOCMAGIC)
41 
42 #define	FILHDR	struct external_filehdr
43 #define	FILHSZ	20
44 
45 
46 /********************** AOUT "OPTIONAL HEADER" **********************/
47 
48 
49 typedef struct
50 {
51   unsigned char magic[2];		/* type of file			*/
52   unsigned char vstamp[2];		/* version stamp		*/
53   unsigned char tsize[4];		/* text size in bytes, padded to FW bdry */
54   unsigned char dsize[4];		/* initialized data "	 "	*/
55   unsigned char bsize[4];		/* uninitialized data "	  "	*/
56   unsigned char entry[4];		/* entry pt.			*/
57   unsigned char text_start[4];		/* base of text used for this file */
58   unsigned char data_start[4];		/* base of data used for this file */
59   unsigned char o_toc[4];		/* address of TOC */
60   unsigned char o_snentry[2];		/* section number of entry point */
61   unsigned char o_sntext[2];		/* section number of .text section */
62   unsigned char o_sndata[2];		/* section number of .data section */
63   unsigned char o_sntoc[2];		/* section number of TOC */
64   unsigned char o_snloader[2];		/* section number of .loader section */
65   unsigned char o_snbss[2];		/* section number of .bss section */
66   unsigned char o_algntext[2];		/* .text alignment */
67   unsigned char o_algndata[2];		/* .data alignment */
68   unsigned char o_modtype[2];		/* module type (??) */
69   unsigned char o_cputype[2];		/* cpu type */
70   unsigned char o_maxstack[4];		/* max stack size (??) */
71   unsigned char o_maxdata[4];		/* max data size (??) */
72   unsigned char o_debugger[4];		/* reserved */
73   unsigned char o_textpsize[1]; 	/* text page size */
74   unsigned char o_datapsize[1]; 	/* data page size */
75   unsigned char o_stackpsize[1];	/* stack page size */
76   unsigned char o_flags[1];		/* Flags and TLS alignment */
77   unsigned char o_sntdata[2];		/* section number of .tdata section */
78   unsigned char o_sntbss[2];		/* section number of .tbss section */
79 }
80 AOUTHDR;
81 
82 #define AOUTSZ 72
83 #define SMALL_AOUTSZ (28)
84 #define AOUTHDRSZ 72
85 
86 /********************** SECTION HEADER **********************/
87 
88 
89 struct external_scnhdr {
90 	char		s_name[8];	/* section name			*/
91 	char		s_paddr[4];	/* physical address, aliased s_nlib */
92 	char		s_vaddr[4];	/* virtual address		*/
93 	char		s_size[4];	/* section size			*/
94 	char		s_scnptr[4];	/* file ptr to raw data for section */
95 	char		s_relptr[4];	/* file ptr to relocation	*/
96 	char		s_lnnoptr[4];	/* file ptr to line numbers	*/
97 	char		s_nreloc[2];	/* number of relocation entries	*/
98 	char		s_nlnno[2];	/* number of line number entries*/
99 	char		s_flags[4];	/* flags			*/
100 };
101 
102 #define	SCNHDR	struct external_scnhdr
103 #define	SCNHSZ	40
104 
105 /********************** LINE NUMBERS **********************/
106 
107 /* 1 line number entry for every "breakpointable" source line in a section.
108  * Line numbers are grouped on a per function basis; first entry in a function
109  * grouping will have l_lnno = 0 and in place of physical address will be the
110  * symbol table index of the function name.
111  */
112 struct external_lineno {
113 	union {
114 		char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
115 		char l_paddr[4];	/* (physical) address of line number	*/
116 	} l_addr;
117 	char l_lnno[2];	/* line number		*/
118 };
119 
120 
121 #define	LINENO	struct external_lineno
122 #define	LINESZ	6
123 
124 
125 /********************** SYMBOLS **********************/
126 
127 #define E_SYMNMLEN	8	/* # characters in a symbol name	*/
128 #define E_FILNMLEN	14	/* # characters in a file name		*/
129 #define E_DIMNUM	4	/* # array dimensions in auxiliary entry */
130 
131 struct external_syment
132 {
133   union {
134     char e_name[E_SYMNMLEN];
135     struct {
136       char e_zeroes[4];
137       char e_offset[4];
138     } e;
139   } e;
140   char e_value[4];
141   char e_scnum[2];
142   char e_type[2];
143   char e_sclass[1];
144   char e_numaux[1];
145 };
146 
147 
148 
149 #define N_BTMASK	(017)
150 #define N_TMASK		(060)
151 #define N_BTSHFT	(4)
152 #define N_TSHIFT	(2)
153 
154 
155 union external_auxent {
156   struct {
157     char x_pad1[2];
158     char x_lnno[4]; 	/* Source line number */
159     char x_pad[12];
160   } x_sym;
161 
162   struct {
163     char x_exptr[4];
164     char x_fsize[4];
165     char x_lnnoptr[4];
166     char x_endndx[4];
167     char x_pad[1];
168   } x_fcn;
169 
170   struct {
171     union {
172       char x_fname[E_FILNMLEN];
173       struct {
174 	char x_zeroes[4];
175 	char x_offset[4];
176       } x_n;
177     } x_n;
178     char x_ftype[1];
179   } x_file;
180 
181   struct {
182     char x_scnlen[4];	/* section length */
183     char x_nreloc[2];	/* # relocation entries */
184     char x_nlinno[2];	/* # line numbers */
185     char x_pad[10];
186   } x_scn;
187 
188   struct {
189     char x_scnlen[4];
190     char x_parmhash[4];
191     char x_snhash[2];
192     char x_smtyp[1];
193     char x_smclas[1];
194     char x_stab[4];
195     char x_snstab[2];
196   } x_csect;
197 
198   struct {
199     char x_scnlen[4];
200     char x_pad1[4];
201     char x_nreloc[4];
202     char x_pad2[6];
203   } x_sect;
204 
205 };
206 
207 #define	SYMENT	struct external_syment
208 #define	SYMESZ	18
209 #define	AUXENT	union external_auxent
210 #define	AUXESZ	18
211 #define DBXMASK 0x80		/* for dbx storage mask */
212 #define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
213 
214 
215 
216 /********************** RELOCATION DIRECTIVES **********************/
217 
218 
219 struct external_reloc {
220   char r_vaddr[4];
221   char r_symndx[4];
222   char r_size[1];
223   char r_type[1];
224 };
225 
226 
227 #define RELOC struct external_reloc
228 #define RELSZ 10
229 
230 #define DEFAULT_DATA_SECTION_ALIGNMENT 4
231 #define DEFAULT_BSS_SECTION_ALIGNMENT 4
232 #define DEFAULT_TEXT_SECTION_ALIGNMENT 4
233 /* For new sections we havn't heard of before */
234 #define DEFAULT_SECTION_ALIGNMENT 4
235 
236 /* The ldhdr structure.  This appears at the start of the .loader
237    section.  */
238 
239 struct external_ldhdr
240 {
241   bfd_byte l_version[4];
242   bfd_byte l_nsyms[4];
243   bfd_byte l_nreloc[4];
244   bfd_byte l_istlen[4];
245   bfd_byte l_nimpid[4];
246   bfd_byte l_impoff[4];
247   bfd_byte l_stlen[4];
248   bfd_byte l_stoff[4];
249 };
250 
251 #define LDHDRSZ (8 * 4)
252 
253 struct external_ldsym
254 {
255   union
256     {
257       bfd_byte _l_name[E_SYMNMLEN];
258       struct
259 	{
260 	  bfd_byte _l_zeroes[4];
261 	  bfd_byte _l_offset[4];
262 	} _l_l;
263     } _l;
264   bfd_byte l_value[4];
265   bfd_byte l_scnum[2];
266   bfd_byte l_smtype[1];
267   bfd_byte l_smclas[1];
268   bfd_byte l_ifile[4];
269   bfd_byte l_parm[4];
270 };
271 
272 #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
273 
274 struct external_ldrel
275 {
276   bfd_byte l_vaddr[4];
277   bfd_byte l_symndx[4];
278   bfd_byte l_rtype[2];
279   bfd_byte l_rsecnm[2];
280 };
281 
282 #define LDRELSZ (2 * 4 + 2 * 2)
283 
284 struct external_exceptab
285 {
286   union {
287     bfd_byte e_symndx[4];
288     bfd_byte e_paddr[4];
289   } e_addr;
290   bfd_byte e_lang[1];
291   bfd_byte e_reason[1];
292 };
293 
294 #define EXCEPTSZ (4 + 2)
295 
296 /******************** Core files *************************/
297 
298 struct external_core_dumpx
299 {
300   unsigned char c_signo[1];
301   unsigned char c_flag[1];
302   unsigned char c_entries[2];
303 
304   unsigned char c_version[4];
305 
306   unsigned char c_fdsinfox[8];
307   unsigned char c_loader[8];
308   unsigned char c_lsize[8];
309 
310   unsigned char c_n_thr[4];
311   unsigned char c_reserved0[4];
312   unsigned char c_thr[8];
313 
314   unsigned char c_segs[8];
315   unsigned char c_segregion[8];
316 
317   unsigned char c_stack[8];
318   unsigned char c_stackorg[8];
319   unsigned char c_size[8];
320 
321   unsigned char c_data[8];
322   unsigned char c_dataorg[8];
323   unsigned char c_datasize[8];
324   unsigned char c_sdorg[8];
325   unsigned char c_sdsize[8];
326 
327   unsigned char c_vmmregions[8];
328   unsigned char c_vmm[8];
329 
330   unsigned char c_impl[4];
331   unsigned char c_pad[4];
332   unsigned char c_cprs[8];
333   unsigned char c_reserved[7 * 8];
334 
335   /* Followed by:
336      - context of the faulting thread.
337      - user structure.  */
338 };
339 
340 
341 /* Core file verion.  */
342 #define CORE_DUMPX_VERSION 0x0feeddb1
343 #define CORE_DUMPXX_VERSION 0x0feeddb2
344 
345 struct external_ld_info32
346 {
347   unsigned char ldinfo_next[4];
348   unsigned char core_offset[4];
349   unsigned char ldinfo_textorg[4];
350   unsigned char ldinfo_textsize[4];
351   unsigned char ldinfo_dataorg[4];
352   unsigned char ldinfo_datasize[4];
353   unsigned char ldinfo_filename[2];
354 };
355