summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Fan <van.freenix@gmail.com>2013-07-22 11:01:42 +0800
committerPeng Fan <van.freenix@gmail.com>2013-09-05 13:47:39 +0800
commit0b41f6ca89bb130b66f1acc0caffda9100f53f0f (patch)
tree944de1618f66431474fc83a7c0bb607f3716aa9e
parent0c4eed48fd7b9983ecf4a94c49cecb59de6c5556 (diff)
V850 Support
Signed-off-by: Peng Fan <van.freenix@gmail.com>
-rw-r--r--init.c11
-rw-r--r--libbsd/include/arch/v850/machine/ansi.h0
-rw-r--r--libbsd/include/arch/v850/machine/asm.h2
-rw-r--r--libbsd/include/arch/v850/machine/cdefs.h0
-rw-r--r--libbsd/include/arch/v850/machine/elf_machdep.h74
-rw-r--r--libbsd/include/arch/v850/machine/int_types.h0
-rw-r--r--rtl-mdreloc-v850.c97
-rw-r--r--shell-init2
-rw-r--r--testcase/Readme9
-rw-r--r--testcase/wscript12
-rw-r--r--wscript2
11 files changed, 207 insertions, 2 deletions
diff --git a/init.c b/init.c
index c50d448..f36109c 100644
--- a/init.c
+++ b/init.c
@@ -23,7 +23,16 @@
* Configure base RTEMS resources.
*/
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+/*
+ * v850sim bsp only has 1M ram
+ */
+#if defined(__v850__)
+#define CONFIGURE_MEMORY_OVERHEAD 210
+#else
#define CONFIGURE_MEMORY_OVERHEAD 512
+#endif
+
#define CONFIGURE_MAXIMUM_TASKS rtems_resource_unlimited (10)
#define CONFIGURE_MAXIMUM_SEMAPHORES rtems_resource_unlimited (10)
#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES rtems_resource_unlimited (5)
@@ -54,7 +63,9 @@
#define CONFIGURE_ATA_DRIVER_TASK_PRIORITY 14
#endif
+#if !defined(__v850__)
#define CONFIGURE_FILESYSTEM_ALL
+#endif
/**
* Tell confdefs.h to provide the configuration.
diff --git a/libbsd/include/arch/v850/machine/ansi.h b/libbsd/include/arch/v850/machine/ansi.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libbsd/include/arch/v850/machine/ansi.h
diff --git a/libbsd/include/arch/v850/machine/asm.h b/libbsd/include/arch/v850/machine/asm.h
new file mode 100644
index 0000000..b3a7a95
--- /dev/null
+++ b/libbsd/include/arch/v850/machine/asm.h
@@ -0,0 +1,2 @@
+
+#define __CONCAT(x,y) x ## y
diff --git a/libbsd/include/arch/v850/machine/cdefs.h b/libbsd/include/arch/v850/machine/cdefs.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libbsd/include/arch/v850/machine/cdefs.h
diff --git a/libbsd/include/arch/v850/machine/elf_machdep.h b/libbsd/include/arch/v850/machine/elf_machdep.h
new file mode 100644
index 0000000..b76d149
--- /dev/null
+++ b/libbsd/include/arch/v850/machine/elf_machdep.h
@@ -0,0 +1,74 @@
+#define ELF32_MACHDEP_ENDIANNESS ELFDATA2LSB
+
+#define ELF32_MACHDEP_ID_CASES \
+ case EM_V850: \
+ break;
+
+#define ELF32_MACHDEP_ID EM_V850
+
+
+
+#define EF_V850_ARCH 0xf0000000
+#define E_V850_ARCH 0x00000000
+#define E_V850E_ARCH 0x10000000
+#define E_V850E1_ARCH 0x20000000
+#define E_V850E2_ARCH 0x30000000
+#define E_V850E2V3_ARCH 0x40000000
+
+#define ARCH_ELFSIZE 32
+
+
+#define R_V850_NONE 0
+#define R_V850_9_PCREL 1
+#define R_V850_22_PCREL 2
+#define R_V850_HI16_S 3
+#define R_V850_HI16 4
+#define R_V850_LO16 5
+#define R_V850_ABS32 6
+#define R_V850_16 7
+#define R_V850_8 8
+#define R_V850_SDA_16_16_OFFSET 9
+#define R_V850_SDA_15_16_OFFSET 10
+#define R_V850_ZDA_16_16_OFFSET 11
+#define R_V850_ZDA_15_16_OFFSET 12
+#define R_V850_TDA_6_8_OFFSET 13
+#define R_V850_TDA_7_8_OFFSET 14
+#define R_V850_TDA_7_7_OFFSET 15
+#define R_V850_TDA_16_16_OFFSET 16
+#define R_V850_TDA_4_5_OFFSET 17
+#define R_V850_TDA_4_4_OFFSET 18
+#define R_V850_SDA_16_16_SPLIT_OFFSET 19
+#define R_V850_ZDA_16_16_SPLIT_OFFSET 20
+#define R_V850_CALLT_6_7_OFFSET 21
+#define R_V850_CALLT_16_16_OFFSET 22
+#define R_V850_GNU_VTINHERIT 23
+#define R_V850_GNU_VTENTRY 24
+#define R_V850_LONGCALL 25
+#define R_V850_LONGJUMP 26
+#define R_V850_ALIGN 27
+#define R_V850_REL32 28
+#define R_V850_LO16_SPLIT_OFFSET 29
+#define R_V850_16_PCREL 30
+#define R_V850_17_PCREL 31
+#define R_V850_23 32
+#define R_V850_32_PCREL 33
+#define R_V850_32_ABS 34
+#define R_V850_16_SPLIT_OFFSET 35
+#define R_V850_16_S1 36
+#define R_V850_LO16_S1 37
+#define R_V850_CALLT_15_16_OFFSET 38
+#define R_V850_32_GOTPCREL 39
+#define R_V850_16_GOT 40
+#define R_V850_32_GOT 41
+#define R_V850_22_PLT 42
+#define R_V850_32_PLT 43
+#define R_V850_COPY 44
+#define R_V850_GLOB_DAT 45
+#define R_V850_JMP_SLOT 46
+#define R_V850_RELATIVE 47
+#define R_V850_16_GOTOFF 48
+#define R_V850_32_GOTOFF 49
+#define R_V850_CODE 50
+#define R_V850_DATA 51
+
+#define R_TYPE(name) __CONCAT(R_V850_,name)
diff --git a/libbsd/include/arch/v850/machine/int_types.h b/libbsd/include/arch/v850/machine/int_types.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libbsd/include/arch/v850/machine/int_types.h
diff --git a/rtl-mdreloc-v850.c b/rtl-mdreloc-v850.c
new file mode 100644
index 0000000..aaa9ba3
--- /dev/null
+++ b/rtl-mdreloc-v850.c
@@ -0,0 +1,97 @@
+
+#include <sys/cdefs.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <rtl.h>
+#include "rtl-elf.h"
+#include "rtl-error.h"
+#include <rtl-trace.h>
+
+bool
+rtems_rtl_elf_rel_resolve_sym (Elf_Word type)
+{
+ return true;
+}
+
+bool
+rtems_rtl_elf_relocate_rela (const rtems_rtl_obj_t* obj,
+ const Elf_Rela* rela,
+ const rtems_rtl_obj_sect_t* sect,
+ const char* symname,
+ const Elf_Byte syminfo,
+ const Elf_Word symvalue)
+{
+ Elf_Addr *where;
+ Elf_Word tmp;
+
+ where = (Elf_Addr *)(sect->base + rela->r_offset);
+
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_RELOC)) {
+ printf("rela relocation type is %ld\n", ELF_R_TYPE(rela->r_info));
+ printf("relocated address 0x%08lx\n", (Elf_Addr)where);
+ }
+
+ switch (ELF_R_TYPE(rela->r_info)) {
+ case R_TYPE(NONE):
+ break;
+
+ case R_TYPE(HI16_S):
+ tmp = (Elf_Sword)(symvalue + rela->r_addend) >> 16;
+ ((uint16_t *)where)[0] = tmp & 0xffff;
+ break;
+
+ case R_TYPE(LO16):
+ tmp = symvalue + rela->r_addend;
+ ((uint16_t *)where)[0] = tmp & 0xffff;
+ break;
+
+ case R_TYPE(LO16_S1):
+ tmp = symvalue + rela->r_addend;
+ ((uint16_t *)where)[0] = tmp & 0xfffe | 0x1;
+ break;
+
+ case R_TYPE(22_PCREL):
+ tmp = symvalue + rela->r_addend - (Elf_Addr)where;
+ if (((Elf_Sword)tmp > 0x1fffff) || ((Elf_Sword)tmp < -0x200000)) {
+ printf("Overflow\n");
+ return false;
+ }
+
+ ((uint16_t *)where)[0] = (*(uint16_t *)where & 0xffc0) |
+ ((tmp >> 16) & 0x3f);
+ ((uint16_t *)where)[1] = (tmp & 0xfffe);
+
+ break;
+
+ case R_TYPE(ABS32):
+ tmp = symvalue + rela->r_addend;
+ tmp += ((uint16_t *)where)[0];
+ tmp += ((uint16_t *)where)[1] << 16;
+ ((uint16_t *)where)[0] = tmp & 0xffff;
+ ((uint16_t *)where)[1] = (tmp >> 16) & 0xffff;
+ break;
+
+ default:
+ rtems_rtl_set_error (EINVAL, "rela type record not supported");
+ printf("error reloc type\n");
+ return false;
+ }
+
+ return true;
+}
+
+bool
+rtems_rtl_elf_relocate_rel (const rtems_rtl_obj_t* obj,
+ const Elf_Rel* rel,
+ const rtems_rtl_obj_sect_t* sect,
+ const char* symname,
+ const Elf_Byte syminfo,
+ const Elf_Word symvalue)
+{
+ rtems_rtl_set_error (EINVAL, "rel type record not supported");
+ return false;
+}
diff --git a/shell-init b/shell-init
index e9005b6..0859000 100644
--- a/shell-init
+++ b/shell-init
@@ -1,5 +1,5 @@
#rtl-trace set all
-#rtl-trace set load load-sect symbol reloc #unresolved
+rtl-trace set load load-sect symbol reloc #unresolved
#dlo libx.a:xa.c.1.o
#dlo libx.a:x-long-name-to-create-gnu-extension-in-archive.c.1.o
#dlo x.rap
diff --git a/testcase/Readme b/testcase/Readme
index 7efb078..364b163 100644
--- a/testcase/Readme
+++ b/testcase/Readme
@@ -42,3 +42,12 @@ lm32:
Simulator:
lm32_evr-gdb build/lm32-rtems4.11-lm32_evr/rtld
qemu-system-lm32 -M lm32-evr -nographic -global lm32,sys.enabled=1 -kernel build/lm32-rtems4.11-lm32_evr/rtld
+
+v850:
+ Because the v850sim only has 1MB ram, the memory allocation should be considered carefully.
+ Otherwise, error will be incured.
+
+ configure --rtems=/opt/rtems-4.11 --rtems-tools=/opt/rtems-4.11 --rtems-archs=v850 --rtems-bsps=v850/v850sim
+
+ Simulator:
+ v850sim-gdb build/v850-rtems4.11-v850sim/rtld
diff --git a/testcase/wscript b/testcase/wscript
index 8698fd7..f38c124 100644
--- a/testcase/wscript
+++ b/testcase/wscript
@@ -96,6 +96,18 @@ def build(bld):
'--entry', 'my_main'],
source = ['1.c', '2.c'])
+ elif arch == 'v850':
+# cflags = '-mlong-calls -fno-common',
+ bld(target = 'test.rap',
+ features = 'c rap',
+ xxxx = 'hello',
+
+ cflags = '-fno-common',
+
+ rtems_linkflags = ['--base', 'rtld.prelink',
+ '--entry', '_my_main'],
+ source = ['1.c', '2.c'])
+
bld(target = '../test.rap',
source = ['test.rap'],
rule = 'cp ${SRC} ${TGT}')
diff --git a/wscript b/wscript
index a86d7ce..5380b9a 100644
--- a/wscript
+++ b/wscript
@@ -66,7 +66,7 @@ def build(bld):
#
# The ARM as special BSP initialise code.
#
- if arch == 'arm' or arch == 'powerpc' or arch == 'mips' or arch == 'bfin' or arch == 'h8300' or arch == 'lm32' or arch == 'moxie':
+ if arch == 'arm' or arch == 'powerpc' or arch == 'mips' or arch == 'bfin' or arch == 'h8300' or arch == 'lm32' or arch == 'moxie' or arch == 'v850':
bld(target = 'bspinit',
features = 'c',
includes = bld.includes,