| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #include "master.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | namespace factor { | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | void flush_icache(cell start, cell len) { | 
					
						
							|  |  |  |   int result; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  |   /* 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); */ | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  |   /* 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"); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  |   if (result < 0) | 
					
						
							|  |  |  |     critical_error("flush_icache() failed", result); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |