diff options
author | Peng Fan <van.freenix@gmail.com> | 2013-07-22 11:01:42 +0800 |
---|---|---|
committer | Peng Fan <van.freenix@gmail.com> | 2013-09-05 13:47:39 +0800 |
commit | 0b41f6ca89bb130b66f1acc0caffda9100f53f0f (patch) | |
tree | 944de1618f66431474fc83a7c0bb607f3716aa9e | |
parent | 0c4eed48fd7b9983ecf4a94c49cecb59de6c5556 (diff) |
V850 Support
Signed-off-by: Peng Fan <van.freenix@gmail.com>
-rw-r--r-- | init.c | 11 | ||||
-rw-r--r-- | libbsd/include/arch/v850/machine/ansi.h | 0 | ||||
-rw-r--r-- | libbsd/include/arch/v850/machine/asm.h | 2 | ||||
-rw-r--r-- | libbsd/include/arch/v850/machine/cdefs.h | 0 | ||||
-rw-r--r-- | libbsd/include/arch/v850/machine/elf_machdep.h | 74 | ||||
-rw-r--r-- | libbsd/include/arch/v850/machine/int_types.h | 0 | ||||
-rw-r--r-- | rtl-mdreloc-v850.c | 97 | ||||
-rw-r--r-- | shell-init | 2 | ||||
-rw-r--r-- | testcase/Readme | 9 | ||||
-rw-r--r-- | testcase/wscript | 12 | ||||
-rw-r--r-- | wscript | 2 |
11 files changed, 207 insertions, 2 deletions
@@ -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; +} @@ -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}') @@ -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, |