]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: avoid arm64 8.1 atomics on Android
authorElias Naur <elias.naur@gmail.com>
Sun, 4 Nov 2018 08:36:25 +0000 (09:36 +0100)
committerElias Naur <elias.naur@gmail.com>
Sun, 4 Nov 2018 19:34:07 +0000 (19:34 +0000)
The kernel on some Samsung S9+ models reports support for arm64 8.1
atomics, but in reality only some of the cores support them. Go
programs scheduled to cores without support will crash with SIGILL.

This change unconditionally disables the optimization on Android.
A better fix is to precisely detect the offending chipset.

Fixes #28431

Change-Id: I35a1273e5660603824d30ebef2ce7e429241bf1f
Reviewed-on: https://go-review.googlesource.com/c/147377
Run-TryBot: Elias Naur <elias.naur@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/os_linux_arm64.go

index cbe528b4aff75a7ca92185866dd6d67a843ebded..2d6f68bdd9e50eea9c62ce8d3ff7bfd4adf0f647 100644 (file)
@@ -22,7 +22,15 @@ func archauxv(tag, val uintptr) {
        case _AT_HWCAP:
                // arm64 doesn't have a 'cpuid' instruction equivalent and relies on
                // HWCAP/HWCAP2 bits for hardware capabilities.
-               cpu.HWCap = uint(val)
+               hwcap := uint(val)
+               if GOOS == "android" {
+                       // The Samsung S9+ kernel reports support for atomics, but not all cores
+                       // actually support them, resulting in SIGILL. See issue #28431.
+                       // TODO(elias.naur): Only disable the optimization on bad chipsets.
+                       const hwcap_ATOMICS = 1 << 8
+                       hwcap &= ^uint(hwcap_ATOMICS)
+               }
+               cpu.HWCap = hwcap
        case _AT_HWCAP2:
                cpu.HWCap2 = uint(val)
        }