From 0b41f6ca89bb130b66f1acc0caffda9100f53f0f Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Mon, 22 Jul 2013 11:01:42 +0800 Subject: V850 Support Signed-off-by: Peng Fan --- init.c | 11 +++ libbsd/include/arch/v850/machine/ansi.h | 0 libbsd/include/arch/v850/machine/asm.h | 2 + libbsd/include/arch/v850/machine/cdefs.h | 0 libbsd/include/arch/v850/machine/elf_machdep.h | 74 ++++++++++++++++++++ libbsd/include/arch/v850/machine/int_types.h | 0 rtl-mdreloc-v850.c | 97 ++++++++++++++++++++++++++ shell-init | 2 +- testcase/Readme | 9 +++ testcase/wscript | 12 ++++ wscript | 2 +- 11 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 libbsd/include/arch/v850/machine/ansi.h create mode 100644 libbsd/include/arch/v850/machine/asm.h create mode 100644 libbsd/include/arch/v850/machine/cdefs.h create mode 100644 libbsd/include/arch/v850/machine/elf_machdep.h create mode 100644 libbsd/include/arch/v850/machine/int_types.h create mode 100644 rtl-mdreloc-v850.c 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 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 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 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 + +#include +#include +#include +#include + +#include +#include "rtl-elf.h" +#include "rtl-error.h" +#include + +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, -- cgit v1.2.3