Merge "Fix signal.sigwait64_SIGRTMIN test"
diff --git a/libc/Android.bp b/libc/Android.bp
index ae5f39e..8dcc8f6 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -127,9 +127,18 @@
name: "libc_scudo_defaults",
cflags: [
- "-DUSE_SCUDO",
+ "-DUSE_SCUDO_SVELTE",
],
+ product_variables: {
+ malloc_not_svelte: {
+ cflags: [
+ "-UUSE_SCUDO_SVELTE",
+ "-DUSE_SCUDO",
+ ],
+ },
+ },
+
whole_static_libs: [
"libscudo",
],
diff --git a/libc/bionic/libc_init_common.cpp b/libc/bionic/libc_init_common.cpp
index 542c4a5..d64a6bd 100644
--- a/libc/bionic/libc_init_common.cpp
+++ b/libc/bionic/libc_init_common.cpp
@@ -42,6 +42,7 @@
#include <unistd.h>
#include <async_safe/log.h>
+#include <platform/bionic/mte_kernel.h>
#include "private/WriteProtected.h"
#include "private/bionic_defs.h"
@@ -109,8 +110,18 @@
#if defined(__aarch64__)
#define PR_SET_TAGGED_ADDR_CTRL 55
#define PR_TAGGED_ADDR_ENABLE (1UL << 0)
+#ifdef ANDROID_EXPERIMENTAL_MTE
+ // First, try enabling MTE in asynchronous mode, with tag 0 excluded. This will fail if the kernel
+ // or hardware doesn't support MTE, and we will fall back to just enabling tagged pointers in
+ // syscall arguments.
+ if (prctl(PR_SET_TAGGED_ADDR_CTRL,
+ PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_ASYNC | (1 << PR_MTE_EXCL_SHIFT), 0, 0, 0)) {
+ prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE, 0, 0, 0);
+ }
+#else
prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE, 0, 0, 0);
#endif
+#endif
}
void __libc_init_fork_handler() {
diff --git a/libc/bionic/malloc_common.h b/libc/bionic/malloc_common.h
index 89dccc3..4a726db 100644
--- a/libc/bionic/malloc_common.h
+++ b/libc/bionic/malloc_common.h
@@ -60,6 +60,11 @@
#include "scudo.h"
#define Malloc(function) scudo_ ## function
+#elif defined(USE_SCUDO_SVELTE)
+
+#include "scudo.h"
+#define Malloc(function) scudo_svelte_ ## function
+
#else
#include "jemalloc.h"
diff --git a/libc/bionic/malloc_common_dynamic.cpp b/libc/bionic/malloc_common_dynamic.cpp
index 0ac3f62..eec49a4 100644
--- a/libc/bionic/malloc_common_dynamic.cpp
+++ b/libc/bionic/malloc_common_dynamic.cpp
@@ -465,6 +465,7 @@
// =============================================================================
// Platform-internal mallopt variant.
// =============================================================================
+__BIONIC_WEAK_FOR_NATIVE_BRIDGE
extern "C" bool android_mallopt(int opcode, void* arg, size_t arg_size) {
if (opcode == M_SET_ZYGOTE_CHILD) {
if (arg != nullptr || arg_size != 0) {
diff --git a/libc/bionic/scudo.h b/libc/bionic/scudo.h
index a80d754..946a497 100644
--- a/libc/bionic/scudo.h
+++ b/libc/bionic/scudo.h
@@ -56,4 +56,24 @@
void scudo_malloc_disable();
void scudo_malloc_enable();
+void* scudo_svelte_aligned_alloc(size_t, size_t);
+void* scudo_svelte_calloc(size_t, size_t);
+void scudo_svelte_free(void*);
+struct mallinfo scudo_svelte_mallinfo();
+void* scudo_svelte_malloc(size_t);
+int scudo_svelte_malloc_info(int, FILE*);
+size_t scudo_svelte_malloc_usable_size(const void*);
+int scudo_svelte_mallopt(int, int);
+void* scudo_svelte_memalign(size_t, size_t);
+void* scudo_svelte_realloc(void*, size_t);
+int scudo_svelte_posix_memalign(void**, size_t, size_t);
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+void* scudo_svelte_pvalloc(size_t);
+void* scudo_svelte_valloc(size_t);
+#endif
+
+int scudo_svelte_malloc_iterate(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*);
+void scudo_svelte_malloc_disable();
+void scudo_svelte_malloc_enable();
+
__END_DECLS
diff --git a/libc/kernel/README.md b/libc/kernel/README.md
index 9036b9f..6db08d6 100644
--- a/libc/kernel/README.md
+++ b/libc/kernel/README.md
@@ -53,14 +53,16 @@
NOT BREAK THE KERNEL <-> USER ABI, FOR EXAMPLE BY CHANGING THE SIZE
OF A GIVEN TYPE. THIS TASK CANNOT BE EASILY AUTOMATED AT THE MOMENT.
-Download the Linux kernel source code:
+Download the Android mainline kernel source code:
```
> mkdir kernel_src
> cd kernel_src
- kernel_src> git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
+ kernel_src> git clone https://android.googlesource.com/kernel/common/ -b android-mainline
```
-Then checkout the stable tag for the new kernel headers to import:
+For now, there are no tags, take the top of tree version. To find the
+version of the linux stable kernel headers the mainline source code is
+tracking, read the uapi/linux/version.h that is generated.
```
kernel_src> cd linux-stable
kernel_src/linux-stable> git checkout tags/vXXX
@@ -71,11 +73,17 @@
to determine which directory to use as the destination directory.
After running lunch, run this command to import the headers into the android
-source tree:
+source tree if there is a kernel source tree already checked out:
```
bionic/libc/kernel/tools/generate_uapi_headers.sh --use-kernel-dir kernel_src
```
+Run this command to automatically download the latest version of the headers
+and import them if there is no checked out kernel source tree:
+```
+ bionic/libc/kernel/tools/generate_uapi_headers.sh --download-kernel
+```
+
Next, run this command to copy the parsed files to bionic/libc/kernel/uapi:
```
bionic/libc/kernel/tools/update_all.py
diff --git a/libc/platform/bionic/mte_kernel.h b/libc/platform/bionic/mte_kernel.h
index 04f2bb6..804311c 100644
--- a/libc/platform/bionic/mte_kernel.h
+++ b/libc/platform/bionic/mte_kernel.h
@@ -36,6 +36,16 @@
// This interface should not be considered to be stable.
#ifdef ANDROID_EXPERIMENTAL_MTE
-#define HWCAP2_MTE (1UL << 31)
-#define PROT_MTE 0x10
+
+#define HWCAP2_MTE (1 << 10)
+#define PROT_MTE 0x20
+
+#define PR_MTE_TCF_SHIFT 1
+#define PR_MTE_TCF_NONE (0UL << PR_MTE_TCF_SHIFT)
+#define PR_MTE_TCF_SYNC (1UL << PR_MTE_TCF_SHIFT)
+#define PR_MTE_TCF_ASYNC (2UL << PR_MTE_TCF_SHIFT)
+#define PR_MTE_TCF_MASK (3UL << PR_MTE_TCF_SHIFT)
+#define PR_MTE_EXCL_SHIFT 3
+#define PR_MTE_EXCL_MASK (0xffffUL << PR_MTE_EXCL_SHIFT)
+
#endif
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 4bcb896..fb22a1d 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -4082,23 +4082,23 @@
path.c_str(), executable_path);
}
+ path = kLdConfigArchFilePath;
+ if (file_exists(path.c_str())) {
+ return path;
+ }
+
// Use generated linker config if flag is set
// TODO(b/138920271) Do not check property once it is confirmed as stable
if (android::base::GetBoolProperty("sys.linker.use_generated_config", true)) {
if (file_exists(kLdGeneratedConfigFilePath)) {
return kLdGeneratedConfigFilePath;
} else {
- DL_WARN("Warning: failed to find generated linker configuration from \"%s\"",
- kLdGeneratedConfigFilePath);
+ // TODO(b/146386369) : Adjust log level and add more condition to log only when necessary
+ INFO("Warning: failed to find generated linker configuration from \"%s\"",
+ kLdGeneratedConfigFilePath);
}
}
-
- path = kLdConfigArchFilePath;
- if (file_exists(path.c_str())) {
- return path;
- }
-
path = get_ld_config_file_vndk_path();
if (file_exists(path.c_str())) {
return path;