summaryrefslogtreecommitdiff
path: root/include/oasys.h
blob: 24426674a735477107d2caf328ef3e5d4570986a (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
/* Oasys object format header file for BFD.

   Copyright (C) 2001-2019 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, 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.

   Contributed by Cygnus Support.  */

#define OASYS_MAX_SEC_COUNT 16
/* **** */

typedef struct oasys_archive_header
  {
    unsigned int  version;
    char create_date[12];
    char revision_date[12];
    unsigned int mod_count;
    file_ptr mod_tbl_offset;
    unsigned int sym_tbl_size;
    unsigned int sym_count;
    file_ptr sym_tbl_offset;
    unsigned int xref_count;
    file_ptr xref_lst_offset;
  }
oasys_archive_header_type;

typedef struct oasys_extarchive_header
  {
    bfd_byte version[4];
    bfd_byte create_date[12];
    bfd_byte revision_date[12];
    bfd_byte mod_count[4];
    bfd_byte mod_tbl_offset[4];
    bfd_byte sym_tbl_size[4];
    bfd_byte sym_count[4];
    bfd_byte sym_tbl_offset[4];
    bfd_byte xref_count[4];
    bfd_byte xref_lst_offset[4];
  }
oasys_extarchive_header_type;

typedef struct oasys_module_table
  {
    int mod_number;
    char mod_date[12];
    unsigned int mod_size;
    unsigned int dep_count;
    unsigned int depee_count;
    file_ptr file_offset;
    unsigned int sect_count;
    char *module_name;
    unsigned int module_name_size;
  }
oasys_module_table_type;

typedef struct oasys_extmodule_table_a
  {
    bfd_byte mod_number[4];
    bfd_byte mod_date[12];
    bfd_byte mod_size[4];
    bfd_byte dep_count[4];
    bfd_byte depee_count[4];
    bfd_byte sect_count[4];
    bfd_byte file_offset[4];
    bfd_byte mod_name[32];
  }
oasys_extmodule_table_type_a_type;

typedef struct oasys_extmodule_table_b
  {
    bfd_byte mod_number[4];
    bfd_byte mod_date[12];
    bfd_byte mod_size[4];
    bfd_byte dep_count[4];
    bfd_byte depee_count[4];
    bfd_byte sect_count[4];
    bfd_byte file_offset[4];
    bfd_byte mod_name_length[4];
  }
oasys_extmodule_table_type_b_type;

typedef enum oasys_record
  {
    oasys_record_is_end_enum = 0,
    oasys_record_is_data_enum = 1,
    oasys_record_is_symbol_enum = 2,
    oasys_record_is_header_enum = 3,
    oasys_record_is_named_section_enum = 4,
    oasys_record_is_com_enum = 5,
    oasys_record_is_debug_enum = 6,
    oasys_record_is_section_enum = 7,
    oasys_record_is_debug_file_enum = 8,
    oasys_record_is_module_enum = 9,
    oasys_record_is_local_enum = 10
  }
oasys_record_enum_type;

typedef struct oasys_record_header
  {
    unsigned char length;
    unsigned char check_sum;
    unsigned char type;
    unsigned char fill;
  }
oasys_record_header_type;

typedef struct oasys_data_record
  {
    oasys_record_header_type header;
    unsigned char relb;
    bfd_byte addr[4];
    /* maximum total size of data record is 255 bytes */
    bfd_byte data[246];
  }
oasys_data_record_type;

typedef struct oasys_header_record
  {
    oasys_record_header_type header;
    unsigned char version_number;
    unsigned char rev_number;
    char module_name[26-6];
    char description[64-26];
  }
oasys_header_record_type;

#define OASYS_VERSION_NUMBER 0
#define OASYS_REV_NUMBER 0

typedef struct oasys_symbol_record
  {
    oasys_record_header_type header;
    unsigned char relb;
    bfd_byte value[4];
    bfd_byte refno[2];
    char name[64];
  }
oasys_symbol_record_type;

#define RELOCATION_PCREL_BIT 0x80
#define RELOCATION_32BIT_BIT 0x40
#define RELOCATION_TYPE_BITS 0x30
#define RELOCATION_TYPE_ABS 0x00
#define RELOCATION_TYPE_REL 0x10
#define RELOCATION_TYPE_UND 0x20
#define RELOCATION_TYPE_COM 0x30
#define RELOCATION_SECT_BITS 0x0f

typedef struct oasys_section_record
  {
    oasys_record_header_type header;
    unsigned char relb;
    bfd_byte value[4];
    bfd_byte vma[4];
    bfd_byte fill[3];
  }
oasys_section_record_type;

typedef struct oasys_end_record
  {
    oasys_record_header_type header;
    unsigned char relb;
    bfd_byte entry[4];
    bfd_byte fill[2];
    bfd_byte zero;
  }
oasys_end_record_type;

typedef union oasys_record_union
  {
    oasys_record_header_type header;
    oasys_data_record_type data;
    oasys_section_record_type section;
    oasys_symbol_record_type symbol;
    oasys_header_record_type first;
    oasys_end_record_type end;
    bfd_byte pad[256];
  }
oasys_record_union_type;