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;