• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/staging/tidspbridge/dynload/
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 */
31struct doff_filehdr_t {
32
33	/* string table size, including filename, in bytes */
34	u32 df_strtab_size;
35
36	/* entry point if one exists */
37	u32 df_entrypt;
38
39	/* identifies byte ordering of file;
40	 * always set to BYTE_RESHUFFLE_VALUE */
41	u32 df_byte_reshuffle;
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 */
45	u32 df_scn_name_size;
46
47#ifndef _BIG_ENDIAN
48	/* number of symbols */
49	u16 df_no_syms;
50
51	/* length in bytes of the longest string, including terminating NULL */
52	/* excludes the name of the file */
53	u16 df_max_str_len;
54
55	/* total number of sections including no-load ones */
56	u16 df_no_scns;
57
58	/* number of sections containing target code allocated or downloaded */
59	u16 df_target_scns;
60
61	/* unique id for dll file format & version */
62	u16 df_doff_version;
63
64	/* identifies ISA */
65	u16 df_target_id;
66
67	/* useful file flags */
68	u16 df_flags;
69
70	/* section reference for entry point, N_UNDEF for none, */
71	/* N_ABS for absolute address */
72	s16 df_entry_secn;
73#else
74	/* length of the longest string, including terminating NULL */
75	u16 df_max_str_len;
76
77	/* number of symbols */
78	u16 df_no_syms;
79
80	/* number of sections containing target code allocated or downloaded */
81	u16 df_target_scns;
82
83	/* total number of sections including no-load ones */
84	u16 df_no_scns;
85
86	/* identifies ISA */
87	u16 df_target_id;
88
89	/* unique id for dll file format & version */
90	u16 df_doff_version;
91
92	/* section reference for entry point, N_UNDEF for none, */
93	/* N_ABS for absolute address */
94	s16 df_entry_secn;
95
96	/* useful file flags */
97	u16 df_flags;
98#endif
99	/* checksum for file header record */
100	u32 df_checksum;
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 */
121struct doff_verify_rec_t {
122
123	/* time and date stamp */
124	u32 dv_timdat;
125
126	/* checksum for all section records */
127	u32 dv_scn_rec_checksum;
128
129	/* checksum for string table */
130	u32 dv_str_tab_checksum;
131
132	/* checksum for symbol table */
133	u32 dv_sym_tab_checksum;
134
135	/* checksum for verification record */
136	u32 dv_verify_rec_checksum;
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
153struct doff_scnhdr_t {
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
166	u32 ds_first_pkt_offset;
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 */
175struct doff_syment_t {
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. */
203struct image_packet_t {
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. */
229struct reloc_record_t {
230
231	s32 vaddr;
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 */
241			u8 _dum1;
242			u16 _dum2;
243			u16 _type;
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
257			u16 _dum;
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
334static inline bool dload_check_type(struct doff_scnhdr_t *sptr, u32 flag)
335{
336	return (sptr->ds_flags & DS_SECTION_TYPE_MASK) == flag;
337}
338static inline bool ds_needs_allocation(struct doff_scnhdr_t *sptr)
339{
340	return sptr->ds_flags & DS_ALLOCATE_MASK;
341}
342
343static inline bool ds_needs_download(struct doff_scnhdr_t *sptr)
344{
345	return sptr->ds_flags & DS_DOWNLOAD_MASK;
346}
347
348static 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 */
355