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