summaryrefslogtreecommitdiff
path: root/packages/gcc/gcc-4.2.2/arm-thumb-cache.patch
blob: fa63846c8ce39ad87522174b620e4a059f5c2c2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--- gcc-4.1.1/gcc/config/arm/linux-gas.h-	2005-06-25 03:22:41.000000000 +0200
+++ gcc-4.1.1/gcc/config/arm/linux-gas.h	2006-06-18 10:23:46.000000000 +0200
@@ -44,6 +44,7 @@
 
 /* Clear the instruction cache from `beg' to `end'.  This makes an
    inline system call to SYS_cacheflush.  */
+#if !defined(__thumb__)
 #define CLEAR_INSN_CACHE(BEG, END)					\
 {									\
   register unsigned long _beg __asm ("a1") = (unsigned long) (BEG);	\
@@ -53,3 +54,18 @@
 		    : "=r" (_beg)					\
 		    : "0" (_beg), "r" (_end), "r" (_flg));		\
 }
+#else
+#define CLEAR_INSN_CACHE(BEG, END)					\
+{									\
+  register unsigned long _beg __asm ("a1") = (unsigned long) (BEG);	\
+  register unsigned long _end __asm ("a2") = (unsigned long) (END);	\
+  register unsigned long _flg __asm ("a3") = 0;				\
+  register unsigned long _swi __asm ("a4") = 0xf0002;			\
+  __asm __volatile ("push      {r7}\n"                                 \
+               "       mov     r7,a4\n"                                \
+               "       swi     0       @ sys_cacheflush\n"             \
+               "       pop     {r7}\n"                                 \
+                   : "=r" (_beg)                                       \
+                   : "0" (_beg), "r" (_end), "r" (_flg), "r" (_swi));  \
+}
+#endif