patches/gcc/3.2.3/110-gcc-20020722-ppc405erratum77.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
yann@402
     1
# See http://gcc.gnu.org/PR7383, http://www.kegel.com/xgcc3/ppc405erratum77.html
yann@402
     2
# Fixed in gcc-3.3
yann@402
     3
yann@402
     4
diff -aur gcc-20020722.orig/gcc/config/rs6000/rs6000.h gcc-20020722/gcc/config/rs6000/rs6000.h
yann@402
     5
--- gcc-20020722.orig/gcc/config/rs6000/rs6000.h	Thu Jul 25 09:32:21 2002
yann@402
     6
+++ gcc-20020722/gcc/config/rs6000/rs6000.h	Thu Jul 25 09:34:45 2002
yann@402
     7
@@ -66,7 +66,7 @@
yann@402
     8
 %{mcpu=rsc1: -D_ARCH_PWR} \
yann@402
     9
 %{mcpu=401: -D_ARCH_PPC} \
yann@402
    10
 %{mcpu=403: -D_ARCH_PPC} \
yann@402
    11
-%{mcpu=405: -D_ARCH_PPC} \
yann@402
    12
+%{mcpu=405: -D_ARCH_PPC -D__PPC405__} \
yann@402
    13
 %{mcpu=505: -D_ARCH_PPC} \
yann@402
    14
 %{mcpu=601: -D_ARCH_PPC -D_ARCH_PWR} \
yann@402
    15
 %{mcpu=602: -D_ARCH_PPC} \
yann@402
    16
diff -aur gcc-20020722.orig/libjava/sysdep/powerpc/locks.h gcc-20020722/libjava/sysdep/powerpc/locks.h
yann@402
    17
--- gcc-20020722.orig/libjava/sysdep/powerpc/locks.h	Thu Jul 25 09:32:30 2002
yann@402
    18
+++ gcc-20020722/libjava/sysdep/powerpc/locks.h	Thu Jul 25 11:39:13 2002
yann@402
    19
@@ -11,6 +11,17 @@
yann@402
    20
 #ifndef __SYSDEP_LOCKS_H__
yann@402
    21
 #define __SYSDEP_LOCKS_H__
yann@402
    22
 
yann@402
    23
+#ifdef __PPC405__
yann@402
    24
+// workaround for PPC405 erratum #77 - 07/18/02 JRO, dank, NN.  References:
yann@402
    25
+// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
yann@402
    26
+// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
yann@402
    27
+// http://www.kegel.com/xgcc3/ppc405erratum77.html
yann@402
    28
+// FIXME: using dbct instead of sync would be faster
yann@402
    29
+#define __LIBGCJ_PPC405_ERR77_SYNC   "sync \n\t"
yann@402
    30
+#else
yann@402
    31
+#define __LIBGCJ_PPC405_ERR77_SYNC
yann@402
    32
+#endif
yann@402
    33
+
yann@402
    34
 typedef size_t obj_addr_t;	/* Integer type big enough for object	*/
yann@402
    35
 				/* address.				*/
yann@402
    36
 
yann@402
    37
@@ -25,6 +36,7 @@
yann@402
    38
 	   "0:    lwarx %0,0,%1 ;"
yann@402
    39
 	   "      xor. %0,%3,%0;"
yann@402
    40
 	   "      bne 1f;"
yann@402
    41
+  	  __LIBGCJ_PPC405_ERR77_SYNC
yann@402
    42
 	   "      stwcx. %2,0,%1;"
yann@402
    43
 	   "      bne- 0b;"
yann@402
    44
 	   "1:    "
yann@402
    45
@@ -58,6 +70,7 @@
yann@402
    46
 	   "0:    lwarx %0,0,%1 ;"
yann@402
    47
 	   "      xor. %0,%3,%0;"
yann@402
    48
 	   "      bne 1f;"
yann@402
    49
+	   __LIBGCJ_PPC405_ERR77_SYNC	 
yann@402
    50
 	   "      stwcx. %2,0,%1;"
yann@402
    51
 	   "      bne- 0b;"
yann@402
    52
 	   "1:    "
yann@402
    53
diff -aur gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h
yann@402
    54
--- gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h	Thu Jul 25 09:32:31 2002
yann@402
    55
+++ gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h	Thu Jul 25 09:34:45 2002
yann@402
    56
@@ -32,6 +32,17 @@
yann@402
    57
 
yann@402
    58
 typedef int _Atomic_word;
yann@402
    59
 
yann@402
    60
+#ifdef __PPC405__
yann@402
    61
+// workaround for PPC405 erratum #77 - 07/18/02 JRO & dank.  References:
yann@402
    62
+// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
yann@402
    63
+// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
yann@402
    64
+// http://www.kegel.com/xgcc3/ppc405erratum77.html
yann@402
    65
+// FIXME: using dbct instead of sync would be faster
yann@402
    66
+#define	__LIBSTDCPP_PPC405_ERR77_SYNC	"sync \n\t"
yann@402
    67
+#else
yann@402
    68
+#define __LIBSTDCPP_PPC405_ERR77_SYNC
yann@402
    69
+#endif
yann@402
    70
+
yann@402
    71
 static inline _Atomic_word
yann@402
    72
 __attribute__ ((__unused__))
yann@402
    73
 __exchange_and_add (volatile _Atomic_word* __mem, int __val)
yann@402
    74
@@ -42,6 +53,7 @@
yann@402
    75
 	"0:\t"
yann@402
    76
 	"lwarx    %0,0,%2 \n\t"
yann@402
    77
 	"add%I3   %1,%0,%3 \n\t"
yann@402
    78
+	__LIBSTDCPP_PPC405_ERR77_SYNC
yann@402
    79
 	"stwcx.   %1,0,%2 \n\t"
yann@402
    80
 	"bne-     0b \n\t"
yann@402
    81
 	"/* End exchange & add */"
yann@402
    82
@@ -61,6 +73,7 @@
yann@402
    83
 	"0:\t"
yann@402
    84
 	"lwarx    %0,0,%1 \n\t"
yann@402
    85
 	"add%I2   %0,%0,%2 \n\t"
yann@402
    86
+	__LIBSTDCPP_PPC405_ERR77_SYNC
yann@402
    87
 	"stwcx.   %0,0,%1 \n\t"
yann@402
    88
 	"bne-     0b \n\t"
yann@402
    89
 	"/* End atomic add */"
yann@402
    90
@@ -78,6 +91,7 @@
yann@402
    91
 	"/* Inline always swap */\n"
yann@402
    92
 	"0:\t"
yann@402
    93
 	"lwarx    %0,0,%1 \n\t"
yann@402
    94
+	__LIBSTDCPP_PPC405_ERR77_SYNC
yann@402
    95
 	"stwcx.   %2,0,%1 \n\t"
yann@402
    96
 	"bne-     0b \n\t"
yann@402
    97
 	"/* End always swap */"
yann@402
    98
@@ -98,6 +112,7 @@
yann@402
    99
 	"lwarx    %0,0,%1 \n\t"
yann@402
   100
 	"cmpwi    %0,0 \n\t"
yann@402
   101
 	"bne-     1f \n\t"
yann@402
   102
+	__LIBSTDCPP_PPC405_ERR77_SYNC
yann@402
   103
 	"stwcx.   %2,0,%1 \n\t"
yann@402
   104
 	"bne-     0b \n"
yann@402
   105
 	"1:\n\t"