Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
doff.h
Go to the documentation of this file.
1 /*
2  * doff.h
3  *
4  * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5  *
6  * Structures & definitions used for dynamically loaded modules file format.
7  * This format is a reformatted version of COFF. It optimizes the layout for
8  * the dynamic loader.
9  *
10  * .dof files, when viewed as a sequence of 32-bit integers, look the same
11  * on big-endian and little-endian machines.
12  *
13  * Copyright (C) 2005-2006 Texas Instruments, Inc.
14  *
15  * This package is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License version 2 as
17  * published by the Free Software Foundation.
18  *
19  * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
21  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22  */
23 
24 #ifndef _DOFF_H
25 #define _DOFF_H
26 
27 
28 #define BYTE_RESHUFFLE_VALUE 0x00010203
29 
30 /* DOFF file header containing fields categorizing the remainder of the file */
32 
33  /* string table size, including filename, in bytes */
35 
36  /* entry point if one exists */
38 
39  /* identifies byte ordering of file;
40  * always set to BYTE_RESHUFFLE_VALUE */
42 
43  /* Size of the string table up to and including the last section name */
44  /* Size includes the name of the COFF file also */
46 
47 #ifndef _BIG_ENDIAN
48  /* number of symbols */
50 
51  /* length in bytes of the longest string, including terminating NULL */
52  /* excludes the name of the file */
54 
55  /* total number of sections including no-load ones */
57 
58  /* number of sections containing target code allocated or downloaded */
60 
61  /* unique id for dll file format & version */
63 
64  /* identifies ISA */
66 
67  /* useful file flags */
69 
70  /* section reference for entry point, N_UNDEF for none, */
71  /* N_ABS for absolute address */
73 #else
74  /* length of the longest string, including terminating NULL */
76 
77  /* number of symbols */
79 
80  /* number of sections containing target code allocated or downloaded */
82 
83  /* total number of sections including no-load ones */
85 
86  /* identifies ISA */
88 
89  /* unique id for dll file format & version */
91 
92  /* section reference for entry point, N_UNDEF for none, */
93  /* N_ABS for absolute address */
95 
96  /* useful file flags */
97  u16 df_flags;
98 #endif
99  /* checksum for file header record */
101 
102 };
103 
104 /* flags in the df_flags field */
105 #define DF_LITTLE 0x100
106 #define DF_BIG 0x200
107 #define DF_BYTE_ORDER (DF_LITTLE | DF_BIG)
108 
109 /* Supported processors */
110 #define TMS470_ID 0x97
111 #define LEAD_ID 0x98
112 #define TMS32060_ID 0x99
113 #define LEAD3_ID 0x9c
114 
115 /* Primary processor for loading */
116 #if TMS32060
117 #define TARGET_ID TMS32060_ID
118 #endif
119 
120 /* Verification record containing values used to test integrity of the bits */
122 
123  /* time and date stamp */
125 
126  /* checksum for all section records */
128 
129  /* checksum for string table */
131 
132  /* checksum for symbol table */
134 
135  /* checksum for verification record */
137 
138 };
139 
140 /* String table is an array of null-terminated strings. The first entry is
141  * the filename, which is added by DLLcreate. No new structure definitions
142  * are required.
143  */
144 
145 /* Section Records including information on the corresponding image packets */
146 /*
147  * !!WARNING!!
148  *
149  * This structure is expected to match in form ldr_section_info in
150  * dynamic_loader.h
151  */
152 
154 
155  s32 ds_offset; /* offset into string table of name */
156  s32 ds_paddr; /* RUN address, in target AU */
157  s32 ds_vaddr; /* LOAD address, in target AU */
158  s32 ds_size; /* section size, in target AU */
159 #ifndef _BIG_ENDIAN
160  u16 ds_page; /* memory page id */
161  u16 ds_flags; /* section flags */
162 #else
163  u16 ds_flags; /* section flags */
164  u16 ds_page; /* memory page id */
165 #endif
167  /* Absolute byte offset into the file */
168  /* where the first image record resides */
169 
170  s32 ds_nipacks; /* number of image packets */
171 
172 };
173 
174 /* Symbol table entry */
176 
177  s32 dn_offset; /* offset into string table of name */
178  s32 dn_value; /* value of symbol */
179 #ifndef _BIG_ENDIAN
180  s16 dn_scnum; /* section number */
181  s16 dn_sclass; /* storage class */
182 #else
183  s16 dn_sclass; /* storage class */
184  s16 dn_scnum; /* section number, 1-based */
185 #endif
186 
187 };
188 
189 /* special values for dn_scnum */
190 #define DN_UNDEF 0 /* undefined symbol */
191 #define DN_ABS (-1) /* value of symbol is absolute */
192 /* special values for dn_sclass */
193 #define DN_EXT 2
194 #define DN_STATLAB 20
195 #define DN_EXTLAB 21
196 
197 /* Default value of image bits in packet */
198 /* Configurable by user on the command line */
199 #define IMAGE_PACKET_SIZE 1024
200 
201 /* An image packet contains a chunk of data from a section along with */
202 /* information necessary for its processing. */
204 
205  s32 num_relocs; /* number of relocations for */
206  /* this packet */
207 
208  s32 packet_size; /* number of bytes in array */
209  /* "bits" occupied by */
210  /* valid data. Could be */
211  /* < IMAGE_PACKET_SIZE to */
212  /* prevent splitting a */
213  /* relocation across packets. */
214  /* Last packet of a section */
215  /* will most likely contain */
216  /* < IMAGE_PACKET_SIZE bytes */
217  /* of valid data */
218 
219  s32 img_chksum; /* Checksum for image packet */
220  /* and the corresponding */
221  /* relocation records */
222 
223  u8 *img_data; /* Actual data in section */
224 
225 };
226 
227 /* The relocation structure definition matches the COFF version. Offsets */
228 /* however are relative to the image packet base not the section base. */
230 
232 
233  /* expressed in target AUs */
234 
235  union {
236  struct {
237 #ifndef _BIG_ENDIAN
238  u8 _offset; /* bit offset of rel fld */
239  u8 _fieldsz; /* size of rel fld */
240  u8 _wordsz; /* # bytes containing rel fld */
244 #else
245  unsigned _dum1:8;
246  unsigned _wordsz:8; /* # bytes containing rel fld */
247  unsigned _fieldsz:8; /* size of rel fld */
248  unsigned _offset:8; /* bit offset of rel fld */
249  u16 _type;
250  u16 _dum2;
251 #endif
252  } _r_field;
253 
254  struct {
255  u32 _spc; /* image packet relative PC */
256 #ifndef _BIG_ENDIAN
258  u16 _type; /* relocation type */
259 #else
260  u16 _type; /* relocation type */
261  u16 _dum;
262 #endif
263  } _r_spc;
264 
265  struct {
266  u32 _uval; /* constant value */
267 #ifndef _BIG_ENDIAN
268  u16 _dum;
269  u16 _type; /* relocation type */
270 #else
271  u16 _type; /* relocation type */
272  u16 _dum;
273 #endif
274  } _r_uval;
275 
276  struct {
277  s32 _symndx; /* 32-bit sym tbl index */
278 #ifndef _BIG_ENDIAN
279  u16 _disp; /* extra addr encode data */
280  u16 _type; /* relocation type */
281 #else
282  u16 _type; /* relocation type */
283  u16 _disp; /* extra addr encode data */
284 #endif
285  } _r_sym;
286  } _u_reloc;
287 
288 };
289 
290 /* abbreviations for convenience */
291 #ifndef TYPE
292 #define TYPE _u_reloc._r_sym._type
293 #define UVAL _u_reloc._r_uval._uval
294 #define SYMNDX _u_reloc._r_sym._symndx
295 #define OFFSET _u_reloc._r_field._offset
296 #define FIELDSZ _u_reloc._r_field._fieldsz
297 #define WORDSZ _u_reloc._r_field._wordsz
298 #define R_DISP _u_reloc._r_sym._disp
299 #endif
300 
301 /**************************************************************************** */
302 /* */
303 /* Important DOFF macros used for file processing */
304 /* */
305 /**************************************************************************** */
306 
307 /* DOFF Versions */
308 #define DOFF0 0
309 
310 /* Return the address/size >= to addr that is at a 32-bit boundary */
311 /* This assumes that a byte is 8 bits */
312 #define DOFF_ALIGN(addr) (((addr) + 3) & ~3UL)
313 
314 /**************************************************************************** */
315 /* */
316 /* The DOFF section header flags field is laid out as follows: */
317 /* */
318 /* Bits 0-3 : Section Type */
319 /* Bit 4 : Set when section requires target memory to be allocated by DL */
320 /* Bit 5 : Set when section requires downloading */
321 /* Bits 8-11: Alignment, same as COFF */
322 /* */
323 /**************************************************************************** */
324 
325 /* Enum for DOFF section types (bits 0-3 of flag): See dynamic_loader.h */
326 #define DS_SECTION_TYPE_MASK 0xF
327 /* DS_ALLOCATE indicates whether a section needs space on the target */
328 #define DS_ALLOCATE_MASK 0x10
329 /* DS_DOWNLOAD indicates that the loader needs to copy bits */
330 #define DS_DOWNLOAD_MASK 0x20
331 /* Section alignment requirement in AUs */
332 #define DS_ALIGNMENT_SHIFT 8
333 
334 static inline bool dload_check_type(struct doff_scnhdr_t *sptr, u32 flag)
335 {
336  return (sptr->ds_flags & DS_SECTION_TYPE_MASK) == flag;
337 }
338 static inline bool ds_needs_allocation(struct doff_scnhdr_t *sptr)
339 {
340  return sptr->ds_flags & DS_ALLOCATE_MASK;
341 }
342 
343 static inline bool ds_needs_download(struct doff_scnhdr_t *sptr)
344 {
345  return sptr->ds_flags & DS_DOWNLOAD_MASK;
346 }
347 
348 static inline int ds_alignment(u16 ds_flags)
349 {
350  return 1 << ((ds_flags >> DS_ALIGNMENT_SHIFT) & DS_SECTION_TYPE_MASK);
351 }
352 
353 
354 #endif /* _DOFF_H */