|
@@ -12,6 +12,7 @@
|
|
#include <linux/linkage.h>
|
|
#include <linux/linkage.h>
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
#include <asm/assembler.h>
|
|
#include <asm/assembler.h>
|
|
|
|
+#include <asm/unwind.h>
|
|
|
|
|
|
#include "proc-macros.S"
|
|
#include "proc-macros.S"
|
|
|
|
|
|
@@ -121,11 +122,13 @@ ENTRY(v6_coherent_kern_range)
|
|
* - the Icache does not read data from the write buffer
|
|
* - the Icache does not read data from the write buffer
|
|
*/
|
|
*/
|
|
ENTRY(v6_coherent_user_range)
|
|
ENTRY(v6_coherent_user_range)
|
|
-
|
|
|
|
|
|
+ UNWIND(.fnstart )
|
|
#ifdef HARVARD_CACHE
|
|
#ifdef HARVARD_CACHE
|
|
bic r0, r0, #CACHE_LINE_SIZE - 1
|
|
bic r0, r0, #CACHE_LINE_SIZE - 1
|
|
-1: mcr p15, 0, r0, c7, c10, 1 @ clean D line
|
|
|
|
|
|
+1:
|
|
|
|
+ USER( mcr p15, 0, r0, c7, c10, 1 ) @ clean D line
|
|
add r0, r0, #CACHE_LINE_SIZE
|
|
add r0, r0, #CACHE_LINE_SIZE
|
|
|
|
+2:
|
|
cmp r0, r1
|
|
cmp r0, r1
|
|
blo 1b
|
|
blo 1b
|
|
#endif
|
|
#endif
|
|
@@ -142,6 +145,19 @@ ENTRY(v6_coherent_user_range)
|
|
#endif
|
|
#endif
|
|
mov pc, lr
|
|
mov pc, lr
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Fault handling for the cache operation above. If the virtual address in r0
|
|
|
|
+ * isn't mapped, just try the next page.
|
|
|
|
+ */
|
|
|
|
+9001:
|
|
|
|
+ mov r0, r0, lsr #12
|
|
|
|
+ mov r0, r0, lsl #12
|
|
|
|
+ add r0, r0, #4096
|
|
|
|
+ b 2b
|
|
|
|
+ UNWIND(.fnend )
|
|
|
|
+ENDPROC(v6_coherent_user_range)
|
|
|
|
+ENDPROC(v6_coherent_kern_range)
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* v6_flush_kern_dcache_page(kaddr)
|
|
* v6_flush_kern_dcache_page(kaddr)
|
|
*
|
|
*
|