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:
parent
58f3cba940
commit
6f1fd68817
|
@ -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__",
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
};
|
|
@ -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",
|
||||
|
|
|
@ -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();
|
||||
}
|
Loading…
Reference in New Issue