|
@@ -1,165 +0,0 @@
|
|
|
-From f5d1ee11dfc74dba39110cbefde93c53ae1cf3df Mon Sep 17 00:00:00 2001
|
|
|
-From: Waldemar Brodkorb <wbx@openadk.org>
|
|
|
-Date: Sat, 19 Mar 2016 18:35:06 +0100
|
|
|
-Subject: [PATCH] lm32: add support for architecture
|
|
|
-
|
|
|
-Add lm32 support patch from:
|
|
|
-https://github.com/m-labs/elf2flt-lm32
|
|
|
-
|
|
|
-Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
|
|
|
----
|
|
|
- elf2flt.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
|
|
- 1 file changed, 102 insertions(+), 1 deletion(-)
|
|
|
-
|
|
|
-diff --git a/elf2flt.c b/elf2flt.c
|
|
|
-index 7d0e639..3b59b92 100644
|
|
|
---- a/elf2flt.c
|
|
|
-+++ b/elf2flt.c
|
|
|
-@@ -62,6 +62,8 @@ const char *elf2flt_progname;
|
|
|
- #include "cygwin-elf.h" /* Cygwin uses a local copy */
|
|
|
- #elif defined(TARGET_xtensa)
|
|
|
- #include <elf/xtensa.h> /* TARGET_* ELF support for the BFD library */
|
|
|
-+#elif defined(TARGET_lm32)
|
|
|
-+#include <elf/lm32.h>
|
|
|
- #elif defined(TARGET_microblaze)
|
|
|
- #include <elf/microblaze.h> /* TARGET_* ELF support for the BFD library */
|
|
|
- #elif defined(TARGET_v850)
|
|
|
-@@ -115,6 +117,11 @@ const char *elf2flt_progname;
|
|
|
- #define ARCH "nios"
|
|
|
- #elif defined(TARGET_nios2)
|
|
|
- #define ARCH "nios2"
|
|
|
-+#elif defined(TARGET_lm32)
|
|
|
-+#define ARCH "lm32"
|
|
|
-+#define FLAT_LM32_RELOC_TYPE_32_BIT 0
|
|
|
-+#define FLAT_LM32_RELOC_TYPE_HI16_BIT 1
|
|
|
-+#define FLAT_LM32_RELOC_TYPE_LO16_BIT 2
|
|
|
- #elif defined(TARGET_xtensa)
|
|
|
- #define ARCH "xtensa"
|
|
|
- #else
|
|
|
-@@ -345,7 +352,7 @@ output_relocs (
|
|
|
- int bad_relocs = 0;
|
|
|
- asymbol **symb;
|
|
|
- long nsymb;
|
|
|
--#ifdef TARGET_bfin
|
|
|
-+#if defined (TARGET_bfin) || defined (TARGET_lm32)
|
|
|
- unsigned long persistent_data = 0;
|
|
|
- #endif
|
|
|
-
|
|
|
-@@ -669,6 +676,36 @@ dump_symbols(symbols, number_of_symbols);
|
|
|
- break;
|
|
|
- default:
|
|
|
- goto bad_resolved_reloc;
|
|
|
-+#elif defined(TARGET_lm32)
|
|
|
-+ case R_LM32_HI16:
|
|
|
-+ case R_LM32_LO16:
|
|
|
-+ if (q->howto->type == R_LM32_HI16) {
|
|
|
-+ pflags = FLAT_LM32_RELOC_TYPE_HI16_BIT << 29;
|
|
|
-+ } else {
|
|
|
-+ pflags = FLAT_LM32_RELOC_TYPE_LO16_BIT << 29;
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ relocation_needed = 1;
|
|
|
-+
|
|
|
-+ /* remember the upper 16 bits */
|
|
|
-+ if ((0xffff0000 & sym_addr) != persistent_data) {
|
|
|
-+ flat_relocs = (uint32_t *)
|
|
|
-+ (realloc (flat_relocs, (flat_reloc_count + 1) * sizeof (uint32_t)));
|
|
|
-+ if (verbose)
|
|
|
-+ printf ("New persistent data for %08lx\n", sym_addr);
|
|
|
-+ persistent_data = 0xffff0000 & sym_addr;
|
|
|
-+ flat_relocs[flat_reloc_count++] = (sym_addr >> 16) | (3 << 29);
|
|
|
-+ }
|
|
|
-+ break;
|
|
|
-+ case R_LM32_32:
|
|
|
-+ pflags = FLAT_LM32_RELOC_TYPE_32_BIT << 29;
|
|
|
-+ relocation_needed = 1;
|
|
|
-+ break;
|
|
|
-+ case R_LM32_CALL:
|
|
|
-+ relocation_needed = 0;
|
|
|
-+ break;
|
|
|
-+ default:
|
|
|
-+ goto bad_resolved_reloc;
|
|
|
- #elif defined(TARGET_m68k)
|
|
|
- case R_68K_32:
|
|
|
- goto good_32bit_resolved_reloc;
|
|
|
-@@ -1447,6 +1484,63 @@ DIS29_RELOCATION:
|
|
|
- #undef _30BITS_RELOC
|
|
|
- #undef _28BITS_RELOC
|
|
|
- #endif
|
|
|
-+#ifdef TARGET_lm32
|
|
|
-+ case R_LM32_32:
|
|
|
-+ {
|
|
|
-+ pflags = FLAT_LM32_RELOC_TYPE_32_BIT << 29;
|
|
|
-+ sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
|
|
-+ sym_addr += sym_vma + q->addend;
|
|
|
-+ relocation_needed = 1;
|
|
|
-+ break;
|
|
|
-+ }
|
|
|
-+ case R_LM32_CALL:
|
|
|
-+ {
|
|
|
-+ sym_vma = 0;
|
|
|
-+ sym_addr += sym_vma + q->addend;
|
|
|
-+ sym_addr -= q->address;
|
|
|
-+ sym_addr = (int32_t)sym_addr >> q->howto->rightshift;
|
|
|
-+
|
|
|
-+ if ((int32_t)sym_addr < -0x8000000 || (int32_t)sym_addr > 0x7ffffff) {
|
|
|
-+ printf("ERROR: Relocation overflow for R_LM32_CALL relocation against %s\n", sym_name);
|
|
|
-+ bad_relocs++;
|
|
|
-+ continue;
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ r_mem[0] |= (sym_addr >> 24) & 0x03;
|
|
|
-+ r_mem[1] = (sym_addr >> 16) & 0xff;
|
|
|
-+ r_mem[2] = (sym_addr >> 8) & 0xff;
|
|
|
-+ r_mem[3] = sym_addr & 0xff;
|
|
|
-+ break;
|
|
|
-+ }
|
|
|
-+ case R_LM32_HI16:
|
|
|
-+ case R_LM32_LO16:
|
|
|
-+ {
|
|
|
-+ if (q->howto->type == R_LM32_HI16) {
|
|
|
-+ pflags = FLAT_LM32_RELOC_TYPE_HI16_BIT << 29;
|
|
|
-+ } else {
|
|
|
-+ pflags = FLAT_LM32_RELOC_TYPE_LO16_BIT << 29;
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
|
|
-+ sym_addr += sym_vma + q->addend;
|
|
|
-+
|
|
|
-+ relocation_needed = 1;
|
|
|
-+
|
|
|
-+ /* remember the upper 16 bits */
|
|
|
-+ if ((0xffff0000 & sym_addr) != persistent_data) {
|
|
|
-+ flat_relocs = (uint32_t *)
|
|
|
-+ (realloc (flat_relocs, (flat_reloc_count + 1) * sizeof (uint32_t)));
|
|
|
-+ if (verbose)
|
|
|
-+ printf ("New persistent data for %08lx\n", sym_addr);
|
|
|
-+ persistent_data = 0xffff0000 & sym_addr;
|
|
|
-+ flat_relocs[flat_reloc_count++] = (sym_addr >> 16) | (3 << 29);
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ r_mem[2] = (sym_addr >> 8) & 0xff;
|
|
|
-+ r_mem[3] = sym_addr & 0xff;
|
|
|
-+ break;
|
|
|
-+ }
|
|
|
-+#endif /* TARGET_lm32 */
|
|
|
- default:
|
|
|
- /* missing support for other types of relocs */
|
|
|
- printf("ERROR: bad reloc type %d\n", (*p)->howto->type);
|
|
|
-@@ -1584,6 +1678,13 @@ DIS29_RELOCATION:
|
|
|
- break;
|
|
|
- #endif
|
|
|
-
|
|
|
-+#ifdef TARGET_lm32
|
|
|
-+ case R_LM32_HI16:
|
|
|
-+ case R_LM32_LO16:
|
|
|
-+ case R_LM32_CALL:
|
|
|
-+ /* entry has already been written */
|
|
|
-+ break;
|
|
|
-+#endif
|
|
|
- default:
|
|
|
- /* The alignment of the build host
|
|
|
- might be stricter than that of the
|
|
|
---
|
|
|
-2.1.4
|
|
|
-
|