aboutsummaryrefslogtreecommitdiff
path: root/include/som/aout.h
blob: 0b0787c4613371df544d28260e9075caeceb91f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/* SOM a.out definitions for BFD.
   Copyright (C) 2010-2017 Free Software Foundation, Inc.
   Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore.

   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 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.  */

#ifndef _SOM_AOUT_H
#define _SOM_AOUT_H

#include "clock.h"

/* Note: SOM uses bit-field in its structure.  All you need to know is:
   - CPUs supported by SOM (hppa) are big-endian,
   - the MSB is numbered 0.  */

struct som_external_header
{
  unsigned char system_id[2];
  unsigned char a_magic[2];
  unsigned char version_id[4];
  struct som_external_clock file_time;
  unsigned char entry_space[4];
  unsigned char entry_subspace[4];
  unsigned char entry_offset[4];
  unsigned char aux_header_location[4];
  unsigned char aux_header_size[4];
  unsigned char som_length[4];
  unsigned char presumed_dp[4];
  unsigned char space_location[4];
  unsigned char space_total[4];
  unsigned char subspace_location[4];
  unsigned char subspace_total[4];
  unsigned char loader_fixup_location[4];
  unsigned char loader_fixup_total[4];
  unsigned char space_strings_location[4];
  unsigned char space_strings_size[4];
  unsigned char init_array_location[4];
  unsigned char init_array_total[4];
  unsigned char compiler_location[4];
  unsigned char compiler_total[4];
  unsigned char symbol_location[4];
  unsigned char symbol_total[4];
  unsigned char fixup_request_location[4];
  unsigned char fixup_request_total[4];
  unsigned char symbol_strings_location[4];
  unsigned char symbol_strings_size[4];
  unsigned char unloadable_sp_location[4];
  unsigned char unloadable_sp_size[4];
  unsigned char checksum[4];
};

#define OLD_VERSION_ID 85082112
#define NEW_VERSION_ID 87102412

#define EXECLIBMAGIC	0x0104
#define RELOC_MAGIC	0x0106
#define EXEC_MAGIC	0x0107
#define SHARE_MAGIC	0x0108
#define SHMEM_MAGIC	0x0109
#define DEMAND_MAGIC	0x010b
#define DL_MAGIC	0x010d
#define SHL_MAGIC	0x010e

struct som_external_aux_id
{
  unsigned char flags[4];
  unsigned char length[4];
};

/* Aux id types.  */
#define VERSION_AUX_ID 6
#define COPYRIGHT_AUX_ID 9

/* Aux id flags.  */
#define SOM_AUX_ID_MANDATORY	(1 << 31)
#define SOM_AUX_ID_COPY		(1 << 30)
#define SOM_AUX_ID_APPEND	(1 << 29)
#define SOM_AUX_ID_IGNORE	(1 << 28)
#define SOM_AUX_ID_TYPE_SH	0
#define SOM_AUX_ID_TYPE_MASK	0xffff

struct som_external_string_auxhdr
{
  struct som_external_aux_id header_id;

  /* Length of the string, without the NUL.  */
  unsigned char string_length[4];

  /* The string.  */
};

struct som_external_exec_auxhdr
{
  struct som_external_aux_id som_auxhdr;

  unsigned char exec_tsize[4];
  unsigned char exec_tmem[4];
  unsigned char exec_tfile[4];
  unsigned char exec_dsize[4];
  unsigned char exec_dmem[4];
  unsigned char exec_dfile[4];
  unsigned char exec_bsize[4];
  unsigned char exec_entry[4];
  unsigned char exec_flags[4];
  unsigned char exec_bfill[4];
};

#define AUX_HDR_SIZE sizeof (struct som_external_exec_auxhdr)

struct som_external_space_dictionary_record
{
  unsigned char name[4];
  unsigned char flags[4];
  unsigned char space_number[4];
  unsigned char subspace_index[4];
  unsigned char subspace_quantity[4];
  unsigned char loader_fix_index[4];
  unsigned char loader_fix_quantity[4];
  unsigned char init_pointer_index[4];
  unsigned char init_pointer_quantity[4];
};

#define SOM_SPACE_IS_LOADABLE		(1 << 31)
#define SOM_SPACE_IS_DEFINED		(1 << 30)
#define SOM_SPACE_IS_PRIVATE		(1 << 29)
#define SOM_SPACE_HAS_INTERMEDIATE_CODE (1 << 28)
#define SOM_SPACE_IS_TSPECIFIC		(1 << 27)
#define SOM_SPACE_SORT_KEY_SH		8
#define SOM_SPACE_SORT_KEY_MASK		0xff

struct som_external_subspace_dictionary_record
{
  unsigned char space_index[4];
  unsigned char flags[4];
  unsigned char file_loc_init_value[4];
  unsigned char initialization_length[4];
  unsigned char subspace_start[4];
  unsigned char subspace_length[4];
  unsigned char alignment[4];
  unsigned char name[4];
  unsigned char fixup_request_index[4];
  unsigned char fixup_request_quantity[4];
};

#define SOM_SUBSPACE_ACCESS_CONTROL_BITS_SH	25
#define SOM_SUBSPACE_ACCESS_CONTROL_BITS_MASK	0x7f
#define SOM_SUBSPACE_MEMORY_RESIDENT		(1 << 24)
#define SOM_SUBSPACE_DUP_COMMON			(1 << 23)
#define SOM_SUBSPACE_IS_COMMON			(1 << 22)
#define SOM_SUBSPACE_IS_LOADABLE		(1 << 21)
#define SOM_SUBSPACE_QUADRANT_SH		19
#define SOM_SUBSPACE_QUADRANT_MASK		0x3
#define SOM_SUBSPACE_INITIALLY_FROZEN		(1 << 18)
#define SOM_SUBSPACE_IS_FIRST			(1 << 17)
#define SOM_SUBSPACE_CODE_ONLY			(1 << 16)
#define SOM_SUBSPACE_SORT_KEY_SH		8
#define SOM_SUBSPACE_SORT_KEY_MASK		0xff
#define SOM_SUBSPACE_REPLICATE_INIT		(1 << 7)
#define SOM_SUBSPACE_CONTINUATION		(1 << 6)
#define SOM_SUBSPACE_IS_TSPECIFIC		(1 << 5)
#define SOM_SUBSPACE_IS_COMDAT			(1 << 4)

struct som_external_compilation_unit
{
  unsigned char name[4];
  unsigned char language_name[4];
  unsigned char product_id[4];
  unsigned char version_id[4];
  unsigned char flags[4];
  struct som_external_clock compile_time;
  struct som_external_clock source_time;
};

struct som_external_symbol_dictionary_record
{
  unsigned char flags[4];
  unsigned char name[4];
  unsigned char qualifier_name[4];
  unsigned char info[4];
  unsigned char symbol_value[4];
};

/* Flags fields.  */
#define SOM_SYMBOL_HIDDEN (1 << 31)
#define SOM_SYMBOL_SECONDARY_DEF (1 << 30)
#define SOM_SYMBOL_TYPE_SH 24
#define SOM_SYMBOL_TYPE_MASK 0x3f
#define SOM_SYMBOL_SCOPE_SH 20
#define SOM_SYMBOL_SCOPE_MASK 0xf
#define SOM_SYMBOL_CHECK_LEVEL_SH 17
#define SOM_SYMBOL_CHECK_LEVEL_MASK 0x7
#define SOM_SYMBOL_MUST_QUALIFY (1 << 16)
#define SOM_SYMBOL_INITIALLY_FROZEN (1 << 15)
#define SOM_SYMBOL_MEMORY_RESIDENT (1 << 14)
#define SOM_SYMBOL_IS_COMMON (1 << 13)
#define SOM_SYMBOL_DUP_COMMON (1 << 12)
#define SOM_SYMBOL_XLEAST_SH 10
#define SOM_SYMBOL_XLEAT_MASK 0x3
#define SOM_SYMBOL_ARG_RELOC_SH 0
#define SOM_SYMBOL_ARG_RELOC_MASK 0x3ff

/* Info fields.  */
#define SOM_SYMBOL_HAS_LONG_RETURN (1 << 31)
#define SOM_SYMBOL_NO_RELOCATION (1 << 30)
#define SOM_SYMBOL_IS_COMDAT (1 << 29)
#define SOM_SYMBOL_SYMBOL_INFO_SH 0
#define SOM_SYMBOL_SYMBOL_INFO_MASK 0xffffff

/* Symbol type definition.  */
#define ST_NULL		0
#define ST_ABSOLUTE	1
#define ST_DATA		2
#define ST_CODE		3
#define ST_PRI_PROG	4
#define ST_SEC_PROG	5
#define ST_ENTRY	6
#define ST_STORAGE	7
#define ST_STUB		8
#define ST_MODULE	9
#define ST_SYM_EXT	10
#define ST_ARG_EXT	11
#define ST_MILLICODE	12
#define ST_PLABEL	13
#define ST_OCT_DIS	14
#define ST_MILLI_EXT	15
#define ST_TSTORAGE	16
#define ST_COMDAT	17

/* Symbol scope.  */
#define SS_UNSAT	0
#define SS_EXTERNAL	1
#define SS_LOCAL	2
#define SS_UNIVERSAL	3

#endif /* _SOM_AOUT_H */