Skip to content

Commit

Permalink
[release-branch.go1.11] runtime: avoid arm64 8.1 atomics on Android
Browse files Browse the repository at this point in the history
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 #28586

Change-Id: I35a1273e5660603824d30ebef2ce7e429241bf1f
Reviewed-on: https://go-review.googlesource.com/c/147377
Run-TryBot: Elias Naur <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Keith Randall <[email protected]>
Reviewed-on: https://go-review.googlesource.com/c/149557
Reviewed-by: Brad Fitzpatrick <[email protected]>
  • Loading branch information
Elias Naur authored and bradfitz committed Nov 14, 2018
1 parent 402eb45 commit f3b9f36
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion src/runtime/os_linux_arm64.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,17 @@ func archauxv(tag, val uintptr) {
randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 |
uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24
case _AT_HWCAP:
cpu_hwcap = uint(val)
// arm64 doesn't have a 'cpuid' instruction equivalent and relies on
// HWCAP/HWCAP2 bits for hardware capabilities.
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)
}
Expand Down

0 comments on commit f3b9f36

Please sign in to comment.