/* * doff.h * * DSP-BIOS Bridge driver support functions for TI OMAP processors. * * Structures & definitions used for dynamically loaded modules file format. * This format is a reformatted version of COFF. It optimizes the layout for * the dynamic loader. * * .dof files, when viewed as a sequence of 32-bit integers, look the same * on big-endian and little-endian machines. * * Copyright (C) 2005-2006 Texas Instruments, Inc. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _DOFF_H #define _DOFF_H #define BYTE_RESHUFFLE_VALUE 0x00010203 /* DOFF file header containing fields categorizing the remainder of the file */ struct doff_filehdr_t { /* string table size, including filename, in bytes */ u32 df_strtab_size; /* entry point if one exists */ u32 df_entrypt; /* identifies byte ordering of file; * always set to BYTE_RESHUFFLE_VALUE */ u32 df_byte_reshuffle; /* Size of the string table up to and including the last section name */ /* Size includes the name of the COFF file also */ u32 df_scn_name_size; #ifndef _BIG_ENDIAN /* number of symbols */ u16 df_no_syms; /* length in bytes of the longest string, including terminating NULL */ /* excludes the name of the file */ u16 df_max_str_len; /* total number of sections including no-load ones */ u16 df_no_scns; /* number of sections containing target code allocated or downloaded */ u16 df_target_scns; /* unique id for dll file format & version */ u16 df_doff_version; /* identifies ISA */ u16 df_target_id; /* useful file flags */ u16 df_flags; /* section reference for entry point, N_UNDEF for none, */ /* N_ABS for absolute address */ s16 df_entry_secn; #else /* length of the longest string, including terminating NULL */ u16 df_max_str_len; /* number of symbols */ u16 df_no_syms; /* number of sections containing target code allocated or downloaded */ u16 df_target_scns; /* total number of sections including no-load ones */ u16 df_no_scns; /* identifies ISA */ u16 df_target_id; /* unique id for dll file format & version */ u16 df_doff_version; /* section reference for entry point, N_UNDEF for none, */ /* N_ABS for absolute address */ s16 df_entry_secn; /* useful file flags */ u16 df_flags; #endif /* checksum for file header record */ u32 df_checksum; }; /* flags in the df_flags field */ #define DF_LITTLE 0x100 #define DF_BIG 0x200 #define DF_BYTE_ORDER (DF_LITTLE | DF_BIG) /* Supported processors */ #define TMS470_ID 0x97 #define LEAD_ID 0x98 #define TMS32060_ID 0x99 #define LEAD3_ID 0x9c /* Primary processor for loading */ #if TMS32060 #define TARGET_ID TMS32060_ID #endif /* Verification record containing values used to test integrity of the bits */ struct doff_verify_rec_t { /* time and date stamp */ u32 dv_timdat; /* checksum for all section records */ u32 dv_scn_rec_checksum; /* checksum for string table */ u32 dv_str_tab_checksum; /* checksum for symbol table */ u32 dv_sym_tab_checksum; /* checksum for verification record */ u32 dv_verify_rec_checksum; }; /* String table is an array of null-terminated strings. The first entry is * the filename, which is added by DLLcreate. No new structure definitions * are required. */ /* Section Records including information on the corresponding image packets */ /* * !!WARNING!! * * This structure is expected to match in form ldr_section_info in * dynamic_loader.h */ struct doff_scnhdr_t { s32 ds_offset; /* offset into string table of name */ s32 ds_paddr; /* RUN address, in target AU */ s32 ds_vaddr; /* LOAD address, in target AU */ s32 ds_size; /* section size, in target AU */ #ifndef _BIG_ENDIAN u16 ds_page; /* memory page id */ u16 ds_flags; /* section flags */ #else u16 ds_flags; /* section flags */ u16 ds_page; /* memory page id */ #endif u32 ds_first_pkt_offset; /* Absolute byte offset into the file */ /* where the first image record resides */ s32 ds_nipacks; /* number of image packets */ }; /* Symbol table entry */ struct doff_syment_t { s32 dn_offset; /* offset into string table of name */ s32 dn_value; /* value of symbol */ #ifndef _BIG_ENDIAN s16 dn_scnum; /* section number */ s16 dn_sclass; /* storage class */ #else s16 dn_sclass; /* storage class */ s16 dn_scnum; /* section number, 1-based */ #endif }; /* special values for dn_scnum */ #define DN_UNDEF 0 /* undefined symbol */ #define DN_ABS (-1) /* value of symbol is absolute */ /* special values for dn_sclass */ #define DN_EXT 2 #define DN_STATLAB 20 #define DN_EXTLAB 21 /* Default value of image bits in packet */ /* Configurable by user on the command line */ #define IMAGE_PACKET_SIZE 1024 /* An image packet contains a chunk of data from a section along with */ /* information necessary for its processing. */ struct image_packet_t { s32 num_relocs; /* number of relocations for */ /* this packet */ s32 packet_size; /* number of bytes in array */ /* "bits" occupied by */ /* valid data. Could be */ /* < IMAGE_PACKET_SIZE to */ /* prevent splitting a */ /* relocation across packets. */ /* Last packet of a section */ /* will most likely contain */ /* < IMAGE_PACKET_SIZE bytes */ /* of valid data */ s32 img_chksum; /* Checksum for image packet */ /* and the corresponding */ /* relocation records */ u8 *img_data; /* Actual data in section */ }; /* The relocation structure definition matches the COFF version. Offsets */ /* however are relative to the image packet base not the section base. */ struct reloc_record_t { s32 vaddr; /* expressed in target AUs */ union { struct { #ifndef _BIG_ENDIAN u8 _offset; /* bit offset of rel fld */ u8 _fieldsz; /* size of rel fld */ u8 _wordsz; /* # bytes containing rel fld */ u8 _dum1; u16 _dum2; u16 _type; #else unsigned _dum1:8; unsigned _wordsz:8; /* # bytes containing rel fld */ unsigned _fieldsz:8; /* size of rel fld */ unsigned _offset:8; /* bit offset of rel fld */ u16 _type; u16 _dum2; #endif } _r_field; struct { u32 _spc; /* image packet relative PC */ #ifndef _BIG_ENDIAN u16 _dum; u16 _type; /* relocation type */ #else u16 _type; /* relocation type */ u16 _dum; #endif } _r_spc; struct { u32 _uval; /* constant value */ #ifndef _BIG_ENDIAN u16 _dum; u16 _type; /* relocation type */ #else u16 _type; /* relocation type */ u16 _dum; #endif } _r_uval; struct { s32 _symndx; /* 32-bit sym tbl index */ #ifndef _BIG_ENDIAN u16 _disp; /* extra addr encode data */ u16 _type; /* relocation type */ #else u16 _type; /* relocation type */ u16 _disp; /* extra addr encode data */ #endif } _r_sym; } _u_reloc; }; /* abbreviations for convenience */ #ifndef TYPE #define TYPE _u_reloc._r_sym._type #define UVAL _u_reloc._r_uval._uval #define SYMNDX _u_reloc._r_sym._symndx #define OFFSET _u_reloc._r_field._offset #define FIELDSZ _u_reloc._r_field._fieldsz #define WORDSZ _u_reloc._r_field._wordsz #define R_DISP _u_reloc._r_sym._disp #endif /**************************************************************************** */ /* */ /* Important DOFF macros used for file processing */ /* */ /**************************************************************************** */ /* DOFF Versions */ #define DOFF0 0 /* Return the address/size >= to addr that is at a 32-bit boundary */ /* This assumes that a byte is 8 bits */ #define DOFF_ALIGN(addr) (((addr) + 3) & ~3UL) /**************************************************************************** */ /* */ /* The DOFF section header flags field is laid out as follows: */ /* */ /* Bits 0-3 : Section Type */ /* Bit 4 : Set when section requires target memory to be allocated by DL */ /* Bit 5 : Set when section requires downloading */ /* Bits 8-11: Alignment, same as COFF */ /* */ /**************************************************************************** */ /* Enum for DOFF section types (bits 0-3 of flag): See dynamic_loader.h */ #define DS_SECTION_TYPE_MASK 0xF /* DS_ALLOCATE indicates whether a section needs space on the target */ #define DS_ALLOCATE_MASK 0x10 /* DS_DOWNLOAD indicates that the loader needs to copy bits */ #define DS_DOWNLOAD_MASK 0x20 /* Section alignment requirement in AUs */ #define DS_ALIGNMENT_SHIFT 8 static inline bool dload_check_type(struct doff_scnhdr_t *sptr, u32 flag) { return (sptr->ds_flags & DS_SECTION_TYPE_MASK) == flag; } static inline bool ds_needs_allocation(struct doff_scnhdr_t *sptr) { return sptr->ds_flags & DS_ALLOCATE_MASK; } static inline bool ds_needs_download(struct doff_scnhdr_t *sptr) { return sptr->ds_flags & DS_DOWNLOAD_MASK; } static inline int ds_alignment(u16 ds_flags) { return 1 << ((ds_flags >> DS_ALIGNMENT_SHIFT) & DS_SECTION_TYPE_MASK); } #endif /* _DOFF_H */