v850.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. /* V850 ELF support for BFD.
  2. Copyright (C) 1997-2022 Free Software Foundation, Inc.
  3. Created by Michael Meissner, Cygnus Support <meissner@cygnus.com>
  4. This file is part of BFD, the Binary File Descriptor library.
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  16. MA 02110-1301, USA. */
  17. /* This file holds definitions specific to the MIPS ELF ABI. Note
  18. that most of this is not actually implemented by BFD. */
  19. #ifndef _ELF_V850_H
  20. #define _ELF_V850_H
  21. /* Processor specific flags for the ELF header e_flags field. */
  22. /* Four bit V850 architecture field. */
  23. #define EF_V850_ARCH 0xf0000000
  24. /* v850 code. */
  25. #define E_V850_ARCH 0x00000000
  26. /* v850e code. */
  27. #define E_V850E_ARCH 0x10000000
  28. /* v850e1 code. */
  29. #define E_V850E1_ARCH 0x20000000
  30. /* v850e2 code. */
  31. #define E_V850E2_ARCH 0x30000000
  32. /* v850e2v3 code. */
  33. #define E_V850E2V3_ARCH 0x40000000
  34. /* v850e3v5 code. */
  35. #define E_V850E3V5_ARCH 0x60000000
  36. /* Flags for the st_other field. */
  37. #define V850_OTHER_SDA 0x10 /* Symbol had SDA relocations. */
  38. #define V850_OTHER_ZDA 0x20 /* Symbol had ZDA relocations. */
  39. #define V850_OTHER_TDA 0x40 /* Symbol had TDA relocations. */
  40. #define V850_OTHER_ERROR 0x80 /* Symbol had an error reported. */
  41. /* V850 relocations. */
  42. #include "elf/reloc-macros.h"
  43. START_RELOC_NUMBERS (v850_reloc_type)
  44. RELOC_NUMBER (R_V850_NONE, 0)
  45. RELOC_NUMBER (R_V850_9_PCREL, 1)
  46. RELOC_NUMBER (R_V850_22_PCREL, 2)
  47. RELOC_NUMBER (R_V850_HI16_S, 3)
  48. RELOC_NUMBER (R_V850_HI16, 4)
  49. RELOC_NUMBER (R_V850_LO16, 5)
  50. RELOC_NUMBER (R_V850_ABS32, 6)
  51. RELOC_NUMBER (R_V850_16, 7)
  52. RELOC_NUMBER (R_V850_8, 8)
  53. RELOC_NUMBER( R_V850_SDA_16_16_OFFSET, 9) /* For ld.b, st.b, set1, clr1, not1, tst1, movea, movhi */
  54. RELOC_NUMBER( R_V850_SDA_15_16_OFFSET, 10) /* For ld.w, ld.h, ld.hu, st.w, st.h */
  55. RELOC_NUMBER( R_V850_ZDA_16_16_OFFSET, 11) /* For ld.b, st.b, set1, clr1, not1, tst1, movea, movhi */
  56. RELOC_NUMBER( R_V850_ZDA_15_16_OFFSET, 12) /* For ld.w, ld.h, ld.hu, st.w, st.h */
  57. RELOC_NUMBER( R_V850_TDA_6_8_OFFSET, 13) /* For sst.w, sld.w */
  58. RELOC_NUMBER( R_V850_TDA_7_8_OFFSET, 14) /* For sst.h, sld.h */
  59. RELOC_NUMBER( R_V850_TDA_7_7_OFFSET, 15) /* For sst.b, sld.b */
  60. RELOC_NUMBER( R_V850_TDA_16_16_OFFSET, 16) /* For set1, clr1, not1, tst1, movea, movhi */
  61. RELOC_NUMBER( R_V850_TDA_4_5_OFFSET, 17) /* For sld.hu */
  62. RELOC_NUMBER( R_V850_TDA_4_4_OFFSET, 18) /* For sld.bu */
  63. RELOC_NUMBER( R_V850_SDA_16_16_SPLIT_OFFSET, 19) /* For ld.bu */
  64. RELOC_NUMBER( R_V850_ZDA_16_16_SPLIT_OFFSET, 20) /* For ld.bu */
  65. RELOC_NUMBER( R_V850_CALLT_6_7_OFFSET, 21) /* For callt */
  66. RELOC_NUMBER( R_V850_CALLT_16_16_OFFSET, 22) /* For callt */
  67. RELOC_NUMBER (R_V850_GNU_VTINHERIT, 23)
  68. RELOC_NUMBER (R_V850_GNU_VTENTRY, 24)
  69. RELOC_NUMBER (R_V850_LONGCALL, 25)
  70. RELOC_NUMBER (R_V850_LONGJUMP, 26)
  71. RELOC_NUMBER (R_V850_ALIGN, 27)
  72. RELOC_NUMBER (R_V850_REL32, 28)
  73. RELOC_NUMBER (R_V850_LO16_SPLIT_OFFSET, 29) /* For ld.bu */
  74. RELOC_NUMBER (R_V850_16_PCREL, 30) /* For loop */
  75. RELOC_NUMBER (R_V850_17_PCREL, 31) /* For br */
  76. RELOC_NUMBER (R_V850_23, 32) /* For 23bit ld.[w,h,hu,b,bu],st.[w,h,b] */
  77. RELOC_NUMBER (R_V850_32_PCREL, 33) /* For jr32, jarl32 */
  78. RELOC_NUMBER (R_V850_32_ABS, 34) /* For jmp32 */
  79. RELOC_NUMBER (R_V850_16_SPLIT_OFFSET, 35) /* For ld.bu */
  80. RELOC_NUMBER (R_V850_16_S1, 36) /* For ld.w, ld.h st.w st.h */
  81. RELOC_NUMBER (R_V850_LO16_S1, 37) /* For ld.w, ld.h st.w st.h */
  82. RELOC_NUMBER (R_V850_CALLT_15_16_OFFSET, 38) /* For ld.w, ld.h, ld.hu, st.w, st.h */
  83. RELOC_NUMBER (R_V850_32_GOTPCREL, 39) /* GLOBAL_OFFSET_TABLE from pc */
  84. RELOC_NUMBER (R_V850_16_GOT, 40) /* GOT ENTRY from gp */
  85. RELOC_NUMBER (R_V850_32_GOT, 41)
  86. RELOC_NUMBER (R_V850_22_PLT, 42) /* For jr */
  87. RELOC_NUMBER (R_V850_32_PLT, 43) /* For jr32 */
  88. RELOC_NUMBER (R_V850_COPY, 44)
  89. RELOC_NUMBER (R_V850_GLOB_DAT, 45)
  90. RELOC_NUMBER (R_V850_JMP_SLOT, 46)
  91. RELOC_NUMBER (R_V850_RELATIVE, 47)
  92. RELOC_NUMBER (R_V850_16_GOTOFF, 48) /* From gp */
  93. RELOC_NUMBER (R_V850_32_GOTOFF, 49)
  94. RELOC_NUMBER (R_V850_CODE, 50)
  95. RELOC_NUMBER (R_V850_DATA, 51) /* For loop */
  96. END_RELOC_NUMBERS (R_V850_max)
  97. /* Processor specific section indices. These sections do not actually
  98. exist. Symbols with a st_shndx field corresponding to one of these
  99. values have a special meaning. */
  100. /* Small data area common symbol. */
  101. #define SHN_V850_SCOMMON SHN_LORESERVE
  102. /* Tiny data area common symbol. */
  103. #define SHN_V850_TCOMMON (SHN_LORESERVE + 1)
  104. /* Zero data area common symbol. */
  105. #define SHN_V850_ZCOMMON (SHN_LORESERVE + 2)
  106. /* Processor specific section types. */
  107. /* Section contains the .scommon data. */
  108. #define SHT_V850_SCOMMON 0x70000000
  109. /* Section contains the .scommon data. */
  110. #define SHT_V850_TCOMMON 0x70000001
  111. /* Section contains the .scommon data. */
  112. #define SHT_V850_ZCOMMON 0x70000002
  113. /* Processor specific section flags. */
  114. /* This section must be in the small data area (pointed to by GP). */
  115. #define SHF_V850_GPREL 0x10000000
  116. /* This section must be in the tiny data area (pointed to by EP). */
  117. #define SHF_V850_EPREL 0x20000000
  118. /* This section must be in the zero data area (pointed to by R0). */
  119. #define SHF_V850_R0REL 0x40000000
  120. /* Alternative versions of the above definitions, as specified by the RH850 ABI. */
  121. #define EF_RH850_ABI 0xF0000000
  122. #define EF_V800_850E3 0x00100000
  123. #define EF_RH850_FPU_DOUBLE 0x00000001 /* sizeof(double) == 8. */
  124. #define EF_RH850_FPU_SINGLE 0x00000002 /* sizeof(double) == 4. */
  125. #define EF_RH850_REGMODE22 0x00000020 /* Registers r15-r24 (inclusive) are not used. */
  126. #define EF_RH850_REGMODE32 0x00000040
  127. #define EF_RH850_GP_FIX 0x00000100 /* r4 is fixed. */
  128. #define EF_RH850_GP_NOFIX 0x00000200 /* r4 is callee save. */
  129. #define EF_RH850_EP_FIX 0x00000400 /* r30 is fixed. */
  130. #define EF_RH850_EP_NOFIX 0x00000800 /* r30 is callee save. */
  131. #define EF_RH850_TP_FIX 0x00001000 /* r5 is fixed. */
  132. #define EF_RH850_TP_NOFIX 0x00002000 /* r5 is callee save. */
  133. #define EF_RH850_REG2_RESERVE 0x00004000 /* r2 is fixed. */
  134. #define EF_RH850_REG2_NORESERVE 0x00008000 /* r2 is callee saved. */
  135. #define SHT_RENESAS_IOP SHT_LOUSER /* Used by Renesas linker. */
  136. #define SHF_RENESAS_ABS 0x80000000 /* Absolute section. */
  137. #define SHF_GHS_ABS 0x00000400 /* Use unknown. */
  138. #define STT_RENESAS_ENTRY 14 /* Set for functions called at reset time. */
  139. START_RELOC_NUMBERS (v800_reloc_type)
  140. RELOC_NUMBER (R_V800_NONE, 0x00)
  141. RELOC_NUMBER (R_V810_NONE, 0x30)
  142. RELOC_NUMBER (R_V810_BYTE, 0x31)
  143. RELOC_NUMBER (R_V810_HWORD, 0x32)
  144. RELOC_NUMBER (R_V810_WORD, 0x33)
  145. RELOC_NUMBER (R_V810_WLO, 0x34)
  146. RELOC_NUMBER (R_V810_WHI, 0x35)
  147. RELOC_NUMBER (R_V810_WHI1, 0x36)
  148. RELOC_NUMBER (R_V810_GPBYTE, 0x37)
  149. RELOC_NUMBER (R_V810_GPHWORD, 0x38)
  150. RELOC_NUMBER (R_V810_GPWORD, 0x39)
  151. RELOC_NUMBER (R_V810_GPWLO, 0x3a)
  152. RELOC_NUMBER (R_V810_GPWHI, 0x3b)
  153. RELOC_NUMBER (R_V810_GPWHI1, 0x3c)
  154. RELOC_NUMBER (R_V850_HWLO, 0x3d)
  155. FAKE_RELOC (R_V810_reserved1, 0x3e)
  156. RELOC_NUMBER (R_V850_EP7BIT, 0x3f)
  157. RELOC_NUMBER (R_V850_EPHBYTE, 0x40)
  158. RELOC_NUMBER (R_V850_EPWBYTE, 0x41)
  159. RELOC_NUMBER (R_V850_REGHWLO, 0x42)
  160. FAKE_RELOC (R_V810_reserved2, 0x43)
  161. RELOC_NUMBER (R_V850_GPHWLO, 0x44)
  162. FAKE_RELOC (R_V810_reserved3, 0x45)
  163. RELOC_NUMBER (R_V850_PCR22, 0x46)
  164. RELOC_NUMBER (R_V850_BLO, 0x47)
  165. RELOC_NUMBER (R_V850_EP4BIT, 0x48)
  166. RELOC_NUMBER (R_V850_EP5BIT, 0x49)
  167. RELOC_NUMBER (R_V850_REGBLO, 0x4a)
  168. RELOC_NUMBER (R_V850_GPBLO, 0x4b)
  169. RELOC_NUMBER (R_V810_WLO_1, 0x4c)
  170. RELOC_NUMBER (R_V810_GPWLO_1, 0x4d)
  171. RELOC_NUMBER (R_V850_BLO_1, 0x4e)
  172. RELOC_NUMBER (R_V850_HWLO_1, 0x4f)
  173. FAKE_RELOC (R_V810_reserved4, 0x50)
  174. RELOC_NUMBER (R_V850_GPBLO_1, 0x51)
  175. RELOC_NUMBER (R_V850_GPHWLO_1, 0x52)
  176. FAKE_RELOC (R_V810_reserved5, 0x53)
  177. RELOC_NUMBER (R_V850_EPBLO, 0x54)
  178. RELOC_NUMBER (R_V850_EPHWLO, 0x55)
  179. FAKE_RELOC (R_V810_reserved6, 0x56)
  180. RELOC_NUMBER (R_V850_EPWLO_N, 0x57)
  181. RELOC_NUMBER (R_V850_PC32, 0x58)
  182. RELOC_NUMBER (R_V850_W23BIT, 0x59)
  183. RELOC_NUMBER (R_V850_GPW23BIT, 0x5a)
  184. RELOC_NUMBER (R_V850_EPW23BIT, 0x5b)
  185. RELOC_NUMBER (R_V850_B23BIT, 0x5c)
  186. RELOC_NUMBER (R_V850_GPB23BIT, 0x5d)
  187. RELOC_NUMBER (R_V850_EPB23BIT, 0x5e)
  188. RELOC_NUMBER (R_V850_PC16U, 0x5f)
  189. RELOC_NUMBER (R_V850_PC17, 0x60)
  190. RELOC_NUMBER (R_V850_DW8, 0x61)
  191. RELOC_NUMBER (R_V850_GPDW8, 0x62)
  192. RELOC_NUMBER (R_V850_EPDW8, 0x63)
  193. RELOC_NUMBER (R_V850_PC9, 0x64)
  194. RELOC_NUMBER (R_V810_REGBYTE, 0x65)
  195. RELOC_NUMBER (R_V810_REGHWORD, 0x66)
  196. RELOC_NUMBER (R_V810_REGWORD, 0x67)
  197. RELOC_NUMBER (R_V810_REGWLO, 0x68)
  198. RELOC_NUMBER (R_V810_REGWHI, 0x69)
  199. RELOC_NUMBER (R_V810_REGWHI1, 0x6a)
  200. RELOC_NUMBER (R_V850_REGW23BIT, 0x6b)
  201. RELOC_NUMBER (R_V850_REGB23BIT, 0x6c)
  202. RELOC_NUMBER (R_V850_REGDW8, 0x6d)
  203. RELOC_NUMBER (R_V810_EPBYTE, 0x6e)
  204. RELOC_NUMBER (R_V810_EPHWORD, 0x6f)
  205. RELOC_NUMBER (R_V810_EPWORD, 0x70)
  206. RELOC_NUMBER (R_V850_WLO23, 0x71)
  207. RELOC_NUMBER (R_V850_WORD_E, 0x72)
  208. RELOC_NUMBER (R_V850_REGWORD_E, 0x73)
  209. RELOC_NUMBER (R_V850_WORD, 0x74)
  210. RELOC_NUMBER (R_V850_GPWORD, 0x75)
  211. RELOC_NUMBER (R_V850_REGWORD, 0x76)
  212. RELOC_NUMBER (R_V850_EPWORD, 0x77)
  213. RELOC_NUMBER (R_V810_TPBYTE, 0x78)
  214. RELOC_NUMBER (R_V810_TPHWORD, 0x79)
  215. RELOC_NUMBER (R_V810_TPWORD, 0x7a)
  216. RELOC_NUMBER (R_V810_TPWLO, 0x7b)
  217. RELOC_NUMBER (R_V810_TPWHI, 0x7c)
  218. RELOC_NUMBER (R_V810_TPWHI1, 0x7d)
  219. RELOC_NUMBER (R_V850_TPHWLO, 0x7e)
  220. RELOC_NUMBER (R_V850_TPBLO, 0x7f)
  221. RELOC_NUMBER (R_V810_TPWLO_1, 0x80)
  222. RELOC_NUMBER (R_V850_TPBLO_1, 0x81)
  223. RELOC_NUMBER (R_V850_TPHWLO_1, 0x82)
  224. RELOC_NUMBER (R_V850_TP23BIT, 0x83)
  225. RELOC_NUMBER (R_V850_TPW23BIT, 0x84)
  226. RELOC_NUMBER (R_V850_TPDW8, 0x85)
  227. /* These are defined by the RH850 ABI, but not used. */
  228. RELOC_NUMBER (R_V810_ABS32, 0xa0)
  229. RELOC_NUMBER (R_V850_SYM, 0xe0)
  230. RELOC_NUMBER (R_V850_OPadd, 0xe1)
  231. RELOC_NUMBER (R_V850_OPsub, 0xe2)
  232. RELOC_NUMBER (R_V850_OPsctsize, 0xe3)
  233. RELOC_NUMBER (R_V850_OPscttop, 0xe4)
  234. END_RELOC_NUMBERS (R_V800_max)
  235. /* Type for Renesas note sections. NB/ This is in application space
  236. rather than processor space as it refers to the requirements of the
  237. binary concerned. A given processor may be able to handle multiple
  238. different types of application. */
  239. #define SHT_RENESAS_INFO 0xa0000000
  240. /* Contents of a Renesas note entry:
  241. namesz +------------------+
  242. | 4 | "REL\0"
  243. descsz +------------------+
  244. | 4 | Currently 4byte only
  245. type +------------------+
  246. | ID |
  247. name +------------------+
  248. | REL\0 |
  249. desc +------------------+
  250. | Value |
  251. +------------------+ */
  252. #define V850_NOTE_SECNAME ".note.renesas"
  253. #define SIZEOF_V850_NOTE 20
  254. #define V850_NOTE_NAME "REL"
  255. enum v850_notes
  256. {
  257. V850_NOTE_ALIGNMENT = 1, /* Alignment of 8-byte entities. */
  258. #define EF_RH850_DATA_ALIGN4 0x0001 /* Aligned to 4-byte bounadries. */
  259. #define EF_RH850_DATA_ALIGN8 0x0002 /* Aligned to 8-byte bounadries. */
  260. V850_NOTE_DATA_SIZE = 2, /* Sizeof double and long double. */
  261. #define EF_RH850_DOUBLE32 0x0001 /* 32-bits in size. */
  262. #define EF_RH850_DOUBLE64 0x0002 /* 64-bits in size. */
  263. V850_NOTE_FPU_INFO = 3, /* Defined if extended floating point insns are used. */
  264. #define EF_RH850_FPU20 0x0001 /* Set if [N]]M{ADD|SUB}F.S are used. */
  265. #define EF_RH850_FPU30 0x0002 /* Set if ADSF.D or ADDF.D is used. */
  266. V850_NOTE_SIMD_INFO = 4,
  267. #define EF_RH850_SIMD 0x0001
  268. V850_NOTE_CACHE_INFO = 5,
  269. #define EF_RH850_CACHE 0x0001
  270. V850_NOTE_MMU_INFO = 6
  271. #define EF_RH850_MMU 0x0001
  272. };
  273. #define NUM_V850_NOTES V850_NOTE_MMU_INFO
  274. #endif /* _ELF_V850_H */