sync/atomic, runtime/internal/atomic: don't assume reads from 0 fail
For a misaligned address force a panic rather than assuming that reading
from the address 0 will cause one.
Change-Id: I25f32be86120d6a4fd33db01f159c5fadac9674e
Reviewed-on: https://go-review.googlesource.com/69850
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/go/runtime/internal/atomic/atomic.c b/libgo/go/runtime/internal/atomic/atomic.c
index b584656..24820f2 100644
--- a/libgo/go/runtime/internal/atomic/atomic.c
+++ b/libgo/go/runtime/internal/atomic/atomic.c
@@ -34,7 +34,7 @@
Load64 (uint64_t *ptr)
{
if (((uintptr_t) ptr & 7) != 0)
- ptr = NULL;
+ panicmem ();
return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
}
@@ -66,7 +66,7 @@
Loadint64 (int64_t *ptr)
{
if (((uintptr_t) ptr & 7) != 0)
- ptr = NULL;
+ panicmem ();
return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
}
@@ -88,7 +88,7 @@
Xadd64 (uint64_t *ptr, int64_t delta)
{
if (((uintptr_t) ptr & 7) != 0)
- ptr = NULL;
+ panicmem ();
return __atomic_add_fetch (ptr, (uint64_t) delta, __ATOMIC_SEQ_CST);
}
@@ -110,7 +110,7 @@
Xaddint64 (int64_t *ptr, int64_t delta)
{
if (((uintptr_t) ptr & 7) != 0)
- ptr = NULL;
+ panicmem ();
return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST);
}
@@ -132,7 +132,7 @@
Xchg64 (uint64_t *ptr, uint64_t new)
{
if (((uintptr_t) ptr & 7) != 0)
- ptr = NULL;
+ panicmem ();
return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST);
}
@@ -184,7 +184,7 @@
Cas64 (uint64_t *ptr, uint64_t old, uint64_t new)
{
if (((uintptr_t) ptr & 7) != 0)
- ptr = NULL;
+ panicmem ();
return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
}
@@ -226,7 +226,7 @@
Store64 (uint64_t *ptr, uint64_t val)
{
if (((uintptr_t) ptr & 7) != 0)
- ptr = NULL;
+ panicmem ();
__atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
}
diff --git a/libgo/go/runtime/panic.go b/libgo/go/runtime/panic.go
index 2f65603..c39a58d 100644
--- a/libgo/go/runtime/panic.go
+++ b/libgo/go/runtime/panic.go
@@ -22,6 +22,7 @@
//go:linkname makefuncreturning runtime.makefuncreturning
//go:linkname gorecover runtime.gorecover
//go:linkname deferredrecover runtime.deferredrecover
+//go:linkname panicmem runtime.panicmem
// Temporary for C code to call:
//go:linkname throw runtime.throw
diff --git a/libgo/go/sync/atomic/atomic.c b/libgo/go/sync/atomic/atomic.c
index 7e04027..32cbf03 100644
--- a/libgo/go/sync/atomic/atomic.c
+++ b/libgo/go/sync/atomic/atomic.c
@@ -26,7 +26,7 @@
SwapInt64 (int64_t *addr, int64_t new)
{
if (((uintptr_t) addr & 7) != 0)
- addr = NULL;
+ panicmem ();
return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
}
@@ -48,7 +48,7 @@
SwapUint64 (uint64_t *addr, uint64_t new)
{
if (((uintptr_t) addr & 7) != 0)
- addr = NULL;
+ panicmem ();
return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
}
@@ -215,7 +215,7 @@
int64_t v;
if (((uintptr_t) addr & 7) != 0)
- addr = NULL;
+ panicmem ();
v = *addr;
while (! __sync_bool_compare_and_swap (addr, v, v))
v = *addr;
@@ -247,7 +247,7 @@
uint64_t v;
if (((uintptr_t) addr & 7) != 0)
- addr = NULL;
+ panicmem ();
v = *addr;
while (! __sync_bool_compare_and_swap (addr, v, v))
v = *addr;
@@ -308,7 +308,7 @@
int64_t v;
if (((uintptr_t) addr & 7) != 0)
- addr = NULL;
+ panicmem ();
v = *addr;
while (! __sync_bool_compare_and_swap (addr, v, val))
v = *addr;
@@ -338,7 +338,7 @@
uint64_t v;
if (((uintptr_t) addr & 7) != 0)
- addr = NULL;
+ panicmem ();
v = *addr;
while (! __sync_bool_compare_and_swap (addr, v, val))
v = *addr;
diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h
index dd5a958..39b5ef8 100644
--- a/libgo/runtime/runtime.h
+++ b/libgo/runtime/runtime.h
@@ -211,6 +211,8 @@
extern bool runtime_isstarted;
extern bool runtime_isarchive;
+extern void panicmem(void) __asm__ (GOSYM_PREFIX "runtime.panicmem");
+
/*
* common functions and data
*/