From 5dbb0a5c6b58f565feb5ac85e42f139343a9eafa Mon Sep 17 00:00:00 2001 From: Mauri de Souza Meneguzzo Date: Thu, 31 Oct 2024 10:48:14 +0000 Subject: [PATCH] internal/runtime/atomic: fix uintptr usage in arm And8/Or8 In CL 622075, I introduced code that violated unsafe.Pointer rules by casting to uintptr and back across statements. This change corrects it. Change-Id: Ib6f6c08d9ce33aaeaf41f390c7e9f13a7b8cb974 GitHub-Last-Rev: 01cc68a87c8c0ad068c71a911013421f28a8b4ef GitHub-Pull-Request: golang/go#70129 Cq-Include-Trybots: luci.golang.try:gotip-linux-arm Reviewed-on: https://go-review.googlesource.com/c/go/+/623755 Reviewed-by: Cherry Mui Reviewed-by: Michael Pratt LUCI-TryBot-Result: Go LUCI Auto-Submit: Michael Pratt --- src/internal/runtime/atomic/atomic_arm.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/internal/runtime/atomic/atomic_arm.go b/src/internal/runtime/atomic/atomic_arm.go index dcc6ad99d6..8d8ffcf7dc 100644 --- a/src/internal/runtime/atomic/atomic_arm.go +++ b/src/internal/runtime/atomic/atomic_arm.go @@ -186,9 +186,8 @@ func Or8(addr *uint8, v uint8) //go:nosplit func goOr8(addr *uint8, v uint8) { // Align down to 4 bytes and use 32-bit CAS. - uaddr := uintptr(unsafe.Pointer(addr)) - addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3)) - word := uint32(v) << ((uaddr & 3) * 8) // little endian + addr32 := (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(addr)) &^ 3)) + word := uint32(v) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian for { old := *addr32 if Cas(addr32, old, old|word) { @@ -203,10 +202,9 @@ func And8(addr *uint8, v uint8) //go:nosplit func goAnd8(addr *uint8, v uint8) { // Align down to 4 bytes and use 32-bit CAS. - uaddr := uintptr(unsafe.Pointer(addr)) - addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3)) - word := uint32(v) << ((uaddr & 3) * 8) // little endian - mask := uint32(0xFF) << ((uaddr & 3) * 8) // little endian + addr32 := (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(addr)) &^ 3)) + word := uint32(v) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian + mask := uint32(0xFF) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian word |= ^mask for { old := *addr32 -- 2.48.1