1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef _DLOAD_INTERNAL_
18#define _DLOAD_INTERNAL_
19
20#include <linux/types.h>
21
22
23
24
25
26
27typedef s32 rvalue;
28
29
30typedef u32 urvalue;
31
32
33
34
35
36#define REASONABLE_SECTION_LIMIT 100
37
38
39#define DLOAD_FILL_BSS 0
40
41
42
43
44
45
46
47
48
49
50#define REORDER_MAP(rawmap) ((rawmap) ^ 0x3030303)
51
52
53
54
55
56#if defined(_BIG_ENDIAN)
57#define HOST_BYTE_ORDER(cookedmap) ((cookedmap) ^ 0x3030303)
58#else
59#define HOST_BYTE_ORDER(cookedmap) (cookedmap)
60#endif
61
62
63
64#if !defined(_BIG_ENDIAN) || TARGET_AU_BITS > 16
65#define TARGET_ORDER(cookedmap) (cookedmap)
66#elif TARGET_AU_BITS > 8
67#define TARGET_ORDER(cookedmap) ((cookedmap) ^ 0x2020202)
68#else
69#define TARGET_ORDER(cookedmap) ((cookedmap) ^ 0x3030303)
70#endif
71
72
73struct my_handle;
74
75
76
77
78struct dbg_mirror_root {
79
80 u32 dbthis;
81 struct my_handle *next;
82 u16 changes;
83 u16 refcount;
84};
85
86struct dbg_mirror_list {
87 u32 dbthis;
88 struct my_handle *next, *prev;
89 struct dbg_mirror_root *root;
90 u16 dbsiz;
91 u32 context;
92};
93
94#define VARIABLE_SIZE 1
95
96
97
98struct my_handle {
99 struct dbg_mirror_list dm;
100
101 u16 secn_count;
102 struct ldr_section_info secns[VARIABLE_SIZE];
103};
104#define MY_HANDLE_SIZE (sizeof(struct my_handle) -\
105 sizeof(struct ldr_section_info))
106
107
108
109
110
111struct local_symbol {
112 s32 value;
113 s32 delta;
114 s16 secnn;
115 s16 sclass;
116};
117
118
119
120
121#define TRAMP_NO_GEN_AVAIL 65535
122#define TRAMP_SYM_PREFIX "__$dbTR__"
123#define TRAMP_SECT_NAME ".dbTR"
124
125#define TRAMP_SYM_PREFIX_LEN 9
126
127#define TRAMP_SYM_HEX_ASCII_LEN 9
128
129#define GET_CONTAINER(ptr, type, field) ((type *)((unsigned long)ptr -\
130 (unsigned long)(&((type *)0)->field)))
131#ifndef FIELD_OFFSET
132#define FIELD_OFFSET(type, field) ((unsigned long)(&((type *)0)->field))
133#endif
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154struct tramp_gen_code_hdr {
155 u32 tramp_code_size;
156 u32 num_relos;
157 u32 relo_offset;
158};
159
160struct tramp_img_pkt {
161 struct tramp_img_pkt *next;
162 u32 base;
163 struct tramp_gen_code_hdr hdr;
164 u8 payload[VARIABLE_SIZE];
165};
166
167struct tramp_img_dup_relo {
168 struct tramp_img_dup_relo *next;
169 struct reloc_record_t relo;
170};
171
172struct tramp_img_dup_pkt {
173 struct tramp_img_dup_pkt *next;
174 s16 secnn;
175 u32 offset;
176 struct image_packet_t img_pkt;
177 struct tramp_img_dup_relo *relo_chain;
178
179
180};
181
182struct tramp_sym {
183 struct tramp_sym *next;
184 u32 index;
185 u32 str_index;
186 struct local_symbol sym_info;
187};
188
189struct tramp_string {
190 struct tramp_string *next;
191 u32 index;
192 char str[VARIABLE_SIZE];
193};
194
195struct tramp_info {
196 u32 tramp_sect_next_addr;
197 struct ldr_section_info sect_info;
198
199 struct tramp_sym *symbol_head;
200 struct tramp_sym *symbol_tail;
201 u32 tramp_sym_next_index;
202 struct local_symbol *final_sym_table;
203
204 struct tramp_string *string_head;
205 struct tramp_string *string_tail;
206 u32 tramp_string_next_index;
207 u32 tramp_string_size;
208 char *final_string_table;
209
210 struct tramp_img_pkt *tramp_pkts;
211 struct tramp_img_dup_pkt *dup_pkts;
212};
213
214
215
216
217enum cinit_mode {
218 CI_COUNT = 0,
219 CI_ADDRESS,
220#if CINIT_ALIGN < CINIT_ADDRESS
221 CI_PARTADDRESS,
222#endif
223 CI_COPY,
224 CI_DONE
225};
226
227
228
229
230
231struct dload_state {
232 struct dynamic_loader_stream *strm;
233 struct dynamic_loader_sym *mysym;
234
235 struct dynamic_loader_allocate *myalloc;
236 struct dynamic_loader_initialize *myio;
237 unsigned myoptions;
238
239 char *str_head;
240#if BITS_PER_AU > BITS_PER_BYTE
241 char *str_temp;
242
243 unsigned temp_len;
244 char *xstrings;
245
246#endif
247
248 unsigned debug_string_size;
249
250 struct doff_scnhdr_t *sect_hdrs;
251 struct ldr_section_info *ldr_sections;
252#if TMS32060
253
254 ldr_addr bss_run_base;
255#endif
256 struct local_symbol *local_symtab;
257
258
259 struct ldr_section_info *image_secn;
260
261 ldr_addr delta_runaddr;
262 ldr_addr image_offset;
263 enum cinit_mode cinit_state;
264 int cinit_count;
265 ldr_addr cinit_addr;
266 s16 cinit_page;
267
268 struct my_handle *myhandle;
269 unsigned dload_errcount;
270
271 unsigned allocated_secn_count;
272#ifndef TARGET_ENDIANNESS
273 int big_e_target;
274#endif
275
276 u32 reorder_map;
277 struct doff_filehdr_t dfile_hdr;
278 struct doff_verify_rec_t verify;
279
280 struct tramp_info tramp;
281
282 int relstkidx;
283
284 rvalue relstk[STATIC_EXPR_STK_SIZE];
285
286};
287
288#ifdef TARGET_ENDIANNESS
289#define TARGET_BIG_ENDIAN TARGET_ENDIANNESS
290#else
291#define TARGET_BIG_ENDIAN (dlthis->big_e_target)
292#endif
293
294
295
296
297extern void dload_error(struct dload_state *dlthis, const char *errtxt, ...);
298extern void dload_syms_error(struct dynamic_loader_sym *syms,
299 const char *errtxt, ...);
300extern void dload_headers(struct dload_state *dlthis);
301extern void dload_strings(struct dload_state *dlthis, bool sec_names_only);
302extern void dload_sections(struct dload_state *dlthis);
303extern void dload_reorder(void *data, int dsiz, u32 map);
304extern u32 dload_checksum(void *data, unsigned siz);
305
306#if HOST_ENDIANNESS
307extern uint32_t dload_reverse_checksum(void *data, unsigned siz);
308#if (TARGET_AU_BITS > 8) && (TARGET_AU_BITS < 32)
309extern uint32_t dload_reverse_checksum16(void *data, unsigned siz);
310#endif
311#endif
312
313
314
315
316extern void dload_relocate(struct dload_state *dlthis, tgt_au_t * data,
317 struct reloc_record_t *rp, bool * tramps_generated,
318 bool second_pass);
319
320extern rvalue dload_unpack(struct dload_state *dlthis, tgt_au_t * data,
321 int fieldsz, int offset, unsigned sgn);
322
323extern int dload_repack(struct dload_state *dlthis, rvalue val, tgt_au_t * data,
324 int fieldsz, int offset, unsigned sgn);
325
326
327
328
329extern bool dload_tramp_avail(struct dload_state *dlthis,
330 struct reloc_record_t *rp);
331
332int dload_tramp_generate(struct dload_state *dlthis, s16 secnn,
333 u32 image_offset, struct image_packet_t *ipacket,
334 struct reloc_record_t *rp);
335
336extern int dload_tramp_pkt_udpate(struct dload_state *dlthis,
337 s16 secnn, u32 image_offset,
338 struct image_packet_t *ipacket);
339
340extern int dload_tramp_finalize(struct dload_state *dlthis);
341
342extern void dload_tramp_cleanup(struct dload_state *dlthis);
343
344#endif
345