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);
 | |
| }
 | |
| 
 | |
| }
 |