32 lines
674 B
C++
32 lines
674 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);
|
|
}
|
|
|
|
}
|