loadElfLibP.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* loadElfLibP.h - private ELF loader library header */
  2. /* Copyright 2001-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01g,16may02,fmk  move the definition of SYM_ADRS to loadLibP.h
  7. 01f,08feb02,jn   Add comments about CHECK_FITS and SIGN_EXTEND for ARM. 
  8. 01e,09jan02,jn   Reinstate previous definition of CHECK_FITS for ARM.  Keep new
  9.                  definition for MIPS.
  10. 01d,03jan02,jn   put back LO_VALUE macro for PPC 
  11. 01c,27nov01,pad  Added macro definitions (SIGN_EXTEND, etc.)
  12. 01b,05sep01,jn   created from loadElfLib.h@@/main/3 - moved utility macros 
  13.                  and private type and structure definitions here
  14. */
  15. #ifndef __INCloadElfLibPh
  16. #define __INCloadElfLibPh
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. #include "symLib.h"
  21. #include "loadLibP.h"
  22. /* Defines */
  23. #define CHECK_LOW14(val)        (((val & 0xffff8000) == 0) ||           
  24.                                  ((val & 0xffff8000) == 0xffff8000))
  25. #define CHECK_LOW16(val)        (((val & 0xffff8000) == 0) ||           
  26.                                  ((val & 0xffff8000) == 0xffff8000))
  27. #define CHECK_LOW16_STRICT(val) (((val & 0xffff0000) == 0) ||           
  28.                                  ((val & 0xffff0000) == 0xffff0000))
  29. #define CHECK_LOW24(val)        (((val & 0xfe000000) == 0) ||           
  30.                                  ((val & 0xfe000000) == 0xfe000000))
  31. #define INSERT(buf,value,mask) 
  32. ((buf) = (((buf) & ~(mask)) | ((value) & (mask))))
  33. #if   (CPU_FAMILY == PPC)
  34. #define LOW24_INSERT(buf,value) INSERT ((buf), (value), 0x03fffffc)
  35. #endif
  36. #if   (CPU_FAMILY == ARM) 
  37. #define LOW24_INSERT(buf,value) INSERT ((buf), (value), 0x00ffffff)
  38. #endif
  39. #define LOW14_INSERT(buf,value) INSERT ((buf), (value), 0x0000fffc)
  40. #define LOW16_VALUE(val) ((val) & 0x0000ffff)
  41. #define LOW16_INSERT(buf,value) INSERT ((buf), (value), 0x0000ffff)
  42. #define LOW26_VALUE(val) ((val) & 0x03ffffff)
  43. #define LOW26_INSERT(buf,value) INSERT ((buf), (value), 0x03ffffff)
  44. #define LO_VALUE(val)           ((val) & 0x0000ffff)
  45. #define HI_VALUE(val)           (((val) >> 16) & 0x0000ffff)
  46. #define HA_VALUE(val)           ((((val) >> 16)+(((val) >> 15) & 0x1)) & 0xffff)
  47. #define STORE_MASKED_VALUE(address, mask, value) 
  48.     *(address) = ((*(address)) & ~(mask)) | ((value) & (mask))
  49. /* macro to check if the alignment is a power of 2 */
  50. #define CHECK_2_ALIGN(x)        (((x) & ((x) - 1)) == 0)
  51. /* the binary number that is "n" 1's */
  52. #define MASK(n) ((1 << (n)) - 1)
  53. /* mask to get the most significant bit of a value on n bit */
  54. #define SIGN_BIT_MASK(n) (1 << ((n) - 1))
  55. /* XXX - jn - use of these macro names should be standardized across arches. */
  56. /* 
  57.  * XXX - Before they were added here, both CHECK_FITS and SIGN_EXTEND were 
  58.  * used by ARM and defined in target/h/arch/arm/elfArm.h
  59.  */
  60. #if (CPU_FAMILY == MIPS)
  61. /* Check whether the value fits in n bits */
  62. #define CHECK_FITS(val,nBits) (((val) & ~(MASK(nBits))) == 0)
  63. #elif (CPU_FAMILY == ARM)
  64. /*
  65.  * macro to check that a signed <val> fits in <nBits> without overflow
  66.  * i.e. that the "sign-bit" is correctly propagated into the excess high bits
  67.  */
  68.    
  69. #define CHECK_FITS(val,nBits) 
  70.         ((((val) & ~((1 << ((nBits)-1))-1)) == 0) || 
  71.          (((val) & ~((1 << ((nBits)-1))-1)) == ~(UINT32)((1 << ((nBits)-1))-1)))
  72. #endif
  73. /*
  74.  * Sign extension macro. Sign extension replaces all higher bits in <val>
  75.  * with copies of the most significant bit on <nBits>.
  76.  *    <val> is the value we want to sign extend.
  77.  *    <nBits> is the number of significant bits in <val>.
  78.  *
  79.  * Note: the assumption is that the storage is greater than <nBits>.
  80.  */
  81. #define SIGN_EXTEND(val, nBits) 
  82. (((MASK(nBits) & (val)) ^ SIGN_BIT_MASK(nBits)) - SIGN_BIT_MASK(nBits))
  83. /*
  84.  * Overflow verification macro. It checks that the signed value <val> does
  85.  * not overflow the number of bits specified by <nBits>. The overflow for
  86.  * signed binary numbers is defined as occuring if and only if at least one
  87.  * of the bits beyond <nBits> is not equal to the sign bit of the value
  88.  * truncated on <nBits>.
  89.  *
  90.  * The expression evaluation gives 1 when the value overflows, 0 otherwise.
  91.  *
  92.  * Note: the assumption is that the maximum storage is on 32 bits.
  93.  */
  94. #define CHECK_SIGNED_OVERFLOW(val,nBits) 
  95. (!(SIGN_EXTEND((val),(nBits)) == (val)))
  96. /* Some masks */
  97. #define RA_MSK          0x001f0000
  98. #define GPR13_MSK       0x000d0000
  99. #define GPR2_MSK        0x00020000
  100. /* type definitions */
  101. typedef void **         SYM_ADRS_TBL;           /* table of symbol's addr */
  102. typedef void *          SCN_ADRS;               /* section's address */
  103. typedef void **         SCN_ADRS_TBL;           /* table of section's addr */
  104. /* data structures */
  105. typedef struct
  106.     {
  107.     UINT32 *    pLoadScnHdrIdxs;        /* loadable sections header index tbl */
  108.     UINT32 *    pSymTabScnHdrIdxs;      /* sym table sections header idx tbl */
  109.     UINT32 *    pRelScnHdrIdxs;         /* reloc info sections header idx tbl */
  110.     UINT32 *    pStrTabScnHdrIdxs;      /* str table sections header idx tbl */
  111.     } IDX_TBLS;
  112. typedef struct
  113.     {
  114.     void *      pAddrSdata;     /* address of SDA data segment */
  115.     void *      pAddrSbss;      /* address of SDA bss segment */
  116.     int         sizeSdata;      /* size of SDA data segment */
  117.     int         sizeSbss;       /* size of SDA bss segment */
  118.     int         flagsSdata;     /* SDA data flags for module */
  119.     int         flagsSbss;      /* SDA bss flags for module */
  120.     PART_ID     sdaMemPartId;   /* ID of memory partition dedicated for SDA */
  121.     void *      sdaBaseAddr;    /* Base address of the SDA area */
  122.     int         sdaAreaSize;    /* Size of the SDA area */
  123.     void *      pAddrSdata2;    /* address of SDA2 data segment */
  124.     void *      pAddrSbss2;     /* address of SDA2 bss segment */
  125.     int         sizeSdata2;     /* size of SDA2 data segment */
  126.     int         sizeSbss2;      /* size of SDA2 bss segment */
  127.     int         flagsSdata2;    /* SDA2 data flags for module */
  128.     int         flagsSbss2;     /* SDA2 bss flags for module */
  129.     PART_ID     sda2MemPartId;  /* ID of memory partition dedicated for SDA2 */
  130.     void *      sda2BaseAddr;   /* Base address of the SDA2 area */
  131.     int         sda2AreaSize;   /* Size of the SDA2 area */
  132.     } SDA_INFO;
  133. typedef struct
  134.     {
  135.     SYM_ADRS    pAddr;  /* symbol's address */
  136.     SYM_TYPE    type;   /* symbol's type */
  137.     } SYM_INFO;
  138. typedef Elf32_Sym **    SYMTBL_REFS;    /* table of pointers to symbol tables */
  139. typedef void ***        SYMADDR_REFS;   /* table of ptrs to sym adrs tables */
  140. typedef SYM_INFO *      SYM_INFO_TBL;   /* table of symbol address/type info */
  141. typedef SYM_INFO_TBL *  SYMINFO_REFS;   /* table of ptr to symbol info tables */
  142. /* function declarations */
  143. int    elfRelocRelEntryRd (int fd, int posRelocEntry, Elf32_Rel * pReloc);
  144. int    elfRelocRelaEntryRd (int fd, int posRelocEntry, Elf32_Rela * pReloc);
  145. /*
  146.  * The following routines are actually located in the relocation units, but
  147.  * we need the prototypes here to allow for a clean build.
  148.  */
  149. #if (CPU_FAMILY == I80X86)
  150. STATUS elfI86Init 
  151.     (
  152.     FUNCPTR * pElfModuleVerifyRtn, 
  153.     FUNCPTR * pElfRelSegRtn
  154.     );
  155. #elif (CPU_FAMILY == ARM)
  156. STATUS elfArmInit 
  157.     (
  158.     FUNCPTR * pElfModuleVerifyRtn, 
  159.     FUNCPTR * pElfRelSegRtn
  160.     );
  161. #elif (CPU_FAMILY == MIPS)
  162. STATUS elfMipsInit 
  163.     (
  164.     FUNCPTR * pElfModuleVerifyRtn, 
  165.     FUNCPTR * pElfRelSegRtn
  166.     );
  167. #endif
  168. #ifdef __cplusplus
  169. }
  170. #endif
  171. #endif /* __INCloadElfLibPh */