From 08324d8525c6f5e04a7278296e39fa1ae215823a Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Mon, 22 Jul 2013 10:32:42 +0800 Subject: More m68k reloc support Signed-off-by: Peng Fan --- rtl-mdreloc-m68k.c | 42 +++++++++++++++++++++++++++++++++++++++++- testcase/1.c | 15 +++++++++++++++ testcase/Readme | 11 +++++++++++ testcase/wscript | 11 +++++++++++ wscript | 2 +- 5 files changed, 79 insertions(+), 2 deletions(-) diff --git a/rtl-mdreloc-m68k.c b/rtl-mdreloc-m68k.c index d9459ff..45d1498 100644 --- a/rtl-mdreloc-m68k.c +++ b/rtl-mdreloc-m68k.c @@ -16,6 +16,20 @@ #include "rtl-error.h" #include +static inline int overflow_8_check(int value) +{ + if ((value & 0xffffff00) && (~value & 0xffffff80)) + return true; + return false; +} + +static inline int overflow_16_check(int value) +{ + if ((value & 0xffff0000) && (~value & 0xffff8000)) + return true; + return false; +} + bool rtems_rtl_elf_rel_resolve_sym (Elf_Word type) { @@ -32,6 +46,7 @@ rtems_rtl_elf_relocate_rela (const rtems_rtl_obj_t* obj, { Elf_Addr target = 0; Elf_Addr* where; + Elf_Word tmp; where = (Elf_Addr *)(sect->base + rela->r_offset); @@ -39,6 +54,31 @@ rtems_rtl_elf_relocate_rela (const rtems_rtl_obj_t* obj, case R_TYPE(NONE): break; + case R_TYPE(PC8): + tmp = symvalue + rela->r_addend - (Elf_Addr)where; + if (overflow_8_check(tmp)) + return false; + + *(uint8_t *)where = tmp; + + if (rtems_rtl_trace (RTEMS_RTL_TRACE_RELOC)) + printf ("rtl: reloc R_TYPE_8/PC8 in %s --> %p (%p) in %s\n", + sect->name, (void*) (symvalue + rela->r_addend), + (void *)*where, rtems_rtl_obj_oname (obj)); + break; + + case R_TYPE(PC16): + tmp = symvalue + rela->r_addend - (Elf_Addr)where; + if (overflow_16_check(tmp)) + return false; + + *(uint16_t*)where = tmp; + + if (rtems_rtl_trace (RTEMS_RTL_TRACE_RELOC)) + printf ("rtl: reloc R_TYPE_16/PC16 in %s --> %p (%p) in %s\n", + sect->name, (void*) (symvalue + rela->r_addend), + (void *)*where, rtems_rtl_obj_oname (obj)); + break; case R_TYPE(PC32): target = (Elf_Addr) symvalue + rela->r_addend; *where += target - (Elf_Addr)where; @@ -92,7 +132,7 @@ rtems_rtl_elf_relocate_rela (const rtems_rtl_obj_t* obj, return false; } - return false; + return true; } bool diff --git a/testcase/1.c b/testcase/1.c index 58903bc..f3ba414 100644 --- a/testcase/1.c +++ b/testcase/1.c @@ -50,7 +50,11 @@ void hello(int arg) #endif default: +#if defined (__m68k__) + printf("M68K PC16 pass\n"); +#else printf("no arg in hello\n"); +#endif return; } } @@ -306,6 +310,17 @@ int rtems(int argc, char **argv) printf("R_M32R_32_RELA, .word global pass\n"); #endif + +#elif defined (__m68k__) + __asm__ volatile ( + ".align 2\n\t" + "subal #4, %%a7\n\t" + "lea 1f, %%a0\n\t" + "movel %%a0, %%a7@(0)\n\t" + "bra hello\n\t" /* R_68K_PC16 */ + "1:\n\t" + "nop\n\t" : : :"a0", "a1" + ); #else /* other archs */ #endif diff --git a/testcase/Readme b/testcase/Readme index 5735dc2..ab95292 100644 --- a/testcase/Readme +++ b/testcase/Readme @@ -59,3 +59,14 @@ m32r: Simulator: m32rsim-gdb build/m32r-rtems4.11-m32rsim/rtld + +M68K: + Use the following two patchs and patch them to qemu-0.11.0-rc1 + http://lists.nongnu.org/archive/html/qemu-devel/2009-09/msg00811.html + http://lists.nongnu.org/archive/html/qemu-devel/2009-09/msg00353.html + + http://www.rtems.org/pipermail/rtems-users/2009-September/005941.html shows how + to compile and run. + + Simulator: + qemu-system-m68k -M uc5282 -nographic -kernel build/m68k-rtems4.11-uC5282/rtld diff --git a/testcase/wscript b/testcase/wscript index cad0613..b455b4e 100644 --- a/testcase/wscript +++ b/testcase/wscript @@ -121,6 +121,17 @@ def build(bld): '--entry', 'my_main'], source = ['1.c', '2.c']) + elif arch == 'm68k': + 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 41d1491..246e67e 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' or arch == 'v850' or arch == 'm32r': + if arch == 'arm' or arch == 'powerpc' or arch == 'mips' or arch == 'bfin' or arch == 'h8300' or arch == 'lm32' or arch == 'moxie' or arch == 'v850' or arch == 'm32r' or arch == 'm68k': bld(target = 'bspinit', features = 'c', includes = bld.includes, -- cgit v1.2.3