diff options
| author | Jayanth Krishnamurthy jayanth.krishnamurthy@ibm.com <jayanth.krishnamurthy@ibm.com> | 2025-11-06 13:43:45 -0600 |
|---|---|---|
| committer | Cherry Mui <cherryyz@google.com> | 2025-12-29 13:19:43 -0800 |
| commit | 6f07a57145a96c8e431721d0b2db4adf412f7c56 (patch) | |
| tree | 654121669412030c14266cbf84662900d1b44e80 | |
| parent | ea603eea37f1030cfeecbe03ec7660fbc0da7819 (diff) | |
| download | go-6f07a57145a96c8e431721d0b2db4adf412f7c56.tar.xz | |
[release-branch.go1.25] runtime/race: set missing argument frame for ppc64x atomic And/Or wrappers
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.
Updates #76776.
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/+/728900
Reviewed-by: David Chase <drchase@google.com>
| -rw-r--r-- | src/runtime/race_ppc64le.s | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/runtime/race_ppc64le.s b/src/runtime/race_ppc64le.s index b327e49a2f..41cd232392 100644 --- a/src/runtime/race_ppc64le.s +++ b/src/runtime/race_ppc64le.s @@ -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 |
