355 lines
9.1 KiB
C
355 lines
9.1 KiB
C
/*
|
|
* 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 */
|