1/* IBM RS/6000 "XCOFF" file definitions for BFD.
2   Copyright (C) 1990-2022 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
23struct 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
49typedef 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}
80AOUTHDR;
81
82#define AOUTSZ 72
83#define SMALL_AOUTSZ (28)
84#define AOUTHDRSZ 72
85
86/********************** SECTION HEADER **********************/
87
88
89struct 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 */
112struct 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
131struct 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
155union 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    char x_resv[3];
180  } x_file;
181
182  struct {
183    char x_scnlen[4];	/* section length */
184    char x_nreloc[2];	/* # relocation entries */
185    char x_nlinno[2];	/* # line numbers */
186    char x_pad[10];
187  } x_scn;
188
189  struct {
190    char x_scnlen[4];
191    char x_parmhash[4];
192    char x_snhash[2];
193    char x_smtyp[1];
194    char x_smclas[1];
195    char x_stab[4];
196    char x_snstab[2];
197  } x_csect;
198
199  struct {
200    char x_scnlen[4];
201    char x_pad1[4];
202    char x_nreloc[4];
203    char x_pad2[6];
204  } x_sect;
205
206};
207
208#define	SYMENT	struct external_syment
209#define	SYMESZ	18
210#define	AUXENT	union external_auxent
211#define	AUXESZ	18
212#define DBXMASK 0x80		/* for dbx storage mask */
213#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
214
215
216
217/********************** RELOCATION DIRECTIVES **********************/
218
219
220struct external_reloc {
221  char r_vaddr[4];
222  char r_symndx[4];
223  char r_size[1];
224  char r_type[1];
225};
226
227
228#define RELOC struct external_reloc
229#define RELSZ 10
230
231#define DEFAULT_DATA_SECTION_ALIGNMENT 4
232#define DEFAULT_BSS_SECTION_ALIGNMENT 4
233#define DEFAULT_TEXT_SECTION_ALIGNMENT 4
234/* For new sections we havn't heard of before */
235#define DEFAULT_SECTION_ALIGNMENT 4
236
237/* The ldhdr structure.  This appears at the start of the .loader
238   section.  */
239
240struct external_ldhdr
241{
242  bfd_byte l_version[4];
243  bfd_byte l_nsyms[4];
244  bfd_byte l_nreloc[4];
245  bfd_byte l_istlen[4];
246  bfd_byte l_nimpid[4];
247  bfd_byte l_impoff[4];
248  bfd_byte l_stlen[4];
249  bfd_byte l_stoff[4];
250};
251
252#define LDHDRSZ (8 * 4)
253
254struct external_ldsym
255{
256  union
257    {
258      bfd_byte _l_name[E_SYMNMLEN];
259      struct
260	{
261	  bfd_byte _l_zeroes[4];
262	  bfd_byte _l_offset[4];
263	} _l_l;
264    } _l;
265  bfd_byte l_value[4];
266  bfd_byte l_scnum[2];
267  bfd_byte l_smtype[1];
268  bfd_byte l_smclas[1];
269  bfd_byte l_ifile[4];
270  bfd_byte l_parm[4];
271};
272
273#define LDSYMSZ (8 + 3 * 4 + 2 + 2)
274
275struct external_ldrel
276{
277  bfd_byte l_vaddr[4];
278  bfd_byte l_symndx[4];
279  bfd_byte l_rtype[2];
280  bfd_byte l_rsecnm[2];
281};
282
283#define LDRELSZ (2 * 4 + 2 * 2)
284
285struct external_exceptab
286{
287  union {
288    bfd_byte e_symndx[4];
289    bfd_byte e_paddr[4];
290  } e_addr;
291  bfd_byte e_lang[1];
292  bfd_byte e_reason[1];
293};
294
295#define EXCEPTSZ (4 + 2)
296
297/******************** Core files *************************/
298
299struct external_core_dumpx
300{
301  unsigned char c_signo[1];
302  unsigned char c_flag[1];
303  unsigned char c_entries[2];
304
305  unsigned char c_version[4];
306
307  unsigned char c_fdsinfox[8];
308  unsigned char c_loader[8];
309  unsigned char c_lsize[8];
310
311  unsigned char c_n_thr[4];
312  unsigned char c_reserved0[4];
313  unsigned char c_thr[8];
314
315  unsigned char c_segs[8];
316  unsigned char c_segregion[8];
317
318  unsigned char c_stack[8];
319  unsigned char c_stackorg[8];
320  unsigned char c_size[8];
321
322  unsigned char c_data[8];
323  unsigned char c_dataorg[8];
324  unsigned char c_datasize[8];
325  unsigned char c_sdorg[8];
326  unsigned char c_sdsize[8];
327
328  unsigned char c_vmmregions[8];
329  unsigned char c_vmm[8];
330
331  unsigned char c_impl[4];
332  unsigned char c_pad[4];
333  unsigned char c_cprs[8];
334  unsigned char c_reserved[7 * 8];
335
336  /* Followed by:
337     - context of the faulting thread.
338     - user structure.  */
339};
340
341
342/* Core file verion.  */
343#define CORE_DUMPX_VERSION 0x0feeddb1
344#define CORE_DUMPXX_VERSION 0x0feeddb2
345
346struct external_ld_info32
347{
348  unsigned char ldinfo_next[4];
349  unsigned char core_offset[4];
350  unsigned char ldinfo_textorg[4];
351  unsigned char ldinfo_textsize[4];
352  unsigned char ldinfo_dataorg[4];
353  unsigned char ldinfo_datasize[4];
354  unsigned char ldinfo_filename[2];
355};
356