local-powerpc8xx-dcbz
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Thu, 15 Feb 2024 22:29:51 +0000 (22:29 +0000)
committerRaspbian forward porter <root@raspbian.org>
Thu, 15 Feb 2024 22:29:51 +0000 (22:29 +0000)
Gbp-Pq: Topic powerpc
Gbp-Pq: Name local-powerpc8xx-dcbz.diff

sysdeps/unix/sysv/linux/powerpc/dl-auxv.h

index be2189732ae66a5dc15aaff572ac40bc572879ce..1327bbc852eea780e7c3a8e67fe223afd2a3bd7d 100644 (file)
@@ -23,8 +23,25 @@ int GLRO(dl_cache_line_size);
 #endif
 
 /* Scan the Aux Vector for the "Data Cache Block Size" entry and assign it
-   to dl_cache_line_size.  */
-#define DL_PLATFORM_AUXV                                                     \
+   to dl_cache_line_size. We have to detect 8xx processors, which
+   have buggy dcbz implementations that cannot report page faults
+   correctly.  That requires reading SPR, which is a privileged
+   operation.  Fortunately 2.2.18 and later emulates PowerPC mfspr
+   reads from the PVR register.  */
+#ifndef __powerpc64__
+ #define DL_PLATFORM_AUXV                                                    \
+      case AT_DCACHEBSIZE:                                                   \
+       {                                                                     \
+         unsigned pvr = 0;                                                   \
+         asm ("mfspr %0, 287" : "=r" (pvr));                                 \
+         if ((pvr & 0xffff0000) == 0x00500000)                               \
+           break;                                                            \
+       }                                                                     \
+       GLRO(dl_cache_line_size) = av->a_un.a_val;                            \
+       break;
+#else
+ #define DL_PLATFORM_AUXV                                                    \
       case AT_DCACHEBSIZE:                                                   \
        GLRO(dl_cache_line_size) = av->a_un.a_val;                            \
        break;
+#endif