Merge "linker: ignore the possibility of page size migration for 32-bit processes." into main
diff --git a/libc/Android.bp b/libc/Android.bp
index 3c5c9f1..c34023c 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -1659,8 +1659,14 @@
},
native_bridge_supported: false,
// It is never correct to depend on this directly. This is only
- // needed for the runtime apex, and in base_system.mk.
- visibility: ["//bionic/apex"],
+ // needed for the runtime apex, and in base_system.mk, and system_image_defaults
+ // which is default module for soong-defined system image.
+ visibility: [
+ "//bionic/apex",
+ "//build/make/target/product/generic",
+ //TODO(b/381985636) : Remove visibility to Soong-defined GSI once resolved
+ "//build/make/target/product/gsi",
+ ],
}
genrule {
diff --git a/libc/bionic/elf_note.cpp b/libc/bionic/elf_note.cpp
index d5cd5de..9cc6b21 100644
--- a/libc/bionic/elf_note.cpp
+++ b/libc/bionic/elf_note.cpp
@@ -38,31 +38,34 @@
return false;
}
+ size_t note_name_len = strlen(note_name) + 1;
+
ElfW(Addr) p = note_addr;
ElfW(Addr) note_end = p + phdr_note->p_memsz;
-
while (p + sizeof(ElfW(Nhdr)) <= note_end) {
+ // Parse the note and check it's structurally valid.
const ElfW(Nhdr)* note = reinterpret_cast<const ElfW(Nhdr)*>(p);
p += sizeof(ElfW(Nhdr));
const char* name = reinterpret_cast<const char*>(p);
- p += align_up(note->n_namesz, 4);
+ if (__builtin_add_overflow(p, align_up(note->n_namesz, 4), &p)) {
+ return false;
+ }
const char* desc = reinterpret_cast<const char*>(p);
- p += align_up(note->n_descsz, 4);
+ if (__builtin_add_overflow(p, align_up(note->n_descsz, 4), &p)) {
+ return false;
+ }
if (p > note_end) {
- break;
- }
- if (note->n_type != note_type) {
- continue;
- }
- size_t note_name_len = strlen(note_name) + 1;
- if (note->n_namesz != note_name_len || strncmp(note_name, name, note_name_len) != 0) {
- break;
+ return false;
}
- *note_hdr = note;
- *note_desc = desc;
-
- return true;
+ // Is this the note we're looking for?
+ if (note->n_type == note_type &&
+ note->n_namesz == note_name_len &&
+ strncmp(note_name, name, note_name_len) == 0) {
+ *note_hdr = note;
+ *note_desc = desc;
+ return true;
+ }
}
return false;
}
diff --git a/libc/bionic/posix_timers.cpp b/libc/bionic/posix_timers.cpp
index 65749a4..9516059 100644
--- a/libc/bionic/posix_timers.cpp
+++ b/libc/bionic/posix_timers.cpp
@@ -141,7 +141,7 @@
// Otherwise, this must be SIGEV_THREAD timer...
timer->callback = evp->sigev_notify_function;
timer->callback_argument = evp->sigev_value;
- atomic_init(&timer->deleted, false);
+ atomic_store_explicit(&timer->deleted, false, memory_order_relaxed);
// Check arguments that the kernel doesn't care about but we do.
if (timer->callback == nullptr) {
diff --git a/libc/bionic/pthread_barrier.cpp b/libc/bionic/pthread_barrier.cpp
index 1618222..ff048a6 100644
--- a/libc/bionic/pthread_barrier.cpp
+++ b/libc/bionic/pthread_barrier.cpp
@@ -95,8 +95,8 @@
return EINVAL;
}
barrier->init_count = count;
- atomic_init(&barrier->state, WAIT);
- atomic_init(&barrier->wait_count, 0);
+ atomic_store_explicit(&barrier->state, WAIT, memory_order_relaxed);
+ atomic_store_explicit(&barrier->wait_count, 0, memory_order_relaxed);
barrier->pshared = false;
if (attr != nullptr && (*attr & 1)) {
barrier->pshared = true;
diff --git a/libc/bionic/pthread_cond.cpp b/libc/bionic/pthread_cond.cpp
index f444676..197fd19 100644
--- a/libc/bionic/pthread_cond.cpp
+++ b/libc/bionic/pthread_cond.cpp
@@ -140,10 +140,10 @@
if (attr != nullptr) {
init_state = (*attr & COND_FLAGS_MASK);
}
- atomic_init(&cond->state, init_state);
+ atomic_store_explicit(&cond->state, init_state, memory_order_relaxed);
#if defined(__LP64__)
- atomic_init(&cond->waiters, 0);
+ atomic_store_explicit(&cond->waiters, 0, memory_order_relaxed);
#endif
return 0;
diff --git a/libc/bionic/pthread_create.cpp b/libc/bionic/pthread_create.cpp
index 54bfa20..3fa8ee6 100644
--- a/libc/bionic/pthread_create.cpp
+++ b/libc/bionic/pthread_create.cpp
@@ -159,11 +159,11 @@
int __init_thread(pthread_internal_t* thread) {
thread->cleanup_stack = nullptr;
- if (__predict_true((thread->attr.flags & PTHREAD_ATTR_FLAG_DETACHED) == 0)) {
- atomic_init(&thread->join_state, THREAD_NOT_JOINED);
- } else {
- atomic_init(&thread->join_state, THREAD_DETACHED);
+ ThreadJoinState state = THREAD_NOT_JOINED;
+ if (__predict_false((thread->attr.flags & PTHREAD_ATTR_FLAG_DETACHED) != 0)) {
+ state = THREAD_DETACHED;
}
+ atomic_store_explicit(&thread->join_state, state, memory_order_relaxed);
// Set the scheduling policy/priority of the thread if necessary.
bool need_set = true;
diff --git a/libc/bionic/pthread_internal.cpp b/libc/bionic/pthread_internal.cpp
index c6426ed..4f2ad0c 100644
--- a/libc/bionic/pthread_internal.cpp
+++ b/libc/bionic/pthread_internal.cpp
@@ -259,8 +259,7 @@
g_func = func;
g_arg = arg;
- static _Atomic(bool) g_retval;
- atomic_init(&g_retval, true);
+ static _Atomic(bool) g_retval(true);
auto handler = [](int, siginfo_t*, void*) {
ErrnoRestorer restorer;
diff --git a/libc/bionic/pthread_mutex.cpp b/libc/bionic/pthread_mutex.cpp
index 0a452e9..c99717a 100644
--- a/libc/bionic/pthread_mutex.cpp
+++ b/libc/bionic/pthread_mutex.cpp
@@ -509,8 +509,8 @@
memset(mutex, 0, sizeof(pthread_mutex_internal_t));
if (__predict_true(attr == nullptr)) {
- atomic_init(&mutex->state, MUTEX_TYPE_BITS_NORMAL);
- return 0;
+ atomic_store_explicit(&mutex->state, MUTEX_TYPE_BITS_NORMAL, memory_order_relaxed);
+ return 0;
}
uint16_t state = 0;
@@ -543,13 +543,13 @@
}
mutex->pi_mutex_id = id;
#endif
- atomic_init(&mutex->state, PI_MUTEX_STATE);
+ atomic_store_explicit(&mutex->state, PI_MUTEX_STATE, memory_order_relaxed);
PIMutex& pi_mutex = mutex->ToPIMutex();
pi_mutex.type = *attr & MUTEXATTR_TYPE_MASK;
pi_mutex.shared = (*attr & MUTEXATTR_SHARED_MASK) != 0;
} else {
- atomic_init(&mutex->state, state);
- atomic_init(&mutex->owner_tid, 0);
+ atomic_store_explicit(&mutex->state, state, memory_order_relaxed);
+ atomic_store_explicit(&mutex->owner_tid, 0, memory_order_relaxed);
}
return 0;
}
diff --git a/libc/bionic/pthread_rwlock.cpp b/libc/bionic/pthread_rwlock.cpp
index 6f3c6fe..92134b4 100644
--- a/libc/bionic/pthread_rwlock.cpp
+++ b/libc/bionic/pthread_rwlock.cpp
@@ -247,7 +247,7 @@
}
}
- atomic_init(&rwlock->state, 0);
+ atomic_store_explicit(&rwlock->state, 0, memory_order_relaxed);
rwlock->pending_lock.init(rwlock->pshared);
return 0;
}
diff --git a/libc/bionic/semaphore.cpp b/libc/bionic/semaphore.cpp
index 33552a9..2c9b745 100644
--- a/libc/bionic/semaphore.cpp
+++ b/libc/bionic/semaphore.cpp
@@ -113,7 +113,7 @@
}
atomic_uint* sem_count_ptr = SEM_TO_ATOMIC_POINTER(sem);
- atomic_init(sem_count_ptr, count);
+ atomic_store_explicit(sem_count_ptr, count, memory_order_relaxed);
return 0;
}
diff --git a/libc/kernel/tools/defaults.py b/libc/kernel/tools/defaults.py
index a71318e..2994e5e 100644
--- a/libc/kernel/tools/defaults.py
+++ b/libc/kernel/tools/defaults.py
@@ -25,6 +25,23 @@
# Otherwise, there will be two struct timeval definitions when
# __kernel_old_timeval is renamed to timeval.
"__kernel_old_timeval": "1",
+ # Drop the custom byte swap functions and just use the clang builtins.
+ # https://github.com/android/ndk/issues/2107
+ "__arch_swab16": kCppUndefinedMacro,
+ "__arch_swab16p": kCppUndefinedMacro,
+ "__arch_swab16s": kCppUndefinedMacro,
+ "__arch_swab32": kCppUndefinedMacro,
+ "__arch_swab32p": kCppUndefinedMacro,
+ "__arch_swab32s": kCppUndefinedMacro,
+ "__arch_swab64": kCppUndefinedMacro,
+ "__arch_swab64p": kCppUndefinedMacro,
+ "__arch_swab64s": kCppUndefinedMacro,
+ "__arch_swahb32": kCppUndefinedMacro,
+ "__arch_swahb32p": kCppUndefinedMacro,
+ "__arch_swahb32s": kCppUndefinedMacro,
+ "__arch_swahw32": kCppUndefinedMacro,
+ "__arch_swahw32p": kCppUndefinedMacro,
+ "__arch_swahw32s": kCppUndefinedMacro,
}
# This is the set of known kernel data structures we want to remove from
@@ -133,9 +150,6 @@
# These are required to support the above functions.
"__fswahw32",
"__fswahb32",
- # As are these, for ILP32.
- "__arch_swab32",
- "__arch_swab64",
# This is used by various macros in <linux/ioprio.h>.
"ioprio_value",
diff --git a/libc/kernel/uapi/asm-arm/asm/swab.h b/libc/kernel/uapi/asm-arm/asm/swab.h
index 3fff953..7684c22 100644
--- a/libc/kernel/uapi/asm-arm/asm/swab.h
+++ b/libc/kernel/uapi/asm-arm/asm/swab.h
@@ -11,18 +11,7 @@
#ifndef __STRICT_ANSI__
#define __SWAB_64_THRU_32__
#endif
-static inline __attribute__((__const__)) __u32 __arch_swab32(__u32 x) {
- __u32 t;
#ifndef __thumb__
- if(! __builtin_constant_p(x)) {
- asm("eor\t%0, %1, %1, ror #16" : "=r" (t) : "r" (x));
- } else
#endif
- t = x ^ ((x << 16) | (x >> 16));
- x = (x << 24) | (x >> 8);
- t &= ~0x00FF0000;
- x ^= (t >> 8);
- return x;
-}
#define __arch_swab32 __arch_swab32
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/swab.h b/libc/kernel/uapi/asm-x86/asm/swab.h
index ce43658..31c850d 100644
--- a/libc/kernel/uapi/asm-x86/asm/swab.h
+++ b/libc/kernel/uapi/asm-x86/asm/swab.h
@@ -8,27 +8,9 @@
#define _ASM_X86_SWAB_H
#include <linux/types.h>
#include <linux/compiler.h>
-static inline __attribute__((__const__)) __u32 __arch_swab32(__u32 val) {
- asm("bswapl %0" : "=r" (val) : "0" (val));
- return val;
-}
#define __arch_swab32 __arch_swab32
-static inline __attribute__((__const__)) __u64 __arch_swab64(__u64 val) {
#ifdef __i386__
- union {
- struct {
- __u32 a;
- __u32 b;
- } s;
- __u64 u;
- } v;
- v.u = val;
- asm("bswapl %0; bswapl %1; xchgl %0,%1" : "=r" (v.s.a), "=r" (v.s.b) : "0" (v.s.a), "1" (v.s.b));
- return v.u;
#else
- asm("bswapq %0" : "=r" (val) : "0" (val));
- return val;
#endif
-}
#define __arch_swab64 __arch_swab64
#endif
diff --git a/libc/kernel/uapi/linux/swab.h b/libc/kernel/uapi/linux/swab.h
index 6225a76..5d240e1 100644
--- a/libc/kernel/uapi/linux/swab.h
+++ b/libc/kernel/uapi/linux/swab.h
@@ -15,29 +15,14 @@
#define ___constant_swab64(x) ((__u64) ((((__u64) (x) & (__u64) 0x00000000000000ffULL) << 56) | (((__u64) (x) & (__u64) 0x000000000000ff00ULL) << 40) | (((__u64) (x) & (__u64) 0x0000000000ff0000ULL) << 24) | (((__u64) (x) & (__u64) 0x00000000ff000000ULL) << 8) | (((__u64) (x) & (__u64) 0x000000ff00000000ULL) >> 8) | (((__u64) (x) & (__u64) 0x0000ff0000000000ULL) >> 24) | (((__u64) (x) & (__u64) 0x00ff000000000000ULL) >> 40) | (((__u64) (x) & (__u64) 0xff00000000000000ULL) >> 56)))
#define ___constant_swahw32(x) ((__u32) ((((__u32) (x) & (__u32) 0x0000ffffUL) << 16) | (((__u32) (x) & (__u32) 0xffff0000UL) >> 16)))
#define ___constant_swahb32(x) ((__u32) ((((__u32) (x) & (__u32) 0x00ff00ffUL) << 8) | (((__u32) (x) & (__u32) 0xff00ff00UL) >> 8)))
-#ifdef __arch_swab16
-#else
-#endif
-#ifdef __arch_swab32
-#else
-#endif
-#ifdef __arch_swab64
-#elif defined(__SWAB_64_THRU_32__)
+#ifdef __SWAB_64_THRU_32__
#else
#endif
static inline __attribute__((__const__)) __u32 __fswahw32(__u32 val) {
-#ifdef __arch_swahw32
- return __arch_swahw32(val);
-#else
return ___constant_swahw32(val);
-#endif
}
static inline __attribute__((__const__)) __u32 __fswahb32(__u32 val) {
-#ifdef __arch_swahb32
- return __arch_swahb32(val);
-#else
return ___constant_swahb32(val);
-#endif
}
#define __swab16(x) (__u16) __builtin_bswap16((__u16) (x))
#define __swab32(x) (__u32) __builtin_bswap32((__u32) (x))
@@ -48,73 +33,33 @@
#define __swahw32(x) (__builtin_constant_p((__u32) (x)) ? ___constant_swahw32(x) : __fswahw32(x))
#define __swahb32(x) (__builtin_constant_p((__u32) (x)) ? ___constant_swahb32(x) : __fswahb32(x))
static __always_inline __u16 __swab16p(const __u16 * p) {
-#ifdef __arch_swab16p
- return __arch_swab16p(p);
-#else
return __swab16(* p);
-#endif
}
static __always_inline __u32 __swab32p(const __u32 * p) {
-#ifdef __arch_swab32p
- return __arch_swab32p(p);
-#else
return __swab32(* p);
-#endif
}
static __always_inline __u64 __swab64p(const __u64 * p) {
-#ifdef __arch_swab64p
- return __arch_swab64p(p);
-#else
return __swab64(* p);
-#endif
}
static inline __u32 __swahw32p(const __u32 * p) {
-#ifdef __arch_swahw32p
- return __arch_swahw32p(p);
-#else
return __swahw32(* p);
-#endif
}
static inline __u32 __swahb32p(const __u32 * p) {
-#ifdef __arch_swahb32p
- return __arch_swahb32p(p);
-#else
return __swahb32(* p);
-#endif
}
static inline void __swab16s(__u16 * p) {
-#ifdef __arch_swab16s
- __arch_swab16s(p);
-#else
* p = __swab16p(p);
-#endif
}
static __always_inline void __swab32s(__u32 * p) {
-#ifdef __arch_swab32s
- __arch_swab32s(p);
-#else
* p = __swab32p(p);
-#endif
}
static __always_inline void __swab64s(__u64 * p) {
-#ifdef __arch_swab64s
- __arch_swab64s(p);
-#else
* p = __swab64p(p);
-#endif
}
static inline void __swahw32s(__u32 * p) {
-#ifdef __arch_swahw32s
- __arch_swahw32s(p);
-#else
* p = __swahw32p(p);
-#endif
}
static inline void __swahb32s(__u32 * p) {
-#ifdef __arch_swahb32s
- __arch_swahb32s(p);
-#else
* p = __swahb32p(p);
-#endif
}
#endif
diff --git a/libc/private/bionic_lock.h b/libc/private/bionic_lock.h
index 8ed4939..d0c6d5e 100644
--- a/libc/private/bionic_lock.h
+++ b/libc/private/bionic_lock.h
@@ -46,7 +46,7 @@
public:
void init(bool process_shared) {
- atomic_init(&state, Unlocked);
+ atomic_store_explicit(&state, Unlocked, memory_order_relaxed);
this->process_shared = process_shared;
}
diff --git a/libc/system_properties/include/system_properties/prop_area.h b/libc/system_properties/include/system_properties/prop_area.h
index 187ff75..089cf52 100644
--- a/libc/system_properties/include/system_properties/prop_area.h
+++ b/libc/system_properties/include/system_properties/prop_area.h
@@ -102,7 +102,7 @@
}
prop_area(const uint32_t magic, const uint32_t version) : magic_(magic), version_(version) {
- atomic_init(&serial_, 0u);
+ atomic_store_explicit(&serial_, 0u, memory_order_relaxed);
memset(reserved_, 0, sizeof(reserved_));
// Allocate enough space for the root node.
bytes_used_ = sizeof(prop_trie_node);
diff --git a/libc/system_properties/prop_info.cpp b/libc/system_properties/prop_info.cpp
index c3bf177..499b36a 100644
--- a/libc/system_properties/prop_info.cpp
+++ b/libc/system_properties/prop_info.cpp
@@ -38,7 +38,7 @@
prop_info::prop_info(const char* name, uint32_t namelen, const char* value, uint32_t valuelen) {
memcpy(this->name, name, namelen);
this->name[namelen] = '\0';
- atomic_init(&this->serial, valuelen << 24);
+ atomic_store_explicit(&this->serial, valuelen << 24, memory_order_relaxed);
memcpy(this->value, value, valuelen);
this->value[valuelen] = '\0';
}
@@ -48,7 +48,7 @@
this->name[namelen] = '\0';
auto error_value_len = sizeof(kLongLegacyError) - 1;
- atomic_init(&this->serial, error_value_len << 24 | kLongFlag);
+ atomic_store_explicit(&this->serial, error_value_len << 24 | kLongFlag, memory_order_relaxed);
memcpy(this->long_property.error_message, kLongLegacyError, sizeof(kLongLegacyError));
this->long_property.offset = long_offset;
diff --git a/tests/stdatomic_test.cpp b/tests/stdatomic_test.cpp
index 1c51b11..8a54080 100644
--- a/tests/stdatomic_test.cpp
+++ b/tests/stdatomic_test.cpp
@@ -40,7 +40,7 @@
atomic_int v = 123;
ASSERT_EQ(123, atomic_load(&v));
- atomic_init(&v, 456);
+ atomic_store_explicit(&v, 456, memory_order_relaxed);
ASSERT_EQ(456, atomic_load(&v));
atomic_flag f = ATOMIC_FLAG_INIT;
@@ -258,9 +258,9 @@
// Run a memory ordering smoke test.
void* result;
three_atomics a;
- atomic_init(&a.x, 0ul);
- atomic_init(&a.y, 0ul);
- atomic_init(&a.z, 0ul);
+ atomic_store_explicit(&a.x, 0ul, memory_order_relaxed);
+ atomic_store_explicit(&a.y, 0ul, memory_order_relaxed);
+ atomic_store_explicit(&a.z, 0ul, memory_order_relaxed);
pthread_t t1,t2;
ASSERT_EQ(0, pthread_create(&t1, nullptr, reader, &a));
ASSERT_EQ(0, pthread_create(&t2, nullptr, writer, &a));