#include "master.hpp" namespace factor { 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); */ /* Assembly swiped from http://lists.arm.linux.org.uk/pipermail/linux-arm/2002-July/003931.html */ __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) tls_vm()critical_error("flush_icache() failed",result); } }