28 lines
		
	
	
		
			877 B
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			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);
 | 
						|
}
 | 
						|
 | 
						|
}
 |