]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.24] runtime/race: set missing argument frame for ppc64x atomic...
authorJayanth Krishnamurthy jayanth.krishnamurthy@ibm.com <jayanth.krishnamurthy@ibm.com>
Thu, 6 Nov 2025 19:43:45 +0000 (13:43 -0600)
committerCherry Mui <cherryyz@google.com>
Mon, 29 Dec 2025 20:53:21 +0000 (12:53 -0800)
The ppc64x TSAN wrappers for atomic And/Or did not initialize R6 with the Go argument frame before calling racecallatomic. Since racecallatomic expects R6 to point to the argument list and dereferences it unconditionally, this led to a nil-pointer dereference under -race.

Other atomic TSAN wrappers (Load/Store/Add/Swap/CAS) already set up R6 in the expected way. This change aligns the And/Or wrappers with the rest by adding the missing R6 initialisation.

This keeps the behavior consistent across all atomic operations on ppc64x.

Fixes #76796.
Change-Id: Iaf578449a6171a0c6f7c33ec6f64c1251297ae6d
Reviewed-on: https://go-review.googlesource.com/c/go/+/718560
Reviewed-by: Mark Freeman <markfreeman@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Paul Murphy <paumurph@redhat.com>
(cherry picked from commit 44cb82449e7f24530fe0fe0bf8261ba9e0e4e7d8)
Reviewed-on: https://go-review.googlesource.com/c/go/+/729420
Reviewed-by: Roland Shoemaker <roland@golang.org>
src/runtime/race_ppc64le.s

index 43829479bde86841f889b673bfa1086a5e45ee22..bd168a38a98a750e364c373056d338c14f0db9b4 100644 (file)
@@ -329,11 +329,13 @@ TEXT      sync∕atomic·AddUintptr(SB), NOSPLIT, $0-24
 TEXT   sync∕atomic·AndInt32(SB), NOSPLIT, $0-20
        GO_ARGS
        MOVD    $__tsan_go_atomic32_fetch_and(SB), R8
+       ADD     $32, R1, R6
        BR      racecallatomic<>(SB)
 
 TEXT   sync∕atomic·AndInt64(SB), NOSPLIT, $0-24
        GO_ARGS
        MOVD    $__tsan_go_atomic64_fetch_and(SB), R8
+       ADD     $32, R1, R6
        BR      racecallatomic<>(SB)
 
 TEXT   sync∕atomic·AndUint32(SB), NOSPLIT, $0-20
@@ -352,11 +354,13 @@ TEXT      sync∕atomic·AndUintptr(SB), NOSPLIT, $0-24
 TEXT   sync∕atomic·OrInt32(SB), NOSPLIT, $0-20
        GO_ARGS
        MOVD    $__tsan_go_atomic32_fetch_or(SB), R8
+       ADD     $32, R1, R6
        BR      racecallatomic<>(SB)
 
 TEXT   sync∕atomic·OrInt64(SB), NOSPLIT, $0-24
        GO_ARGS
        MOVD    $__tsan_go_atomic64_fetch_or(SB), R8
+       ADD     $32, R1, R6
        BR      racecallatomic<>(SB)
 
 TEXT   sync∕atomic·OrUint32(SB), NOSPLIT, $0-20