0006-lm32.patch 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. --- elf2flt-453398f917d167f8c308c8f997270c48ae8f8b12.orig/elf2flt.c 2025-04-14 19:50:51.016711969 +0000
  2. +++ elf2flt-453398f917d167f8c308c8f997270c48ae8f8b12/elf2flt.c 2025-04-14 21:41:22.134771290 +0000
  3. @@ -62,6 +62,8 @@ const char *elf2flt_progname;
  4. #include <elf/bfin.h>
  5. #elif defined(TARGET_h8300)
  6. #include <elf/h8.h>
  7. +#elif defined(TARGET_lm32)
  8. +#include <elf/lm32.h>
  9. #elif defined(TARGET_m68k)
  10. #include <elf/m68k.h>
  11. #elif defined(TARGET_microblaze)
  12. @@ -115,6 +117,12 @@ const char *elf2flt_progname;
  13. #define ARCH "sh2"
  14. #elif defined(TARGET_h8300)
  15. #define ARCH "h8300"
  16. +#elif defined(TARGET_lm32)
  17. +#define ARCH "lm32"
  18. +#define FLAT_LM32_RELOC_TYPE_32_BIT 0
  19. +#define FLAT_LM32_RELOC_TYPE_HI16_BIT 1
  20. +#define FLAT_LM32_RELOC_TYPE_LO16_BIT 2
  21. +#define FLAT_LM32_RELOC_TYPE_PERSIST 3
  22. #elif defined(TARGET_microblaze)
  23. #define ARCH "microblaze"
  24. #elif defined(TARGET_e1)
  25. @@ -375,7 +383,7 @@ output_relocs (
  26. int bad_relocs = 0;
  27. asymbol **symb;
  28. long nsymb;
  29. -#ifdef TARGET_bfin
  30. +#if defined(TARGET_bfin) || defined(TARGET_lm32)
  31. unsigned long persistent_data = 0;
  32. #endif
  33. @@ -674,6 +682,40 @@ output_relocs (
  34. break;
  35. default:
  36. goto bad_resolved_reloc;
  37. +#elif defined(TARGET_lm32)
  38. + case R_LM32_HI16:
  39. + case R_LM32_LO16:
  40. + sym_vma = elf2flt_bfd_section_vma(abs_bfd, sym_section);
  41. + sym_addr += sym_vma + q->addend;
  42. + /* remember the upper 16 bits */
  43. + if ((0xFFFF0000UL & sym_addr) != persistent_data) {
  44. + flat_relocs = (uint32_t *)realloc(flat_relocs,
  45. + (flat_reloc_count + 1) * sizeof (uint32_t));
  46. + if (verbose)
  47. + printf("New persistent data for %08"PRIx32"\n", sym_addr);
  48. + persistent_data = 0xFFFF0000UL & sym_addr;
  49. + pflags = FLAT_LM32_RELOC_TYPE_PERSIST;
  50. + pflags <<= 29;
  51. + flat_relocs[flat_reloc_count++] = pflags | (sym_addr >> 16);
  52. + }
  53. + pflags = q->howto->type == R_LM32_HI16 ?
  54. + FLAT_LM32_RELOC_TYPE_HI16_BIT :
  55. + FLAT_LM32_RELOC_TYPE_LO16_BIT;
  56. + pflags <<= 29;
  57. + relocation_needed = 1;
  58. + break;
  59. + case R_LM32_32:
  60. + sym_vma = elf2flt_bfd_section_vma(abs_bfd, sym_section);
  61. + sym_addr += sym_vma + q->addend;
  62. + pflags = FLAT_LM32_RELOC_TYPE_32_BIT;
  63. + pflags <<= 29;
  64. + relocation_needed = 1;
  65. + break;
  66. + case R_LM32_CALL:
  67. + relocation_needed = 0;
  68. + break;
  69. + default:
  70. + goto bad_resolved_reloc;
  71. #elif defined(TARGET_m68k)
  72. case R_68K_32:
  73. goto good_32bit_resolved_reloc;
  74. @@ -1010,6 +1052,63 @@ output_relocs (
  75. continue;
  76. #endif
  77. +#ifdef TARGET_lm32
  78. + case R_LM32_HI16:
  79. + case R_LM32_LO16:
  80. + sym_vma = elf2flt_bfd_section_vma(abs_bfd, sym_section);
  81. + sym_addr += sym_vma + q->addend;
  82. + /* remember the upper 16 bits */
  83. + if ((0xFFFF0000UL & sym_addr) != persistent_data) {
  84. + flat_relocs = (uint32_t *)realloc(flat_relocs,
  85. + (flat_reloc_count + 1) * sizeof (uint32_t));
  86. + if (verbose)
  87. + printf("New persistent data for %08"PRIx32"\n", sym_addr);
  88. + persistent_data = 0xFFFF0000UL & sym_addr;
  89. + pflags = FLAT_LM32_RELOC_TYPE_PERSIST;
  90. + pflags <<= 29;
  91. + flat_relocs[flat_reloc_count++] = pflags | (sym_addr >> 16);
  92. + }
  93. + pflags = q->howto->type == R_LM32_HI16 ?
  94. + FLAT_LM32_RELOC_TYPE_HI16_BIT :
  95. + FLAT_LM32_RELOC_TYPE_LO16_BIT;
  96. + pflags <<= 29;
  97. + relocation_needed = 1;
  98. + break;
  99. + case R_LM32_32:
  100. + sym_vma = elf2flt_bfd_section_vma(abs_bfd, sym_section);
  101. + sym_addr += sym_vma + q->addend;
  102. + pflags = FLAT_LM32_RELOC_TYPE_32_BIT;
  103. + pflags <<= 29;
  104. + relocation_needed = 1;
  105. + break;
  106. + case R_LM32_CALL:
  107. + sym_vma = 0;
  108. + sym_addr += sym_vma + q->addend;
  109. + sym_addr -= q->address;
  110. + sym_addr = (int32_t)sym_addr >> q->howto->rightshift;
  111. + {
  112. + union {
  113. + uint32_t u;
  114. + int32_t s;
  115. + } rangecheck;
  116. +
  117. + rangecheck.u = (unsigned)sym_addr << 6;
  118. + rangecheck.s >>= 6;
  119. + if (rangecheck.u != sym_addr) {
  120. + printf("ERROR: Relocation overflow for R_LM32_CALL relocation against %s\n", sym_name);
  121. + ++bad_relocs;
  122. + continue;
  123. + }
  124. + }
  125. + relocation_needed = 0;
  126. + r_mem[0] = (r_mem[0] & 0xFCU) |
  127. + ((sym_addr >> 24) & 0x03U);
  128. + r_mem[1] = (sym_addr >> 16) & 0xFFU;
  129. + r_mem[2] = (sym_addr >> 8) & 0xFFU;
  130. + r_mem[3] = sym_addr & 0xFFU;
  131. + break;
  132. +#endif
  133. +
  134. #ifdef TARGET_microblaze
  135. case R_MICROBLAZE_64:
  136. /* The symbol is split over two consecutive instructions.
  137. @@ -1596,6 +1695,21 @@ DIS29_RELOCATION:
  138. break;
  139. #endif
  140. +#ifdef TARGET_lm32
  141. + case R_LM32_HI16:
  142. + case R_LM32_LO16:
  143. + r_mem[2] = (sym_addr >> 8) & 0xFFU;
  144. + r_mem[3] = sym_addr & 0xFFU;
  145. + break;
  146. + case R_LM32_CALL:
  147. + /*
  148. + * use_resolved=…
  149. + * 0: already written above
  150. + * 1: no write necessary
  151. + */
  152. + break;
  153. +#endif
  154. +
  155. default:
  156. /* The alignment of the build host
  157. might be stricter than that of the
  158. --- elf2flt-453398f917d167f8c308c8f997270c48ae8f8b12.orig/elf2flt.ld.in 2025-04-14 19:50:51.020711942 +0000
  159. +++ elf2flt-453398f917d167f8c308c8f997270c48ae8f8b12/elf2flt.ld.in 2025-04-14 22:23:40.078052838 +0000
  160. @@ -34,6 +34,7 @@ W_RODAT *(.rodata)
  161. W_RODAT *(.rodata1)
  162. W_RODAT *(.rodata.*)
  163. W_RODAT *(.gnu.linkonce.r*)
  164. +W_RODAT *(.rofixup)
  165. /* .ARM.extab name sections containing exception unwinding information */
  166. *(.ARM.extab* .gnu.linkonce.armextab.*)
  167. --- elf2flt-453398f917d167f8c308c8f997270c48ae8f8b12.orig/flthdr.c 2025-04-14 19:50:43.924759193 +0000
  168. +++ elf2flt-453398f917d167f8c308c8f997270c48ae8f8b12/flthdr.c 2025-04-14 22:01:24.467101158 +0000
  169. @@ -33,6 +33,8 @@ const char *elf2flt_progname;
  170. #if defined TARGET_bfin
  171. # define flat_get_relocate_addr(addr) (addr & 0x03ffffff)
  172. +#elif defined(TARGET_lm32)
  173. +# define flat_get_relocate_addr(addr) ((addr) & 0x1FFFFFFFU)
  174. #else
  175. # define flat_get_relocate_addr(addr) (addr)
  176. #endif
  177. @@ -173,6 +175,8 @@ process_file(const char *ifile, const ch
  178. addr = ntohl(addr);
  179. if (r & 1)
  180. addr &= 0x00ffffff;
  181. +#elif defined(TARGET_lm32)
  182. + addr = ntohl(addr);
  183. #endif
  184. printf("%"PRIx32"\n", addr);
  185. }