factor/vm/os-linux-arm.cpp

28 lines
877 B
C++

#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)
critical_error("flush_icache() failed", result);
}
}