Merge "Try to resolve interface names before removing nameless interfaces."
diff --git a/README.md b/README.md
index 6bece25..388a139 100644
--- a/README.md
+++ b/README.md
@@ -62,8 +62,6 @@
arch-arm/
arch-arm64/
arch-common/
- arch-mips/
- arch-mips64/
arch-x86/
arch-x86_64/
# Each architecture has its own subdirectory for stuff that isn't shared
diff --git a/apex/Android.bp b/apex/Android.bp
index 4fbbec1..f62f930 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -14,13 +14,6 @@
private_key: "com.android.runtime.pem",
}
-prebuilt_etc {
- name: "com.android.runtime.ld.config.txt",
- src: "ld.config.txt",
- filename: "ld.config.txt",
- installable: false,
-}
-
apex {
name: "com.android.runtime",
compile_multilib: "both",
@@ -38,7 +31,6 @@
binaries: ["linker"],
},
},
- prebuilts: ["com.android.runtime.ld.config.txt"],
key: "com.android.runtime.key",
certificate: ":com.android.runtime.certificate",
}
diff --git a/apex/ld.config.txt b/apex/ld.config.txt
deleted file mode 100644
index dae883d..0000000
--- a/apex/ld.config.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Bionic loader config file for the Runtime APEX. This is a minimal config to
-# make the linker able to load itself as an executable (it just needs to exist).
-
-dir.runtime = /apex/com.android.runtime/bin/
-
-[runtime]
diff --git a/benchmarks/Android.bp b/benchmarks/Android.bp
index b4176de..5f8c113 100644
--- a/benchmarks/Android.bp
+++ b/benchmarks/Android.bp
@@ -34,6 +34,7 @@
"inttypes_benchmark.cpp",
"malloc_benchmark.cpp",
"malloc_sql_benchmark.cpp",
+ "malloc_map_benchmark.cpp",
"math_benchmark.cpp",
"property_benchmark.cpp",
"pthread_benchmark.cpp",
@@ -52,6 +53,15 @@
"libtinyxml2",
],
stl: "libc++_static",
+
+ target: {
+ android: {
+ static_libs: [
+ "libmeminfo",
+ "libprocinfo",
+ ],
+ },
+ },
}
cc_defaults {
diff --git a/benchmarks/bionic_benchmarks.cpp b/benchmarks/bionic_benchmarks.cpp
index 7139cfa..187ee76 100644
--- a/benchmarks/bionic_benchmarks.cpp
+++ b/benchmarks/bionic_benchmarks.cpp
@@ -39,6 +39,8 @@
static const std::vector<int> kCommonSizes{
8,
+ 16,
+ 32,
64,
512,
1 * KB,
diff --git a/benchmarks/malloc_map_benchmark.cpp b/benchmarks/malloc_map_benchmark.cpp
new file mode 100644
index 0000000..ba4d62c
--- /dev/null
+++ b/benchmarks/malloc_map_benchmark.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <err.h>
+#include <malloc.h>
+#include <stdint.h>
+
+#include <map>
+#include <unordered_map>
+#include <vector>
+
+#include <benchmark/benchmark.h>
+#include "util.h"
+
+#include <android-base/strings.h>
+
+#if defined(__BIONIC__)
+
+#include <meminfo/procmeminfo.h>
+#include <procinfo/process_map.h>
+
+static void Gather(uint64_t* rss_bytes) {
+ android::meminfo::ProcMemInfo proc_mem(getpid());
+ const std::vector<android::meminfo::Vma>& maps = proc_mem.MapsWithoutUsageStats();
+ for (auto& vma : maps) {
+ if (vma.name == "[anon:libc_malloc]" || android::base::StartsWith(vma.name, "[anon:scudo:") ||
+ android::base::StartsWith(vma.name, "[anon:GWP-ASan")) {
+ android::meminfo::Vma update_vma(vma);
+ if (!proc_mem.FillInVmaStats(update_vma)) {
+ err(1, "FillInVmaStats failed\n");
+ }
+ *rss_bytes += update_vma.usage.rss;
+ }
+ }
+}
+#endif
+
+template <typename MapType>
+static void MapBenchmark(benchmark::State& state, size_t num_elements) {
+#if defined(__BIONIC__)
+ uint64_t rss_bytes = 0;
+#endif
+
+ for (auto _ : state) {
+#if defined(__BIONIC__)
+ state.PauseTiming();
+ mallopt(M_PURGE, 0);
+ uint64_t rss_bytes_before = 0;
+ Gather(&rss_bytes_before);
+ state.ResumeTiming();
+#endif
+ MapType map;
+ for (size_t i = 0; i < num_elements; i++) {
+ map[i][0] = 0;
+ }
+#if defined(__BIONIC__)
+ state.PauseTiming();
+ mallopt(M_PURGE, 0);
+ Gather(&rss_bytes);
+ // Try and record only the memory used in the map.
+ rss_bytes -= rss_bytes_before;
+ state.ResumeTiming();
+#endif
+ }
+
+#if defined(__BIONIC__)
+ double rss_mb = (rss_bytes / static_cast<double>(state.iterations())) / 1024.0 / 1024.0;
+ state.counters["RSS_MB"] = rss_mb;
+#endif
+}
+
+static void BM_std_map_8(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[8]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_map_8);
+
+static void BM_std_map_16(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[16]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_map_16);
+
+static void BM_std_map_32(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[32]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_map_32);
+
+static void BM_std_map_64(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[64]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_map_64);
+
+static void BM_std_map_96(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[96]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_map_96);
+
+static void BM_std_map_128(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[128]>>(state, 500000);
+}
+BIONIC_BENCHMARK(BM_std_map_128);
+
+static void BM_std_map_256(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[256]>>(state, 500000);
+}
+BIONIC_BENCHMARK(BM_std_map_256);
+
+static void BM_std_map_512(benchmark::State& state) {
+ MapBenchmark<std::map<uint64_t, char[512]>>(state, 500000);
+}
+BIONIC_BENCHMARK(BM_std_map_512);
+
+static void BM_std_unordered_map_8(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[8]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_8);
+
+static void BM_std_unordered_map_16(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[16]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_16);
+
+static void BM_std_unordered_map_32(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[32]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_32);
+
+static void BM_std_unordered_map_64(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[64]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_64);
+
+static void BM_std_unordered_map_96(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[96]>>(state, 1000000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_96);
+
+static void BM_std_unordered_map_128(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[128]>>(state, 500000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_128);
+
+static void BM_std_unordered_map_256(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[256]>>(state, 500000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_256);
+
+static void BM_std_unordered_map_512(benchmark::State& state) {
+ MapBenchmark<std::unordered_map<uint64_t, char[512]>>(state, 500000);
+}
+BIONIC_BENCHMARK(BM_std_unordered_map_512);
diff --git a/docs/32-bit-abi.md b/docs/32-bit-abi.md
index 0ea94d4..81afd14 100644
--- a/docs/32-bit-abi.md
+++ b/docs/32-bit-abi.md
@@ -65,11 +65,11 @@
## `sigset_t` is too small for real-time signals
-On 32-bit Android, `sigset_t` is too small for ARM and x86 (but correct for
-MIPS). This means that there is no support for real-time signals in 32-bit
-code. Android P (API level 28) adds `sigset64_t` and a corresponding function
-for every function that takes a `sigset_t` (so `sigprocmask64` takes a
-`sigset64_t` where `sigprocmask` takes a `sigset_t`).
+On 32-bit Android, `sigset_t` is too small for ARM and x86. This means that
+there is no support for real-time signals in 32-bit code. Android P (API
+level 28) adds `sigset64_t` and a corresponding function for every function
+that takes a `sigset_t` (so `sigprocmask64` takes a `sigset64_t` where
+`sigprocmask` takes a `sigset_t`).
On 32-bit Android, `struct sigaction` is also too small because it contains
a `sigset_t`. We also offer a `struct sigaction64` and `sigaction64` function
diff --git a/libc/Android.bp b/libc/Android.bp
index 92951f7..80b157a 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -613,20 +613,6 @@
"upstream-openbsd/lib/libc/string/strncmp.c",
],
},
- mips: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memchr.c",
- "upstream-openbsd/lib/libc/string/strcpy.c",
- "upstream-openbsd/lib/libc/string/strncmp.c",
- ],
- },
- mips64: {
- exclude_srcs: [
- "upstream-openbsd/lib/libc/string/memchr.c",
- "upstream-openbsd/lib/libc/string/strcpy.c",
- "upstream-openbsd/lib/libc/string/strncmp.c",
- ],
- },
x86: {
exclude_srcs: [
"upstream-openbsd/lib/libc/string/memchr.c",
@@ -886,60 +872,6 @@
],
},
- mips: {
- srcs: [
- "arch-mips/string/memcmp.c",
- "arch-mips/string/memcpy.c",
- "arch-mips/string/memset.S",
- "arch-mips/string/strcmp.S",
- "arch-mips/string/strncmp.S",
- "arch-mips/string/strlen.c",
- "arch-mips/string/strnlen.c",
- "arch-mips/string/strchr.c",
- "arch-mips/string/strcpy.c",
- "arch-mips/string/memchr.c",
- "arch-mips/string/memmove.c",
-
- "arch-mips/bionic/__bionic_clone.S",
- "arch-mips/bionic/cacheflush.cpp",
- "arch-mips/bionic/_exit_with_stack_teardown.S",
- "arch-mips/bionic/libcrt_compat.c",
- "arch-mips/bionic/setjmp.S",
- "arch-mips/bionic/syscall.S",
- "arch-mips/bionic/vfork.S",
- ],
- exclude_srcs: [
- "bionic/strchr.cpp",
- "bionic/strnlen.c",
- ],
- },
- mips64: {
- srcs: [
- "arch-mips/string/memcmp.c",
- "arch-mips/string/memcpy.c",
- "arch-mips/string/memset.S",
- "arch-mips/string/strcmp.S",
- "arch-mips/string/strncmp.S",
- "arch-mips/string/strlen.c",
- "arch-mips/string/strnlen.c",
- "arch-mips/string/strchr.c",
- "arch-mips/string/strcpy.c",
- "arch-mips/string/memchr.c",
- "arch-mips/string/memmove.c",
-
- "arch-mips64/bionic/__bionic_clone.S",
- "arch-mips64/bionic/_exit_with_stack_teardown.S",
- "arch-mips64/bionic/setjmp.S",
- "arch-mips64/bionic/syscall.S",
- "arch-mips64/bionic/vfork.S",
- "arch-mips64/bionic/stat.cpp",
- ],
- exclude_srcs: [
- "bionic/strchr.cpp",
- "bionic/strnlen.c",
- ],
- },
-
x86: {
srcs: [
"arch-x86/generic/string/memcmp.S",
@@ -1990,12 +1922,6 @@
defaults: ["crt_defaults"],
arch: {
- mips: {
- cflags: ["-fPIC"],
- },
- mips64: {
- cflags: ["-fPIC"],
- },
x86: {
cflags: ["-fPIC"],
},
@@ -2050,26 +1976,6 @@
name: "crtbegin_static1",
local_include_dirs: ["include"],
srcs: ["arch-common/bionic/crtbegin.c"],
-
- arch: {
- mips: {
- srcs: [
- "arch-mips/bionic/crtbegin.c",
- ],
- exclude_srcs: [
- "arch-common/bionic/crtbegin.c",
- ],
- },
- mips64: {
- srcs: [
- "arch-mips64/bionic/crtbegin.c",
- ],
- exclude_srcs: [
- "arch-common/bionic/crtbegin.c",
- ],
- },
- },
-
defaults: ["crt_defaults"],
}
@@ -2087,25 +1993,6 @@
name: "crtbegin_dynamic1",
local_include_dirs: ["include"],
srcs: ["arch-common/bionic/crtbegin.c"],
-
- arch: {
- mips: {
- srcs: [
- "arch-mips/bionic/crtbegin.c",
- ],
- exclude_srcs: [
- "arch-common/bionic/crtbegin.c",
- ],
- },
- mips64: {
- srcs: [
- "arch-mips64/bionic/crtbegin.c",
- ],
- exclude_srcs: [
- "arch-common/bionic/crtbegin.c",
- ],
- },
- },
defaults: ["crt_defaults"],
}
diff --git a/libc/NOTICE b/libc/NOTICE
index ef61ec1..8245ff8 100644
--- a/libc/NOTICE
+++ b/libc/NOTICE
@@ -2568,38 +2568,6 @@
-------------------------------------------------------------------
-Copyright (c) 1991, 1993, 1995,
- The Regents of the University of California. All rights reserved.
-
-This code is derived from software contributed to Berkeley by
-Havard Eidnes.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
Copyright (c) 1992 Henry Spencer.
Copyright (c) 1992, 1993
The Regents of the University of California. All rights reserved.
@@ -2727,38 +2695,6 @@
Copyright (c) 1992, 1993
The Regents of the University of California. All rights reserved.
-This code is derived from software contributed to Berkeley by
-Ralph Campbell.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
-Copyright (c) 1992, 1993
- The Regents of the University of California. All rights reserved.
-
This software was developed by the Computer Systems Engineering group
at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
contributed to Berkeley.
@@ -3522,34 +3458,6 @@
-------------------------------------------------------------------
-Copyright (c) 2001-2002 Opsycon AB (www.opsycon.se / www.opsycon.com)
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. Neither the name of Opsycon AB nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
-OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
Copyright (c) 2001-2011 The FreeBSD Project.
All rights reserved.
@@ -5400,35 +5308,6 @@
-------------------------------------------------------------------
-Copyright (c) 2013
- MIPS Technologies, Inc., California.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. Neither the name of the MIPS Technologies, Inc., nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
Copyright (c) 2013 ARM Ltd
All rights reserved.
@@ -5781,38 +5660,6 @@
-------------------------------------------------------------------
-Copyright (c) 2017 Imagination Technologies.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with
- the distribution.
- * Neither the name of Imagination Technologies nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--------------------------------------------------------------------
-
Copyright (c)1999 Citrus Project,
All rights reserved.
diff --git a/libc/arch-mips/bionic/__bionic_clone.S b/libc/arch-mips/bionic/__bionic_clone.S
deleted file mode 100644
index b6056f2..0000000
--- a/libc/arch-mips/bionic/__bionic_clone.S
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-
-// pid_t __bionic_clone(int flags, void* child_stack, pid_t* parent_tid, void* tls, pid_t* child_tid, int (*fn)(void*), void* arg);
-ENTRY_PRIVATE(__bionic_clone)
- .set noreorder
- .cpload $t9
- .set reorder
-
- # set up child stack
- subu $a1,16
- lw $t0,20($sp) # fn
- lw $t1,24($sp) # arg
- sw $t0,0($a1) # fn
- sw $t1,4($a1) # arg
-
- # remainder of arguments are correct for clone system call
- li $v0,__NR_clone
- syscall
-
- bnez $a3,.L__error_bc
-
- beqz $v0,.L__thread_start_bc
-
- j $ra
-
-.L__thread_start_bc:
- # Clear return address in child so we don't unwind further.
- li $ra,0
-
- lw $a0,0($sp) # fn
- lw $a1,4($sp) # arg
-
- # void __start_thread(int (*func)(void*), void *arg)
- la $t9,__start_thread
- j $t9
-
-.L__error_bc:
- move $a0,$v0
- la $t9,__set_errno_internal
- j $t9
-END(__bionic_clone)
diff --git a/libc/arch-mips/bionic/_exit_with_stack_teardown.S b/libc/arch-mips/bionic/_exit_with_stack_teardown.S
deleted file mode 100644
index 566b1c8..0000000
--- a/libc/arch-mips/bionic/_exit_with_stack_teardown.S
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-
-// void _exit_with_stack_teardown(void* stackBase, size_t stackSize)
-ENTRY_PRIVATE(_exit_with_stack_teardown)
- li $v0, __NR_munmap
- syscall
- // If munmap failed, we ignore the failure and exit anyway.
-
- li $a0, 0
- li $v0, __NR_exit
- syscall
- // The exit syscall does not return.
-END(_exit_with_stack_teardown)
diff --git a/libc/arch-mips/bionic/cacheflush.cpp b/libc/arch-mips/bionic/cacheflush.cpp
deleted file mode 100644
index 380ad90..0000000
--- a/libc/arch-mips/bionic/cacheflush.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <unistd.h>
-#include <sys/cachectl.h>
-
-#include <async_safe/log.h>
-
-// Linux historically defines a cacheflush(3) routine for MIPS
-// with this signature:
-
-// int cacheflush(char *addr, int nbytes, int cache);
-
-// Android defines an alternate cacheflush routine which exposes the
-// ARM system call interface:
-
-// int cacheflush (long start, long end, long flags)
-
-// This is an attempt to maintain compatibility between the historical MIPS
-// usage for software previously ported to MIPS and Android specific
-// uses of cacheflush().
-
-int cacheflush(long start, long end, long /*flags*/) {
- if (end < start) {
- // It looks like this is really a MIPS-style cacheflush call.
- static bool warned = false;
- if (!warned) {
- async_safe_format_log(ANDROID_LOG_WARN, "libc",
- "cacheflush called with (start,len) instead of (start,end)");
- warned = true;
- }
- end += start;
- }
-
- // Use the GCC builtin. This will generate inline synci instructions if available,
- // or call _flush_cache(start, len, BCACHE) directly.
- __builtin___clear_cache(reinterpret_cast<char*>(start), reinterpret_cast<char*>(end));
- return 0;
-}
diff --git a/libc/arch-mips/bionic/crtbegin.c b/libc/arch-mips/bionic/crtbegin.c
deleted file mode 100644
index d72ec7b..0000000
--- a/libc/arch-mips/bionic/crtbegin.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "../../bionic/libc_init_common.h"
-#include <stddef.h>
-#include <stdint.h>
-
-__attribute__ ((section (".preinit_array")))
-void (*__PREINIT_ARRAY__)(void) = (void (*)(void)) -1;
-
-__attribute__ ((section (".init_array")))
-void (*__INIT_ARRAY__)(void) = (void (*)(void)) -1;
-
-__attribute__ ((section (".fini_array")))
-void (*__FINI_ARRAY__)(void) = (void (*)(void)) -1;
-
-
-__LIBC_HIDDEN__ void do_mips_start(void *raw_args) {
- structors_array_t array;
- array.preinit_array = &__PREINIT_ARRAY__;
- array.init_array = &__INIT_ARRAY__;
- array.fini_array = &__FINI_ARRAY__;
-
- __libc_init(raw_args, NULL, &main, &array);
-}
-
-/*
- * This function prepares the return address with a branch-and-link
- * instruction (bal) and then uses a .cpload to compute the Global
- * Offset Table (GOT) pointer ($gp). The $gp is then used to load
- * the address of _do_start() into $t9 just before calling it.
- * Terminating the stack with a NULL return address.
- */
-__asm__ (
-" .set push \n"
-" \n"
-" .text \n"
-" .align 4 \n"
-" .type __start,@function \n"
-" .globl __start \n"
-" .globl _start \n"
-" \n"
-" .ent __start \n"
-"__start: \n"
-" _start: \n"
-" .frame $sp,32,$ra \n"
-" .mask 0x80000000,-4 \n"
-" \n"
-" .set noreorder \n"
-" bal 1f \n"
-" nop \n"
-"1: \n"
-" .cpload $ra \n"
-" .set reorder \n"
-" \n"
-" move $a0, $sp \n"
-" addiu $sp, $sp, (-32) \n"
-" sw $0, 28($sp) \n"
-" la $t9, do_mips_start \n"
-" jalr $t9 \n"
-" \n"
-"2: b 2b \n"
-" .end __start \n"
-" \n"
-" .set pop \n"
-);
-
-#include "../../arch-common/bionic/__dso_handle.h"
-#include "../../arch-common/bionic/atexit.h"
-#include "../../arch-common/bionic/pthread_atfork.h"
diff --git a/libc/arch-mips/bionic/libcrt_compat.c b/libc/arch-mips/bionic/libcrt_compat.c
deleted file mode 100644
index cfa41f2..0000000
--- a/libc/arch-mips/bionic/libcrt_compat.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-extern char __divdi3;
-extern char __moddi3;
-extern char __popcountsi2;
-extern char __udivdi3;
-extern char __umoddi3;
-
-void* __bionic_libcrt_compat_symbols[] = {
- &__divdi3,
- &__moddi3,
- &__popcountsi2,
- &__udivdi3,
- &__umoddi3,
-};
diff --git a/libc/arch-mips/bionic/setjmp.S b/libc/arch-mips/bionic/setjmp.S
deleted file mode 100644
index ffe3665..0000000
--- a/libc/arch-mips/bionic/setjmp.S
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * Copyright (c) 2001-2002 Opsycon AB (www.opsycon.se / www.opsycon.com)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Opsycon AB nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-/*-
- * Copyright (c) 1991, 1993, 1995,
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Havard Eidnes.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ralph Campbell.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)signal.h 8.1 (Berkeley) 6/10/93
- */
-
-#include <private/bionic_asm.h>
-
-/* jmpbuf is declared to users as an array of longs, which is only
- * 4-byte aligned in 32-bit builds. The Mips jmpbuf begins with a
- * dynamically-sized 0- or 4-byte unused filler so that double-prec FP regs
- * are saved to 8-byte-aligned mem cells.
- * All the following jmpbuf offsets are from the rounded-DOWN base addr.
- */
-
-/* Fields of same size on all MIPS abis: */
-/* field: byte offset: size: */
-/* dynam filler (0*4) 0-4 bytes of rounddown filler, DON'T TOUCH!!
- often overlays user storage!! */
-#define SC_FPSR_OFFSET (1*4) /* 4 bytes, floating point control/status reg */
-/* following fields are 8-byte aligned */
-#define SC_FLAG_OFFSET (2*4) /* 8 bytes, cookie and savesigs flag, first actual field */
-#define SC_MASK_OFFSET (4*4) /* 16 bytes, mips32/mips64 version of sigset_t */
-#define SC_CKSUM_OFFSET (8*4) /* 8 bytes, used for checksum */
-
-/* Registers that are 4-byte on mips32 o32, and 8-byte on mips64 n64 abi */
-#define SC_REGS_OFFSET (10*4) /* SC_REGS_BYTES */
-#define SC_REGS_SAVED 12 /*regs*/ /* ra,s0-s8,gp,sp */
-#define SC_REGS_BYTES (SC_REGS_SAVED*REGSZ)
-#define SC_REGS SC_REGS_OFFSET
-
-/* Double floating pt registers are 8-bytes on all abis,
- * but the number of saved fp regs varies for o32/n32 versus n64 abis:
- */
-
-#ifdef __LP64__
-#define SC_FPREGS_SAVED 8 /* all fp regs f24,f25,f26,f27,f28,f29,f30,f31 */
-#else
-#define SC_FPREGS_SAVED 6 /* even fp regs f20,f22,f24,f26,f28,f30 */
-#endif
-
-#define SC_FPREGS_OFFSET (SC_REGS_OFFSET + SC_REGS_BYTES) /* SC_FPREGS_BYTES */
-#define SC_FPREGS_BYTES (SC_FPREGS_SAVED*REGSZ_FP)
-#define SC_FPREGS SC_FPREGS_OFFSET
-
-#define SC_TOTAL_BYTES (SC_FPREGS_OFFSET + SC_FPREGS_BYTES)
-#define SC_TOTAL_LONGS (SC_TOTAL_BYTES/REGSZ)
-
-#define USE_CHECKSUM 1
-
-.macro m_mangle_reg_and_store reg, cookie, temp, offset
- xor \temp, \reg, \cookie
- REG_S \temp, \offset
-.endm
-
-.macro m_unmangle_reg_and_load reg, cookie, temp, offset
- REG_L \temp, \offset
- xor \reg, \temp, \cookie
-.endm
-
-.macro m_calculate_checksum dst, src, scratch
- REG_L \dst, REGSZ(\src)
-#ifdef __LP64__
- /* 64 bit: checksum offset is 4 (actual _JBLEN is 25) */
- .irp i,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
-#else
- /* 32 bit: checksum offset is 8 (actual _JBLEN is 34) */
- .irp i,2,3,4,5,6,7,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33
-#endif
- REG_L \scratch, \i*REGSZ(\src)
- xor \dst, \dst, \scratch
- .endr
-.endm
-
-/*
- *
- * GPOFF and FRAMESIZE must be the same for all setjmp/longjmp routines
- *
- */
-
-FRAMESZ= MKFSIZ(2,6)
-A1OFF= FRAMESZ-4*REGSZ
-A0OFF= FRAMESZ-3*REGSZ
-GPOFF= FRAMESZ-2*REGSZ
-RAOFF= FRAMESZ-1*REGSZ
-
-NON_LEAF(sigsetjmp, FRAMESZ, $ra)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(sigsetjmp)
- .mask 0x80000000, RAOFF
- PTR_SUBU $sp, FRAMESZ # allocate stack frame
- SETUP_GP64(GPOFF, sigsetjmp)
- SAVE_GP(GPOFF)
- .set reorder
-
-setjmp_common:
-#ifndef __LP64__
- li $t0, ~7
- and $a0, $t0 # round jmpbuf addr DOWN to 8-byte boundary
-#endif
- REG_S $ra, RAOFF($sp) # spill state
- REG_S $a0, A0OFF($sp)
-
- # get the cookie and store it along with the signal flag.
- move $a0, $a1
- jal __bionic_setjmp_cookie_get
- REG_L $a0, A0OFF($sp)
-
- REG_S $v0, SC_FLAG_OFFSET($a0) # save cookie and savesigs flag
- andi $t0, $v0, 1 # extract savesigs flag
-
- beqz $t0, 1f # do saving of signal mask?
-
- # call sigprocmask(int how ignored, sigset_t* null, sigset_t* SC_MASK(a0)):
- LA $a2, SC_MASK_OFFSET($a0) # gets current signal mask
- li $a0, 0 # how; ignored when new mask is null
- li $a1, 0 # null new mask
- jal sigprocmask # get current signal mask
- REG_L $a0, A0OFF($sp)
-1:
- REG_L $gp, GPOFF($sp) # restore spills
- REG_L $ra, RAOFF($sp)
- REG_L $t0, SC_FLAG_OFFSET($a0) # move cookie to temp reg
-
- # callee-saved long-sized regs:
- PTR_ADDU $v1, $sp, FRAMESZ # save orig sp
-
- # m_mangle_reg_and_store reg, cookie, temp, offset
- m_mangle_reg_and_store $ra, $t0, $t1, SC_REGS+0*REGSZ($a0)
- m_mangle_reg_and_store $s0, $t0, $t2, SC_REGS+1*REGSZ($a0)
- m_mangle_reg_and_store $s1, $t0, $t3, SC_REGS+2*REGSZ($a0)
- m_mangle_reg_and_store $s2, $t0, $t1, SC_REGS+3*REGSZ($a0)
- m_mangle_reg_and_store $s3, $t0, $t2, SC_REGS+4*REGSZ($a0)
- m_mangle_reg_and_store $s4, $t0, $t3, SC_REGS+5*REGSZ($a0)
- m_mangle_reg_and_store $s5, $t0, $t1, SC_REGS+6*REGSZ($a0)
- m_mangle_reg_and_store $s6, $t0, $t2, SC_REGS+7*REGSZ($a0)
- m_mangle_reg_and_store $s7, $t0, $t3, SC_REGS+8*REGSZ($a0)
- m_mangle_reg_and_store $s8, $t0, $t1, SC_REGS+9*REGSZ($a0)
- m_mangle_reg_and_store $gp, $t0, $t2, SC_REGS+10*REGSZ($a0)
- m_mangle_reg_and_store $v1, $t0, $t3, SC_REGS+11*REGSZ($a0)
-
- cfc1 $v0, $31
-
-#ifdef __LP64__
- # callee-saved fp regs on mips n64 ABI are $f24..$f31
- s.d $f24, SC_FPREGS+0*REGSZ_FP($a0)
- s.d $f25, SC_FPREGS+1*REGSZ_FP($a0)
- s.d $f26, SC_FPREGS+2*REGSZ_FP($a0)
- s.d $f27, SC_FPREGS+3*REGSZ_FP($a0)
- s.d $f28, SC_FPREGS+4*REGSZ_FP($a0)
- s.d $f29, SC_FPREGS+5*REGSZ_FP($a0)
- s.d $f30, SC_FPREGS+6*REGSZ_FP($a0)
- s.d $f31, SC_FPREGS+7*REGSZ_FP($a0)
-#else
- # callee-saved fp regs on mips o32 ABI are
- # the even-numbered double fp regs $f20,$f22,...$f30
- s.d $f20, SC_FPREGS+0*REGSZ_FP($a0)
- s.d $f22, SC_FPREGS+1*REGSZ_FP($a0)
- s.d $f24, SC_FPREGS+2*REGSZ_FP($a0)
- s.d $f26, SC_FPREGS+3*REGSZ_FP($a0)
- s.d $f28, SC_FPREGS+4*REGSZ_FP($a0)
- s.d $f30, SC_FPREGS+5*REGSZ_FP($a0)
-#endif
- sw $v0, SC_FPSR_OFFSET($a0)
-#if USE_CHECKSUM
- m_calculate_checksum $t0, $a0, $t1
- REG_S $t0, SC_CKSUM_OFFSET($a0)
-#endif
- move $v0, $zero
- RESTORE_GP64
- PTR_ADDU $sp, FRAMESZ
- j $ra
-END(sigsetjmp)
-
-
-# Alternate entry points:
-
-NON_LEAF(setjmp, FRAMESZ, $ra)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(setjmp)
- .mask 0x80000000, RAOFF
- PTR_SUBU $sp, FRAMESZ
- SETUP_GP64(GPOFF, setjmp) # can't share sigsetjmp's gp code
- SAVE_GP(GPOFF)
- .set reorder
-
- li $a1, 1 # save/restore signals state
- b setjmp_common # tail call
-END(setjmp)
-
-
-NON_LEAF(_setjmp, FRAMESZ, $ra)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(_setjmp)
- .mask 0x80000000, RAOFF
- PTR_SUBU $sp, FRAMESZ
- SETUP_GP64(GPOFF, _setjmp) # can't share sigsetjmp's gp code
- SAVE_GP(GPOFF)
- .set reorder
-
- li $a1, 0 # don't save/restore signals
- b setjmp_common # tail call
-END(_setjmp)
-
-
-NON_LEAF(siglongjmp, FRAMESZ, $ra)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(siglongjmp)
- .mask 0x80000000, RAOFF
- PTR_SUBU $sp, FRAMESZ
- SETUP_GP64(GPOFF, siglongjmp)
- SAVE_GP(GPOFF)
- .set reorder
-
-#ifndef __LP64__
- li $t0, ~7
- and $a0, $t0 # round jmpbuf addr DOWN to 8-byte boundary
-#endif
-
- move $s1, $a1 # temp spill
- move $s0, $a0
-
-#if USE_CHECKSUM
- m_calculate_checksum $t0, $s0, $s2
- REG_L $s2, SC_CKSUM_OFFSET($s0)
- beq $t0, $s2, 0f
- nop
- jal __bionic_setjmp_checksum_mismatch
- nop
-0:
-#endif
-
- # extract savesigs flag
- REG_L $s2, SC_FLAG_OFFSET($s0)
- andi $t0, $s2, 1
- beqz $t0, 1f # restore signal mask?
-
- # call sigprocmask(int how SIG_SETMASK, sigset_t* SC_MASK(a0), sigset_t* null):
- LA $a1, SC_MASK_OFFSET($s0) # signals being restored
- li $a0, 3 # mips SIG_SETMASK
- li $a2, 0 # null
- jal sigprocmask # restore signal mask
-1:
- move $t0, $s2 # get cookie to temp reg
- move $a1, $s1
- move $a0, $s0
-
- # callee-saved long-sized regs:
-
- # m_unmangle_reg_and_load reg, cookie, temp, offset
- # don't restore gp yet, old value is needed for cookie_check call
- m_unmangle_reg_and_load $ra, $t0, $t1, SC_REGS+0*REGSZ($a0)
- m_unmangle_reg_and_load $s0, $t0, $t2, SC_REGS+1*REGSZ($a0)
- m_unmangle_reg_and_load $s1, $t0, $t3, SC_REGS+2*REGSZ($a0)
- m_unmangle_reg_and_load $s2, $t0, $t1, SC_REGS+3*REGSZ($a0)
- m_unmangle_reg_and_load $s3, $t0, $t2, SC_REGS+4*REGSZ($a0)
- m_unmangle_reg_and_load $s4, $t0, $t3, SC_REGS+5*REGSZ($a0)
- m_unmangle_reg_and_load $s5, $t0, $t1, SC_REGS+6*REGSZ($a0)
- m_unmangle_reg_and_load $s6, $t0, $t2, SC_REGS+7*REGSZ($a0)
- m_unmangle_reg_and_load $s7, $t0, $t3, SC_REGS+8*REGSZ($a0)
- m_unmangle_reg_and_load $s8, $t0, $t1, SC_REGS+9*REGSZ($a0)
- m_unmangle_reg_and_load $v1, $t0, $t2, SC_REGS+10*REGSZ($a0)
- m_unmangle_reg_and_load $sp, $t0, $t3, SC_REGS+11*REGSZ($a0)
-
- lw $v0, SC_FPSR_OFFSET($a0)
- ctc1 $v0, $31 # restore old fr mode before fp values
-#ifdef __LP64__
- # callee-saved fp regs on mips n64 ABI are $f24..$f31
- l.d $f24, SC_FPREGS+0*REGSZ_FP($a0)
- l.d $f25, SC_FPREGS+1*REGSZ_FP($a0)
- l.d $f26, SC_FPREGS+2*REGSZ_FP($a0)
- l.d $f27, SC_FPREGS+3*REGSZ_FP($a0)
- l.d $f28, SC_FPREGS+4*REGSZ_FP($a0)
- l.d $f29, SC_FPREGS+5*REGSZ_FP($a0)
- l.d $f30, SC_FPREGS+6*REGSZ_FP($a0)
- l.d $f31, SC_FPREGS+7*REGSZ_FP($a0)
-#else
- # callee-saved fp regs on mips o32 ABI are
- # the even-numbered double fp regs $f20,$f22,...$f30
- l.d $f20, SC_FPREGS+0*REGSZ_FP($a0)
- l.d $f22, SC_FPREGS+1*REGSZ_FP($a0)
- l.d $f24, SC_FPREGS+2*REGSZ_FP($a0)
- l.d $f26, SC_FPREGS+3*REGSZ_FP($a0)
- l.d $f28, SC_FPREGS+4*REGSZ_FP($a0)
- l.d $f30, SC_FPREGS+5*REGSZ_FP($a0)
-#endif
-
- # check cookie
- PTR_SUBU $sp, FRAMESZ
- REG_S $v1, GPOFF($sp)
- REG_S $ra, RAOFF($sp)
- REG_S $a1, A1OFF($sp)
- move $a0, $t0
- jal __bionic_setjmp_cookie_check
- REG_L $gp, GPOFF($sp)
- REG_L $ra, RAOFF($sp)
- REG_L $a1, A1OFF($sp)
- PTR_ADDU $sp, FRAMESZ
-
- sltiu $t0, $a1, 1 # never return 0!
- xor $v0, $a1, $t0
- j $ra # return to setjmp call site
-END(siglongjmp)
-
-ALIAS_SYMBOL(longjmp, siglongjmp)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(longjmp)
-ALIAS_SYMBOL(_longjmp, siglongjmp)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(_longjmp)
diff --git a/libc/arch-mips/bionic/syscall.S b/libc/arch-mips/bionic/syscall.S
deleted file mode 100644
index 857bbab..0000000
--- a/libc/arch-mips/bionic/syscall.S
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-
-/*
- * The caller is only required to allocate 16 bytes of stack for a0-a3.
- * syscall has up to 6 arguments, so we need space for the extra two arguments.
- */
-#define STACKSIZE 2*4
-
-ENTRY(syscall)
- .set noreorder
- .cpload $t9
- move $v0, $a0
- move $a0, $a1
- move $a1, $a2
- move $a2, $a3
- lw $a3, 16($sp)
- lw $t0, 20($sp)
- lw $t1, 24($sp)
- subu $sp, STACKSIZE
- sw $t0, 16($sp)
- sw $t1, 20($sp)
- syscall
- addu $sp, STACKSIZE
- bnez $a3, 1f
- move $a0, $v0
- j $ra
- nop
-1:
- la $t9, __set_errno_internal
- j $t9
- nop
- .set reorder
-END(syscall)
diff --git a/libc/arch-mips/bionic/vfork.S b/libc/arch-mips/bionic/vfork.S
deleted file mode 100644
index c4f67c6..0000000
--- a/libc/arch-mips/bionic/vfork.S
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-#include <linux/sched.h>
-
-// TODO: mips' uapi signal.h is missing #ifndef __ASSEMBLY__.
-// #include <asm/signal.h>
-#define SIGCHLD 18
-
-ENTRY(vfork)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(vfork)
- .set noreorder
- .cpload $t9
-
- // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
- .set push
- .set mips32r2
- rdhwr $v0, $29 // v0 = tls; kernel trap on mips32r1
- .set pop
- lw $v0, REGSZ*1($v0) // v0 = v0[TLS_SLOT_THREAD_ID ie 1]
- sw $0, REGSZ*2+4($v0) // v0->cached_pid_ = 0
-
- li $a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
- li $a1, 0
- li $a2, 0
- li $a3, 0
- subu $sp, 8
- sw $0, 16($sp)
- li $v0, __NR_clone
- syscall
- addu $sp, 8
- bnez $a3, 1f
- move $a0, $v0
-
- j $ra
- nop
-1:
- la $t9, __set_errno_internal
- j $t9
- nop
-END(vfork)
diff --git a/libc/arch-mips/string/memchr.c b/libc/arch-mips/string/memchr.c
deleted file mode 100644
index bc24f79..0000000
--- a/libc/arch-mips/string/memchr.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include <string.h>
-
-#define ENABLE_PREFETCH 1
-#define op_t unsigned long int
-#define op_size sizeof (op_t)
-
-#if ENABLE_PREFETCH
-#define PREFETCH(addr) __builtin_prefetch (addr, 0, 1);
-#else
-#define PREFETCH(addr)
-#endif
-
-#if __mips64 || __mips_isa_rev >= 2
-static inline void * __attribute__ ((always_inline))
-do_bytes (const op_t* w, op_t inval)
-{
- const unsigned char *p = (const unsigned char *) w;
- op_t outval = 0;
-#if __mips64
- __asm__ volatile (
- "dsbh %1, %0 \n\t"
- "dshd %0, %1 \n\t"
- "dclz %1, %0 \n\t"
- : "+r" (inval), "+r" (outval)
- );
-#else
- __asm__ volatile (
- "wsbh %1, %0 \n\t"
- "rotr %0, %1, 16 \n\t"
- "clz %1, %0 \n\t"
- : "+r" (inval), "+r" (outval)
- );
-#endif
- p += (outval >> 3);
- return (void *) p;
-}
-
-#define DO_WORD(in, val) { \
- op_t tmp = ((val - mask_1) & ~val) & mask_128; \
- if (tmp != 0) \
- return do_bytes(in, tmp); \
-}
-#else
-static inline void * __attribute__ ((always_inline))
-do_bytes (const op_t* w, unsigned char ch)
-{
- const unsigned char *p = (const unsigned char *) w;
- for (; *p != ch; ++p);
- return (void *) p;
-}
-
-#define DO_WORD(in, val) { \
- op_t tmp = ((val - mask_1) & ~val) & mask_128; \
- if (tmp != 0) \
- return do_bytes(in, ch); \
-}
-#endif
-
-#define DO_WORDS(w) { \
- op_t* w1 = (op_t*) w; \
- op_t val0 = w1[0] ^ mask_c; \
- op_t val1 = w1[1] ^ mask_c; \
- op_t val2 = w1[2] ^ mask_c; \
- op_t val3 = w1[3] ^ mask_c; \
- DO_WORD(w1, val0) \
- DO_WORD(w1 + 1, val1) \
- DO_WORD(w1 + 2, val2) \
- DO_WORD(w1 + 3, val3) \
-}
-
-void *
-memchr (void const *s, int c_in, size_t n)
-{
- if (n != 0) {
- const unsigned char *p = (const unsigned char *) s;
- const op_t *w;
- op_t mask_1, mask_128, mask_c;
- unsigned char ch = (unsigned char) c_in;
-
- /*
- * Check bytewize till initial alignment
- */
- for (; n > 0 && ((size_t) p % op_size) != 0; --n, ++p) {
- if (*p == ch)
- return (void *) p;
- }
-
- w = (const op_t *) p;
-
- mask_c = ch | (ch << 8);
- mask_c |= mask_c << 16;
- __asm__ volatile (
- "li %0, 0x01010101 \n\t"
- : "=r" (mask_1)
- );
-#if __mips64
- mask_1 |= mask_1 << 32;
- mask_c |= mask_c << 32;
-#endif
- mask_128 = mask_1 << 7;
-
- /*
- * Check op_size byteswize after initial alignment
- */
-#if ((_MIPS_SIM == _ABIO32) || _MIPS_TUNE_I6400)
- PREFETCH (w);
- PREFETCH (w + 8);
- while (n >= 24 * op_size) {
- PREFETCH(w + 16);
- DO_WORDS(w);
- DO_WORDS(w + 4);
- w += 8;
- n -= 8 * op_size;
- }
- while (n >= 8 * op_size) {
- DO_WORDS(w);
- DO_WORDS(w + 4);
- w += 8;
- n -= 8 * op_size;
- }
-#else
- PREFETCH (w);
- PREFETCH (w + 4);
- while (n >= 12 * op_size) {
- PREFETCH(w + 8);
- DO_WORDS(w);
- w += 4;
- n -= 4 * op_size;
- }
- while (n >= 4 * op_size) {
- DO_WORDS(w);
- w += 4;
- n -= 4 * op_size;
- }
-#endif
-
- while (n >= op_size) {
- op_t val = *w ^ mask_c;
- DO_WORD(w, val);
- w++;
- n -= op_size;
- }
-
- /*
- * Check bytewize for remaining bytes
- */
- p = (const unsigned char *) w;
- for (; n > 0; --n, ++p) {
- if (*p == ch)
- return (void *) p;
- }
- }
- return NULL;
-}
diff --git a/libc/arch-mips/string/memcmp.c b/libc/arch-mips/string/memcmp.c
deleted file mode 100644
index eb4ad07..0000000
--- a/libc/arch-mips/string/memcmp.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-#include <stdint.h>
-
-#define ENABLE_PREFETCH 1
-
-#define STRNG(X) #X
-#define PREFETCH(src_ptr, offset) \
- asm("pref 0, " STRNG(offset) "(%[src]) \n\t" : : [src] "r" (src_ptr));
-
-#if !defined(UNALIGNED_INSTR_SUPPORT)
-/* does target have unaligned lw/ld/ualw/uald instructions? */
-#define UNALIGNED_INSTR_SUPPORT 0
-#if __mips_isa_rev < 6 && !__mips1
-#undef UNALIGNED_INSTR_SUPPORT
-#define UNALIGNED_INSTR_SUPPORT 1
-#endif
-#endif
-
-#if !defined(HW_UNALIGNED_SUPPORT)
-/* Does target have hardware support for unaligned accesses? */
-#define HW_UNALIGNED_SUPPORT 0
-#if __mips_isa_rev >= 6
-#undef HW_UNALIGNED_SUPPORT
-#define HW_UNALIGNED_SUPPORT 1
-#endif
-#endif
-
-#define SIZEOF_reg_t 4
-#if _MIPS_SIM == _ABIO32
-typedef unsigned long reg_t;
-typedef struct bits
-{
- reg_t B0:8, B1:8, B2:8, B3:8;
-} bits_t;
-#else
-#undef SIZEOF_reg_t
-#define SIZEOF_reg_t 8
-typedef unsigned long long reg_t;
-typedef struct bits
-{
- reg_t B0:8, B1:8, B2:8, B3:8, B4:8, B5:8, B6:8, B7:8;
-} bits_t;
-#endif
-
-/* This union assumes that small structures can be in registers. If
- not, then memory accesses will be done - not optimal, but ok. */
-typedef union
-{
- reg_t v;
- bits_t b;
-} bitfields_t;
-
-#define do_bitfield(__i) \
- if (x.b.B##__i != y.b.B##__i) return x.b.B##__i - y.b.B##__i;
-
-/* pull apart the words to find the first differing unsigned byte. */
-static int __attribute__ ((noinline)) do_by_bitfields (reg_t a, reg_t b)
-{
- bitfields_t x, y;
- x.v = a;
- y.v = b;
- do_bitfield (0);
- do_bitfield (1);
- do_bitfield (2);
-#if SIZEOF_reg_t == 4
- return x.b.B3 - y.b.B3;
-#else
- do_bitfield (3);
- do_bitfield (4);
- do_bitfield (5);
- do_bitfield (6);
- return x.b.B7 - y.b.B7;
-#endif
-}
-
-/* This code is called when aligning a pointer, there are remaining bytes
- after doing word compares, or architecture does not have some form
- of unaligned support. */
-static inline int __attribute__ ((always_inline))
-do_bytes (const void *a, const void *b, unsigned long len)
-{
- unsigned char *x = (unsigned char *) a;
- unsigned char *y = (unsigned char *) b;
- unsigned long i;
-
- /* 'len' might be zero here, so preloading the first two values
- before the loop may access unallocated memory. */
- for (i = 0; i < len; i++) {
- if (*x != *y)
- return *x - *y;
- x++;
- y++;
- }
- return 0;
-}
-
-#if !HW_UNALIGNED_SUPPORT
-#if UNALIGNED_INSTR_SUPPORT
-/* for MIPS GCC, there are no unaligned builtins - so this struct forces
- the compiler to treat the pointer access as unaligned. */
-struct ulw
-{
- reg_t uli;
-} __attribute__ ((packed));
-
-/* first pointer is not aligned while second pointer is. */
-static int unaligned_words (const struct ulw *a, const reg_t *b,
- unsigned long words, unsigned long bytes)
-{
-#if ENABLE_PREFETCH
- /* prefetch pointer aligned to 32 byte boundary */
- const reg_t *pref_ptr = (const reg_t *) (((uintptr_t) b + 31) & ~31);
- const reg_t *pref_ptr_a = (const reg_t *) (((uintptr_t) a + 31) & ~31);
-#endif
- for (; words >= 16; words -= 8) {
-#if ENABLE_PREFETCH
- pref_ptr += 8;
- PREFETCH(pref_ptr, 0);
- PREFETCH(pref_ptr, 32);
-
- pref_ptr_a += 8;
- PREFETCH(pref_ptr_a, 0);
- PREFETCH(pref_ptr_a, 32);
-#endif
- reg_t x0 = a[0].uli, x1 = a[1].uli;
- reg_t x2 = a[2].uli, x3 = a[3].uli;
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3];
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- if (x1 != y1)
- return do_by_bitfields (x1, y1);
- if (x2 != y2)
- return do_by_bitfields (x2, y2);
- if (x3 != y3)
- return do_by_bitfields (x3, y3);
-
- x0 = a[4].uli; x1 = a[5].uli;
- x2 = a[6].uli; x3 = a[7].uli;
- y0 = b[4]; y1 = b[5]; y2 = b[6]; y3 = b[7];
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- if (x1 != y1)
- return do_by_bitfields (x1, y1);
- if (x2 != y2)
- return do_by_bitfields (x2, y2);
- if (x3 != y3)
- return do_by_bitfields (x3, y3);
-
- a += 8;
- b += 8;
- }
-
- for (; words >= 4; words -= 4) {
- reg_t x0 = a[0].uli, x1 = a[1].uli;
- reg_t x2 = a[2].uli, x3 = a[3].uli;
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3];
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- if (x1 != y1)
- return do_by_bitfields (x1, y1);
- if (x2 != y2)
- return do_by_bitfields (x2, y2);
- if (x3 != y3)
- return do_by_bitfields (x3, y3);
- a += 4;
- b += 4;
- }
-
- /* do remaining words. */
- while (words--) {
- reg_t x0 = a->uli;
- reg_t y0 = *b;
- a += 1;
- b += 1;
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- }
-
- /* mop up any remaining bytes. */
- return do_bytes (a, b, bytes);
-}
-#else
-/* no HW support or unaligned lw/ld/ualw/uald instructions. */
-static int unaligned_words (const reg_t *a, const reg_t *b,
- unsigned long words, unsigned long bytes)
-{
- return do_bytes (a, b, (sizeof (reg_t) * words) + bytes);
-}
-#endif /* UNALIGNED_INSTR_SUPPORT */
-#endif /* HW_UNALIGNED_SUPPORT */
-
-/* both pointers are aligned, or first isn't and HW support for unaligned. */
-static int aligned_words (const reg_t *a, const reg_t *b,
- unsigned long words, unsigned long bytes)
-{
-#if ENABLE_PREFETCH
- /* prefetch pointer aligned to 32 byte boundary */
- const reg_t *pref_ptr = (const reg_t *) (((uintptr_t) b + 31) & ~31);
- const reg_t *pref_ptr_a = (const reg_t *) (((uintptr_t) a + 31) & ~31);
-#endif
-
- for (; words >= 24; words -= 12) {
-#if ENABLE_PREFETCH
- pref_ptr += 12;
- PREFETCH(pref_ptr, 0);
- PREFETCH(pref_ptr, 32);
- PREFETCH(pref_ptr, 64);
-
- pref_ptr_a += 12;
- PREFETCH(pref_ptr_a, 0);
- PREFETCH(pref_ptr_a, 32);
- PREFETCH(pref_ptr_a, 64);
-#endif
- reg_t x0 = a[0], x1 = a[1], x2 = a[2], x3 = a[3];
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3];
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- if (x1 != y1)
- return do_by_bitfields (x1, y1);
- if (x2 != y2)
- return do_by_bitfields (x2, y2);
- if (x3 != y3)
- return do_by_bitfields (x3, y3);
-
- x0 = a[4]; x1 = a[5]; x2 = a[6]; x3 = a[7];
- y0 = b[4]; y1 = b[5]; y2 = b[6]; y3 = b[7];
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- if (x1 != y1)
- return do_by_bitfields (x1, y1);
- if (x2 != y2)
- return do_by_bitfields (x2, y2);
- if (x3 != y3)
- return do_by_bitfields (x3, y3);
-
- x0 = a[8]; x1 = a[9]; x2 = a[10]; x3 = a[11];
- y0 = b[8]; y1 = b[9]; y2 = b[10]; y3 = b[11];
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- if (x1 != y1)
- return do_by_bitfields (x1, y1);
- if (x2 != y2)
- return do_by_bitfields (x2, y2);
- if (x3 != y3)
- return do_by_bitfields (x3, y3);
-
- a += 12;
- b += 12;
- }
-
- for (; words >= 4; words -= 4) {
- reg_t x0 = a[0], x1 = a[1], x2 = a[2], x3 = a[3];
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3];
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- if (x1 != y1)
- return do_by_bitfields (x1, y1);
- if (x2 != y2)
- return do_by_bitfields (x2, y2);
- if (x3 != y3)
- return do_by_bitfields (x3, y3);
- a += 4;
- b += 4;
- }
-
- /* do remaining words. */
- while (words--) {
- reg_t x0 = *a;
- reg_t y0 = *b;
- a += 1;
- b += 1;
- if (x0 != y0)
- return do_by_bitfields (x0, y0);
- }
-
- /* mop up any remaining bytes. */
- return do_bytes (a, b, bytes);
-}
-
-int memcmp (const void *a, const void *b, size_t len)
-{
- unsigned long bytes, words;
-
- /* shouldn't hit that often. */
- if (len < sizeof (reg_t) * 4) {
- return do_bytes (a, b, len);
- }
-
- /* Align the second pointer to word/dword alignment.
- Note that the pointer is only 32-bits for o32/n32 ABIs. For
- n32, loads are done as 64-bit while address remains 32-bit. */
- bytes = ((unsigned long) b) % sizeof (reg_t);
- if (bytes) {
- int res;
- bytes = sizeof (reg_t) - bytes;
- if (bytes > len)
- bytes = len;
- res = do_bytes (a, b, bytes);
- if (res || len == bytes)
- return res;
- len -= bytes;
- a = (const void *) (((unsigned char *) a) + bytes);
- b = (const void *) (((unsigned char *) b) + bytes);
- }
-
- /* Second pointer now aligned. */
- words = len / sizeof (reg_t);
- bytes = len % sizeof (reg_t);
-
-#if HW_UNALIGNED_SUPPORT
- /* treat possible unaligned first pointer as aligned. */
- return aligned_words (a, b, words, bytes);
-#else
- if (((unsigned long) a) % sizeof (reg_t) == 0) {
- return aligned_words (a, b, words, bytes);
- }
- /* need to use unaligned instructions on first pointer. */
- return unaligned_words (a, b, words, bytes);
-#endif
-}
diff --git a/libc/arch-mips/string/memcpy.c b/libc/arch-mips/string/memcpy.c
deleted file mode 100644
index bb0d179..0000000
--- a/libc/arch-mips/string/memcpy.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-
-#if !defined(UNALIGNED_INSTR_SUPPORT)
-/* does target have unaligned lw/ld/ualw/uald instructions? */
-#define UNALIGNED_INSTR_SUPPORT 0
-#if __mips_isa_rev < 6 && !__mips1
-#undef UNALIGNED_INSTR_SUPPORT
-#define UNALIGNED_INSTR_SUPPORT 1
-#endif
-#endif
-
-#if !defined(HW_UNALIGNED_SUPPORT)
-/* Does target have hardware support for unaligned accesses? */
-#define HW_UNALIGNED_SUPPORT 0
-#if __mips_isa_rev >= 6
-#undef HW_UNALIGNED_SUPPORT
-#define HW_UNALIGNED_SUPPORT 1
-#endif
-#endif
-
-#define ENABLE_PREFETCH 1
-
-#if ENABLE_PREFETCH
-#define PREFETCH(addr) __builtin_prefetch (addr, 0, 1);
-#else
-#define PREFETCH(addr)
-#endif
-
-#if _MIPS_SIM == _ABIO32
-typedef unsigned long reg_t;
-typedef struct
-{
- reg_t B0:8, B1:8, B2:8, B3:8;
-} bits_t;
-#else
-typedef unsigned long long reg_t;
-typedef struct
-{
- reg_t B0:8, B1:8, B2:8, B3:8, B4:8, B5:8, B6:8, B7:8;
-} bits_t;
-#endif
-
-typedef union
-{
- reg_t v;
- bits_t b;
-} bitfields_t;
-
-#define DO_BYTE(a, i) \
- a[i] = bw.b.B##i; \
- len--; \
- if(!len) return ret; \
-
-/* This code is called when aligning a pointer, there are remaining bytes
- after doing word compares, or architecture does not have some form
- of unaligned support. */
-static inline void * __attribute__ ((always_inline))
-do_bytes (void *a, const void *b, unsigned long len, void *ret)
-{
- unsigned char *x = (unsigned char *) a;
- unsigned char *y = (unsigned char *) b;
- unsigned long i;
-
- /* 'len' might be zero here, so preloading the first two values
- before the loop may access unallocated memory. */
- for (i = 0; i < len; i++) {
- *x = *y;
- x++;
- y++;
- }
- return ret;
-}
-
-/* This code is called to copy only remaining bytes within word or doubleword */
-static inline void * __attribute__ ((always_inline))
-do_bytes_remaining (void *a, const void *b, unsigned long len, void *ret)
-{
- unsigned char *x = (unsigned char *) a;
-
- if(len > 0) {
- bitfields_t bw;
- bw.v = *((reg_t*) b);
-
-#if __mips64
- DO_BYTE(x, 0);
- DO_BYTE(x, 1);
- DO_BYTE(x, 2);
- DO_BYTE(x, 3);
- DO_BYTE(x, 4);
- DO_BYTE(x, 5);
- DO_BYTE(x, 6);
- DO_BYTE(x, 7);
-#else
- DO_BYTE(x, 0);
- DO_BYTE(x, 1);
- DO_BYTE(x, 2);
- DO_BYTE(x, 3);
-#endif
- }
-
- return ret;
-}
-
-#if !HW_UNALIGNED_SUPPORT
-#if UNALIGNED_INSTR_SUPPORT
-/* for MIPS GCC, there are no unaligned builtins - so this struct forces
- the compiler to treat the pointer access as unaligned. */
-struct ulw
-{
- reg_t uli;
-} __attribute__ ((packed));
-
-/* first pointer is not aligned while second pointer is. */
-static void *
-unaligned_words (struct ulw *a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
-#if ((_MIPS_SIM == _ABIO32) || _MIPS_TUNE_I6400)
- unsigned long i, words_by_8, words_by_1;
- words_by_1 = words % 8;
- words_by_8 = words >> 3;
- for (; words_by_8 > 0; words_by_8--) {
- if(words_by_8 != 1)
- PREFETCH (b + 8);
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3];
- reg_t y4 = b[4], y5 = b[5], y6 = b[6], y7 = b[7];
- a[0].uli = y0;
- a[1].uli = y1;
- a[2].uli = y2;
- a[3].uli = y3;
- a[4].uli = y4;
- a[5].uli = y5;
- a[6].uli = y6;
- a[7].uli = y7;
- a += 8;
- b += 8;
- }
-#else
- unsigned long i, words_by_4, words_by_1;
- words_by_1 = words % 4;
- words_by_4 = words >> 2;
- for (; words_by_4 > 0; words_by_4--) {
- if(words_by_4 != 1)
- PREFETCH (b + 4);
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3];
- a[0].uli = y0;
- a[1].uli = y1;
- a[2].uli = y2;
- a[3].uli = y3;
- a += 4;
- b += 4;
- }
-#endif
-
- /* do remaining words. */
- for (i = 0; i < words_by_1; i++) {
- a->uli = *b;
- a += 1;
- b += 1;
- }
-
- /* mop up any remaining bytes. */
- return do_bytes_remaining (a, b, bytes, ret);
-}
-#else
-/* no HW support or unaligned lw/ld/ualw/uald instructions. */
-static void *
-unaligned_words (reg_t * a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
- unsigned long i;
- unsigned char *x = (unsigned char *) a;
-
- for (i = 0; i < words; i++) {
- bitfields_t bw;
- bw.v = *((reg_t*) b);
- x = (unsigned char *) a;
-#if __mips64
- x[0] = bw.b.B0;
- x[1] = bw.b.B1;
- x[2] = bw.b.B2;
- x[3] = bw.b.B3;
- x[4] = bw.b.B4;
- x[5] = bw.b.B5;
- x[6] = bw.b.B6;
- x[7] = bw.b.B7;
-#else
- x[0] = bw.b.B0;
- x[1] = bw.b.B1;
- x[2] = bw.b.B2;
- x[3] = bw.b.B3;
-#endif
- a += 1;
- b += 1;
- }
-
- /* mop up any remaining bytes */
- return do_bytes_remaining (a, b, bytes, ret);
-}
-#endif /* UNALIGNED_INSTR_SUPPORT */
-#endif /* HW_UNALIGNED_SUPPORT */
-
-/* both pointers are aligned, or first isn't and HW support for unaligned. */
-static void *
-aligned_words (reg_t * a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
-#if ((_MIPS_SIM == _ABIO32) || _MIPS_TUNE_I6400)
- unsigned long i, words_by_8, words_by_1;
- words_by_1 = words % 8;
- words_by_8 = words >> 3;
- for (; words_by_8 > 0; words_by_8--) {
- if(words_by_8 != 1)
- PREFETCH (b + 8);
- reg_t x0 = b[0], x1 = b[1], x2 = b[2], x3 = b[3];
- reg_t x4 = b[4], x5 = b[5], x6 = b[6], x7 = b[7];
- a[0] = x0;
- a[1] = x1;
- a[2] = x2;
- a[3] = x3;
- a[4] = x4;
- a[5] = x5;
- a[6] = x6;
- a[7] = x7;
- a += 8;
- b += 8;
- }
-#else
- unsigned long i, words_by_4, words_by_1;
- words_by_1 = words % 4;
- words_by_4 = words >> 2;
- for (; words_by_4 > 0; words_by_4--) {
- if(words_by_4 != 1)
- PREFETCH (b + 4);
- reg_t x0 = b[0], x1 = b[1], x2 = b[2], x3 = b[3];
- a[0] = x0;
- a[1] = x1;
- a[2] = x2;
- a[3] = x3;
- a += 4;
- b += 4;
- }
-#endif
-
- /* do remaining words. */
- for (i = 0; i < words_by_1; i++) {
- *a = *b;
- a += 1;
- b += 1;
- }
-
- /* mop up any remaining bytes. */
- return do_bytes_remaining (a, b, bytes, ret);
-}
-
-void *
-memcpy (void *a, const void *b, size_t len)
-{
- unsigned long bytes, words;
- void *ret = a;
-
- /* shouldn't hit that often. */
- if (len < sizeof (reg_t) * 4) {
- return do_bytes (a, b, len, a);
- }
-
- /* Align the second pointer to word/dword alignment.
- Note that the pointer is only 32-bits for o32/n32 ABIs. For
- n32, loads are done as 64-bit while address remains 32-bit. */
- bytes = ((unsigned long) b) % sizeof (reg_t);
- if (bytes) {
- bytes = sizeof (reg_t) - bytes;
- if (bytes > len)
- bytes = len;
- do_bytes (a, b, bytes, ret);
- if (len == bytes)
- return ret;
- len -= bytes;
- a = (void *) (((unsigned char *) a) + bytes);
- b = (const void *) (((unsigned char *) b) + bytes);
- }
-
- /* Second pointer now aligned. */
- words = len / sizeof (reg_t);
- bytes = len % sizeof (reg_t);
-#if HW_UNALIGNED_SUPPORT
- /* treat possible unaligned first pointer as aligned. */
- return aligned_words (a, b, words, bytes, ret);
-#else
- if (((unsigned long) a) % sizeof (reg_t) == 0) {
- return aligned_words (a, b, words, bytes, ret);
- }
- /* need to use unaligned instructions on first pointer. */
- return unaligned_words (a, b, words, bytes, ret);
-#endif
-}
diff --git a/libc/arch-mips/string/memmove.c b/libc/arch-mips/string/memmove.c
deleted file mode 100644
index 74d4cd0..0000000
--- a/libc/arch-mips/string/memmove.c
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-
-#if !defined(UNALIGNED_INSTR_SUPPORT)
-/* does target have unaligned lw/ld/ualw/uald instructions? */
-#define UNALIGNED_INSTR_SUPPORT 0
-#if __mips_isa_rev < 6 && !__mips1
-#undef UNALIGNED_INSTR_SUPPORT
-#define UNALIGNED_INSTR_SUPPORT 1
-#endif
-#endif
-
-#if !defined(HW_UNALIGNED_SUPPORT)
-/* Does target have hardware support for unaligned accesses? */
-#define HW_UNALIGNED_SUPPORT 0
-#if __mips_isa_rev >= 6
-#undef HW_UNALIGNED_SUPPORT
-#define HW_UNALIGNED_SUPPORT 1
-#endif
-#endif
-
-#define ENABLE_PREFETCH 1
-
-#if ENABLE_PREFETCH
-#define PREFETCH(addr) __builtin_prefetch (addr, 0, 1);
-#else
-#define PREFETCH(addr)
-#endif
-
-#if _MIPS_SIM == _ABIO32
-typedef unsigned long reg_t;
-typedef struct
-{
- reg_t B0:8, B1:8, B2:8, B3:8;
-} bits_t;
-#else
-typedef unsigned long long reg_t;
-typedef struct
-{
- reg_t B0:8, B1:8, B2:8, B3:8, B4:8, B5:8, B6:8, B7:8;
-} bits_t;
-#endif
-
-typedef union
-{
- reg_t v;
- bits_t b;
-} bitfields_t;
-
-#define DO_BYTE(a, i) \
- a[i] = bw.b.B##i; \
- len--; \
- if(!len) return ret; \
-
-/* This code is called when aligning a pointer, there are remaining bytes
- after doing word compares, or architecture does not have some form
- of unaligned support. */
-static inline void * __attribute__ ((always_inline))
-do_bytes (void *a, const void *b, unsigned long len, void *ret)
-{
- unsigned char *x = (unsigned char *) a;
- unsigned char *y = (unsigned char *) b;
- unsigned long i;
-
- /* 'len' might be zero here, so preloading the first two values
- before the loop may access unallocated memory. */
- for (i = 0; i < len; i++)
- {
- *x = *y;
- x++;
- y++;
- }
- return ret;
-}
-
-static inline void * __attribute__ ((always_inline))
-do_bytes_backward (void *a, const void *b, unsigned long len, void *ret)
-{
- unsigned char *x = (unsigned char *) a;
- unsigned char *y = (unsigned char *) b;
- unsigned long i;
-
- /* 'len' might be zero here, so preloading the first two values
- before the loop may access unallocated memory. */
- for (i = 0; i < len; i++) {
- *--x = *--y;
- }
- return ret;
-}
-
-static inline void * __attribute__ ((always_inline))
-do_bytes_aligned (void *a, const void *b, unsigned long len, void *ret)
-{
- unsigned char *x = (unsigned char *) a;
-
- if(len > 0) {
- bitfields_t bw;
- bw.v = *((reg_t*) b);
-
-#if __mips64
- DO_BYTE(x, 0);
- DO_BYTE(x, 1);
- DO_BYTE(x, 2);
- DO_BYTE(x, 3);
- DO_BYTE(x, 4);
- DO_BYTE(x, 5);
- DO_BYTE(x, 6);
- DO_BYTE(x, 7);
-#else
- DO_BYTE(x, 0);
- DO_BYTE(x, 1);
- DO_BYTE(x, 2);
- DO_BYTE(x, 3);
-#endif
- }
-
- return ret;
-}
-
-#if !HW_UNALIGNED_SUPPORT
-#if UNALIGNED_INSTR_SUPPORT
-/* for MIPS GCC, there are no unaligned builtins - so this struct forces
- the compiler to treat the pointer access as unaligned. */
-struct ulw
-{
- reg_t uli;
-} __attribute__ ((packed));
-
-#define STORE_UNALIGNED_8(a, b) \
-{ \
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3]; \
- reg_t y4 = b[4], y5 = b[5], y6 = b[6], y7 = b[7]; \
- a[0].uli = y0; \
- a[1].uli = y1; \
- a[2].uli = y2; \
- a[3].uli = y3; \
- a[4].uli = y4; \
- a[5].uli = y5; \
- a[6].uli = y6; \
- a[7].uli = y7; \
-}
-
-#define STORE_UNALIGNED_4(a, b) \
-{ \
- reg_t y0 = b[0], y1 = b[1], y2 = b[2], y3 = b[3]; \
- a[0].uli = y0; \
- a[1].uli = y1; \
- a[2].uli = y2; \
- a[3].uli = y3; \
-}
-
-/* first pointer is not aligned while second pointer is. */
-static void *
-unaligned_words_forward (struct ulw *a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
-#if ((_MIPS_SIM == _ABIO32) || _MIPS_TUNE_I6400)
- unsigned long i, words_by_8, words_by_1;
- words_by_1 = words % 8;
- words_by_8 = words >> 3;
- for (; words_by_8 > 0; words_by_8--) {
- if(words_by_8 != 1)
- PREFETCH (b + 8);
- STORE_UNALIGNED_8(a, b);
- a += 8;
- b += 8;
- }
-#else
- unsigned long i, words_by_4, words_by_1;
- words_by_1 = words % 4;
- words_by_4 = words >> 2;
- for (; words_by_4 > 0; words_by_4--) {
- if(words_by_4 != 1)
- PREFETCH (b + 4);
- STORE_UNALIGNED_4(a, b);
- a += 4;
- b += 4;
- }
-#endif
-
- /* do remaining words. */
- for (i = 0; i < words_by_1; i++) {
- a->uli = *b;
- a += 1;
- b += 1;
- }
-
- /* mop up any remaining bytes. */
- return do_bytes_aligned (a, b, bytes, ret);
-}
-
-static void *
-unaligned_words_backward (struct ulw *a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
-#if ((_MIPS_SIM == _ABIO32) || _MIPS_TUNE_I6400)
- unsigned long i, words_by_8, words_by_1;
- words_by_1 = words % 8;
- words_by_8 = words >> 3;
- for (; words_by_8 > 0; words_by_8--) {
- if(words_by_8 != 1)
- PREFETCH (b - 16);
- a -= 8;
- b -= 8;
- STORE_UNALIGNED_8(a, b);
- }
-#else
- unsigned long i, words_by_4, words_by_1;
- words_by_1 = words % 4;
- words_by_4 = words >> 2;
- for (; words_by_4 > 0; words_by_4--) {
- if(words_by_4 != 1)
- PREFETCH (b - 8);
- a -= 4;
- b -= 4;
- STORE_UNALIGNED_4(a, b);
- }
-#endif
-
- /* do remaining words. */
- for (i = 0; i < words_by_1; i++) {
- a -= 1;
- b -= 1;
- a->uli = *b;
- }
-
- /* mop up any remaining bytes. */
- return do_bytes_backward (a, b, bytes, ret);
-}
-
-#else
-/* no HW support or unaligned lw/ld/ualw/uald instructions. */
-static void *
-unaligned_words_forward (reg_t * a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
- return do_bytes_aligned (a, b, (sizeof (reg_t) * words) + bytes, ret);
-}
-
-static void *
-unaligned_words_backward (reg_t * a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
- return do_bytes_backward (a, b, (sizeof (reg_t) * words) + bytes, ret);
-}
-
-#endif /* UNALIGNED_INSTR_SUPPORT */
-#endif /* HW_UNALIGNED_SUPPORT */
-
-/* both pointers are aligned, or first isn't and HW support for unaligned. */
-
-#define STORE_ALIGNED_8(a, b) \
-{ \
- reg_t x0 = b[0], x1 = b[1], x2 = b[2], x3 = b[3]; \
- reg_t x4 = b[4], x5 = b[5], x6 = b[6], x7 = b[7]; \
- a[0] = x0; \
- a[1] = x1; \
- a[2] = x2; \
- a[3] = x3; \
- a[4] = x4; \
- a[5] = x5; \
- a[6] = x6; \
- a[7] = x7; \
-}
-
-#define STORE_ALIGNED_4(a, b) \
-{ \
- reg_t x0 = b[0], x1 = b[1], x2 = b[2], x3 = b[3]; \
- a[0] = x0; \
- a[1] = x1; \
- a[2] = x2; \
- a[3] = x3; \
-}
-
-static void *
-aligned_words_forward (reg_t * a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
-#if ((_MIPS_SIM == _ABIO32) || _MIPS_TUNE_I6400)
- unsigned long i, words_by_8, words_by_1;
- words_by_1 = words % 8;
- words_by_8 = words >> 3;
- for (; words_by_8 > 0; words_by_8--) {
- if(words_by_8 != 1)
- PREFETCH (b + 8);
- STORE_ALIGNED_8(a, b);
- a += 8;
- b += 8;
- }
-#else
- unsigned long i, words_by_4, words_by_1;
- words_by_1 = words % 4;
- words_by_4 = words >> 2;
- for (; words_by_4 > 0; words_by_4--) {
- if(words_by_4 != 1)
- PREFETCH (b + 4);
- STORE_ALIGNED_4(a, b);
- a += 4;
- b += 4;
- }
-#endif
-
- /* do remaining words. */
- for (i = 0; i < words_by_1; i++) {
- *a = *b;
- a += 1;
- b += 1;
- }
-
- /* mop up any remaining bytes. */
- return do_bytes_aligned (a, b, bytes, ret);
-}
-
-
-static void *
-aligned_words_backward (reg_t * a, const reg_t * b,
- unsigned long words, unsigned long bytes, void *ret)
-{
-#if ((_MIPS_SIM == _ABIO32) || _MIPS_TUNE_I6400)
- unsigned long i, words_by_8, words_by_1;
- words_by_1 = words % 8;
- words_by_8 = words >> 3;
- for (; words_by_8 > 0; words_by_8--) {
- if(words_by_8 != 1)
- PREFETCH (b - 16);
- a -= 8;
- b -= 8;
- STORE_ALIGNED_8(a, b);
- }
-#else
- unsigned long i, words_by_4, words_by_1;
- words_by_1 = words % 4;
- words_by_4 = words >> 2;
- for (; words_by_4 > 0; words_by_4--) {
- if(words_by_4 != 1)
- PREFETCH (b - 8);
- a -= 4;
- b -= 4;
- STORE_ALIGNED_4(a, b);
- }
-#endif
-
- /* do remaining words. */
- for (i = 0; i < words_by_1; i++) {
- a -= 1;
- b -= 1;
- *a = *b;
- }
-
- /* mop up any remaining bytes. */
- return do_bytes_backward (a, b, bytes, ret);
-}
-
-void *
-memmove (void *dst0, const void *src0, size_t length)
-{
- unsigned long bytes, words;
- void *ret = dst0;
-
- if (length == 0 || dst0 == src0) /* nothing to do */
- return dst0;
-
- if ((unsigned long)dst0 < (unsigned long)src0) {
- /* Copy forwards. */
- /* This shouldn't hit that often. */
- if (length < sizeof (reg_t) * 4) {
- return do_bytes (dst0, src0, length, ret);
- }
-
- /* Align the second pointer to word/dword alignment.
- Note that the pointer is only 32-bits for o32/n32 ABIs. For
- n32, loads are done as 64-bit while address remains 32-bit. */
- bytes = ((unsigned long) src0) % sizeof (reg_t);
- if (bytes) {
- bytes = sizeof (reg_t) - bytes;
- if (bytes > length)
- bytes = length;
- do_bytes (dst0, src0, bytes, ret);
- if (length == bytes)
- return ret;
- length -= bytes;
- dst0 = (void *) (((unsigned char *) dst0) + bytes);
- src0 = (const void *) (((unsigned char *) src0) + bytes);
- }
-
- /* Second pointer now aligned. */
- words = length / sizeof (reg_t);
- bytes = length % sizeof (reg_t);
-#if HW_UNALIGNED_SUPPORT
- /* treat possible unaligned first pointer as aligned. */
- return aligned_words_forward (dst0, src0, words, bytes, ret);
-#else
- if (((unsigned long) dst0) % sizeof (reg_t) == 0) {
- return aligned_words_forward (dst0, src0, words, bytes, ret);
- }
- /* need to use unaligned instructions on first pointer. */
- return unaligned_words_forward (dst0, src0, words, bytes, ret);
-#endif
- } else {
- /* Copy backwards. */
- dst0 = (void *) (((unsigned char *) dst0) + length);
- src0 = (const void *) (((unsigned char *) src0) + length);
-
- /* This shouldn't hit that often. */
- if (length < sizeof (reg_t) * 4) {
- return do_bytes_backward (dst0, src0, length, ret);
- }
-
- /* Align the second pointer to word/dword alignment.
- Note that the pointer is only 32-bits for o32/n32 ABIs. For
- n32, loads are done as 64-bit while address remains 32-bit. */
- bytes = ((unsigned long) src0) % sizeof (reg_t);
- if (bytes) {
- if (bytes > length)
- bytes = length;
- do_bytes_backward (dst0, src0, bytes, ret);
- if (length == bytes)
- return ret;
- length -= bytes;
- dst0 = (void *) (((unsigned char *) dst0) - bytes);
- src0 = (const void *) (((unsigned char *) src0) - bytes);
- }
-
- words = length / sizeof (reg_t);
- bytes = length % sizeof (reg_t);
-#if HW_UNALIGNED_SUPPORT
- /* treat possible unaligned first pointer as aligned. */
- return aligned_words_backward ((void *)dst0, (void *)src0, words, bytes, ret);
-#else
- if (((unsigned long) dst0) % sizeof (reg_t) == 0) {
- return aligned_words_backward (dst0, src0, words, bytes, ret);
- }
- /* need to use unaligned instructions on first pointer. */
- return unaligned_words_backward (dst0, src0, words, bytes, ret);
-#endif
- }
-}
diff --git a/libc/arch-mips/string/memset.S b/libc/arch-mips/string/memset.S
deleted file mode 100644
index 85ba2e9..0000000
--- a/libc/arch-mips/string/memset.S
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Copyright (c) 2013
- * MIPS Technologies, Inc., California.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifdef __ANDROID__
-# include <private/bionic_asm.h>
-# define PREFETCH_STORE_HINT PREFETCH_HINT_PREPAREFORSTORE
-#elif _LIBC
-# include <sysdep.h>
-# include <regdef.h>
-# include <sys/asm.h>
-# define PREFETCH_STORE_HINT PREFETCH_HINT_PREPAREFORSTORE
-#elif _COMPILING_NEWLIB
-# include "machine/asm.h"
-# include "machine/regdef.h"
-# define PREFETCH_STORE_HINT PREFETCH_HINT_PREPAREFORSTORE
-#else
-# include <regdef.h>
-# include <sys/asm.h>
-#endif
-
-/* Check to see if the MIPS architecture we are compiling for supports
- prefetching. */
-
-#if (__mips == 4) || (__mips == 5) || (__mips == 32) || (__mips == 64)
-# ifndef DISABLE_PREFETCH
-# define USE_PREFETCH
-# endif
-#endif
-
-#if defined(_MIPS_SIM) && ((_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32))
-# ifndef DISABLE_DOUBLE
-# define USE_DOUBLE
-# endif
-#endif
-
-#ifndef USE_DOUBLE
-# ifndef DISABLE_DOUBLE_ALIGN
-# define DOUBLE_ALIGN
-# endif
-#endif
-
-/* Some asm.h files do not have the L macro definition. */
-#ifndef L
-# if _MIPS_SIM == _ABIO32
-# define L(label) $L ## label
-# else
-# define L(label) .L ## label
-# endif
-#endif
-
-/* Some asm.h files do not have the PTR_ADDIU macro definition. */
-#ifndef PTR_ADDIU
-# if _MIPS_SIM == _ABIO32
-# define PTR_ADDIU addiu
-# else
-# define PTR_ADDIU daddiu
-# endif
-#endif
-
-/* New R6 instructions that may not be in asm.h. */
-#ifndef PTR_LSA
-# if _MIPS_SIM == _ABIO32
-# define PTR_LSA lsa
-# else
-# define PTR_LSA dlsa
-# endif
-#endif
-
-/* Using PREFETCH_HINT_PREPAREFORSTORE instead of PREFETCH_STORE
- or PREFETCH_STORE_STREAMED offers a large performance advantage
- but PREPAREFORSTORE has some special restrictions to consider.
-
- Prefetch with the 'prepare for store' hint does not copy a memory
- location into the cache, it just allocates a cache line and zeros
- it out. This means that if you do not write to the entire cache
- line before writing it out to memory some data will get zero'ed out
- when the cache line is written back to memory and data will be lost.
-
- There are ifdef'ed sections of this memcpy to make sure that it does not
- do prefetches on cache lines that are not going to be completely written.
- This code is only needed and only used when PREFETCH_STORE_HINT is set to
- PREFETCH_HINT_PREPAREFORSTORE. This code assumes that cache lines are
- less than MAX_PREFETCH_SIZE bytes and if the cache line is larger it will
- not work correctly. */
-
-#ifdef USE_PREFETCH
-# define PREFETCH_HINT_STORE 1
-# define PREFETCH_HINT_STORE_STREAMED 5
-# define PREFETCH_HINT_STORE_RETAINED 7
-# define PREFETCH_HINT_PREPAREFORSTORE 30
-
-/* If we have not picked out what hints to use at this point use the
- standard load and store prefetch hints. */
-# ifndef PREFETCH_STORE_HINT
-# define PREFETCH_STORE_HINT PREFETCH_HINT_STORE
-# endif
-
-/* We double everything when USE_DOUBLE is true so we do 2 prefetches to
- get 64 bytes in that case. The assumption is that each individual
- prefetch brings in 32 bytes. */
-# ifdef USE_DOUBLE
-# define PREFETCH_CHUNK 64
-# define PREFETCH_FOR_STORE(chunk, reg) \
- pref PREFETCH_STORE_HINT, (chunk)*64(reg); \
- pref PREFETCH_STORE_HINT, ((chunk)*64)+32(reg)
-# else
-# define PREFETCH_CHUNK 32
-# define PREFETCH_FOR_STORE(chunk, reg) \
- pref PREFETCH_STORE_HINT, (chunk)*32(reg)
-# endif
-
-/* MAX_PREFETCH_SIZE is the maximum size of a prefetch, it must not be less
- than PREFETCH_CHUNK, the assumed size of each prefetch. If the real size
- of a prefetch is greater than MAX_PREFETCH_SIZE and the PREPAREFORSTORE
- hint is used, the code will not work correctly. If PREPAREFORSTORE is not
- used than MAX_PREFETCH_SIZE does not matter. */
-# define MAX_PREFETCH_SIZE 128
-/* PREFETCH_LIMIT is set based on the fact that we never use an offset greater
- than 5 on a STORE prefetch and that a single prefetch can never be larger
- than MAX_PREFETCH_SIZE. We add the extra 32 when USE_DOUBLE is set because
- we actually do two prefetches in that case, one 32 bytes after the other. */
-# ifdef USE_DOUBLE
-# define PREFETCH_LIMIT (5 * PREFETCH_CHUNK) + 32 + MAX_PREFETCH_SIZE
-# else
-# define PREFETCH_LIMIT (5 * PREFETCH_CHUNK) + MAX_PREFETCH_SIZE
-# endif
-
-# if (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) \
- && ((PREFETCH_CHUNK * 4) < MAX_PREFETCH_SIZE)
-/* We cannot handle this because the initial prefetches may fetch bytes that
- are before the buffer being copied. We start copies with an offset
- of 4 so avoid this situation when using PREPAREFORSTORE. */
-# error "PREFETCH_CHUNK is too large and/or MAX_PREFETCH_SIZE is too small."
-# endif
-#else /* USE_PREFETCH not defined */
-# define PREFETCH_FOR_STORE(offset, reg)
-#endif
-
-#if __mips_isa_rev > 5
-# if (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE)
-# undef PREFETCH_STORE_HINT
-# define PREFETCH_STORE_HINT PREFETCH_HINT_STORE_STREAMED
-# endif
-# define R6_CODE
-#endif
-
-/* We load/store 64 bits at a time when USE_DOUBLE is true.
- The C_ prefix stands for CHUNK and is used to avoid macro name
- conflicts with system header files. */
-
-#ifdef USE_DOUBLE
-# define C_ST sd
-# if __MIPSEB
-# define C_STHI sdl /* high part is left in big-endian */
-# else
-# define C_STHI sdr /* high part is right in little-endian */
-# endif
-#else
-# define C_ST sw
-# if __MIPSEB
-# define C_STHI swl /* high part is left in big-endian */
-# else
-# define C_STHI swr /* high part is right in little-endian */
-# endif
-#endif
-
-/* Bookkeeping values for 32 vs. 64 bit mode. */
-#ifdef USE_DOUBLE
-# define NSIZE 8
-# define NSIZEMASK 0x3f
-# define NSIZEDMASK 0x7f
-#else
-# define NSIZE 4
-# define NSIZEMASK 0x1f
-# define NSIZEDMASK 0x3f
-#endif
-#define UNIT(unit) ((unit)*NSIZE)
-#define UNITM1(unit) (((unit)*NSIZE)-1)
-
-#ifdef __ANDROID__
-LEAF(__memset_chk,0)
-#else
-LEAF(__memset_chk)
-#endif
- .set noreorder
- sltu $t2, $a3, $a2
- beq $t2, $zero, memset
- nop
- .cpsetup $t9, $t8, __memset_chk
- LA $t9, __memset_chk_fail
- jr $t9
- nop
- .set reorder
-END(__memset_chk)
-
-#ifdef __ANDROID__
-LEAF(memset,0)
-#else
-LEAF(memset)
-#endif
-
- .set nomips16
- .set noreorder
-/* If the size is less than 2*NSIZE (8 or 16), go to L(lastb). Regardless of
- size, copy dst pointer to v0 for the return value. */
- slti $t2,$a2,(2 * NSIZE)
- bne $t2,$zero,L(lastb)
- move $v0,$a0
-
-/* If memset value is not zero, we copy it to all the bytes in a 32 or 64
- bit word. */
- beq $a1,$zero,L(set0) /* If memset value is zero no smear */
- PTR_SUBU $a3,$zero,$a0
- nop
-
- /* smear byte into 32 or 64 bit word */
-#if ((__mips == 64) || (__mips == 32)) && (__mips_isa_rev >= 2)
-# ifdef USE_DOUBLE
- dins $a1, $a1, 8, 8 /* Replicate fill byte into half-word. */
- dins $a1, $a1, 16, 16 /* Replicate fill byte into word. */
- dins $a1, $a1, 32, 32 /* Replicate fill byte into dbl word. */
-# else
- ins $a1, $a1, 8, 8 /* Replicate fill byte into half-word. */
- ins $a1, $a1, 16, 16 /* Replicate fill byte into word. */
-# endif
-#else
-# ifdef USE_DOUBLE
- and $a1,0xff
- dsll $t2,$a1,8
- or $a1,$t2
- dsll $t2,$a1,16
- or $a1,$t2
- dsll $t2,$a1,32
- or $a1,$t2
-# else
- and $a1,0xff
- sll $t2,$a1,8
- or $a1,$t2
- sll $t2,$a1,16
- or $a1,$t2
-# endif
-#endif
-
-/* If the destination address is not aligned do a partial store to get it
- aligned. If it is already aligned just jump to L(aligned). */
-L(set0):
-#ifndef R6_CODE
- andi $t2,$a3,(NSIZE-1) /* word-unaligned address? */
- beq $t2,$zero,L(aligned) /* t2 is the unalignment count */
- PTR_SUBU $a2,$a2,$t2
- C_STHI $a1,0($a0)
- PTR_ADDU $a0,$a0,$t2
-#else /* R6_CODE */
- andi $t2,$a0,(NSIZE-1)
- lapc $t9,L(atable)
- PTR_LSA $t9,$t2,$t9,2
- jrc $t9
-L(atable):
- bc L(aligned)
-# ifdef USE_DOUBLE
- bc L(lb7)
- bc L(lb6)
- bc L(lb5)
- bc L(lb4)
-# endif
- bc L(lb3)
- bc L(lb2)
- bc L(lb1)
-L(lb7):
- sb $a1,6($a0)
-L(lb6):
- sb $a1,5($a0)
-L(lb5):
- sb $a1,4($a0)
-L(lb4):
- sb $a1,3($a0)
-L(lb3):
- sb $a1,2($a0)
-L(lb2):
- sb $a1,1($a0)
-L(lb1):
- sb $a1,0($a0)
-
- li $t9,NSIZE
- subu $t2,$t9,$t2
- PTR_SUBU $a2,$a2,$t2
- PTR_ADDU $a0,$a0,$t2
-#endif /* R6_CODE */
-
-L(aligned):
-/* If USE_DOUBLE is not set we may still want to align the data on a 16
- byte boundry instead of an 8 byte boundry to maximize the opportunity
- of proAptiv chips to do memory bonding (combining two sequential 4
- byte stores into one 8 byte store). We know there are at least 4 bytes
- left to store or we would have jumped to L(lastb) earlier in the code. */
-#ifdef DOUBLE_ALIGN
- andi $t2,$a3,4
- beq $t2,$zero,L(double_aligned)
- PTR_SUBU $a2,$a2,$t2
- sw $a1,0($a0)
- PTR_ADDU $a0,$a0,$t2
-L(double_aligned):
-#endif
-
-/* Now the destination is aligned to (word or double word) aligned address
- Set a2 to count how many bytes we have to copy after all the 64/128 byte
- chunks are copied and a3 to the dest pointer after all the 64/128 byte
- chunks have been copied. We will loop, incrementing a0 until it equals
- a3. */
- andi $t8,$a2,NSIZEDMASK /* any whole 64-byte/128-byte chunks? */
- beq $a2,$t8,L(chkw) /* if a2==t8, no 64-byte/128-byte chunks */
- PTR_SUBU $a3,$a2,$t8 /* subtract from a2 the reminder */
- PTR_ADDU $a3,$a0,$a3 /* Now a3 is the final dst after loop */
-
-/* When in the loop we may prefetch with the 'prepare to store' hint,
- in this case the a0+x should not be past the "t0-32" address. This
- means: for x=128 the last "safe" a0 address is "t0-160". Alternatively,
- for x=64 the last "safe" a0 address is "t0-96" In the current version we
- will use "prefetch hint,128(a0)", so "t0-160" is the limit. */
-#if defined(USE_PREFETCH) \
- && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE)
- PTR_ADDU $t0,$a0,$a2 /* t0 is the "past the end" address */
- PTR_SUBU $t9,$t0,PREFETCH_LIMIT /* t9 is the "last safe pref" address */
-#endif
-#if defined(USE_PREFETCH) \
- && (PREFETCH_STORE_HINT != PREFETCH_HINT_PREPAREFORSTORE)
- PREFETCH_FOR_STORE (1, $a0)
- PREFETCH_FOR_STORE (2, $a0)
- PREFETCH_FOR_STORE (3, $a0)
-#endif
-
-L(loop16w):
-#if defined(USE_PREFETCH) \
- && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE)
- sltu $v1,$t9,$a0 /* If a0 > t9 don't use next prefetch */
- bgtz $v1,L(skip_pref)
- nop
-#endif
-#ifndef R6_CODE
- PREFETCH_FOR_STORE (4, $a0)
- PREFETCH_FOR_STORE (5, $a0)
-#else
- PREFETCH_FOR_STORE (2, $a0)
-#endif
-L(skip_pref):
- C_ST $a1,UNIT(0)($a0)
- C_ST $a1,UNIT(1)($a0)
- C_ST $a1,UNIT(2)($a0)
- C_ST $a1,UNIT(3)($a0)
- C_ST $a1,UNIT(4)($a0)
- C_ST $a1,UNIT(5)($a0)
- C_ST $a1,UNIT(6)($a0)
- C_ST $a1,UNIT(7)($a0)
- C_ST $a1,UNIT(8)($a0)
- C_ST $a1,UNIT(9)($a0)
- C_ST $a1,UNIT(10)($a0)
- C_ST $a1,UNIT(11)($a0)
- C_ST $a1,UNIT(12)($a0)
- C_ST $a1,UNIT(13)($a0)
- C_ST $a1,UNIT(14)($a0)
- C_ST $a1,UNIT(15)($a0)
- PTR_ADDIU $a0,$a0,UNIT(16) /* adding 64/128 to dest */
- bne $a0,$a3,L(loop16w)
- nop
- move $a2,$t8
-
-/* Here we have dest word-aligned but less than 64-bytes or 128 bytes to go.
- Check for a 32(64) byte chunk and copy if if there is one. Otherwise
- jump down to L(chk1w) to handle the tail end of the copy. */
-L(chkw):
- andi $t8,$a2,NSIZEMASK /* is there a 32-byte/64-byte chunk. */
- /* the t8 is the reminder count past 32-bytes */
- beq $a2,$t8,L(chk1w)/* when a2==t8, no 32-byte chunk */
- nop
- C_ST $a1,UNIT(0)($a0)
- C_ST $a1,UNIT(1)($a0)
- C_ST $a1,UNIT(2)($a0)
- C_ST $a1,UNIT(3)($a0)
- C_ST $a1,UNIT(4)($a0)
- C_ST $a1,UNIT(5)($a0)
- C_ST $a1,UNIT(6)($a0)
- C_ST $a1,UNIT(7)($a0)
- PTR_ADDIU $a0,$a0,UNIT(8)
-
-/* Here we have less than 32(64) bytes to set. Set up for a loop to
- copy one word (or double word) at a time. Set a2 to count how many
- bytes we have to copy after all the word (or double word) chunks are
- copied and a3 to the dest pointer after all the (d)word chunks have
- been copied. We will loop, incrementing a0 until a0 equals a3. */
-L(chk1w):
- andi $a2,$t8,(NSIZE-1) /* a2 is the reminder past one (d)word chunks */
- beq $a2,$t8,L(lastb)
- PTR_SUBU $a3,$t8,$a2 /* a3 is count of bytes in one (d)word chunks */
- PTR_ADDU $a3,$a0,$a3 /* a3 is the dst address after loop */
-
-/* copying in words (4-byte or 8 byte chunks) */
-L(wordCopy_loop):
- PTR_ADDIU $a0,$a0,UNIT(1)
- bne $a0,$a3,L(wordCopy_loop)
- C_ST $a1,UNIT(-1)($a0)
-
-/* Copy the last 8 (or 16) bytes */
-L(lastb):
- blez $a2,L(leave)
- PTR_ADDU $a3,$a0,$a2 /* a3 is the last dst address */
-L(lastbloop):
- PTR_ADDIU $a0,$a0,1
- bne $a0,$a3,L(lastbloop)
- sb $a1,-1($a0)
-L(leave):
- j $ra
- nop
-
- .set at
- .set reorder
-END(memset)
-#ifndef __ANDROID__
-# ifdef _LIBC
-libc_hidden_builtin_def (memset)
-libc_hidden_builtin_def (__memset_chk)
-# endif
-#endif
diff --git a/libc/arch-mips/string/strchr.c b/libc/arch-mips/string/strchr.c
deleted file mode 100644
index 3458f66..0000000
--- a/libc/arch-mips/string/strchr.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-
-#define op_t unsigned long int
-#define op_size sizeof (op_t)
-
-#if __mips64
-typedef struct
-{
- op_t B0:8, B1:8, B2:8, B3:8, B4:8, B5:8, B6:8, B7:8;
-} bits_t;
-#else
-typedef struct
-{
- op_t B0:8, B1:8, B2:8, B3:8;
-} bits_t;
-#endif
-
-typedef union
-{
- op_t v;
- bits_t b;
-} bitfields_t;
-
-#define DO_BYTE(i) \
- if (a.b.B##i != ch) { \
- if(a.b.B##i == '\0') return 0; \
- p++; \
- } else \
- return (char *)p;
-
-#define DO_WORD(w, cnt) { \
- op_t val = w[cnt] ^ mask_c; \
- if ((((w[cnt] - mask_1) & ~w[cnt]) & mask_128) || \
- (((val - mask_1) & ~val) & mask_128)) { \
- return do_bytes(w + cnt, ch); \
- } \
-}
-
-static inline char * __attribute__ ((always_inline))
-do_bytes (const op_t* w, unsigned char ch)
-{
- bitfields_t a;
- unsigned char* p = (unsigned char *) w;
- a.v = *w;
-#if __mips64
- DO_BYTE(0)
- DO_BYTE(1)
- DO_BYTE(2)
- DO_BYTE(3)
- DO_BYTE(4)
- DO_BYTE(5)
- DO_BYTE(6)
- DO_BYTE(7)
-#else
- DO_BYTE(0)
- DO_BYTE(1)
- DO_BYTE(2)
- DO_BYTE(3)
-#endif
- return (char *)p;
-}
-
-char* strchr(const char* s, int c)
-{
- const op_t *w;
- op_t mask_1, mask_128, mask_c;
- const unsigned char ch = c;
- unsigned char* p = (unsigned char *) s;
-
- /*
- * Check byte by byte till initial alignment
- */
- for ( ; *p != ch && ((size_t) p % op_size) != 0; p++)
- if (*p == '\0')
- return 0;
-
- if (*p != ch) {
- w = (const op_t *) p;
-
- mask_c = ch | (ch << 8);
- mask_c |= mask_c << 16;
- __asm__ volatile (
- "li %0, 0x01010101 \n\t"
- : "=r" (mask_1)
- );
-#if __mips64
- mask_1 |= mask_1 << 32;
- mask_c |= mask_c << 32;
-#endif
- mask_128 = mask_1 << 7;
-
- /*
- * Check word/dword wize after initial alignment till character match
- * or end of string
- */
- while (1) {
- DO_WORD(w, 0)
- DO_WORD(w, 1)
- DO_WORD(w, 2)
- DO_WORD(w, 3)
- w += 4;
- }
- }
-
- return (char *)p;
-}
diff --git a/libc/arch-mips/string/strcmp.S b/libc/arch-mips/string/strcmp.S
deleted file mode 100644
index 4791a0d..0000000
--- a/libc/arch-mips/string/strcmp.S
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef __ANDROID__
-# include <private/bionic_asm.h>
-#elif _LIBC
-# include <sysdep.h>
-# include <regdef.h>
-# include <sys/asm.h>
-#elif _COMPILING_NEWLIB
-# include "machine/asm.h"
-# include "machine/regdef.h"
-#else
-# include <regdef.h>
-# include <sys/asm.h>
-#endif
-
-#if __mips64
-# define NSIZE 8
-# define LW ld
-# define EXT dext
-# define SRL dsrl
-# define SLL dsll
-# define SUBU dsubu
-#else
-# define NSIZE 4
-# define LW lw
-# define EXT ext
-# define SRL srl
-# define SLL sll
-# define SUBU subu
-#endif
-
-/* Technically strcmp should not read past the end of the strings being
- compared. We will read a full word that may contain excess bits beyond
- the NULL string terminator but unless ENABLE_READAHEAD is set, we will not
- read the next word after the end of string. Setting ENABLE_READAHEAD will
- improve performance but is technically illegal based on the definition of
- strcmp. */
-#ifdef ENABLE_READAHEAD
-# define DELAY_READ
-#else
-# define DELAY_READ nop
-#endif
-
-/* Testing on a little endian machine showed using CLZ was a
- performance loss, so we are not turning it on by default. */
-#if defined(ENABLE_CLZ) && (__mips_isa_rev > 1)
-# define USE_CLZ
-#endif
-
-/* Some asm.h files do not have the L macro definition. */
-#ifndef L
-# if _MIPS_SIM == _ABIO32
-# define L(label) $L ## label
-# else
-# define L(label) .L ## label
-# endif
-#endif
-
-/* Some asm.h files do not have the PTR_ADDIU macro definition. */
-#ifndef PTR_ADDIU
-# if _MIPS_SIM == _ABIO32
-# define PTR_ADDIU addiu
-# else
-# define PTR_ADDIU daddiu
-# endif
-#endif
-
-/* It might seem better to do the 'beq' instruction between the two 'lbu'
- instructions so that the nop is not needed but testing showed that this
- code is actually faster (based on glibc strcmp test). */
-#define BYTECMP01(OFFSET) \
- lbu $v0, OFFSET($a0); \
- lbu $v1, OFFSET($a1); \
- beq $v0, $zero, L(bexit01); \
- nop; \
- bne $v0, $v1, L(bexit01)
-
-#define BYTECMP89(OFFSET) \
- lbu $t8, OFFSET($a0); \
- lbu $t9, OFFSET($a1); \
- beq $t8, $zero, L(bexit89); \
- nop; \
- bne $t8, $t9, L(bexit89)
-
-/* Allow the routine to be named something else if desired. */
-#ifndef STRCMP_NAME
-# define STRCMP_NAME strcmp
-#endif
-
-#ifdef __ANDROID__
-LEAF(STRCMP_NAME, 0)
-#else
-LEAF(STRCMP_NAME)
-#endif
- .set nomips16
- .set noreorder
-
- andi $t1, $a1, (NSIZE - 1)
- beqz $t1, L(exitalign)
- or $t0, $zero, NSIZE
- SUBU $t1, $t0, $t1 #process (NSIZE - 1) bytes at max
-
-L(alignloop): #do by bytes until a1 aligned
- BYTECMP01(0)
- SUBU $t1, $t1, 0x1
- PTR_ADDIU $a0, $a0, 0x1
- bnez $t1, L(alignloop)
- PTR_ADDIU $a1, $a1, 0x1
-
-L(exitalign):
-
-/* string a1 is NSIZE byte aligned at this point. */
-
- lui $t8, 0x0101
- ori $t8, 0x0101
- lui $t9, 0x7f7f
- ori $t9, 0x7f7f
-#if __mips64
- dsll $t1, $t8, 32
- or $t8, $t1
- dsll $t1, $t9, 32
- or $t9, $t1
-#endif
-
- andi $t2, $a0, (NSIZE - 1) #check if a0 aligned
- SUBU $t3, $t0, $t2 #t3 will be used as shifter
- bnez $t2, L(uloopenter)
- SUBU $a2, $a0, $t2 #bring back a0 to aligned position
-
-#define STRCMPW(OFFSET) \
- LW $v0, OFFSET($a0); \
- LW $v1, OFFSET($a1); \
- SUBU $t0, $v0, $t8; \
- bne $v0, $v1, L(worddiff); \
- nor $t1, $v0, $t9; \
- and $t0, $t0, $t1; \
- bne $t0, $zero, L(returnzero);\
-
-L(wordloop):
- STRCMPW(0 * NSIZE)
- DELAY_READ
- STRCMPW(1 * NSIZE)
- DELAY_READ
- STRCMPW(2 * NSIZE)
- DELAY_READ
- STRCMPW(3 * NSIZE)
- DELAY_READ
- STRCMPW(4 * NSIZE)
- DELAY_READ
- STRCMPW(5 * NSIZE)
- DELAY_READ
- STRCMPW(6 * NSIZE)
- DELAY_READ
- STRCMPW(7 * NSIZE)
- PTR_ADDIU $a0, $a0, (8 * NSIZE)
- b L(wordloop)
- PTR_ADDIU $a1, $a1, (8 * NSIZE)
-
-#define USTRCMPW(OFFSET) \
- LW $v1, OFFSET($a1); \
- SUBU $t0, $v0, $t8; \
- nor $t1, $v0, $t9; \
- and $t0, $t0, $t1; \
- bne $t0, $zero, L(worddiff); \
- SRL $v0, $t2; \
- LW $a3, (OFFSET + NSIZE)($a2); \
- SUBU $t0, $v1, $t8; \
- SLL $t1, $a3, $t3; \
- or $v0, $v0, $t1; \
- bne $v0, $v1, L(worddiff); \
- nor $t1, $v1, $t9; \
- and $t0, $t0, $t1; \
- bne $t0, $zero, L(returnzero); \
- move $v0, $a3;\
-
-L(uloopenter):
- LW $v0, 0($a2)
- SLL $t2, 3 #multiply by 8
- SLL $t3, 3 #multiply by 8
- li $a3, -1 #all 1s
- SRL $a3, $t3
- or $v0, $a3 #replace with all 1s if zeros in unintented read
-
-L(uwordloop):
- USTRCMPW(0 * NSIZE)
- USTRCMPW(1 * NSIZE)
- USTRCMPW(2 * NSIZE)
- USTRCMPW(3 * NSIZE)
- USTRCMPW(4 * NSIZE)
- USTRCMPW(5 * NSIZE)
- USTRCMPW(6 * NSIZE)
- USTRCMPW(7 * NSIZE)
- PTR_ADDIU $a2, $a2, (8 * NSIZE)
- b L(uwordloop)
- PTR_ADDIU $a1, $a1, (8 * NSIZE)
-
-L(returnzero):
- j $ra
- move $v0, $zero
-
-#if __mips_isa_rev > 1
-#define EXT_COMPARE01(POS) \
- EXT $t0, $v0, POS, 8; \
- beq $t0, $zero, L(wexit01); \
- EXT $t1, $v1, POS, 8; \
- bne $t0, $t1, L(wexit01)
-#define EXT_COMPARE89(POS) \
- EXT $t8, $v0, POS, 8; \
- beq $t8, $zero, L(wexit89); \
- EXT $t9, $v1, POS, 8; \
- bne $t8, $t9, L(wexit89)
-#else
-#define EXT_COMPARE01(POS) \
- SRL $t0, $v0, POS; \
- SRL $t1, $v1, POS; \
- andi $t0, $t0, 0xff; \
- beq $t0, $zero, L(wexit01); \
- andi $t1, $t1, 0xff; \
- bne $t0, $t1, L(wexit01)
-#define EXT_COMPARE89(POS) \
- SRL $t8, $v0, POS; \
- SRL $t9, $v1, POS; \
- andi $t8, $t8, 0xff; \
- beq $t8, $zero, L(wexit89); \
- andi $t9, $t9, 0xff; \
- bne $t8, $t9, L(wexit89)
-#endif
-
-L(worddiff):
-#ifdef USE_CLZ
- SUBU $t0, $v0, $t8
- nor $t1, $v0, $t9
- and $t1, $t0, $t1
- xor $t0, $v0, $v1
- or $t0, $t0, $t1
-# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- wsbh $t0, $t0
- rotr $t0, $t0, 16
-# endif
- clz $t1, $t0
- and $t1, 0xf8
-# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
- neg $t1
- addu $t1, 24
-# endif
- rotrv $v0, $v0, $t1
- rotrv $v1, $v1, $t1
- and $v0, $v0, 0xff
- and $v1, $v1, 0xff
- j $ra
- SUBU $v0, $v0, $v1
-#else /* USE_CLZ */
-# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- andi $t0, $v0, 0xff
- beq $t0, $zero, L(wexit01)
- andi $t1, $v1, 0xff
- bne $t0, $t1, L(wexit01)
- EXT_COMPARE89(8)
- EXT_COMPARE01(16)
-#ifndef __mips64
- SRL $t8, $v0, 24
- SRL $t9, $v1, 24
-#else
- EXT_COMPARE89(24)
- EXT_COMPARE01(32)
- EXT_COMPARE89(40)
- EXT_COMPARE01(48)
- SRL $t8, $v0, 56
- SRL $t9, $v1, 56
-#endif
-
-# else /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
-#ifdef __mips64
- SRL $t0, $v0, 56
- beq $t0, $zero, L(wexit01)
- SRL $t1, $v1, 56
- bne $t0, $t1, L(wexit01)
- EXT_COMPARE89(48)
- EXT_COMPARE01(40)
- EXT_COMPARE89(32)
- EXT_COMPARE01(24)
-#else
- SRL $t0, $v0, 24
- beq $t0, $zero, L(wexit01)
- SRL $t1, $v1, 24
- bne $t0, $t1, L(wexit01)
-#endif
- EXT_COMPARE89(16)
- EXT_COMPARE01(8)
-
- andi $t8, $v0, 0xff
- andi $t9, $v1, 0xff
-# endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
-
-L(wexit89):
- j $ra
- SUBU $v0, $t8, $t9
-L(wexit01):
- j $ra
- SUBU $v0, $t0, $t1
-#endif /* USE_CLZ */
-
-L(byteloop):
- BYTECMP01(0)
- BYTECMP89(1)
- BYTECMP01(2)
- BYTECMP89(3)
- BYTECMP01(4)
- BYTECMP89(5)
- BYTECMP01(6)
- BYTECMP89(7)
- PTR_ADDIU $a0, $a0, 8
- b L(byteloop)
- PTR_ADDIU $a1, $a1, 8
-
-L(bexit01):
- j $ra
- SUBU $v0, $v0, $v1
-L(bexit89):
- j $ra
- SUBU $v0, $t8, $t9
-
- .set at
- .set reorder
-
-END(STRCMP_NAME)
-#ifndef __ANDROID__
-# ifdef _LIBC
-libc_hidden_builtin_def (STRCMP_NAME)
-# endif
-#endif
diff --git a/libc/arch-mips/string/strcpy.c b/libc/arch-mips/string/strcpy.c
deleted file mode 100644
index b77105e..0000000
--- a/libc/arch-mips/string/strcpy.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-
-#define op_t unsigned long int
-
-#if !defined(UNALIGNED_INSTR_SUPPORT)
-/* does target have unaligned lw/ld/ualw/uald instructions? */
-#define UNALIGNED_INSTR_SUPPORT 0
-#if __mips_isa_rev < 6 && !__mips1
-#undef UNALIGNED_INSTR_SUPPORT
-#define UNALIGNED_INSTR_SUPPORT 1
-#endif
-#endif
-
-#if !defined(HW_UNALIGNED_SUPPORT)
-/* Does target have hardware support for unaligned accesses? */
-#define HW_UNALIGNED_SUPPORT 0
-#if __mips_isa_rev >= 6
-#undef HW_UNALIGNED_SUPPORT
-#define HW_UNALIGNED_SUPPORT 1
-#endif
-#endif
-
-#if __mips64
-typedef struct
-{
- op_t B0:8, B1:8, B2:8, B3:8, B4:8, B5:8, B6:8, B7:8;
-} bits_t;
-#else
-typedef struct
-{
- op_t B0:8, B1:8, B2:8, B3:8;
-} bits_t;
-#endif
-
-typedef union
-{
- op_t v;
- bits_t b;
-} bitfields_t;
-
-#if !HW_UNALIGNED_SUPPORT && UNALIGNED_INSTR_SUPPORT
-/* for MIPS GCC, there are no unaligned builtins - so this struct forces
- the compiler to treat the pointer access as unaligned. */
-struct ulw
-{
- op_t uli;
-} __attribute__ ((packed));
-#endif /* !HW_UNALIGNED_SUPPORT && UNALIGNED_INSTR_SUPPORT */
-
-#define DO_BYTE(i, ptdst) { \
- *(ptdst+i) = a.b.B##i; \
- if(a.b.B##i == '\0') \
- return ret; \
-}
-
-#if __mips64
-#define DO_BYTES(val, dst) { \
- bitfields_t a; \
- char *tdst = (char *)(dst); \
- a.v = val; \
- DO_BYTE(0, tdst) \
- DO_BYTE(1, tdst) \
- DO_BYTE(2, tdst) \
- DO_BYTE(3, tdst) \
- DO_BYTE(4, tdst) \
- DO_BYTE(5, tdst) \
- DO_BYTE(6, tdst) \
- DO_BYTE(7, tdst) \
-}
-#else
-#define DO_BYTES(val, dst) { \
- bitfields_t a; \
- char *tdst = (char *)(dst); \
- a.v = val; \
- DO_BYTE(0, tdst) \
- DO_BYTE(1, tdst) \
- DO_BYTE(2, tdst) \
- DO_BYTE(3, tdst) \
-}
-#endif
-
-#define DO_WORD_ALIGNED(dst, src) { \
- op_t val = *(src); \
- if ((((val - mask_1) & ~val) & mask_128) != 0) { \
- DO_BYTES(val, dst); \
- } else *(dst) = val; \
-}
-
-#if !HW_UNALIGNED_SUPPORT
-#if UNALIGNED_INSTR_SUPPORT
-#define DO_WORD_UNALIGNED(dst, src) { \
- op_t val = *(src); \
- if ((((val - mask_1) & ~val) & mask_128) != 0) { \
- DO_BYTES(val, dst); \
- } else { \
- struct ulw *a = (struct ulw *)(dst); \
- a->uli = val; \
- } \
-}
-#else
-#define DO_WORD_UNALIGNED(dst, src) { \
- op_t val = *(src); \
- if ((((val - mask_1) & ~val) & mask_128) != 0) { \
- DO_BYTES(val, dst); \
- } else { \
- char *pdst = (char *) dst; \
- const char *psrc = (const char *) src; \
- for (; (*pdst = *psrc) != '\0'; ++psrc, ++pdst); \
- return ret; \
- } \
-}
-#endif /* UNALIGNED_INSTR_SUPPORT */
-
-#define PROCESS_UNALIGNED_WORDS(a, b) { \
- while (1) { \
- DO_WORD_UNALIGNED(a, b); \
- DO_WORD_UNALIGNED(a + 1, b + 1); \
- DO_WORD_UNALIGNED(a + 2, b + 2); \
- DO_WORD_UNALIGNED(a + 3, b + 3); \
- a += 4; \
- b += 4; \
- } \
-}
-#endif /* HW_UNALIGNED_SUPPORT */
-
-#define PROCESS_ALIGNED_WORDS(a, b) { \
- while (1) { \
- DO_WORD_ALIGNED(a, b); \
- DO_WORD_ALIGNED(a + 1, b + 1); \
- DO_WORD_ALIGNED(a + 2, b + 2); \
- DO_WORD_ALIGNED(a + 3, b + 3); \
- a += 4; \
- b += 4; \
- } \
-}
-
-char *
-strcpy (char *to, const char *from)
-{
- char *ret = to;
- op_t mask_1, mask_128;
- const op_t *src;
- op_t *dst;
-
- for (; (*to = *from) != '\0' && ((size_t) from % sizeof (op_t)) != 0; ++from, ++to);
-
- if(*to != '\0') {
- __asm__ volatile (
- "li %0, 0x01010101 \n\t"
- : "=r" (mask_1)
- );
-#if __mips64
- mask_1 |= mask_1 << 32;
-#endif
- mask_128 = mask_1 << 7;
-
- src = (const op_t *) from;
- dst = (op_t *) to;
-
-#if HW_UNALIGNED_SUPPORT
- PROCESS_ALIGNED_WORDS(dst, src);
-#else
- if (((unsigned long) dst) % sizeof (op_t) == 0) {
- PROCESS_ALIGNED_WORDS(dst, src);
- } else {
- PROCESS_UNALIGNED_WORDS(dst, src);
- }
-#endif
- }
-
- return ret;
-}
diff --git a/libc/arch-mips/string/strlen.c b/libc/arch-mips/string/strlen.c
deleted file mode 100644
index 28463f6..0000000
--- a/libc/arch-mips/string/strlen.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-
-#define op_t unsigned long int
-#define op_size sizeof (op_t)
-
-#if __mips64 || __mips_isa_rev >= 2
-static inline size_t __attribute__ ((always_inline))
-do_bytes (const char *base, const char *p, op_t inval)
-{
- op_t outval = 0;
-#if __mips64
- __asm__ volatile (
- "dsbh %1, %0 \n\t"
- "dshd %0, %1 \n\t"
- "dclz %1, %0 \n\t"
- : "+r" (inval), "+r" (outval)
- );
-#else
- __asm__ volatile (
- "wsbh %1, %0 \n\t"
- "rotr %0, %1, 16 \n\t"
- "clz %1, %0 \n\t"
- : "+r" (inval), "+r" (outval)
- );
-#endif
- p += (outval >> 3);
- return (size_t) (p - base);
-}
-
-#define DO_WORD(w, cnt) { \
- op_t val = ((w[cnt] - mask_1) & ~w[cnt]) & mask_128; \
- if (val) \
- return do_bytes(str, (const char *)(w + cnt), val); \
-}
-#else
-static inline size_t __attribute__ ((always_inline))
-do_bytes (const char *base, const char *p)
-{
- for (; *p; ++p);
- return (size_t) (p - base);
-}
-
-#define DO_WORD(w, cnt) { \
- if (((w[cnt] - mask_1) & ~w[cnt]) & mask_128) \
- return do_bytes(str, (const char *)(w + cnt)); \
-}
-#endif
-
-size_t
-strlen (const char *str)
-{
- if (*str) {
- const char *p = (const char *) str;
- const op_t *w;
- op_t mask_1, mask_128;
-
- while ((size_t) p % sizeof (op_t)) {
- if (!(*p))
- return (p - str);
- p++;
- }
-
- __asm__ volatile (
- "li %0, 0x01010101 \n\t"
- : "=r" (mask_1)
- );
-#if __mips64
- mask_1 |= mask_1 << 32;
-#endif
- mask_128 = mask_1 << 7;
-
- w = (const op_t *) p;
-
- while (1) {
- DO_WORD(w, 0);
- DO_WORD(w, 1);
- DO_WORD(w, 2);
- DO_WORD(w, 3);
- w += 4;
- }
- }
- return 0;
-}
diff --git a/libc/arch-mips/string/strncmp.S b/libc/arch-mips/string/strncmp.S
deleted file mode 100644
index 49250a0..0000000
--- a/libc/arch-mips/string/strncmp.S
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef __ANDROID__
-# include <private/bionic_asm.h>
-#elif _LIBC
-# include <sysdep.h>
-# include <regdef.h>
-# include <sys/asm.h>
-#elif _COMPILING_NEWLIB
-# include "machine/asm.h"
-# include "machine/regdef.h"
-#else
-# include <regdef.h>
-# include <sys/asm.h>
-#endif
-
-#if __mips64
-# define NSIZE 8
-# define LW ld
-# define LWR ldr
-# define LWL ldl
-# define EXT dext
-# define SRL dsrl
-# define SUBU dsubu
-#else
-# define NSIZE 4
-# define LW lw
-# define LWR lwr
-# define LWL lwl
-# define EXT ext
-# define SRL srl
-# define SUBU subu
-#endif
-
-/* Technically strcmp should not read past the end of the strings being
- compared. We will read a full word that may contain excess bits beyond
- the NULL string terminator but unless ENABLE_READAHEAD is set, we will not
- read the next word after the end of string. Setting ENABLE_READAHEAD will
- improve performance but is technically illegal based on the definition of
- strcmp. */
-#ifdef ENABLE_READAHEAD
-# define DELAY_READ
-#else
-# define DELAY_READ nop
-#endif
-
-/* Testing on a little endian machine showed using CLZ was a
- performance loss, so we are not turning it on by default. */
-#if defined(ENABLE_CLZ) && (__mips_isa_rev > 1) && (!__mips64)
-# define USE_CLZ
-#endif
-
-/* Some asm.h files do not have the L macro definition. */
-#ifndef L
-# if _MIPS_SIM == _ABIO32
-# define L(label) $L ## label
-# else
-# define L(label) .L ## label
-# endif
-#endif
-
-/* Some asm.h files do not have the PTR_ADDIU macro definition. */
-#ifndef PTR_ADDIU
-# if _MIPS_SIM == _ABIO32
-# define PTR_ADDIU addiu
-# else
-# define PTR_ADDIU daddiu
-# endif
-#endif
-
-/* It might seem better to do the 'beq' instruction between the two 'lbu'
- instructions so that the nop is not needed but testing showed that this
- code is actually faster (based on glibc strcmp test). */
-#define BYTECMP01(OFFSET) \
- lbu $v0, OFFSET($a0); \
- lbu $v1, OFFSET($a1); \
- beq $v0, $zero, L(bexit01); \
- nop; \
- bne $v0, $v1, L(bexit01)
-
-#define BYTECMP89(OFFSET) \
- lbu $t8, OFFSET($a0); \
- lbu $t9, OFFSET($a1); \
- beq $t8, $zero, L(bexit89); \
- nop; \
- bne $t8, $t9, L(bexit89)
-
-/* Allow the routine to be named something else if desired. */
-#ifndef STRNCMP_NAME
-# define STRNCMP_NAME strncmp
-#endif
-
-#ifdef __ANDROID__
-LEAF(STRNCMP_NAME, 0)
-#else
-LEAF(STRNCMP_NAME)
-#endif
- .set nomips16
- .set noreorder
-
- srl $t0, $a2, (2 + NSIZE / 4)
- beqz $t0, L(byteloop) #process by bytes if less than (2 * NSIZE)
- andi $t1, $a1, (NSIZE - 1)
- beqz $t1, L(exitalign)
- or $t0, $zero, NSIZE
- SUBU $t1, $t0, $t1 #process (NSIZE - 1) bytes at max
- SUBU $a2, $a2, $t1 #dec count by t1
-
-L(alignloop): #do by bytes until a1 aligned
- BYTECMP01(0)
- SUBU $t1, $t1, 0x1
- PTR_ADDIU $a0, $a0, 0x1
- bne $t1, $zero, L(alignloop)
- PTR_ADDIU $a1, $a1, 0x1
-
-L(exitalign):
-
-/* string a1 is NSIZE byte aligned at this point. */
-#ifndef __mips1
- lui $t8, 0x0101
- ori $t8, 0x0101
- lui $t9, 0x7f7f
- ori $t9, 0x7f7f
-#if __mips64
- dsll $t0, $t8, 32
- or $t8, $t0
- dsll $t1, $t9, 32
- or $t9, $t1
-#endif
-#endif
-
-/* hardware or software alignment not supported for mips1
- rev6 archs have h/w unaligned support
- remainings archs need to implemented with unaligned instructions */
-
-#if __mips1
- andi $t0, $a0, (NSIZE - 1)
- bne $t0, $zero, L(byteloop)
-#elif __mips_isa_rev < 6
- andi $t0, $a0, (NSIZE - 1)
- bne $t0, $zero, L(uwordloop)
-#endif
-
-#define STRCMPW(OFFSET) \
- LW $v0, (OFFSET)($a0); \
- LW $v1, (OFFSET)($a1); \
- SUBU $t0, $v0, $t8; \
- bne $v0, $v1, L(worddiff); \
- nor $t1, $v0, $t9; \
- and $t0, $t0, $t1; \
- bne $t0, $zero, L(returnzero);\
-
-L(wordloop):
- SUBU $t1, $a2, (8 * NSIZE)
- bltz $t1, L(onewords)
- STRCMPW(0 * NSIZE)
- DELAY_READ
- STRCMPW(1 * NSIZE)
- DELAY_READ
- STRCMPW(2 * NSIZE)
- DELAY_READ
- STRCMPW(3 * NSIZE)
- DELAY_READ
- STRCMPW(4 * NSIZE)
- DELAY_READ
- STRCMPW(5 * NSIZE)
- DELAY_READ
- STRCMPW(6 * NSIZE)
- DELAY_READ
- STRCMPW(7 * NSIZE)
- SUBU $a2, $a2, (8 * NSIZE)
- PTR_ADDIU $a0, $a0, (8 * NSIZE)
- b L(wordloop)
- PTR_ADDIU $a1, $a1, (8 * NSIZE)
-
-L(onewords):
- SUBU $t1, $a2, NSIZE
- bltz $t1, L(byteloop)
- STRCMPW(0)
- SUBU $a2, $a2, NSIZE
- PTR_ADDIU $a0, $a0, NSIZE
- b L(onewords)
- PTR_ADDIU $a1, $a1, NSIZE
-
-#if __mips_isa_rev < 6 && !__mips1
-#define USTRCMPW(OFFSET) \
- LWR $v0, (OFFSET)($a0); \
- LWL $v0, (OFFSET + NSIZE - 1)($a0); \
- LW $v1, (OFFSET)($a1); \
- SUBU $t0, $v0, $t8; \
- bne $v0, $v1, L(worddiff); \
- nor $t1, $v0, $t9; \
- and $t0, $t0, $t1; \
- bne $t0, $zero, L(returnzero);\
-
-L(uwordloop):
- SUBU $t1, $a2, (8 * NSIZE)
- bltz $t1, L(uonewords)
- USTRCMPW(0 * NSIZE)
- DELAY_READ
- USTRCMPW(1 * NSIZE)
- DELAY_READ
- USTRCMPW(2 * NSIZE)
- DELAY_READ
- USTRCMPW(3 * NSIZE)
- DELAY_READ
- USTRCMPW(4 * NSIZE)
- DELAY_READ
- USTRCMPW(5 * NSIZE)
- DELAY_READ
- USTRCMPW(6 * NSIZE)
- DELAY_READ
- USTRCMPW(7 * NSIZE)
- SUBU $a2, $a2, (8 * NSIZE)
- PTR_ADDIU $a0, $a0, (8 * NSIZE)
- b L(uwordloop)
- PTR_ADDIU $a1, $a1, (8 * NSIZE)
-
-L(uonewords):
- SUBU $t1, $a2, NSIZE
- bltz $t1, L(byteloop)
- USTRCMPW(0)
- SUBU $a2, $a2, NSIZE
- PTR_ADDIU $a0, $a0, NSIZE
- b L(uonewords)
- PTR_ADDIU $a1, $a1, NSIZE
-
-#endif
-
-L(returnzero):
- j $ra
- move $v0, $zero
-
-#if __mips_isa_rev > 1
-#define EXT_COMPARE01(POS) \
- EXT $t0, $v0, POS, 8; \
- beq $t0, $zero, L(wexit01); \
- EXT $t1, $v1, POS, 8; \
- bne $t0, $t1, L(wexit01)
-#define EXT_COMPARE89(POS) \
- EXT $t8, $v0, POS, 8; \
- beq $t8, $zero, L(wexit89); \
- EXT $t9, $v1, POS, 8; \
- bne $t8, $t9, L(wexit89)
-#else
-#define EXT_COMPARE01(POS) \
- SRL $t0, $v0, POS; \
- SRL $t1, $v1, POS; \
- andi $t0, $t0, 0xff; \
- beq $t0, $zero, L(wexit01); \
- andi $t1, $t1, 0xff; \
- bne $t0, $t1, L(wexit01)
-#define EXT_COMPARE89(POS) \
- SRL $t8, $v0, POS; \
- SRL $t9, $v1, POS; \
- andi $t8, $t8, 0xff; \
- beq $t8, $zero, L(wexit89); \
- andi $t9, $t9, 0xff; \
- bne $t8, $t9, L(wexit89)
-#endif
-
-L(worddiff):
-#ifdef USE_CLZ
- SUBU $t0, $v0, $t8
- nor $t1, $v0, $t9
- and $t1, $t0, $t1
- xor $t0, $v0, $v1
- or $t0, $t0, $t1
-# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- wsbh $t0, $t0
- rotr $t0, $t0, 16
-# endif
- clz $t1, $t0
- and $t1, 0xf8
-# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
- neg $t1
- addu $t1, 24
-# endif
- rotrv $v0, $v0, $t1
- rotrv $v1, $v1, $t1
- and $v0, $v0, 0xff
- and $v1, $v1, 0xff
- j $ra
- SUBU $v0, $v0, $v1
-#else /* USE_CLZ */
-# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- andi $t0, $v0, 0xff
- beq $t0, $zero, L(wexit01)
- andi $t1, $v1, 0xff
- bne $t0, $t1, L(wexit01)
- EXT_COMPARE89(8)
- EXT_COMPARE01(16)
-#ifndef __mips64
- SRL $t8, $v0, 24
- SRL $t9, $v1, 24
-#else
- EXT_COMPARE89(24)
- EXT_COMPARE01(32)
- EXT_COMPARE89(40)
- EXT_COMPARE01(48)
- SRL $t8, $v0, 56
- SRL $t9, $v1, 56
-#endif
-
-# else /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
-#ifdef __mips64
- SRL $t0, $v0, 56
- beq $t0, $zero, L(wexit01)
- SRL $t1, $v1, 56
- bne $t0, $t1, L(wexit01)
- EXT_COMPARE89(48)
- EXT_COMPARE01(40)
- EXT_COMPARE89(32)
- EXT_COMPARE01(24)
-#else
- SRL $t0, $v0, 24
- beq $t0, $zero, L(wexit01)
- SRL $t1, $v1, 24
- bne $t0, $t1, L(wexit01)
-#endif
- EXT_COMPARE89(16)
- EXT_COMPARE01(8)
-
- andi $t8, $v0, 0xff
- andi $t9, $v1, 0xff
-# endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
-
-L(wexit89):
- j $ra
- SUBU $v0, $t8, $t9
-L(wexit01):
- j $ra
- SUBU $v0, $t0, $t1
-#endif /* USE_CLZ */
-
-L(byteloop):
- beq $a2, $zero, L(returnzero)
- SUBU $a2, $a2, 1
- BYTECMP01(0)
- nop
- beq $a2, $zero, L(returnzero)
- SUBU $a2, $a2, 1
- BYTECMP89(1)
- nop
- beq $a2, $zero, L(returnzero)
- SUBU $a2, $a2, 1
- BYTECMP01(2)
- nop
- beq $a2, $zero, L(returnzero)
- SUBU $a2, $a2, 1
- BYTECMP89(3)
- PTR_ADDIU $a0, $a0, 4
- b L(byteloop)
- PTR_ADDIU $a1, $a1, 4
-
-L(bexit01):
- j $ra
- SUBU $v0, $v0, $v1
-L(bexit89):
- j $ra
- SUBU $v0, $t8, $t9
-
- .set at
- .set reorder
-
-END(STRNCMP_NAME)
-#ifndef __ANDROID__
-# ifdef _LIBC
-libc_hidden_builtin_def (STRNCMP_NAME)
-# endif
-#endif
diff --git a/libc/arch-mips/string/strnlen.c b/libc/arch-mips/string/strnlen.c
deleted file mode 100644
index 2011deb..0000000
--- a/libc/arch-mips/string/strnlen.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2017 Imagination Technologies.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with
- * the distribution.
- * * Neither the name of Imagination Technologies nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-
-#define op_t unsigned long int
-#define op_size sizeof (op_t)
-
-#if __mips64 || __mips_isa_rev >= 2
-static inline size_t __attribute__ ((always_inline))
-do_bytes (const char *base, const char *p, op_t inval)
-{
- op_t outval = 0;
-#if __mips64
- __asm__ volatile (
- "dsbh %1, %0 \n\t"
- "dshd %0, %1 \n\t"
- "dclz %1, %0 \n\t"
- : "+r" (inval), "+r" (outval)
- );
-#else
- __asm__ volatile (
- "wsbh %1, %0 \n\t"
- "rotr %0, %1, 16 \n\t"
- "clz %1, %0 \n\t"
- : "+r" (inval), "+r" (outval)
- );
-#endif
- p += (outval >> 3);
- return (size_t) (p - base);
-}
-
-#define DO_WORD(in, val) { \
- op_t tmp = ((val - mask_1) & ~val) & mask_128; \
- if (tmp) \
- return do_bytes(str, (const char *)(in), tmp); \
-}
-#else
-static inline size_t __attribute__ ((always_inline))
-do_bytes (const char *base, const char *p)
-{
- for (; *p; ++p);
- return (size_t) (p - base);
-}
-
-#define DO_WORD(in, val) { \
- if (((val - mask_1) & ~val) & mask_128) { \
- return do_bytes(str, (const char *)(in)); \
- } \
-}
-#endif
-
-size_t strnlen (const char *str, size_t n) {
- if (n != 0) {
- const char *p = (const char *) str;
- const op_t *w;
- op_t mask_1, mask_128;
-
- for (; n > 0 && ((size_t) p % op_size) != 0; --n, ++p) {
- if (!(*p))
- return (p - str);
- }
-
- w = (const op_t *) p;
-
- __asm__ volatile (
- "li %0, 0x01010101 \n\t"
- : "=r" (mask_1)
- );
-#if __mips64
- mask_1 |= mask_1 << 32;
-#endif
- mask_128 = mask_1 << 7;
-
- /*
- * Check op_size byteswize after initial alignment
- */
- while (n >= 4 * op_size) {
- const op_t w0 = w[0];
- const op_t w1 = w[1];
- const op_t w2 = w[2];
- const op_t w3 = w[3];
- DO_WORD(w + 0, w0)
- DO_WORD(w + 1, w1)
- DO_WORD(w + 2, w2)
- DO_WORD(w + 3, w3)
- w += 4;
- n -= 4 * op_size;
- }
-
- while (n >= op_size) {
- DO_WORD(w, w[0]);
- w++;
- n -= op_size;
- }
-
- /*
- * Check bytewize for remaining bytes
- */
- p = (const char *) w;
- for (; n > 0; --n, ++p) {
- if (!(*p))
- return (p - str);
- }
-
- return (p - str);
- }
-
- return 0;
-}
diff --git a/libc/arch-mips64/bionic/__bionic_clone.S b/libc/arch-mips64/bionic/__bionic_clone.S
deleted file mode 100644
index d725efc..0000000
--- a/libc/arch-mips64/bionic/__bionic_clone.S
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-
-#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32)
-FRAMESZ = MKFSIZ(NARGSAVE,0)
-FRAME_ARG = 0*REGSZ
-FRAME_FN = 1*REGSZ
-#else
-FRAMESZ = MKFSIZ(0,3)
-FRAME_GP = FRAMESZ-1*REGSZ
-FRAME_ARG = FRAMESZ-2*REGSZ
-FRAME_FN = FRAMESZ-3*REGSZ
-#endif
-
-// pid_t __bionic_clone(int flags, void* child_stack, pid_t* parent_tid, void* tls, pid_t* child_tid, int (*fn)(void*), void* arg);
-LEAF(__bionic_clone, FRAMESZ)
- PTR_SUBU $sp, FRAMESZ # allocate stack frame
- SETUP_GP64(FRAME_GP,__bionic_clone)
- SAVE_GP(FRAME_GP)
-
- # set up child stack
- PTR_SUBU $a1,FRAMESZ
-#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32)
- PTR_L $t0,FRAMESZ+5*REGSZ($sp) # fn
- PRL_L $t1,FRAMESZ+6*REGSZ($sp) # arg
- PTR_S $t0,FRAME_FN($a1) # fn
- PTR_S $t1,FRAME_ARG($a1) # arg
-#else
- PTR_L $t0,FRAME_GP($sp) # copy gp to child stack
- PTR_S $t0,FRAME_GP($a1)
- PTR_S $a5,FRAME_FN($a1) # fn
- PTR_S $a6,FRAME_ARG($a1) # arg
-# endif
-
- # remainder of arguments are correct for clone system call
- LI $v0,__NR_clone
- syscall
-
- move $a0,$v0
- bnez $a3,.L__error_bc
-
- beqz $v0,.L__thread_start_bc
-
- RESTORE_GP64
- PTR_ADDU $sp,FRAMESZ
- j $ra
-
-.L__thread_start_bc:
- # Clear return address in child so we don't unwind further.
- li $ra,0
-
- # void __start_thread(int (*func)(void*), void *arg)
- PTR_L $a0,FRAME_FN($sp) # fn
- PTR_L $a1,FRAME_ARG($sp) # arg
- LA $t9,__start_thread
- RESTORE_GP64
- /*
- * For O32 etc the child stack must have space for a0..a3 to be stored
- * For N64 etc, the child stack can be restored to the original value
- */
-#if !((_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32))
- PTR_ADDU $sp,FRAMESZ
-#endif
- j $t9
-
-.L__error_bc:
- LA $t9,__set_errno_internal
- RESTORE_GP64
- PTR_ADDU $sp,FRAMESZ
- j $t9
- END(__bionic_clone)
-.hidden __bionic_clone
diff --git a/libc/arch-mips64/bionic/_exit_with_stack_teardown.S b/libc/arch-mips64/bionic/_exit_with_stack_teardown.S
deleted file mode 100644
index 4f80801..0000000
--- a/libc/arch-mips64/bionic/_exit_with_stack_teardown.S
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-
-// void _exit_with_stack_teardown(void* stackBase, size_t stackSize)
-ENTRY_PRIVATE(_exit_with_stack_teardown)
- li $v0, __NR_munmap
- syscall
- // If munmap failed, we ignore the failure and exit anyway.
-
- li $a0, 0
- li $v0, __NR_exit
- syscall
- // The exit syscall does not return.
-END(_exit_with_stack_teardown)
diff --git a/libc/arch-mips64/bionic/crtbegin.c b/libc/arch-mips64/bionic/crtbegin.c
deleted file mode 100644
index bdd423b..0000000
--- a/libc/arch-mips64/bionic/crtbegin.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "../../bionic/libc_init_common.h"
-#include <stddef.h>
-#include <stdint.h>
-
-__attribute__ ((section (".preinit_array")))
-void (*__PREINIT_ARRAY__)(void) = (void (*)(void)) -1;
-
-__attribute__ ((section (".init_array")))
-void (*__INIT_ARRAY__)(void) = (void (*)(void)) -1;
-
-__attribute__ ((section (".fini_array")))
-void (*__FINI_ARRAY__)(void) = (void (*)(void)) -1;
-
-
-__LIBC_HIDDEN__ void do_mips_start(void *raw_args) {
- structors_array_t array;
- array.preinit_array = &__PREINIT_ARRAY__;
- array.init_array = &__INIT_ARRAY__;
- array.fini_array = &__FINI_ARRAY__;
-
- __libc_init(raw_args, NULL, &main, &array);
-}
-
-/*
- * This function prepares the return address with a branch-and-link
- * instruction (bal) and then uses a .cpsetup to compute the Global
- * Offset Table (GOT) pointer ($gp). The $gp is then used to load
- * the address of _do_mips_start() into $t9 just before calling it.
- * Terminating the stack with a NULL return address.
- */
-__asm__ (
-" .set push \n"
-" \n"
-" .text \n"
-" .align 4 \n"
-" .type __start,@function \n"
-" .globl __start \n"
-" .globl _start \n"
-" \n"
-" .ent __start \n"
-"__start: \n"
-" _start: \n"
-" .frame $sp,32,$0 \n"
-" .mask 0x80000000,-8 \n"
-" \n"
-" move $a0, $sp \n"
-" daddiu $sp, $sp, -32 \n"
-" \n"
-" .set noreorder \n"
-" bal 1f \n"
-" nop \n"
-"1: \n"
-" .cpsetup $ra,16,1b \n"
-" .set reorder \n"
-" \n"
-" sd $0, 24($sp) \n"
-" jal do_mips_start \n"
-" \n"
-"2: b 2b \n"
-" .end __start \n"
-" \n"
-" .set pop \n"
-);
-
-#include "../../arch-common/bionic/__dso_handle.h"
-#include "../../arch-common/bionic/atexit.h"
-#include "../../arch-common/bionic/pthread_atfork.h"
diff --git a/libc/arch-mips64/bionic/setjmp.S b/libc/arch-mips64/bionic/setjmp.S
deleted file mode 120000
index b117bb6..0000000
--- a/libc/arch-mips64/bionic/setjmp.S
+++ /dev/null
@@ -1 +0,0 @@
-../../arch-mips/bionic/setjmp.S
\ No newline at end of file
diff --git a/libc/arch-mips64/bionic/stat.cpp b/libc/arch-mips64/bionic/stat.cpp
deleted file mode 100644
index 63b6cd1..0000000
--- a/libc/arch-mips64/bionic/stat.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/syscall.h>
-#include <unistd.h>
-
-struct kernel_stat {
- unsigned int st_dev;
- unsigned int st_pad0[3];
- unsigned long st_ino;
- mode_t st_mode;
- __u32 st_nlink;
- uid_t st_uid;
- gid_t st_gid;
- unsigned int st_rdev;
- unsigned int st_pad1[3];
- __kernel_off_t st_size;
- unsigned int _st_atime;
- unsigned int _st_atime_nsec;
- unsigned int _st_mtime;
- unsigned int _st_mtime_nsec;
- unsigned int _st_ctime;
- unsigned int _st_ctime_nsec;
- unsigned int st_blksize;
- unsigned int st_pad2;
- unsigned long st_blocks;
-};
-
-static void copy_stat(struct stat* st, struct kernel_stat* s) {
- st->st_dev = static_cast<dev_t>(s->st_dev);
- st->st_ino = static_cast<ino_t>(s->st_ino);
- st->st_mode = static_cast<mode_t>(s->st_mode);
- st->st_nlink = static_cast<nlink_t>(s->st_nlink);
- st->st_uid = static_cast<uid_t>(s->st_uid);
- st->st_gid = static_cast<gid_t>(s->st_gid);
- st->st_rdev = static_cast<dev_t>(s->st_rdev);
- st->st_size = static_cast<off_t>(s->st_size);
- st->st_blksize = static_cast<int>(s->st_blksize);
- st->st_blocks = static_cast<long>(s->st_blocks);
- st->st_atim.tv_sec = static_cast<time_t>(s->_st_atime);
- st->st_atim.tv_nsec = static_cast<long>(s->_st_atime_nsec);
- st->st_mtim.tv_sec = static_cast<time_t>(s->_st_mtime);
- st->st_mtim.tv_nsec = static_cast<long>(s->_st_mtime_nsec);
- st->st_ctim.tv_sec = static_cast<time_t>(s->_st_ctime);
- st->st_ctim.tv_nsec = static_cast<long>(s->_st_ctime_nsec);
-}
-
-int fstat(int fp, struct stat* st) {
- kernel_stat s;
- int ret = syscall(__NR_fstat, fp, &s);
- copy_stat(st, &s);
- return ret;
-}
-__strong_alias(fstat64, fstat);
-
-int fstatat(int dirfd, const char* pathname, struct stat* buf, int flags) {
- kernel_stat s;
- int ret = syscall(__NR_newfstatat, dirfd, pathname, &s, flags);
- copy_stat(buf, &s);
- return ret;
-}
-__strong_alias(fstatat64, fstatat);
diff --git a/libc/arch-mips64/bionic/syscall.S b/libc/arch-mips64/bionic/syscall.S
deleted file mode 100644
index ce5dfd3..0000000
--- a/libc/arch-mips64/bionic/syscall.S
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-
-#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32)
-FRAMESZ = MKFSIZ(6,0)
-#else
-FRAMESZ = MKFSIZ(0,1)
-FRAME_GP = FRAMESZ-1*REGSZ
-#endif
-
-LEAF(syscall,FRAMESZ)
- PTR_SUBU $sp, FRAMESZ # allocate stack frame
- SETUP_GP64(FRAME_GP,syscall)
- SAVE_GP(FRAME_GP)
- move $v0, $a0 # syscall number to v0
- move $a0, $a1 # shift args down
- move $a1, $a2
- move $a2, $a3
-#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32)
- REG_L $a3, FRAMESZ+4*REGSZ($sp)
- REG_L $t0, FRAMESZ+5*REGSZ($sp)
- REG_L $t1, FRAMESZ+6*REGSZ($sp)
- REG_S $t0, 4*REGSZ($sp)
- REG_S $t1, 5*REGSZ($sp)
-#else
- move $a3, $a4
- move $a4, $a5
- move $a5, $a6
-#endif
- syscall
- move $a0, $v0
- bnez $a3, 1f
- RESTORE_GP64
- PTR_ADDU $sp, FRAMESZ
- j $ra
-1:
- LA $t9,__set_errno_internal
- RESTORE_GP64
- PTR_ADDU $sp, FRAMESZ
- j $t9
- END(syscall)
diff --git a/libc/arch-mips64/bionic/vfork.S b/libc/arch-mips64/bionic/vfork.S
deleted file mode 100644
index b5ff5d4..0000000
--- a/libc/arch-mips64/bionic/vfork.S
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-#include <linux/sched.h>
-
-// TODO: mips' uapi signal.h is missing #ifndef __ASSEMBLY__.
-// #include <asm/signal.h>
-#define SIGCHLD 18
-
- .text
-
-#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32)
-FRAMESZ = MKFSIZ(5,0)
-#else
-FRAMESZ = MKFSIZ(0,0)
-#endif
-
-LEAF(vfork,FRAMESZ)
-__BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(vfork)
-#if FRAMESZ!=0
- PTR_SUBU $sp, FRAMESZ
-#endif
- SETUP_GP64($a5, vfork)
-
- // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
- rdhwr $v0, $29 // v0 = tls
- REG_L $v0, REGSZ*1($v0) // v0 = v0[TLS_SLOT_THREAD_ID ie 1]
- sw $0, REGSZ*2+4($v0) // v0->cached_pid_ = 0
-
- LI $a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
- move $a1, $0
- move $a2, $0
- move $a3, $0
-#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32)
- REG_S $0, 4*REGSZ(sp)
-#else
- move $a4, $0
-#endif
- LI $v0, __NR_clone
- syscall
-#if FRAMESZ!=0
- PTR_ADDU $sp,FRAMESZ
-#endif
- move $a0, $v0
- bnez $a3, 1f
- RESTORE_GP64
- j $ra
-1:
- LA $t9,__set_errno_internal
- RESTORE_GP64
- j $t9
- END(vfork)
diff --git a/libc/bionic/gwp_asan_wrappers.cpp b/libc/bionic/gwp_asan_wrappers.cpp
index 1feb871..d3e6a14 100644
--- a/libc/bionic/gwp_asan_wrappers.cpp
+++ b/libc/bionic/gwp_asan_wrappers.cpp
@@ -26,7 +26,10 @@
* SUCH DAMAGE.
*/
+#include <platform/bionic/android_unsafe_frame_pointer_chase.h>
#include <platform/bionic/malloc.h>
+#include <private/bionic_arc4random.h>
+#include <private/bionic_globals.h>
#include <private/bionic_malloc_dispatch.h>
#include <stddef.h>
#include <stdint.h>
@@ -64,9 +67,15 @@
Opts.SampleRate = 2500;
Opts.InstallSignalHandlers = false;
Opts.InstallForkHandlers = true;
+ Opts.Backtrace = android_unsafe_frame_pointer_chase;
GuardedAlloc.init(Opts);
- info_log("GWP-ASan has been enabled.");
+ // TODO(b/149790891): The log line below causes ART tests to fail as they're
+ // not expecting any output. Disable the output for now.
+ // info_log("GWP-ASan has been enabled.");
+
+ __libc_shared_globals()->gwp_asan_state = GuardedAlloc.getAllocatorState();
+ __libc_shared_globals()->gwp_asan_metadata = GuardedAlloc.getMetadataRegion();
return true;
}
@@ -190,9 +199,15 @@
Malloc(malloc_info),
};
-// TODO(mitchp): Turn on GWP-ASan here probabilistically.
+// The probability (1 / kProcessSampleRate) that a process will be ranodmly
+// selected for sampling. kProcessSampleRate should always be a power of two to
+// avoid modulo bias.
+static constexpr uint8_t kProcessSampleRate = 128;
+
bool ShouldGwpAsanSampleProcess() {
- return false;
+ uint8_t random_number;
+ __libc_safe_arc4random_buf(&random_number, sizeof(random_number));
+ return random_number % kProcessSampleRate == 0;
}
bool MaybeInitGwpAsanFromLibc(libc_globals* globals) {
@@ -259,3 +274,7 @@
return true;
}
+
+bool DispatchIsGwpAsan(const MallocDispatch* dispatch) {
+ return dispatch == &gwp_asan_dispatch;
+}
diff --git a/libc/bionic/gwp_asan_wrappers.h b/libc/bionic/gwp_asan_wrappers.h
index fd9c547..a39d50b 100644
--- a/libc/bionic/gwp_asan_wrappers.h
+++ b/libc/bionic/gwp_asan_wrappers.h
@@ -37,3 +37,8 @@
// Maybe initialize GWP-ASan. Set force_init to true to bypass process sampling.
bool MaybeInitGwpAsan(libc_globals* globals, bool force_init = false);
+
+// Returns whether GWP-ASan is the provided dispatch table pointer. Used in
+// heapprofd's signal-initialization sequence to determine the intermediate
+// dispatch pointer to use when initing.
+bool DispatchIsGwpAsan(const MallocDispatch* dispatch);
diff --git a/libc/bionic/heap_tagging.cpp b/libc/bionic/heap_tagging.cpp
index 0eaf34e..62b5f5c 100644
--- a/libc/bionic/heap_tagging.cpp
+++ b/libc/bionic/heap_tagging.cpp
@@ -33,11 +33,11 @@
#include <platform/bionic/malloc.h>
#include <platform/bionic/mte_kernel.h>
+extern "C" void scudo_malloc_disable_memory_tagging();
+
static HeapTaggingLevel heap_tagging_level = M_HEAP_TAGGING_LEVEL_NONE;
void SetDefaultHeapTaggingLevel() {
- // Allow the kernel to accept tagged pointers in syscall arguments. This is a no-op (kernel
- // returns -EINVAL) if the kernel doesn't understand the prctl.
#if defined(__aarch64__)
#define PR_SET_TAGGED_ADDR_CTRL 55
#define PR_TAGGED_ADDR_ENABLE (1UL << 0)
@@ -47,15 +47,23 @@
// 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) == 0) {
+ heap_tagging_level = M_HEAP_TAGGING_LEVEL_ASYNC;
return;
}
#endif // ANDROID_EXPERIMENTAL_MTE
+ // Allow the kernel to accept tagged pointers in syscall arguments. This is a no-op (kernel
+ // returns -EINVAL) if the kernel doesn't understand the prctl.
if (prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE, 0, 0, 0) == 0) {
+#if !__has_feature(hwaddress_sanitizer)
heap_tagging_level = M_HEAP_TAGGING_LEVEL_TBI;
__libc_globals.mutate([](libc_globals* globals) {
- globals->heap_pointer_tag = reinterpret_cast<uintptr_t>(POINTER_TAG) << TAG_SHIFT;
+ // Arrange for us to set pointer tags to POINTER_TAG, check tags on
+ // deallocation and untag when passing pointers to the allocator.
+ globals->heap_pointer_tag = (reinterpret_cast<uintptr_t>(POINTER_TAG) << TAG_SHIFT) |
+ (0xffull << CHECK_SHIFT) | (0xffull << UNTAG_SHIFT);
});
+#endif // hwaddress_sanitizer
}
#endif // aarch64
}
@@ -66,16 +74,22 @@
}
auto tag_level = *reinterpret_cast<HeapTaggingLevel*>(arg);
+ if (tag_level == heap_tagging_level) {
+ return true;
+ }
+
switch (tag_level) {
case M_HEAP_TAGGING_LEVEL_NONE:
break;
case M_HEAP_TAGGING_LEVEL_TBI:
+ case M_HEAP_TAGGING_LEVEL_ASYNC:
if (heap_tagging_level == M_HEAP_TAGGING_LEVEL_NONE) {
error_log(
"SetHeapTaggingLevel: re-enabling tagging after it was disabled is not supported");
- return false;
+ } else {
+ error_log("SetHeapTaggingLevel: switching between TBI and ASYNC is not supported");
}
- break;
+ return false;
default:
error_log("SetHeapTaggingLevel: unknown tagging level");
return false;
@@ -83,8 +97,16 @@
heap_tagging_level = tag_level;
info_log("SetHeapTaggingLevel: tag level set to %d", tag_level);
- if (heap_tagging_level == M_HEAP_TAGGING_LEVEL_NONE && __libc_globals->heap_pointer_tag != 0) {
- __libc_globals.mutate([](libc_globals* globals) { globals->heap_pointer_tag = 0; });
+ if (heap_tagging_level == M_HEAP_TAGGING_LEVEL_NONE) {
+#if defined(USE_SCUDO)
+ scudo_malloc_disable_memory_tagging();
+#endif
+ __libc_globals.mutate([](libc_globals* globals) {
+ // Preserve the untag mask (we still want to untag pointers when passing them to the
+ // allocator if we were doing so before), but clear the fixed tag and the check mask,
+ // so that pointers are no longer tagged and checks no longer happen.
+ globals->heap_pointer_tag &= 0xffull << UNTAG_SHIFT;
+ });
}
return true;
diff --git a/libc/bionic/malloc_common_dynamic.cpp b/libc/bionic/malloc_common_dynamic.cpp
index b1bf3d0..da87c33 100644
--- a/libc/bionic/malloc_common_dynamic.cpp
+++ b/libc/bionic/malloc_common_dynamic.cpp
@@ -291,7 +291,7 @@
// linker will load the libs found in /system/lib which might be incompatible
// with libc.so in the runtime APEX. Use android_dlopen_ext to explicitly load
// the ones in the runtime APEX.
- struct android_namespace_t* runtime_ns = android_get_exported_namespace("com.android.runtime");
+ struct android_namespace_t* runtime_ns = android_get_exported_namespace("com_android_runtime");
if (runtime_ns != nullptr) {
const android_dlextinfo dlextinfo = {
.flags = ANDROID_DLEXT_USE_NAMESPACE,
diff --git a/libc/bionic/malloc_heapprofd.cpp b/libc/bionic/malloc_heapprofd.cpp
index bf4c63a..198d2f0 100644
--- a/libc/bionic/malloc_heapprofd.cpp
+++ b/libc/bionic/malloc_heapprofd.cpp
@@ -42,6 +42,7 @@
#include <private/bionic_malloc_dispatch.h>
#include <sys/system_properties.h>
+#include "gwp_asan_wrappers.h"
#include "malloc_common.h"
#include "malloc_common_dynamic.h"
#include "malloc_heapprofd.h"
@@ -86,30 +87,6 @@
extern "C" void* MallocInitHeapprofdHook(size_t);
-static constexpr MallocDispatch __heapprofd_init_dispatch
- __attribute__((unused)) = {
- Malloc(calloc),
- Malloc(free),
- Malloc(mallinfo),
- MallocInitHeapprofdHook, // malloc replacement
- Malloc(malloc_usable_size),
- Malloc(memalign),
- Malloc(posix_memalign),
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- Malloc(pvalloc),
-#endif
- Malloc(realloc),
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- Malloc(valloc),
-#endif
- Malloc(malloc_iterate),
- Malloc(malloc_disable),
- Malloc(malloc_enable),
- Malloc(mallopt),
- Malloc(aligned_alloc),
- Malloc(malloc_info),
- };
-
constexpr char kHeapprofdProgramPropertyPrefix[] = "heapprofd.enable.";
constexpr size_t kHeapprofdProgramPropertyPrefixSize = sizeof(kHeapprofdProgramPropertyPrefix) - 1;
constexpr size_t kMaxCmdlineSize = 512;
@@ -176,6 +153,15 @@
// is loaded synchronously).
// In both cases, the caller is responsible for verifying that the process is
// considered profileable.
+
+// Previously installed default dispatch table, if it exists. This is used to
+// load heapprofd properly when GWP-ASan was already installed. If GWP-ASan was
+// already installed, heapprofd will take over the dispatch table, but will use
+// GWP-ASan as the backing dispatch. This variable is atomically protected by
+// gHeapprofdInitInProgress.
+static const MallocDispatch* gPreviousDefaultDispatchTable = nullptr;
+static MallocDispatch gEphemeralDispatch;
+
void HandleHeapprofdSignal() {
if (atomic_load_explicit(&gHeapprofdIncompatibleHooks, memory_order_acquire)) {
error_log("%s: not enabling heapprofd, malloc_debug/malloc_hooks are enabled.", getprogname());
@@ -187,11 +173,29 @@
// not ever have a conflict modifying the globals.
if (!atomic_exchange(&gGlobalsMutating, true)) {
if (!atomic_exchange(&gHeapprofdInitInProgress, true)) {
+ // If the backing dispatch is GWP-ASan, we should use GWP-ASan as the
+ // intermediate dispatch table during initialisation. It may be possible
+ // at this point in time that heapprofd is *already* the default dispatch,
+ // and as such we don't want to use heapprofd as the backing store
+ // (otherwise infinite recursion occurs).
+ gPreviousDefaultDispatchTable = nullptr;
+ const MallocDispatch* default_dispatch = GetDefaultDispatchTable();
+ if (DispatchIsGwpAsan(default_dispatch)) {
+ gPreviousDefaultDispatchTable = default_dispatch;
+ }
+
__libc_globals.mutate([](libc_globals* globals) {
- atomic_store(&globals->default_dispatch_table, &__heapprofd_init_dispatch);
- auto dispatch_table = GetDispatchTable();
- if (!MallocLimitInstalled() || dispatch_table == &globals->malloc_dispatch_table) {
- atomic_store(&globals->current_dispatch_table, &__heapprofd_init_dispatch);
+ // Wholesale copy the malloc dispatch table here. If the current/default
+ // dispatch table is pointing to the malloc_dispatch_table, we can't
+ // modify it as it may be racy. This dispatch table copy is ephemeral,
+ // and the dispatch tables will be resolved back to the global
+ // malloc_dispatch_table after initialization finishes.
+ gEphemeralDispatch = globals->malloc_dispatch_table;
+ gEphemeralDispatch.malloc = MallocInitHeapprofdHook;
+
+ atomic_store(&globals->default_dispatch_table, &gEphemeralDispatch);
+ if (!MallocLimitInstalled()) {
+ atomic_store(&globals->current_dispatch_table, &gEphemeralDispatch);
}
});
}
@@ -241,6 +245,12 @@
return;
}
+ // Before we set the new default_dispatch_table in FinishInstallHooks, save
+ // the previous dispatch table. If DispatchReset() gets called later, we want
+ // to be able to restore the dispatch. We're still under
+ // gHeapprofdInitInProgress locks at this point.
+ gPreviousDefaultDispatchTable = GetDefaultDispatchTable();
+
if (FinishInstallHooks(globals, nullptr, kHeapprofdPrefix)) {
atomic_store(&gHeapprofdHandle, impl_handle);
} else if (!reusing_handle) {
@@ -274,10 +284,9 @@
if (!atomic_exchange(&gHeapprofdInitHookInstalled, true)) {
pthread_mutex_lock(&gGlobalsMutateLock);
__libc_globals.mutate([](libc_globals* globals) {
- auto old_dispatch = GetDefaultDispatchTable();
- atomic_store(&globals->default_dispatch_table, nullptr);
- if (GetDispatchTable() == old_dispatch) {
- atomic_store(&globals->current_dispatch_table, nullptr);
+ atomic_store(&globals->default_dispatch_table, gPreviousDefaultDispatchTable);
+ if (!MallocLimitInstalled()) {
+ atomic_store(&globals->current_dispatch_table, gPreviousDefaultDispatchTable);
}
});
pthread_mutex_unlock(&gGlobalsMutateLock);
@@ -292,7 +301,10 @@
error_log("%s: heapprod: failed to pthread_setname_np", getprogname());
}
}
- return Malloc(malloc)(bytes);
+ // Get an allocation from libc malloc. If we had a previous dispatch table,
+ // this will come from it - otherwise, we'll get it from the system
+ // allocator.
+ return malloc(bytes);
}
bool HeapprofdInitZygoteChildProfiling() {
@@ -309,10 +321,9 @@
if (!atomic_exchange(&gHeapprofdInitInProgress, true)) {
pthread_mutex_lock(&gGlobalsMutateLock);
__libc_globals.mutate([](libc_globals* globals) {
- auto old_dispatch = GetDefaultDispatchTable();
- atomic_store(&globals->default_dispatch_table, nullptr);
- if (GetDispatchTable() == old_dispatch) {
- atomic_store(&globals->current_dispatch_table, nullptr);
+ atomic_store(&globals->default_dispatch_table, gPreviousDefaultDispatchTable);
+ if (!MallocLimitInstalled()) {
+ atomic_store(&globals->current_dispatch_table, gPreviousDefaultDispatchTable);
}
});
pthread_mutex_unlock(&gGlobalsMutateLock);
diff --git a/libc/bionic/malloc_tagged_pointers.h b/libc/bionic/malloc_tagged_pointers.h
index 9c2a89b..212459b 100644
--- a/libc/bionic/malloc_tagged_pointers.h
+++ b/libc/bionic/malloc_tagged_pointers.h
@@ -47,44 +47,62 @@
// rely on the implementation-defined value of this pointer tag, as it may
// change.
static constexpr uintptr_t POINTER_TAG = 0x3C;
+static constexpr unsigned UNTAG_SHIFT = 40;
+static constexpr unsigned CHECK_SHIFT = 48;
static constexpr unsigned TAG_SHIFT = 56;
#if defined(__aarch64__)
static constexpr uintptr_t ADDRESS_MASK = (static_cast<uintptr_t>(1) << TAG_SHIFT) - 1;
static constexpr uintptr_t TAG_MASK = static_cast<uintptr_t>(0xFF) << TAG_SHIFT;
+
+static inline uintptr_t FixedPointerTag() {
+ return __libc_globals->heap_pointer_tag & TAG_MASK;
+}
+
+static inline uintptr_t PointerCheckMask() {
+ return (__libc_globals->heap_pointer_tag << (TAG_SHIFT - CHECK_SHIFT)) & TAG_MASK;
+}
+
+static inline uintptr_t PointerUntagMask() {
+ return ~(__libc_globals->heap_pointer_tag << (TAG_SHIFT - UNTAG_SHIFT));
+}
#endif // defined(__aarch64__)
// Return a forcibly-tagged pointer.
static inline void* TagPointer(void* ptr) {
#if defined(__aarch64__)
- return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(ptr) |
- reinterpret_cast<uintptr_t>(__libc_globals->heap_pointer_tag));
+ return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(ptr) | FixedPointerTag());
#else
async_safe_fatal("Attempting to tag a pointer (%p) on non-aarch64.", ptr);
#endif
}
-#if defined(__aarch64__) && !__has_feature(hwaddress_sanitizer)
+#if defined(__aarch64__)
// Return a forcibly-untagged pointer. The pointer tag is not checked for
// validity.
static inline void* UntagPointer(const volatile void* ptr) {
return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(ptr) & ADDRESS_MASK);
}
-static void* SlowPathPointerCheck(const volatile void* ptr) {
- uintptr_t ptr_tag = reinterpret_cast<uintptr_t>(ptr) & TAG_MASK;
- uintptr_t heap_tag = reinterpret_cast<uintptr_t>(__libc_globals->heap_pointer_tag);
+// Untag the pointer, and check the pointer tag iff the kernel supports tagged pointers and the
+// pointer tag isn't being used by HWASAN or MTE. If the tag is incorrect, trap.
+static inline void* MaybeUntagAndCheckPointer(const volatile void* ptr) {
+ if (__predict_false(ptr == nullptr)) {
+ return nullptr;
+ }
+
+ uintptr_t ptr_int = reinterpret_cast<uintptr_t>(ptr);
// Applications may disable pointer tagging, which will be propagated to
// libc in the zygote. This means that there may already be tagged heap
// allocations that will fail when checked against the zero-ed heap tag. The
- // check bellow allows us to turn *off* pointer tagging and still allow
- // tagged heap allocations to be freed, as long as they're using *our* tag.
- if (__predict_false(heap_tag != 0 || ptr_tag != (POINTER_TAG << TAG_SHIFT))) {
+ // check below allows us to turn *off* pointer tagging (by setting PointerCheckMask() and
+ // FixedPointerTag() to zero) and still allow tagged heap allocations to be freed.
+ if ((ptr_int & PointerCheckMask()) != FixedPointerTag()) {
// TODO(b/145604058) - Upstream tagged pointers documentation and provide
// a link to it in the abort message here.
async_safe_fatal("Pointer tag for %p was truncated.", ptr);
}
- return UntagPointer(ptr);
+ return reinterpret_cast<void*>(ptr_int & PointerUntagMask());
}
// Return a tagged pointer iff the kernel supports tagged pointers, and `ptr` is
@@ -96,23 +114,7 @@
return ptr;
}
-// Untag the pointer, and check the pointer tag iff the kernel supports tagged
-// pointers. If the tag is incorrect, trap.
-static inline void* MaybeUntagAndCheckPointer(const volatile void* ptr) {
- if (__predict_false(ptr == nullptr)) {
- return nullptr;
- }
-
- uintptr_t ptr_tag = reinterpret_cast<uintptr_t>(ptr) & TAG_MASK;
- uintptr_t heap_tag = reinterpret_cast<uintptr_t>(__libc_globals->heap_pointer_tag);
-
- if (__predict_false(heap_tag != ptr_tag)) {
- return SlowPathPointerCheck(ptr);
- }
- return UntagPointer(ptr);
-}
-
-#else // defined(__aarch64__) && !__has_feature(hwaddress_sanitizer)
+#else // defined(__aarch64__)
static inline void* UntagPointer(const volatile void* ptr) {
return const_cast<void*>(ptr);
}
@@ -125,4 +127,4 @@
return const_cast<void *>(ptr);
}
-#endif // defined(__aarch64__) && !__has_feature(hwaddress_sanitizer)
+#endif // defined(__aarch64__)
diff --git a/libc/bionic/sys_msg.cpp b/libc/bionic/sys_msg.cpp
index 4880356..462c83b 100644
--- a/libc/bionic/sys_msg.cpp
+++ b/libc/bionic/sys_msg.cpp
@@ -32,9 +32,8 @@
#include <unistd.h>
int msgctl(int id, int cmd, msqid_ds* buf) {
-#if !defined(__LP64__) || defined(__mips__)
+#if !defined(__LP64__)
// Annoyingly, the kernel requires this for 32-bit but rejects it for 64-bit.
- // Mips64 is an exception to this, it requires the flag.
cmd |= IPC_64;
#endif
#if defined(SYS_msgctl)
diff --git a/libc/bionic/sys_sem.cpp b/libc/bionic/sys_sem.cpp
index 5e2a05c..058cfef 100644
--- a/libc/bionic/sys_sem.cpp
+++ b/libc/bionic/sys_sem.cpp
@@ -33,9 +33,8 @@
#include <unistd.h>
int semctl(int id, int num, int cmd, ...) {
-#if !defined(__LP64__) || defined(__mips__)
+#if !defined(__LP64__)
// Annoyingly, the kernel requires this for 32-bit but rejects it for 64-bit.
- // Mips64 is an exception to this, it requires the flag.
cmd |= IPC_64;
#endif
va_list ap;
diff --git a/libc/bionic/sys_shm.cpp b/libc/bionic/sys_shm.cpp
index f3b26e7..f780e04 100644
--- a/libc/bionic/sys_shm.cpp
+++ b/libc/bionic/sys_shm.cpp
@@ -45,9 +45,8 @@
}
int shmctl(int id, int cmd, struct shmid_ds* buf) {
-#if !defined(__LP64__) || defined(__mips__)
+#if !defined(__LP64__)
// Annoyingly, the kernel requires this for 32-bit but rejects it for 64-bit.
- // Mips64 is an exception to this, it requires the flag.
cmd |= IPC_64;
#endif
#if defined(SYS_shmctl)
diff --git a/libc/include/bits/elf_mips.h b/libc/include/bits/elf_mips.h
deleted file mode 100644
index e29c481..0000000
--- a/libc/include/bits/elf_mips.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* $NetBSD: elf_machdep.h,v 1.15 2011/03/15 07:39:22 matt Exp $ */
-
-#ifndef _MIPS_ELF_MACHDEP_H_
-#define _MIPS_ELF_MACHDEP_H_
-
-/* mips relocs. */
-
-#define R_MIPS_NONE 0
-#define R_MIPS_16 1
-#define R_MIPS_32 2
-#define R_MIPS_REL32 3
-#define R_MIPS_REL R_MIPS_REL32
-#define R_MIPS_26 4
-#define R_MIPS_HI16 5 /* high 16 bits of symbol value */
-#define R_MIPS_LO16 6 /* low 16 bits of symbol value */
-#define R_MIPS_GPREL16 7 /* GP-relative reference */
-#define R_MIPS_LITERAL 8 /* Reference to literal section */
-#define R_MIPS_GOT16 9 /* Reference to global offset table */
-#define R_MIPS_GOT R_MIPS_GOT16
-#define R_MIPS_PC16 10 /* 16 bit PC relative reference */
-#define R_MIPS_CALL16 11 /* 16 bit call thru glbl offset tbl */
-#define R_MIPS_CALL R_MIPS_CALL16
-#define R_MIPS_GPREL32 12
-
-/* 13, 14, 15 are not defined at this point. */
-#define R_MIPS_UNUSED1 13
-#define R_MIPS_UNUSED2 14
-#define R_MIPS_UNUSED3 15
-
-/*
- * The remaining relocs are apparently part of the 64-bit Irix ELF ABI.
- */
-#define R_MIPS_SHIFT5 16
-#define R_MIPS_SHIFT6 17
-
-#define R_MIPS_64 18
-#define R_MIPS_GOT_DISP 19
-#define R_MIPS_GOT_PAGE 20
-#define R_MIPS_GOT_OFST 21
-#define R_MIPS_GOT_HI16 22
-#define R_MIPS_GOT_LO16 23
-#define R_MIPS_SUB 24
-#define R_MIPS_INSERT_A 25
-#define R_MIPS_INSERT_B 26
-#define R_MIPS_DELETE 27
-#define R_MIPS_HIGHER 28
-#define R_MIPS_HIGHEST 29
-#define R_MIPS_CALL_HI16 30
-#define R_MIPS_CALL_LO16 31
-#define R_MIPS_SCN_DISP 32
-#define R_MIPS_REL16 33
-#define R_MIPS_ADD_IMMEDIATE 34
-#define R_MIPS_PJUMP 35
-#define R_MIPS_RELGOT 36
-#define R_MIPS_JALR 37
-/* TLS relocations */
-
-#define R_MIPS_TLS_DTPMOD32 38 /* Module number 32 bit */
-#define R_MIPS_TLS_DTPREL32 39 /* Module-relative offset 32 bit */
-#define R_MIPS_TLS_DTPMOD64 40 /* Module number 64 bit */
-#define R_MIPS_TLS_DTPREL64 41 /* Module-relative offset 64 bit */
-#define R_MIPS_TLS_GD 42 /* 16 bit GOT offset for GD */
-#define R_MIPS_TLS_LDM 43 /* 16 bit GOT offset for LDM */
-#define R_MIPS_TLS_DTPREL_HI16 44 /* Module-relative offset, high 16 bits */
-#define R_MIPS_TLS_DTPREL_LO16 45 /* Module-relative offset, low 16 bits */
-#define R_MIPS_TLS_GOTTPREL 46 /* 16 bit GOT offset for IE */
-#define R_MIPS_TLS_TPREL32 47 /* TP-relative offset, 32 bit */
-#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */
-#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */
-#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */
-
-#define R_MIPS_max 51
-
-#define R_MIPS16_min 100
-#define R_MIPS16_26 100
-#define R_MIPS16_GPREL 101
-#define R_MIPS16_GOT16 102
-#define R_MIPS16_CALL16 103
-#define R_MIPS16_HI16 104
-#define R_MIPS16_LO16 105
-#define R_MIPS16_max 106
-
-
-/* mips dynamic tags */
-
-#define DT_MIPS_RLD_VERSION 0x70000001
-#define DT_MIPS_TIME_STAMP 0x70000002
-#define DT_MIPS_ICHECKSUM 0x70000003
-#define DT_MIPS_IVERSION 0x70000004
-#define DT_MIPS_FLAGS 0x70000005
-#define DT_MIPS_BASE_ADDRESS 0x70000006
-#define DT_MIPS_CONFLICT 0x70000008
-#define DT_MIPS_LIBLIST 0x70000009
-#define DT_MIPS_CONFLICTNO 0x7000000b
-#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* number of local got ents */
-#define DT_MIPS_LIBLISTNO 0x70000010
-#define DT_MIPS_SYMTABNO 0x70000011 /* number of .dynsym entries */
-#define DT_MIPS_UNREFEXTNO 0x70000012
-#define DT_MIPS_GOTSYM 0x70000013 /* first dynamic sym in got */
-#define DT_MIPS_HIPAGENO 0x70000014
-#define DT_MIPS_RLD_MAP 0x70000016 /* address of loader map */
-#define DT_MIPS_RLD_MAP_REL 0x70000035 /* offset of loader map, used for PIE */
-
-/*
- * ELF Flags
- */
-#define EF_MIPS_PIC 0x00000002 /* Contains PIC code */
-#define EF_MIPS_CPIC 0x00000004 /* STD PIC calling sequence */
-#define EF_MIPS_ABI2 0x00000020 /* N32 */
-
-#define EF_MIPS_ARCH_ASE 0x0f000000 /* Architectural extensions */
-#define EF_MIPS_ARCH_MDMX 0x08000000 /* MDMX multimedia extension */
-#define EF_MIPS_ARCH_M16 0x04000000 /* MIPS-16 ISA extensions */
-
-#define EF_MIPS_ARCH 0xf0000000 /* Architecture field */
-#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code */
-#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code */
-#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code */
-#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code */
-#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code */
-#define EF_MIPS_ARCH_32 0x50000000 /* -mips32 code */
-#define EF_MIPS_ARCH_64 0x60000000 /* -mips64 code */
-#define EF_MIPS_ARCH_32R2 0x70000000 /* -mips32r2 code */
-#define EF_MIPS_ARCH_64R2 0x80000000 /* -mips64r2 code */
-
-#define EF_MIPS_ABI 0x0000f000
-#define EF_MIPS_ABI_O32 0x00001000
-#define EF_MIPS_ABI_O64 0x00002000
-#define EF_MIPS_ABI_EABI32 0x00003000
-#define EF_MIPS_ABI_EABI64 0x00004000
-
-#endif /* _MIPS_ELF_MACHDEP_H_ */
diff --git a/libc/include/bits/fortify/string.h b/libc/include/bits/fortify/string.h
index 4a7ed12..beb5ff5 100644
--- a/libc/include/bits/fortify/string.h
+++ b/libc/include/bits/fortify/string.h
@@ -204,21 +204,17 @@
"'strlcat' called with size bigger than buffer") {
#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
return __strlcat_chk(dst, src, size, __bos(dst));
-#endif
+#else
return __call_bypassing_fortify(strlcat)(dst, src, size);
+#endif
}
+#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
__BIONIC_FORTIFY_INLINE
size_t strlen(const char* const s __pass_object_size0) __overloadable {
-#if __ANDROID_API__ >= 17 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
- size_t bos = __bos0(s);
-
- if (!__bos_trivially_gt(bos, __builtin_strlen(s))) {
- return __strlen_chk(s, bos);
- }
-#endif
- return __builtin_strlen(s);
+ return __strlen_chk(s, __bos0(s));
}
+#endif
__BIONIC_FORTIFY_INLINE
char* strchr(const char* const s __pass_object_size, int c) __overloadable {
diff --git a/libc/include/elf.h b/libc/include/elf.h
index a319abb..4739bbd 100644
--- a/libc/include/elf.h
+++ b/libc/include/elf.h
@@ -33,7 +33,6 @@
#include <bits/auxvec.h>
#include <bits/elf_arm.h>
#include <bits/elf_arm64.h>
-#include <bits/elf_mips.h>
#include <bits/elf_x86.h>
#include <bits/elf_x86_64.h>
#include <linux/elf.h>
diff --git a/libc/include/sys/auxv.h b/libc/include/sys/auxv.h
index c651940..bf70dda 100644
--- a/libc/include/sys/auxv.h
+++ b/libc/include/sys/auxv.h
@@ -40,7 +40,7 @@
__BEGIN_DECLS
/**
- * [getauxval(3)](http://man7.org/linux/man-pages/man2/personality.2.html) returns values from
+ * [getauxval(3)](http://man7.org/linux/man-pages/man3/getauxval.3.html) returns values from
* the ELF auxiliary vector passed by the kernel.
*
* Returns the corresponding value on success,
diff --git a/libc/libc.map.txt b/libc/libc.map.txt
index 54da02e..37807be 100644
--- a/libc/libc.map.txt
+++ b/libc/libc.map.txt
@@ -9,7 +9,7 @@
__b64_ntop;
__b64_pton;
__cmsg_nxthdr; # introduced=21
- __connect; # arm x86 mips introduced=21
+ __connect; # arm x86 introduced=21
__ctype_get_mb_cur_max; # introduced=21
__cxa_atexit;
__cxa_finalize;
@@ -17,16 +17,16 @@
__dn_comp;
__dn_count_labels;
__dn_skipname;
- __epoll_pwait; # arm x86 mips introduced=21
+ __epoll_pwait; # arm x86 introduced=21
__errno;
- __exit; # arm x86 mips introduced=21
- __fadvise64; # x86 mips introduced=21
+ __exit; # arm x86 introduced=21
+ __fadvise64; # x86 introduced=21
__fbufsize; # introduced=23
- __fcntl64; # arm x86 mips
+ __fcntl64; # arm x86
__FD_CLR_chk; # introduced=21
__FD_ISSET_chk; # introduced=21
__FD_SET_chk; # introduced=21
- __fgets_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ __fgets_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
__flbf; # introduced=23
__fp_nquery;
__fp_query;
@@ -38,17 +38,17 @@
__fpurge; # introduced=23
__freadable; # introduced=23
__fsetlocking; # introduced=23
- __fstatfs64; # arm x86 mips
+ __fstatfs64; # arm x86
__fwritable; # introduced=23
__get_h_errno;
- __getcpu; # arm x86 mips introduced-arm=12 introduced-mips=16 introduced-x86=12
- __getcwd; # arm x86 mips
- __getpid; # arm x86 mips introduced=21
- __getpriority; # arm x86 mips
+ __getcpu; # arm x86 introduced-arm=12 introduced-x86=12
+ __getcwd; # arm x86
+ __getpid; # arm x86 introduced=21
+ __getpriority; # arm x86
__gnu_basename; # introduced=23
__gnu_strerror_r; # introduced=23
__hostalias;
- __ioctl; # arm x86 mips
+ __ioctl; # arm x86
__isfinite;
__isfinitef;
__isfinitel;
@@ -61,44 +61,44 @@
__isnormal;
__isnormalf;
__isnormall;
- __isthreaded; # arm x86 mips var
+ __isthreaded; # arm x86 var
__libc_current_sigrtmax; # introduced=21
__libc_current_sigrtmin; # introduced=21
__libc_init;
- __llseek; # arm x86 mips
+ __llseek; # arm x86
__loc_aton;
__loc_ntoa;
__memchr_chk; # introduced=23
- __memcpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __memmove_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ __memcpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __memmove_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
__memrchr_chk; # introduced=23
- __memset_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __mmap2; # arm x86 mips
- __ns_format_ttl; # arm x86 mips
- __ns_get16; # arm x86 mips
- __ns_get32; # arm x86 mips
- __ns_initparse; # arm x86 mips
- __ns_makecanon; # arm x86 mips
- __ns_msg_getflag; # arm x86 mips
- __ns_name_compress; # arm x86 mips
- __ns_name_ntol; # arm x86 mips
- __ns_name_ntop; # arm x86 mips
- __ns_name_pack; # arm x86 mips
- __ns_name_pton; # arm x86 mips
- __ns_name_rollback; # arm x86 mips
- __ns_name_skip; # arm x86 mips
- __ns_name_uncompress; # arm x86 mips
- __ns_name_unpack; # arm x86 mips
- __ns_parserr; # arm x86 mips
- __ns_put16; # arm x86 mips
- __ns_put32; # arm x86 mips
- __ns_samename; # arm x86 mips
- __ns_skiprr; # arm x86 mips
- __ns_sprintrr; # arm x86 mips
- __ns_sprintrrf; # arm x86 mips
- __open_2; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __openat; # arm x86 mips
- __openat_2; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ __memset_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __mmap2; # arm x86
+ __ns_format_ttl; # arm x86
+ __ns_get16; # arm x86
+ __ns_get32; # arm x86
+ __ns_initparse; # arm x86
+ __ns_makecanon; # arm x86
+ __ns_msg_getflag; # arm x86
+ __ns_name_compress; # arm x86
+ __ns_name_ntol; # arm x86
+ __ns_name_ntop; # arm x86
+ __ns_name_pack; # arm x86
+ __ns_name_pton; # arm x86
+ __ns_name_rollback; # arm x86
+ __ns_name_skip; # arm x86
+ __ns_name_uncompress; # arm x86
+ __ns_name_unpack; # arm x86
+ __ns_parserr; # arm x86
+ __ns_put16; # arm x86
+ __ns_put32; # arm x86
+ __ns_samename; # arm x86
+ __ns_skiprr; # arm x86
+ __ns_sprintrr; # arm x86
+ __ns_sprintrrf; # arm x86
+ __open_2; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __openat; # arm x86
+ __openat_2; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
__p_cdname;
__p_cdnname;
__p_class;
@@ -113,22 +113,22 @@
__p_type;
__p_type_syms; # var
__poll_chk; # introduced=23
- __ppoll; # arm x86 mips introduced=21
+ __ppoll; # arm x86 introduced=21
__ppoll_chk; # introduced=23
__ppoll64_chk; # introduced=28
__pread64_chk; # introduced=23
__pread_chk; # introduced=23
__progname; # var
- __pselect6; # arm x86 mips introduced=21
+ __pselect6; # arm x86 introduced=21
__pthread_cleanup_pop;
__pthread_cleanup_push;
- __ptrace; # arm x86 mips
+ __ptrace; # arm x86
__putlong;
__putshort;
__read_chk; # introduced=21
__readlink_chk; # introduced=23
__readlinkat_chk; # introduced=23
- __reboot; # arm x86 mips
+ __reboot; # arm x86
__recvfrom_chk; # introduced=21
__register_atfork; # introduced=23
__res_close;
@@ -151,59 +151,59 @@
__res_send;
__res_send_setqhook;
__res_send_setrhook;
- __rt_sigaction; # arm x86 mips
- __rt_sigpending; # arm x86 mips introduced=21
- __rt_sigprocmask; # arm x86 mips
- __rt_sigsuspend; # arm x86 mips introduced=21
- __rt_sigtimedwait; # arm x86 mips
- __sched_cpualloc; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- __sched_cpucount; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- __sched_cpufree; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- __sched_getaffinity; # arm x86 mips introduced=12
+ __rt_sigaction; # arm x86
+ __rt_sigpending; # arm x86 introduced=21
+ __rt_sigprocmask; # arm x86
+ __rt_sigsuspend; # arm x86 introduced=21
+ __rt_sigtimedwait; # arm x86
+ __sched_cpualloc; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ __sched_cpucount; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ __sched_cpufree; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ __sched_getaffinity; # arm x86 introduced=12
__set_thread_area; # x86
- __set_tid_address; # arm x86 mips introduced=21
- __set_tls; # arm mips
+ __set_tid_address; # arm x86 introduced=21
+ __set_tls; # arm
__sF; # var
- __sigaction; # arm x86 mips introduced=21
- __snprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __socket; # arm x86 mips introduced=21
- __sprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ __sigaction; # arm x86 introduced=21
+ __snprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __socket; # arm x86 introduced=21
+ __sprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
__stack_chk_fail;
__stack_chk_guard; # var
- __statfs64; # arm x86 mips
+ __statfs64; # arm x86
__stpcpy_chk; # introduced=21
__stpncpy_chk; # introduced=21
__stpncpy_chk2; # introduced=21
- __strcat_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __strchr_chk; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
- __strcpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __strlcat_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __strlcpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __strlen_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __strncat_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __strncpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ __strcat_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __strchr_chk; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
+ __strcpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __strlcat_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __strlcpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __strlen_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __strncat_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __strncpy_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
__strncpy_chk2; # introduced=21
- __strrchr_chk; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
+ __strrchr_chk; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
__sym_ntop;
__sym_ntos;
__sym_ston;
__system_property_area_serial; # introduced=23
__system_property_find;
__system_property_find_nth;
- __system_property_foreach; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ __system_property_foreach; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
__system_property_get;
__system_property_read;
- __system_property_serial; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
- __system_property_set; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- __timer_create; # arm x86 mips
- __timer_delete; # arm x86 mips
- __timer_getoverrun; # arm x86 mips
- __timer_gettime; # arm x86 mips
- __timer_settime; # arm x86 mips
- __umask_chk; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
- __vsnprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __vsprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- __waitid; # arm x86 mips
+ __system_property_serial; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
+ __system_property_set; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ __timer_create; # arm x86
+ __timer_delete; # arm x86
+ __timer_getoverrun; # arm x86
+ __timer_gettime; # arm x86
+ __timer_settime; # arm x86
+ __umask_chk; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
+ __vsnprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __vsprintf_chk; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ __waitid; # arm x86
_ctype_; # var
_Exit; # introduced=21
_exit;
@@ -216,11 +216,11 @@
_resolv_set_nameservers_for_net; # introduced=21
_setjmp;
_tolower; # introduced=21
- _tolower_tab_; # arm x86 mips var
+ _tolower_tab_; # arm x86 var
_toupper; # introduced=21
- _toupper_tab_; # arm x86 mips var
+ _toupper_tab_; # arm x86 var
abort;
- abs; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ abs; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
accept;
accept4; # introduced=21
access;
@@ -233,8 +233,8 @@
arc4random_buf;
arc4random_uniform;
asctime;
- asctime64; # arm x86 mips
- asctime64_r; # arm x86 mips
+ asctime64; # arm x86
+ asctime64_r; # arm x86
asctime_r;
asprintf;
at_quick_exit; # introduced=21
@@ -243,7 +243,7 @@
atol;
atoll;
basename;
- basename_r; # arm x86 mips
+ basename_r; # arm x86
bind;
bindresvport;
brk;
@@ -251,7 +251,7 @@
btowc;
c16rtomb; # introduced=21
c32rtomb; # introduced=21
- cacheflush; # arm mips
+ cacheflush; # arm
calloc;
capget;
capset;
@@ -274,7 +274,7 @@
clock_gettime;
clock_nanosleep;
clock_settime;
- clone; # introduced-arm=9 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ clone; # introduced-arm=9 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
close;
closedir;
closelog;
@@ -282,8 +282,8 @@
creat;
creat64; # introduced=21
ctime;
- ctime64; # arm x86 mips
- ctime64_r; # arm x86 mips
+ ctime64; # arm x86
+ ctime64_r; # arm x86
ctime_r;
daemon;
daylight; # var
@@ -291,7 +291,7 @@
difftime;
dirfd;
dirname;
- dirname_r; # arm x86 mips
+ dirname_r; # arm x86
div;
dn_expand;
dprintf; # introduced=21
@@ -317,10 +317,10 @@
error_one_per_line; # var introduced=23
error_print_progname; # var introduced=23
errx;
- ether_aton; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- ether_aton_r; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- ether_ntoa; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- ether_ntoa_r; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ ether_aton; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ ether_aton_r; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ ether_ntoa; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ ether_ntoa_r; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
eventfd;
eventfd_read;
eventfd_write;
@@ -345,13 +345,13 @@
fdatasync;
fdopen;
fdopendir;
- fdprintf; # arm x86 mips versioned=28
+ fdprintf; # arm x86 versioned=28
feof;
feof_unlocked; # introduced=23
ferror;
ferror_unlocked; # introduced=23
fflush;
- ffs; # introduced-arm=9 introduced-arm64=21 introduced-mips=9 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
+ ffs; # introduced-arm=9 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
fgetc;
fgetln;
fgetpos;
@@ -392,25 +392,25 @@
fstatat64; # introduced=21
fstatfs;
fstatfs64; # introduced=21
- fstatvfs; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ fstatvfs; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
fstatvfs64; # introduced=21
fsync;
ftell;
ftello;
ftok;
ftruncate;
- ftruncate64; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ ftruncate64; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
ftrylockfile;
fts_children; # introduced=21
fts_close; # introduced=21
fts_open; # introduced=21
fts_read; # introduced=21
fts_set; # introduced=21
- ftw; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ ftw; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
ftw64; # introduced=21
funlockfile;
funopen;
- futimens; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ futimens; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
fwide;
fwprintf;
fwrite;
@@ -421,13 +421,13 @@
get_nprocs_conf; # introduced=23
get_phys_pages; # introduced=23
getaddrinfo;
- getauxval; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
+ getauxval; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
getc;
getc_unlocked;
getchar;
getchar_unlocked;
getcwd;
- getdelim; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
+ getdelim; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
getegid;
getenv;
geteuid;
@@ -445,7 +445,7 @@
gethostent;
gethostname;
getitimer;
- getline; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
+ getline; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
getlogin;
getmntent;
getmntent_r; # introduced=21
@@ -467,9 +467,9 @@
getprotobynumber;
getpt;
getpwnam;
- getpwnam_r; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ getpwnam_r; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
getpwuid;
- getpwuid_r; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ getpwuid_r; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
getresgid;
getresuid;
getrlimit;
@@ -479,7 +479,7 @@
getservbyname;
getservbyport;
getservent;
- getsid; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ getsid; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
getsockname;
getsockopt;
gettid;
@@ -490,8 +490,8 @@
getwchar;
getxattr;
gmtime;
- gmtime64; # arm x86 mips
- gmtime64_r; # arm x86 mips
+ gmtime64; # arm x86
+ gmtime64_r; # arm x86
gmtime_r;
grantpt; # introduced=21
herror;
@@ -500,8 +500,8 @@
htons; # introduced=21
if_indextoname;
if_nametoindex;
- imaxabs; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
- imaxdiv; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ imaxabs; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
+ imaxdiv; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
inet_addr;
inet_aton;
inet_lnaof; # introduced=21
@@ -590,7 +590,7 @@
kill;
killpg;
klogctl;
- labs; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ labs; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
lchown;
lcong48; # introduced=23
ldexp;
@@ -601,13 +601,13 @@
linkat; # introduced=21
listen;
listxattr;
- llabs; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ llabs; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
lldiv;
llistxattr;
localeconv; # introduced=21
localtime;
- localtime64; # arm x86 mips
- localtime64_r; # arm x86 mips
+ localtime64; # arm x86
+ localtime64_r; # arm x86
localtime_r;
login_tty; # introduced=23
longjmp;
@@ -623,7 +623,7 @@
mallinfo;
malloc;
malloc_info; # introduced=23
- malloc_usable_size; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ malloc_usable_size; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
mbrlen;
mbrtoc16; # introduced=21
mbrtoc32; # introduced=21
@@ -661,9 +661,9 @@
mkstemps64; # introduced=23
mktemp;
mktime;
- mktime64; # arm x86 mips
+ mktime64; # arm x86
mlock;
- mlockall; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ mlockall; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
mmap;
mmap64; # introduced=21
mount;
@@ -672,36 +672,36 @@
mremap;
msync;
munlock;
- munlockall; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ munlockall; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
munmap;
nanosleep;
newlocale; # introduced=21
- nftw; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ nftw; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
nftw64; # introduced=21
nice;
nrand48;
- ns_format_ttl; # arm64 x86_64 mips64 introduced=22
- ns_get16; # arm64 x86_64 mips64 introduced=22
- ns_get32; # arm64 x86_64 mips64 introduced=22
- ns_initparse; # arm64 x86_64 mips64 introduced=22
- ns_makecanon; # arm64 x86_64 mips64 introduced=22
- ns_msg_getflag; # arm64 x86_64 mips64 introduced=22
- ns_name_compress; # arm64 x86_64 mips64 introduced=22
- ns_name_ntol; # arm64 x86_64 mips64 introduced=22
- ns_name_ntop; # arm64 x86_64 mips64 introduced=22
- ns_name_pack; # arm64 x86_64 mips64 introduced=22
- ns_name_pton; # arm64 x86_64 mips64 introduced=22
- ns_name_rollback; # arm64 x86_64 mips64 introduced=22
- ns_name_skip; # arm64 x86_64 mips64 introduced=22
- ns_name_uncompress; # arm64 x86_64 mips64 introduced=22
- ns_name_unpack; # arm64 x86_64 mips64 introduced=22
- ns_parserr; # arm64 x86_64 mips64 introduced=22
- ns_put16; # arm64 x86_64 mips64 introduced=22
- ns_put32; # arm64 x86_64 mips64 introduced=22
- ns_samename; # arm64 x86_64 mips64 introduced=22
- ns_skiprr; # arm64 x86_64 mips64 introduced=22
- ns_sprintrr; # arm64 x86_64 mips64 introduced=22
- ns_sprintrrf; # arm64 x86_64 mips64 introduced=22
+ ns_format_ttl; # arm64 x86_64 introduced=22
+ ns_get16; # arm64 x86_64 introduced=22
+ ns_get32; # arm64 x86_64 introduced=22
+ ns_initparse; # arm64 x86_64 introduced=22
+ ns_makecanon; # arm64 x86_64 introduced=22
+ ns_msg_getflag; # arm64 x86_64 introduced=22
+ ns_name_compress; # arm64 x86_64 introduced=22
+ ns_name_ntol; # arm64 x86_64 introduced=22
+ ns_name_ntop; # arm64 x86_64 introduced=22
+ ns_name_pack; # arm64 x86_64 introduced=22
+ ns_name_pton; # arm64 x86_64 introduced=22
+ ns_name_rollback; # arm64 x86_64 introduced=22
+ ns_name_skip; # arm64 x86_64 introduced=22
+ ns_name_uncompress; # arm64 x86_64 introduced=22
+ ns_name_unpack; # arm64 x86_64 introduced=22
+ ns_parserr; # arm64 x86_64 introduced=22
+ ns_put16; # arm64 x86_64 introduced=22
+ ns_put32; # arm64 x86_64 introduced=22
+ ns_samename; # arm64 x86_64 introduced=22
+ ns_skiprr; # arm64 x86_64 introduced=22
+ ns_sprintrr; # arm64 x86_64 introduced=22
+ ns_sprintrrf; # arm64 x86_64 introduced=22
nsdispatch;
ntohl; # introduced=21
ntohs; # introduced=21
@@ -738,16 +738,16 @@
ppoll; # introduced=21
prctl;
pread;
- pread64; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ pread64; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
printf;
- prlimit; # arm64 x86_64 mips64
+ prlimit; # arm64 x86_64
prlimit64; # introduced=21
process_vm_readv; # introduced=23
process_vm_writev; # introduced=23
pselect;
- psiginfo; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- psignal; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
- pthread_atfork; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ psiginfo; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ psignal; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
+ pthread_atfork; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
pthread_attr_destroy;
pthread_attr_getdetachstate;
pthread_attr_getguardsize;
@@ -769,10 +769,10 @@
pthread_cond_init;
pthread_cond_signal;
pthread_cond_timedwait;
- pthread_cond_timedwait_monotonic; # arm x86 mips
- pthread_cond_timedwait_monotonic_np; # introduced-arm=9 introduced-x86=9 introduced-mips=9 introduced-arm64=28 introduced-x64_64=28 introduced-mips64=28
- pthread_cond_timedwait_relative_np; # arm x86 mips
- pthread_cond_timeout_np; # arm x86 mips
+ pthread_cond_timedwait_monotonic; # arm x86
+ pthread_cond_timedwait_monotonic_np; # introduced-arm=9 introduced-x86=9 introduced-arm64=28 introduced-x64_64=28
+ pthread_cond_timedwait_relative_np; # arm x86
+ pthread_cond_timeout_np; # arm x86
pthread_cond_wait;
pthread_condattr_destroy;
pthread_condattr_getclock; # introduced=21
@@ -796,7 +796,7 @@
pthread_mutex_destroy;
pthread_mutex_init;
pthread_mutex_lock;
- pthread_mutex_lock_timeout_np; # arm x86 mips
+ pthread_mutex_lock_timeout_np; # arm x86
pthread_mutex_timedlock; # introduced=21
pthread_mutex_trylock;
pthread_mutex_unlock;
@@ -837,12 +837,12 @@
putenv;
puts;
pututline;
- putw; # arm x86 mips
+ putw; # arm x86
putwc;
putwchar;
- pvalloc; # arm x86 mips introduced=17
+ pvalloc; # arm x86 introduced=17
pwrite;
- pwrite64; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ pwrite64; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
qsort;
quick_exit; # introduced=21
raise;
@@ -887,12 +887,12 @@
scanf;
sched_get_priority_max;
sched_get_priority_min;
- sched_getaffinity; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- sched_getcpu; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ sched_getaffinity; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ sched_getcpu; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
sched_getparam;
sched_getscheduler;
sched_rr_get_interval;
- sched_setaffinity; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ sched_setaffinity; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
sched_setparam;
sched_setscheduler;
sched_yield;
@@ -961,13 +961,13 @@
sigfillset; # introduced=21
siginterrupt;
sigismember; # introduced=21
- siglongjmp; # introduced-arm=9 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ siglongjmp; # introduced-arm=9 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
signal; # introduced=21
- signalfd; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
+ signalfd; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
sigpending;
sigprocmask;
sigqueue; # introduced=23
- sigsetjmp; # introduced-arm=9 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ sigsetjmp; # introduced-arm=9 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
sigsetmask;
sigsuspend;
sigtimedwait; # introduced=23
@@ -987,7 +987,7 @@
stat64; # introduced=21
statfs;
statfs64; # introduced=21
- statvfs; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ statvfs; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
statvfs64; # introduced=21
stderr; # var introduced=23
stdin; # var introduced=23
@@ -1045,8 +1045,8 @@
strtouq; # introduced=21
strxfrm;
strxfrm_l; # introduced=21
- swapoff; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
- swapon; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ swapoff; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
+ swapon; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
swprintf;
swscanf;
symlink;
@@ -1076,18 +1076,18 @@
tfind;
tgkill;
time;
- timegm; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- timegm64; # arm x86 mips
- timelocal; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
- timelocal64; # arm x86 mips
+ timegm; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ timegm64; # arm x86
+ timelocal; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
+ timelocal64; # arm x86
timer_create;
timer_delete;
timer_getoverrun;
timer_gettime;
timer_settime;
- timerfd_create; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
- timerfd_gettime; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
- timerfd_settime; # introduced-arm=19 introduced-arm64=21 introduced-mips=19 introduced-mips64=21 introduced-x86=19 introduced-x86_64=21
+ timerfd_create; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
+ timerfd_gettime; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
+ timerfd_settime; # introduced-arm=19 introduced-arm64=21 introduced-x86=19 introduced-x86_64=21
times;
timezone; # var
tmpfile;
@@ -1119,19 +1119,19 @@
unlinkat;
unlockpt;
unsetenv;
- unshare; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ unshare; # introduced-arm=17 introduced-arm64=21 introduced-x86=17 introduced-x86_64=21
uselocale; # introduced=21
usleep;
utime;
- utimensat; # introduced-arm=12 introduced-arm64=21 introduced-mips=12 introduced-mips64=21 introduced-x86=12 introduced-x86_64=21
+ utimensat; # introduced-arm=12 introduced-arm64=21 introduced-x86=12 introduced-x86_64=21
utimes;
utmpname;
- valloc; # arm x86 mips
+ valloc; # arm x86
vasprintf;
vdprintf; # introduced=21
verr;
verrx;
- vfdprintf; # arm x86 mips versioned=28
+ vfdprintf; # arm x86 versioned=28
vfork;
vfprintf;
vfscanf;
@@ -1151,7 +1151,7 @@
vwprintf;
vwscanf; # introduced=21
wait;
- wait4; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21
+ wait4; # introduced-arm=18 introduced-arm64=21 introduced-x86=18 introduced-x86_64=21
waitid;
waitpid;
warn;
@@ -1221,7 +1221,7 @@
*;
};
-LIBC_N { # introduced-arm64=24 introduced-mips=24 introduced-mips64=24 introduced-x86=24 introduced-x86_64=24
+LIBC_N { # introduced-arm64=24 introduced-x86=24 introduced-x86_64=24
global:
__aeabi_atexit; # arm versioned=24
__aeabi_memclr; # arm versioned=24
@@ -1265,7 +1265,7 @@
lockf64; # introduced=24
preadv; # introduced=24
preadv64; # introduced=24
- prlimit; # arm mips x86 introduced=24
+ prlimit; # arm x86 introduced=24
pthread_barrierattr_destroy; # introduced=24
pthread_barrierattr_getpshared; # introduced=24
pthread_barrierattr_init; # introduced=24
@@ -1291,7 +1291,7 @@
__sendto_chk; # introduced=26
__system_property_read_callback; # introduced=26
__system_property_wait; # introduced=26
- bsd_signal; # arm x86 mips versioned=26
+ bsd_signal; # arm x86 versioned=26
catclose; # introduced=26
catgets; # introduced=26
catopen; # introduced=26
@@ -1551,7 +1551,7 @@
LIBC_PRIVATE {
global:
- __accept4; # arm x86 mips
+ __accept4; # arm x86
__adddf3; # arm
__addsf3; # arm
__aeabi_atexit; # arm
@@ -1624,12 +1624,12 @@
__arm_fadvise64_64; # arm
__ashldi3; # arm
__ashrdi3; # arm
- __bionic_brk; # arm x86 mips
+ __bionic_brk; # arm x86
__bionic_libcrt_compat_symbols; # arm x86
__cmpdf2; # arm
__cmpsf2; # arm
__divdf3; # arm
- __divdi3; # arm x86 mips
+ __divdi3; # arm x86
__divsf3; # arm
__divsi3; # arm
__dso_handle; # arm
@@ -1648,13 +1648,13 @@
__floatundisf; # arm
__floatunsidf; # arm
__floatunsisf; # arm
- __futex_wait; # arm x86 mips
- __futex_wake; # arm x86 mips
+ __futex_wait; # arm x86
+ __futex_wake; # arm x86
__gedf2; # arm
__gesf2; # arm
- __get_thread; # arm x86 mips
- __get_tls; # arm x86 mips
- __getdents64; # arm x86 mips
+ __get_thread; # arm x86
+ __get_tls; # arm x86
+ __getdents64; # arm x86
__gnu_ldivmod_helper; # arm
__gnu_uldivmod_helper; # arm
__gnu_Unwind_Find_exidx; # arm
@@ -1670,72 +1670,72 @@
__mulsf3; # arm
__nedf2; # arm
__nesf2; # arm
- __open; # arm x86 mips
- __page_shift; # arm x86 mips
- __page_size; # arm x86 mips
+ __open; # arm x86
+ __page_shift; # arm x86
+ __page_size; # arm x86
__popcount_tab; # arm
- __popcountsi2; # arm x86 mips
- __pthread_gettid; # arm x86 mips
- __sclose; # arm x86 mips
- __sdidinit; # arm x86 mips
- __set_errno; # arm x86 mips
- __sflags; # arm x86 mips
- __sflush; # arm x86 mips
- __sfp; # arm x86 mips
- __sglue; # arm x86 mips
- __sinit; # arm x86 mips
- __smakebuf; # arm x86 mips
- __sread; # arm x86 mips
- __srefill; # arm x86 mips
- __srget; # arm x86 mips
- __sseek; # arm x86 mips
+ __popcountsi2; # arm x86
+ __pthread_gettid; # arm x86
+ __sclose; # arm x86
+ __sdidinit; # arm x86
+ __set_errno; # arm x86
+ __sflags; # arm x86
+ __sflush; # arm x86
+ __sfp; # arm x86
+ __sglue; # arm x86
+ __sinit; # arm x86
+ __smakebuf; # arm x86
+ __sread; # arm x86
+ __srefill; # arm x86
+ __srget; # arm x86
+ __sseek; # arm x86
__subdf3; # arm
__subsf3; # arm
- __swbuf; # arm x86 mips
- __swrite; # arm x86 mips
- __swsetup; # arm x86 mips
+ __swbuf; # arm x86
+ __swrite; # arm x86
+ __swsetup; # arm x86
__truncdfsf2; # arm
- __udivdi3; # arm x86 mips
+ __udivdi3; # arm x86
__udivsi3; # arm
- __umoddi3; # x86 mips
+ __umoddi3; # x86
__unorddf2; # arm
__unordsf2; # arm
- __wait4; # arm x86 mips
- _fwalk; # arm x86 mips
+ __wait4; # arm x86
+ _fwalk; # arm x86
android_getaddrinfofornetcontext;
android_gethostbyaddrfornet;
android_gethostbyaddrfornetcontext;
android_gethostbynamefornet;
android_gethostbynamefornetcontext;
android_unsafe_frame_pointer_chase;
- arc4random_addrandom; # arm x86 mips
- arc4random_stir; # arm x86 mips
+ arc4random_addrandom; # arm x86
+ arc4random_stir; # arm x86
atexit; # arm
- bcopy; # arm x86 mips
- bzero; # arm x86 mips
- dlmalloc; # arm x86 mips
- dlmalloc_inspect_all; # arm x86 mips
- dlmalloc_trim; # arm x86 mips
- dlmalloc_usable_size; # arm x86 mips
- ftime; # arm x86 mips
- getdents; # arm x86 mips
- getdtablesize; # arm x86 mips
- index; # arm x86 mips
- issetugid; # arm x86 mips
- memswap; # arm x86 mips
- pthread_attr_getstackaddr; # arm x86 mips
- pthread_attr_setstackaddr; # arm x86 mips
- SHA1Final; # arm x86 mips
- SHA1Init; # arm x86 mips
- SHA1Transform; # arm x86 mips
- SHA1Update; # arm x86 mips
- strntoimax; # arm x86 mips
- strntoumax; # arm x86 mips
- strtotimeval; # arm x86 mips
- sysv_signal; # arm x86 mips
- tkill; # arm x86 mips
- wait3; # arm x86 mips
- wcswcs; # arm x86 mips
+ bcopy; # arm x86
+ bzero; # arm x86
+ dlmalloc; # arm x86
+ dlmalloc_inspect_all; # arm x86
+ dlmalloc_trim; # arm x86
+ dlmalloc_usable_size; # arm x86
+ ftime; # arm x86
+ getdents; # arm x86
+ getdtablesize; # arm x86
+ index; # arm x86
+ issetugid; # arm x86
+ memswap; # arm x86
+ pthread_attr_getstackaddr; # arm x86
+ pthread_attr_setstackaddr; # arm x86
+ SHA1Final; # arm x86
+ SHA1Init; # arm x86
+ SHA1Transform; # arm x86
+ SHA1Update; # arm x86
+ strntoimax; # arm x86
+ strntoumax; # arm x86
+ strtotimeval; # arm x86
+ sysv_signal; # arm x86
+ tkill; # arm x86
+ wait3; # arm x86
+ wcswcs; # arm x86
} LIBC_Q;
LIBC_DEPRECATED {
diff --git a/libc/libstdc++.map.txt b/libc/libstdc++.map.txt
index 0a242d5..bb7040f 100644
--- a/libc/libstdc++.map.txt
+++ b/libc/libstdc++.map.txt
@@ -5,14 +5,14 @@
_ZdaPvRKSt9nothrow_t; # weak
_ZdlPv; # weak
_ZdlPvRKSt9nothrow_t; # weak
- _Znaj; # arm x86 mips weak
- _ZnajRKSt9nothrow_t; # arm x86 mips weak
- _Znam; # arm64 x86_64 mips64 weak
- _ZnamRKSt9nothrow_t; # arm64 x86_64 mips64 weak
- _Znwj; # arm x86 mips weak
- _ZnwjRKSt9nothrow_t; # arm x86 mips weak
- _Znwm; # arm64 x86_64 mips64 weak
- _ZnwmRKSt9nothrow_t; # arm64 x86_64 mips64 weak
+ _Znaj; # arm x86 weak
+ _ZnajRKSt9nothrow_t; # arm x86 weak
+ _Znam; # arm64 x86_64 weak
+ _ZnamRKSt9nothrow_t; # arm64 x86_64 weak
+ _Znwj; # arm x86 weak
+ _ZnwjRKSt9nothrow_t; # arm x86 weak
+ _Znwm; # arm64 x86_64 weak
+ _ZnwmRKSt9nothrow_t; # arm64 x86_64 weak
__cxa_guard_abort;
__cxa_guard_acquire;
__cxa_guard_release;
diff --git a/libc/platform/bionic/malloc.h b/libc/platform/bionic/malloc.h
index 99eefa4..0ea7e3c 100644
--- a/libc/platform/bionic/malloc.h
+++ b/libc/platform/bionic/malloc.h
@@ -114,6 +114,8 @@
// Address-only tagging. Heap pointers have a non-zero tag in the most significant byte which is
// checked in free(). Memory accesses ignore the tag.
M_HEAP_TAGGING_LEVEL_TBI = 1,
+ // Enable heap tagging if supported, at a level appropriate for asynchronous memory tag checks.
+ M_HEAP_TAGGING_LEVEL_ASYNC = 2,
};
// Manipulates bionic-specific handling of memory allocation APIs such as
diff --git a/libc/platform/bionic/mte.h b/libc/platform/bionic/mte.h
index 661664a..fbf3895 100644
--- a/libc/platform/bionic/mte.h
+++ b/libc/platform/bionic/mte.h
@@ -42,20 +42,26 @@
}
#endif
-struct ScopedDisableMTE {
- ScopedDisableMTE() {
#ifdef __aarch64__
+class ScopedDisableMTE {
+ size_t prev_tco_;
+
+ public:
+ ScopedDisableMTE() {
if (mte_supported()) {
- __asm__ __volatile__(".arch_extension mte; msr tco, #1");
+ __asm__ __volatile__(".arch_extension mte; mrs %0, tco; msr tco, #1" : "=r"(prev_tco_));
}
-#endif
}
~ScopedDisableMTE() {
-#ifdef __aarch64__
if (mte_supported()) {
- __asm__ __volatile__(".arch_extension mte; msr tco, #0");
+ __asm__ __volatile__(".arch_extension mte; msr tco, %0" : : "r"(prev_tco_));
}
-#endif
}
};
+#else
+struct ScopedDisableMTE {
+ // Silence unused variable warnings in non-aarch64 builds.
+ ScopedDisableMTE() {}
+};
+#endif
diff --git a/libc/platform/bionic/mte_kernel.h b/libc/platform/bionic/mte_kernel.h
index 804311c..2c777c9 100644
--- a/libc/platform/bionic/mte_kernel.h
+++ b/libc/platform/bionic/mte_kernel.h
@@ -48,4 +48,7 @@
#define PR_MTE_EXCL_SHIFT 3
#define PR_MTE_EXCL_MASK (0xffffUL << PR_MTE_EXCL_SHIFT)
+#define SEGV_MTEAERR 6
+#define SEGV_MTESERR 7
+
#endif
diff --git a/libc/private/bionic_globals.h b/libc/private/bionic_globals.h
index 4cc9bbe..6e7eb76 100644
--- a/libc/private/bionic_globals.h
+++ b/libc/private/bionic_globals.h
@@ -65,6 +65,10 @@
__LIBC_HIDDEN__ extern WriteProtected<libc_globals> __libc_globals;
struct abort_msg_t;
+namespace gwp_asan {
+struct AllocatorState;
+struct AllocationMetadata;
+}; // namespace gwp_asan
// Globals shared between the dynamic linker and libc.so.
struct libc_shared_globals {
@@ -96,6 +100,9 @@
// Values passed from the linker to libc.so.
const char* init_progname = nullptr;
char** init_environ = nullptr;
+
+ const gwp_asan::AllocatorState *gwp_asan_state = nullptr;
+ const gwp_asan::AllocationMetadata *gwp_asan_metadata = nullptr;
};
__LIBC_HIDDEN__ libc_shared_globals* __libc_shared_globals();
diff --git a/linker/Android.bp b/linker/Android.bp
index a411a90..4be080b 100644
--- a/linker/Android.bp
+++ b/linker/Android.bp
@@ -324,7 +324,6 @@
},
compile_multilib: "both",
- xom: false,
recovery_available: true,
apex_available: [
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 03b08b6..15b6a40 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -3448,16 +3448,12 @@
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 {
- // 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);
- }
+ if (file_exists(kLdGeneratedConfigFilePath)) {
+ return kLdGeneratedConfigFilePath;
+ } else {
+ // 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 = get_ld_config_file_vndk_path();
diff --git a/linker/linker_debuggerd_android.cpp b/linker/linker_debuggerd_android.cpp
index b8c82f9..42ea2b7 100644
--- a/linker/linker_debuggerd_android.cpp
+++ b/linker/linker_debuggerd_android.cpp
@@ -39,6 +39,12 @@
return __libc_shared_globals()->abort_msg;
},
.post_dump = ¬ify_gdb_of_libraries,
+ .get_gwp_asan_state = []() {
+ return __libc_shared_globals()->gwp_asan_state;
+ },
+ .get_gwp_asan_metadata = []() {
+ return __libc_shared_globals()->gwp_asan_metadata;
+ },
};
debuggerd_init(&callbacks);
}
diff --git a/tests/libs/Android.bp b/tests/libs/Android.bp
index 06c090c..c427282 100644
--- a/tests/libs/Android.bp
+++ b/tests/libs/Android.bp
@@ -333,10 +333,6 @@
"libnstest_public",
"libnstest_private",
],
- // The dlext.ns_anonymous test copies the loaded segments of this shared
- // object into a new mapping, so every segment must be readable. Turn off
- // eXecute-Only-Memory. See http://b/123034666.
- xom: false,
}
cc_test_library {
diff --git a/tests/malloc_test.cpp b/tests/malloc_test.cpp
index 4da6d3f..5944414 100644
--- a/tests/malloc_test.cpp
+++ b/tests/malloc_test.cpp
@@ -25,6 +25,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/auxv.h>
+#include <sys/prctl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
@@ -40,7 +42,10 @@
#if defined(__BIONIC__)
+#include "SignalUtils.h"
+
#include "platform/bionic/malloc.h"
+#include "platform/bionic/mte_kernel.h"
#include "platform/bionic/reserved_signals.h"
#include "private/bionic_config.h"
@@ -1196,3 +1201,70 @@
GTEST_SKIP() << "bionic extension";
#endif
}
+
+#if defined(__BIONIC__) && defined(__aarch64__) && defined(ANDROID_EXPERIMENTAL_MTE)
+template <int SiCode> void CheckSiCode(int, siginfo_t* info, void*) {
+ if (info->si_code != SiCode) {
+ _exit(2);
+ }
+ _exit(1);
+}
+
+static bool SetTagCheckingLevel(int level) {
+ int tagged_addr_ctrl = prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0);
+ if (tagged_addr_ctrl < 0) {
+ return false;
+ }
+
+ tagged_addr_ctrl = (tagged_addr_ctrl & ~PR_MTE_TCF_MASK) | level;
+ return prctl(PR_SET_TAGGED_ADDR_CTRL, tagged_addr_ctrl, 0, 0, 0) == 0;
+}
+#endif
+
+TEST(android_mallopt, tag_level) {
+#if defined(__BIONIC__) && defined(__aarch64__) && defined(ANDROID_EXPERIMENTAL_MTE)
+ if (!(getauxval(AT_HWCAP2) & HWCAP2_MTE)) {
+ GTEST_SKIP() << "requires MTE support";
+ return;
+ }
+
+ std::unique_ptr<int[]> p = std::make_unique<int[]>(4);
+
+ // First, check that memory tagging is enabled and the default tag checking level is async.
+ // We assume that scudo is used on all MTE enabled hardware; scudo inserts a header with a
+ // mismatching tag before each allocation.
+ EXPECT_EXIT(
+ {
+ ScopedSignalHandler ssh(SIGSEGV, CheckSiCode<SEGV_MTEAERR>, SA_SIGINFO);
+ p[-1] = 42;
+ },
+ testing::ExitedWithCode(1), "");
+
+ EXPECT_TRUE(SetTagCheckingLevel(PR_MTE_TCF_SYNC));
+ EXPECT_EXIT(
+ {
+ ScopedSignalHandler ssh(SIGSEGV, CheckSiCode<SEGV_MTESERR>, SA_SIGINFO);
+ p[-1] = 42;
+ },
+ testing::ExitedWithCode(1), "");
+
+ EXPECT_TRUE(SetTagCheckingLevel(PR_MTE_TCF_NONE));
+ volatile int oob ATTRIBUTE_UNUSED = p[-1];
+
+ HeapTaggingLevel tag_level = M_HEAP_TAGGING_LEVEL_TBI;
+ EXPECT_FALSE(android_mallopt(M_SET_HEAP_TAGGING_LEVEL, &tag_level, sizeof(tag_level)));
+
+ tag_level = M_HEAP_TAGGING_LEVEL_NONE;
+ EXPECT_TRUE(android_mallopt(M_SET_HEAP_TAGGING_LEVEL, &tag_level, sizeof(tag_level)));
+ std::unique_ptr<int[]> p2 = std::make_unique<int[]>(4);
+ EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(p2.get()) >> 56);
+
+ tag_level = M_HEAP_TAGGING_LEVEL_ASYNC;
+ EXPECT_FALSE(android_mallopt(M_SET_HEAP_TAGGING_LEVEL, &tag_level, sizeof(tag_level)));
+
+ tag_level = M_HEAP_TAGGING_LEVEL_NONE;
+ EXPECT_TRUE(android_mallopt(M_SET_HEAP_TAGGING_LEVEL, &tag_level, sizeof(tag_level)));
+#else
+ GTEST_SKIP() << "arm64 only";
+#endif
+}
diff --git a/tests/mte_test.cpp b/tests/mte_test.cpp
index 2f922a2..8928805 100644
--- a/tests/mte_test.cpp
+++ b/tests/mte_test.cpp
@@ -16,17 +16,30 @@
#include <gtest/gtest.h>
+#include <android-base/macros.h>
#include <bionic/mte.h>
__attribute__((no_sanitize("hwaddress")))
static void test_tag_mismatch() {
- ScopedDisableMTE x;
-#if defined(__aarch64__)
std::unique_ptr<int[]> p = std::make_unique<int[]>(4);
p[0] = 1;
- int* mistagged_p = reinterpret_cast<int*>(reinterpret_cast<uintptr_t>(p.get()) + (1ULL << 56));
- volatile int load = *mistagged_p;
- (void)load;
+ int* mistagged_p ATTRIBUTE_UNUSED =
+ reinterpret_cast<int*>(reinterpret_cast<uintptr_t>(p.get()) + (1ULL << 56));
+ {
+ ScopedDisableMTE x;
+ { ScopedDisableMTE y; }
+#if defined(__aarch64__)
+ volatile int load ATTRIBUTE_UNUSED = *mistagged_p;
+#endif
+ }
+#if defined(__aarch64__)
+ if (mte_supported()) {
+ EXPECT_DEATH(
+ {
+ volatile int load ATTRIBUTE_UNUSED = *mistagged_p;
+ },
+ "");
+ }
#endif
}
diff --git a/tests/tagged_pointers_test.cpp b/tests/tagged_pointers_test.cpp
index 4a666c4..56d1037 100644
--- a/tests/tagged_pointers_test.cpp
+++ b/tests/tagged_pointers_test.cpp
@@ -18,6 +18,7 @@
#include <sys/prctl.h>
#include "platform/bionic/malloc.h"
+#include "platform/bionic/mte.h"
#include "utils.h"
#include <bionic/malloc_tagged_pointers.h>
@@ -39,6 +40,10 @@
}
#ifdef __aarch64__
+ if (mte_supported()) {
+ GTEST_SKIP() << "Tagged pointers are not used on MTE hardware.";
+ }
+
void *x = malloc(1);
// Ensure that `x` has a pointer tag.
@@ -51,6 +56,9 @@
EXPECT_TRUE(android_mallopt(M_SET_HEAP_TAGGING_LEVEL, &tag_level, sizeof(tag_level)));
EXPECT_DEATH(free(untag_address(malloc(1))), "Pointer tag for 0x[a-zA-Z0-9]* was truncated");
+ tag_level = M_HEAP_TAGGING_LEVEL_ASYNC;
+ EXPECT_FALSE(android_mallopt(M_SET_HEAP_TAGGING_LEVEL, &tag_level, sizeof(tag_level)));
+
x = malloc(1);
void *y = malloc(1);
// Disable heap tagging.