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