[scudo][standalone] Introduce platform specific code & mutexes
Summary:
This CL adds the platform specific code for Fuchsia, Linux & Android,
as well as some tests related to those (more tests to come later).
While some of it is pretty much a straight port of the existing scudo &
sanitizer_common code, the memory mapping functions have been reworked
a bit to fit the limited usage scenario that Scudo has for them.
For Fuchsia, I can now track the Vmar/Vmo pair for memory mappings if
there is an intent to grow or decommit some mapping (that will be
useful for the Primary).
Reviewers: eugenis, vitalybuka, mcgrathr, phosek, flowerhack, morehouse, dmmoore415
Reviewed By: vitalybuka, morehouse
Subscribers: kcc, dvyukov, srhines, mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D58184
llvm-svn: 354895
2019-02-27 00:47:25 +08:00
|
|
|
//===-- linux.h -------------------------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef SCUDO_LINUX_H_
|
|
|
|
#define SCUDO_LINUX_H_
|
|
|
|
|
|
|
|
#include "platform.h"
|
|
|
|
|
|
|
|
#if SCUDO_LINUX
|
|
|
|
|
|
|
|
namespace scudo {
|
|
|
|
|
[scudo][standalone] Introduce the Secondary allocator
Summary:
The Secondary allocator wraps the platform allocation primitives. It is
meant to be used for larger sizes that the Primary can't fullfill, as
it will be slower, and sizes are multiple of the system page size.
This also changes some of the existing code, notably the opaque
platform data being passed to the platform specific functions: we can
shave a couple of syscalls on Fuchsia by storing additional data (this
addresses a TODO).
Reviewers: eugenis, vitalybuka, hctim, morehouse
Reviewed By: morehouse
Subscribers: mgorny, delcypher, jfb, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D60787
llvm-svn: 359097
2019-04-24 22:20:49 +08:00
|
|
|
// MapPlatformData is unused on Linux, define it as a minimally sized structure.
|
|
|
|
struct MapPlatformData {};
|
|
|
|
|
[scudo][standalone] Introduce platform specific code & mutexes
Summary:
This CL adds the platform specific code for Fuchsia, Linux & Android,
as well as some tests related to those (more tests to come later).
While some of it is pretty much a straight port of the existing scudo &
sanitizer_common code, the memory mapping functions have been reworked
a bit to fit the limited usage scenario that Scudo has for them.
For Fuchsia, I can now track the Vmar/Vmo pair for memory mappings if
there is an intent to grow or decommit some mapping (that will be
useful for the Primary).
Reviewers: eugenis, vitalybuka, mcgrathr, phosek, flowerhack, morehouse, dmmoore415
Reviewed By: vitalybuka, morehouse
Subscribers: kcc, dvyukov, srhines, mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D58184
llvm-svn: 354895
2019-02-27 00:47:25 +08:00
|
|
|
#if SCUDO_ANDROID
|
|
|
|
|
|
|
|
#if defined(__aarch64__)
|
|
|
|
#define __get_tls() \
|
|
|
|
({ \
|
|
|
|
void **__v; \
|
|
|
|
__asm__("mrs %0, tpidr_el0" : "=r"(__v)); \
|
|
|
|
__v; \
|
|
|
|
})
|
|
|
|
#elif defined(__arm__)
|
|
|
|
#define __get_tls() \
|
|
|
|
({ \
|
|
|
|
void **__v; \
|
|
|
|
__asm__("mrc p15, 0, %0, c13, c0, 3" : "=r"(__v)); \
|
|
|
|
__v; \
|
|
|
|
})
|
|
|
|
#elif defined(__i386__)
|
|
|
|
#define __get_tls() \
|
|
|
|
({ \
|
|
|
|
void **__v; \
|
|
|
|
__asm__("movl %%gs:0, %0" : "=r"(__v)); \
|
|
|
|
__v; \
|
|
|
|
})
|
|
|
|
#elif defined(__x86_64__)
|
|
|
|
#define __get_tls() \
|
|
|
|
({ \
|
|
|
|
void **__v; \
|
|
|
|
__asm__("mov %%fs:0, %0" : "=r"(__v)); \
|
|
|
|
__v; \
|
|
|
|
})
|
|
|
|
#else
|
|
|
|
#error "Unsupported architecture."
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// The Android Bionic team has allocated a TLS slot for sanitizers starting
|
|
|
|
// with Q, given that Android currently doesn't support ELF TLS. It is used to
|
|
|
|
// store sanitizer thread specific data.
|
2019-10-19 04:00:32 +08:00
|
|
|
static const int TLS_SLOT_SANITIZER = 6;
|
[scudo][standalone] Introduce platform specific code & mutexes
Summary:
This CL adds the platform specific code for Fuchsia, Linux & Android,
as well as some tests related to those (more tests to come later).
While some of it is pretty much a straight port of the existing scudo &
sanitizer_common code, the memory mapping functions have been reworked
a bit to fit the limited usage scenario that Scudo has for them.
For Fuchsia, I can now track the Vmar/Vmo pair for memory mappings if
there is an intent to grow or decommit some mapping (that will be
useful for the Primary).
Reviewers: eugenis, vitalybuka, mcgrathr, phosek, flowerhack, morehouse, dmmoore415
Reviewed By: vitalybuka, morehouse
Subscribers: kcc, dvyukov, srhines, mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D58184
llvm-svn: 354895
2019-02-27 00:47:25 +08:00
|
|
|
|
|
|
|
ALWAYS_INLINE uptr *getAndroidTlsPtr() {
|
|
|
|
return reinterpret_cast<uptr *>(&__get_tls()[TLS_SLOT_SANITIZER]);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // SCUDO_ANDROID
|
|
|
|
|
|
|
|
} // namespace scudo
|
|
|
|
|
|
|
|
#endif // SCUDO_LINUX
|
|
|
|
|
|
|
|
#endif // SCUDO_LINUX_H_
|