diff --git a/Makefile b/Makefile index a67f24f19d..77a6fb6409 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ CC = gcc +AR = ar +LD = ld EXECUTABLE = factor VERSION = 0.91 diff --git a/vm/Config.linux.arm b/vm/Config.linux.arm index 4b8c8415db..26acde562d 100644 --- a/vm/Config.linux.arm +++ b/vm/Config.linux.arm @@ -1,2 +1,3 @@ include vm/Config.linux include vm/Config.arm +PLAF_DLL_OBJS += vm/os-linux-arm.o diff --git a/vm/Config.unix b/vm/Config.unix index 73934d7f41..390a719c77 100644 --- a/vm/Config.unix +++ b/vm/Config.unix @@ -21,5 +21,5 @@ endif # LINKER = gcc -shared -o # LINK_WITH_ENGINE = '-Wl,-rpath,$$ORIGIN' -lfactor -LINKER = ar rcs +LINKER = $(AR) rcs LINK_WITH_ENGINE = -Wl,--whole-archive -lfactor -Wl,-no-whole-archive diff --git a/vm/os-linux-arm.c b/vm/os-linux-arm.c new file mode 100644 index 0000000000..217fb58fa7 --- /dev/null +++ b/vm/os-linux-arm.c @@ -0,0 +1,23 @@ +#include "master.h" + +void flush_icache(CELL start, CELL len) +{ + int result; + + /* XXX: why doesn't this work on Nokia n800? It should behave + identically to the below assembly. */ + /* result = syscall(__ARM_NR_cacheflush,start,start + len,0); */ + + __asm__ __volatile__ ( + "mov r0, %1\n" + "sub r1, %2, #1\n" + "mov r2, #0\n" + "swi " __sys1(__ARM_NR_cacheflush) "\n" + "mov %0, r0\n" + : "=r" (result) + : "r" (start), "r" (start + len) + : "r0","r1","r2"); + + if(result < 0) + critical_error("flush_icache() failed",result); +} diff --git a/vm/os-linux-arm.h b/vm/os-linux-arm.h index 2e3d6062ed..6e078b014d 100644 --- a/vm/os-linux-arm.h +++ b/vm/os-linux-arm.h @@ -8,7 +8,7 @@ INLINE void *ucontext_stack_pointer(void *uap) return (void *)ucontext->uc_mcontext.arm_sp; } -INLINE void flush_icache(CELL start, CELL len) -{ - syscall(__ARM_NR_cacheflush,start,start + len,0); -} +#define UAP_PROGRAM_COUNTER(ucontext) \ + (((ucontext_t *)(ucontext))->uc_mcontext.arm_pc) + +void flush_icache(CELL start, CELL len);