Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* RX ELF support for BFD.
  2.    Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
  3.  
  4.    This file is part of BFD, the Binary File Descriptor library.
  5.  
  6.    This program is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 3 of the License, or
  9.    (at your option) any later version.
  10.  
  11.    This program is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with this program; if not, write to the Free Software Foundation,
  18.    Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
  19.  
  20. #ifndef _ELF_RX_H
  21. #define _ELF_RX_H
  22.  
  23. #include "elf/reloc-macros.h"
  24.  
  25. /* Note that there are a few internal relocation types used by the
  26.    linker to do link-time relaxation.  If you update this file, please
  27.    check elf32-rx.c to see if any of the internal relocations need to
  28.    be, er, relocated.  */
  29.  
  30. /* Preliminary relocations.  */
  31. START_RELOC_NUMBERS (elf_rx_reloc_type)
  32.  
  33.   RELOC_NUMBER (R_RX_NONE,         0x00)
  34.   /* These are for data, and are bi-endian.  */
  35.   RELOC_NUMBER (R_RX_DIR32,        0x01) /* Was: R_RX_32.  */
  36.   RELOC_NUMBER (R_RX_DIR24S,       0x02) /* Was: R_RX_24.  */
  37.   RELOC_NUMBER (R_RX_DIR16,        0x03)
  38.   RELOC_NUMBER (R_RX_DIR16U,       0x04) /* Was: R_RX_16_UNS.  */
  39.   RELOC_NUMBER (R_RX_DIR16S,       0x05) /* Was: R_RX_16.  */
  40.   RELOC_NUMBER (R_RX_DIR8,         0x06)
  41.   RELOC_NUMBER (R_RX_DIR8U,        0x07) /* Was: R_RX_8_UNS.  */
  42.   RELOC_NUMBER (R_RX_DIR8S,        0x08) /* Was: R_RX_8.  */
  43.  
  44.   /* Signed pc-relative values.  */
  45.   RELOC_NUMBER (R_RX_DIR24S_PCREL, 0x09) /* Was: R_RX_24_PCREL.  */
  46.   RELOC_NUMBER (R_RX_DIR16S_PCREL, 0x0a) /* Was: R_RX_16_PCREL.  */
  47.   RELOC_NUMBER (R_RX_DIR8S_PCREL,  0x0b) /* Was: R_RX_8_PCREL.  */
  48.  
  49.   /* These are for fields in the instructions.  */
  50.   RELOC_NUMBER (R_RX_DIR16UL,      0x0c)
  51.   RELOC_NUMBER (R_RX_DIR16UW,      0x0d)
  52.   RELOC_NUMBER (R_RX_DIR8UL,       0x0e)
  53.   RELOC_NUMBER (R_RX_DIR8UW,       0x0f)
  54.   RELOC_NUMBER (R_RX_DIR32_REV,    0x10)
  55.   RELOC_NUMBER (R_RX_DIR16_REV,    0x11)
  56.   RELOC_NUMBER (R_RX_DIR3U_PCREL,  0x12)
  57.  
  58.   /* These are extensions added by Red Hat.  */
  59.   RELOC_NUMBER (R_RX_RH_3_PCREL,   0x20) /* Like R_RX_DIR8S_PCREL but only 3-bits.  */
  60.   RELOC_NUMBER (R_RX_RH_16_OP,     0x21) /* Like R_RX_DIR16 but for opcodes - always big endian.  */
  61.   RELOC_NUMBER (R_RX_RH_24_OP,     0x22) /* Like R_RX_DIR24S but for opcodes - always big endian.  */
  62.   RELOC_NUMBER (R_RX_RH_32_OP,     0x23) /* Like R_RX_DIR32 but for opcodes - always big endian.  */
  63.   RELOC_NUMBER (R_RX_RH_24_UNS,    0x24) /* Like R_RX_DIR24S but for unsigned values.  */
  64.   RELOC_NUMBER (R_RX_RH_8_NEG,     0x25) /* Like R_RX_DIR8 but -x is stored.  */
  65.   RELOC_NUMBER (R_RX_RH_16_NEG,    0x26) /* Like R_RX_DIR16 but -x is stored.  */
  66.   RELOC_NUMBER (R_RX_RH_24_NEG,    0x27) /* Like R_RX_DIR24S but -x is stored.  */
  67.   RELOC_NUMBER (R_RX_RH_32_NEG,    0x28) /* Like R_RX_DIR32 but -x is stored.  */
  68.   RELOC_NUMBER (R_RX_RH_DIFF,      0x29) /* Subtract from a previous relocation.  */
  69.   RELOC_NUMBER (R_RX_RH_GPRELB,    0x2a) /* Byte value, relative to __gp.  */
  70.   RELOC_NUMBER (R_RX_RH_GPRELW,    0x2b) /* Word value, relative to __gp.  */
  71.   RELOC_NUMBER (R_RX_RH_GPRELL,    0x2c) /* Long value, relative to __gp.  */
  72.   RELOC_NUMBER (R_RX_RH_RELAX,     0x2d) /* Marks opcodes suitable for linker relaxation.  */
  73.  
  74.   /* These are for complex relocs.  */
  75.   RELOC_NUMBER (R_RX_ABS32,        0x41)
  76.   RELOC_NUMBER (R_RX_ABS24S,       0x42)
  77.   RELOC_NUMBER (R_RX_ABS16,        0x43)
  78.   RELOC_NUMBER (R_RX_ABS16U,       0x44)
  79.   RELOC_NUMBER (R_RX_ABS16S,       0x45)
  80.   RELOC_NUMBER (R_RX_ABS8,         0x46)
  81.   RELOC_NUMBER (R_RX_ABS8U,        0x47)
  82.   RELOC_NUMBER (R_RX_ABS8S,        0x48)
  83.   RELOC_NUMBER (R_RX_ABS24S_PCREL, 0x49)
  84.   RELOC_NUMBER (R_RX_ABS16S_PCREL, 0x4a)
  85.   RELOC_NUMBER (R_RX_ABS8S_PCREL,  0x4b)
  86.   RELOC_NUMBER (R_RX_ABS16UL,      0x4c)
  87.   RELOC_NUMBER (R_RX_ABS16UW,      0x4d)
  88.   RELOC_NUMBER (R_RX_ABS8UL,       0x4e)
  89.   RELOC_NUMBER (R_RX_ABS8UW,       0x4f)
  90.   RELOC_NUMBER (R_RX_ABS32_REV,    0x50)
  91.   RELOC_NUMBER (R_RX_ABS16_REV,    0x51)
  92.  
  93.   RELOC_NUMBER (R_RX_SYM,          0x80)
  94.   RELOC_NUMBER (R_RX_OPneg,        0x81)
  95.   RELOC_NUMBER (R_RX_OPadd,        0x82)
  96.   RELOC_NUMBER (R_RX_OPsub,        0x83)
  97.   RELOC_NUMBER (R_RX_OPmul,        0x84)
  98.   RELOC_NUMBER (R_RX_OPdiv,        0x85)
  99.   RELOC_NUMBER (R_RX_OPshla,       0x86)
  100.   RELOC_NUMBER (R_RX_OPshra,       0x87)
  101.   RELOC_NUMBER (R_RX_OPsctsize,    0x88)
  102.   RELOC_NUMBER (R_RX_OPscttop,     0x8d)
  103.   RELOC_NUMBER (R_RX_OPand,        0x90)
  104.   RELOC_NUMBER (R_RX_OPor,         0x91)
  105.   RELOC_NUMBER (R_RX_OPxor,        0x92)
  106.   RELOC_NUMBER (R_RX_OPnot,        0x93)
  107.   RELOC_NUMBER (R_RX_OPmod,        0x94)
  108.   RELOC_NUMBER (R_RX_OPromtop,     0x95)
  109.   RELOC_NUMBER (R_RX_OPramtop,     0x96)
  110.  
  111. END_RELOC_NUMBERS (R_RX_max)
  112.  
  113. #define EF_RX_CPU_RX    0x00000079      /* FIXME: this collides with the E_FLAG_RX_... values below.  */
  114. #define EF_RX_CPU_MASK  0x0000007F      /* specific cpu bits.  */
  115. #define EF_RX_ALL_FLAGS (EF_RX_CPU_MASK)
  116.  
  117. /* Values for the e_flags field in the ELF header.  */
  118. #define E_FLAG_RX_64BIT_DOUBLES         (1 << 0)
  119. #define E_FLAG_RX_DSP                   (1 << 1) /* Defined in the RX CPU Object file specification, but not explained. */
  120. #define E_FLAG_RX_PID                   (1 << 2) /* Unofficial - DJ */
  121. #define E_FLAG_RX_ABI                   (1 << 3) /* Binary passes stacked arguments using natural alignment.  Unofficial - NC.  */
  122.  
  123. /* These define the addend field of R_RX_RH_RELAX relocations.  */
  124. #define RX_RELAXA_IMM6  0x00000010      /* Imm8/16/24/32 at bit offset 6.  */
  125. #define RX_RELAXA_IMM12 0x00000020      /* Imm8/16/24/32 at bit offset 12.  */
  126. #define RX_RELAXA_DSP4  0x00000040      /* Dsp0/8/16 at bit offset 4.  */
  127. #define RX_RELAXA_DSP6  0x00000080      /* Dsp0/8/16 at bit offset 6.  */
  128. #define RX_RELAXA_DSP14 0x00000100      /* Dsp0/8/16 at bit offset 14.  */
  129. #define RX_RELAXA_BRA   0x00000200      /* Any type of branch (must be decoded).  */
  130. #define RX_RELAXA_RNUM  0x0000000f      /* Number of associated relocations.  */
  131. /* These mark the place where alignment is requested, and the place where the filler bytes end.  */
  132. #define RX_RELAXA_ALIGN 0x10000000      /* Start alignment; the remaining bits are the alignment value.  */
  133. #define RX_RELAXA_ELIGN 0x20000000      /* End alignment; the remaining bits are the alignment value.  */
  134. #define RX_RELAXA_ANUM  0x00ffffff      /* Alignment amount, in bytes (i.e. .balign).  */
  135.  
  136. #endif /* _ELF_RX_H */
  137.