From f172737d165dd7c255e5020c0b57545ccb432bad Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <wbx@openadk.org>
Date: Sun, 20 Mar 2016 15:58:46 +0100
Subject: add lm32 support to elf2flt

---
 toolchain/elf2flt/Makefile.inc                     |   1 +
 .../0001-lm32-add-support-for-architecture.patch   | 165 +++++++++++++++++++++
 2 files changed, 166 insertions(+)
 create mode 100644 toolchain/elf2flt/patches/git/0001-lm32-add-support-for-architecture.patch

(limited to 'toolchain/elf2flt')

diff --git a/toolchain/elf2flt/Makefile.inc b/toolchain/elf2flt/Makefile.inc
index be2b4b07b..ea5667fa7 100644
--- a/toolchain/elf2flt/Makefile.inc
+++ b/toolchain/elf2flt/Makefile.inc
@@ -2,5 +2,6 @@
 # material, please see the LICENCE file in the top-level directory.
 
 PKG_NAME:=		elf2flt
+PKG_VERSION:=		git
 PKG_RELEASE:=		1
 PKG_SITES:=		https://github.com/uclinux-dev/elf2flt.git
diff --git a/toolchain/elf2flt/patches/git/0001-lm32-add-support-for-architecture.patch b/toolchain/elf2flt/patches/git/0001-lm32-add-support-for-architecture.patch
new file mode 100644
index 000000000..2bb9e13e1
--- /dev/null
+++ b/toolchain/elf2flt/patches/git/0001-lm32-add-support-for-architecture.patch
@@ -0,0 +1,165 @@
+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
+
-- 
cgit v1.2.3