27 lines
		
	
	
		
			649 B
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			27 lines
		
	
	
		
			649 B
		
	
	
	
		
			C
		
	
	
#include "master.h"
 | 
						|
 | 
						|
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);
 | 
						|
}
 |