Add some MTE-related helpers.

mte_supported() lets code efficiently detect the presence of MTE, and
ScopedDisableMTE lets code disable MTE RAII-style in a particular region
of code.

Bug: 135772972
Change-Id: I628a054b50d79f67f39f35d44232b7a2ae166afb
This commit is contained in:
Peter Collingbourne 2020-01-29 16:27:31 -08:00
parent 58f3cba940
commit 6f1fd68817
5 changed files with 106 additions and 1 deletions

View File

@ -1797,7 +1797,7 @@ cc_library_headers {
name: "bionic_libc_platform_headers",
visibility: [
"//art:__subpackages__",
"//bionic/libc:__subpackages__",
"//bionic:__subpackages__",
"//frameworks:__subpackages__",
"//external/perfetto:__subpackages__",
"//external/scudo:__subpackages__",

View File

@ -31,6 +31,7 @@
#include <sys/auxv.h>
#include <private/bionic_auxv.h>
#include <private/bionic_globals.h>
#include <private/bionic_ifuncs.h>
#include <elf.h>
#include <errno.h>

View File

@ -0,0 +1,61 @@
/*
* 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.
*/
#pragma once
#include <sys/auxv.h>
#include <bionic/mte_kernel.h>
#ifdef __aarch64__
inline bool mte_supported() {
#ifdef ANDROID_EXPERIMENTAL_MTE
static bool supported = getauxval(AT_HWCAP2) & HWCAP2_MTE;
#else
static bool supported = false;
#endif
return supported;
}
#endif
struct ScopedDisableMTE {
ScopedDisableMTE() {
#ifdef __aarch64__
if (mte_supported()) {
__asm__ __volatile__(".arch_extension mte; msr tco, #1");
}
#endif
}
~ScopedDisableMTE() {
#ifdef __aarch64__
if (mte_supported()) {
__asm__ __volatile__(".arch_extension mte; msr tco, #0");
}
#endif
}
};

View File

@ -38,6 +38,7 @@ cc_defaults {
// For glibc.
"-D__STDC_LIMIT_MACROS",
],
header_libs: ["bionic_libc_platform_headers"],
// Make the bionic tests implicitly test bionic's shadow call stack support.
arch: {
arm64: {
@ -49,6 +50,12 @@ cc_defaults {
address: false,
},
bootstrap: true,
product_variables: {
experimental_mte: {
cflags: ["-DANDROID_EXPERIMENTAL_MTE"],
},
},
}
// -----------------------------------------------------------------------------
@ -117,6 +124,7 @@ cc_test_library {
"math_force_long_double_test.cpp",
"membarrier_test.cpp",
"mntent_test.cpp",
"mte_test.cpp",
"netdb_test.cpp",
"net_if_test.cpp",
"netinet_ether_test.cpp",

35
tests/mte_test.cpp Normal file
View File

@ -0,0 +1,35 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <gtest/gtest.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;
#endif
}
TEST(mte_test, ScopedDisableMTE) {
test_tag_mismatch();
}