blob: ceb30a7950ade1c189c273ce53ec4f0653640b59 [file] [log] [blame]
Art versions in the directory, and where they were build from
-------------------------------------------------------------
See https://source.android.com/source/build-numbers.html for build numbers.
Device names:
angler: Nexus 6P
mako: Nexus 4
art (default)
-------------
Build from AOSP branch master. To update to a new AOSP master
mkdir master
cd master
repo init -u https://android.googlesource.com/platform/manifest -b master
repo sync -cq -j24
source build/envsetup.sh
lunch aosp_angler-eng
m -j24
m -j24 build-art
m -j24 test-art-host
Collected into tools/linux/art
scripts/update-host-art.sh --android-checkout ~/android/master --art-dir art
The precise info for the AOSP master used is in aosp_master_manifest.xml, which is
produced using this command:
repo manifest -o aosp_master_manifest.xml -r
To reproduce that AOSP state, use the following commands:
mkdir master
cd master
mkdir -p .repo/manifests
cp <r8-checkout>/aosp_master_manifest.xml .repo/manifests
repo init -u https://android.googlesource.com/platform/manifest -m aosp_master_manifest.xml
<continue with repo sync as above>
art-7.0.0
---------
Build from branch android-7.0.0_r21 with the following patch:
diff --git a/runtime/thread.cc b/runtime/thread.cc
index 16f30cded..acdd995e9 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -554,6 +554,12 @@ void Thread::InstallImplicitProtection() {
// AddressSanitizer does not like the part of this functions that reads every stack page.
// Looks a lot like an out-of-bounds access.
+ //
+ // Accesses too far below the current machine register corresponding to the stack pointer (e.g.,
+ // ESP on x86[-32], SP on ARM) might cause a SIGSEGV (at least on x86 with newer kernels). We
+ // thus have to move the stack pointer. We do this portably by using a recursive function with a
+ // large stack frame size.
+
// (Defensively) first remove the protection on the protected region as will want to read
// and write it. Ignore errors.
UnprotectStack();
@@ -561,12 +567,26 @@ void Thread::InstallImplicitProtection() {
VLOG(threads) << "Need to map in stack for thread at " << std::hex <<
static_cast<void*>(pregion);
- // Read every page from the high address to the low.
- volatile uint8_t dont_optimize_this;
- UNUSED(dont_optimize_this);
- for (uint8_t* p = stack_top; p >= pregion; p -= kPageSize) {
- dont_optimize_this = *p;
- }
+ struct RecurseDownStack {
+ // This function has an intentionally large stack size.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wframe-larger-than="
+ NO_INLINE
+ static void Touch(uintptr_t target) {
+ volatile size_t zero = 0;
+ // Use a large local volatile array to ensure a large frame size. Do not use anything close
+ // to a full page for ASAN. It would be nice to ensure the frame size is at most a page, but
+ // there is no pragma support for this.
+ volatile char space[kPageSize - 256];
+ char sink ATTRIBUTE_UNUSED = space[zero];
+ if (reinterpret_cast<uintptr_t>(space) >= target + kPageSize) {
+ Touch(target);
+ }
+ zero *= 2; // Try to avoid tail recursion.
+ }
+#pragma GCC diagnostic pop
+ };
+ RecurseDownStack::Touch(reinterpret_cast<uintptr_t>(pregion));
VLOG(threads) << "(again) installing stack protected region at " << std::hex <<
static_cast<void*>(pregion) << " to " <<
mkdir 7.0.0_r21
cd 7.0.0_r21
repo init -u https://android.googlesource.com/platform/manifest -b android-7.0.0_r21
repo sync -cq -j24
source build/envsetup.sh
lunch aosp_angler-userdebug
cd art
<apply patch>
cd ..
m -j24
m -j24 build-art
m -j24 test-art-host
Collected into tools/linux/art-7.0.0.
scripts/update-host-art.sh --android-checkout ~/android/7.0.0_r21 --art-dir art-7.0.0
art-6.0.1
---------
Build from branch android-6.0.1_r66 with the following patch:
diff --git a/runtime/thread.cc b/runtime/thread.cc
index 6e8f89cb4..788d717ca 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -357,20 +357,37 @@ void Thread::InstallImplicitProtection() {
uint8_t* stack_top = reinterpret_cast<uint8_t*>(reinterpret_cast<uintptr_t>(&stack_himem) &
~(kPageSize - 1)); // Page containing current top of stack.
+ //
+ // Accesses too far below the current machine register corresponding to the stack pointer (e.g.,
+ // ESP on x86[-32], SP on ARM) might cause a SIGSEGV (at least on x86 with newer kernels). We
+ // thus have to move the stack pointer. We do this portably by using a recursive function with a
+ // large stack frame size.
+
// First remove the protection on the protected region as will want to read and
// write it. This may fail (on the first attempt when the stack is not mapped)
// but we ignore that.
UnprotectStack();
- // Map in the stack. This must be done by reading from the
- // current stack pointer downwards as the stack may be mapped using VM_GROWSDOWN
- // in the kernel. Any access more than a page below the current SP might cause
- // a segv.
-
- // Read every page from the high address to the low.
- for (uint8_t* p = stack_top; p >= pregion; p -= kPageSize) {
- dont_optimize_this = *p;
- }
+ struct RecurseDownStack {
+ // This function has an intentionally large stack size.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wframe-larger-than="
+ NO_INLINE
+ static void Touch(uintptr_t target) {
+ volatile size_t zero = 0;
+ // Use a large local volatile array to ensure a large frame size. Do not use anything close
+ // to a full page for ASAN. It would be nice to ensure the frame size is at most a page, but
+ // there is no pragma support for this.
+ volatile char space[kPageSize - 256];
+ char sink ATTRIBUTE_UNUSED = space[zero];
+ if (reinterpret_cast<uintptr_t>(space) >= target + kPageSize) {
+ Touch(target);
+ }
+ zero *= 2; // Try to avoid tail recursion.
+ }
+#pragma GCC diagnostic pop
+ };
+ RecurseDownStack::Touch(reinterpret_cast<uintptr_t>(pregion));
VLOG(threads) << "installing stack protected region at " << std::hex <<
static_cast<void*>(pregion) << " to " <<
mkdir 6.0.1_r66
cd 6.0.1_r66
repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r66
repo sync -cq -j24
source build/envsetup.sh
lunch aosp_angler-userdebug
cd art
<apply patch>
cd ..
m -j24
m -j24 build-art
m -j24 test-art-host
Collected into tools/linux/art-6.0.1.
scripts/update-host-art.sh --android-checkout ~/android/6.0.1_r66 --art-dir art-6.0.1
art-5.1.1
---------
Build from branch 5.1.1_r19 with the following patch:
diff --git a/runtime/thread.cc b/runtime/thread.cc
index 2f474f7ae..f927ad7a3 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -257,20 +257,39 @@ void Thread::InstallImplicitProtection() {
byte* stack_top = reinterpret_cast<byte*>(reinterpret_cast<uintptr_t>(&stack_himem) &
~(kPageSize - 1)); // Page containing current top of stack.
+ //
+ // Accesses too far below the current machine register corresponding to the stack pointer (e.g.,
+ // ESP on x86[-32], SP on ARM) might cause a SIGSEGV (at least on x86 with newer kernels). We
+ // thus have to move the stack pointer. We do this portably by using a recursive function with a
+ // large stack frame size.
+
// First remove the protection on the protected region as will want to read and
// write it. This may fail (on the first attempt when the stack is not mapped)
// but we ignore that.
UnprotectStack();
- // Map in the stack. This must be done by reading from the
- // current stack pointer downwards as the stack may be mapped using VM_GROWSDOWN
- // in the kernel. Any access more than a page below the current SP might cause
- // a segv.
-
- // Read every page from the high address to the low.
- for (byte* p = stack_top; p >= pregion; p -= kPageSize) {
- dont_optimize_this = *p;
- }
+#define NO_INLINE __attribute__ ((noinline))
+#define ATTRIBUTE_UNUSED __attribute__((__unused__))
+ struct RecurseDownStack {
+ // This function has an intentionally large stack size.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wframe-larger-than="
+ NO_INLINE
+ static void Touch(uintptr_t target) {
+ volatile size_t zero = 0;
+ // Use a large local volatile array to ensure a large frame size. Do not use anything close
+ // to a full page for ASAN. It would be nice to ensure the frame size is at most a page, but
+ // there is no pragma support for this.
+ volatile char space[kPageSize - 256];
+ char sink ATTRIBUTE_UNUSED = space[zero];
+ if (reinterpret_cast<uintptr_t>(space) >= target + kPageSize) {
+ Touch(target);
+ }
+ zero *= 2; // Try to avoid tail recursion.
+ }
+#pragma GCC diagnostic pop
+ };
+ RecurseDownStack::Touch(reinterpret_cast<uintptr_t>(pregion));
VLOG(threads) << "installing stack protected region at " << std::hex <<
static_cast<void*>(pregion) << " to " <<
mkdir 5.1.1_r19
cd 5.1.1_r19
repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r19
repo sync -cq -j24
source build/envsetup.sh
lunch aosp_mako-userdebug
cd art
<apply patch>
cd ..
m -j24
m -j24 build-art
m -j24 test-art-host
Collected into tools/linux/art-5.1.1.
scripts/update-host-art.sh --android-checkout ~/android/5.1.1_r19 --art-dir art-5.1.1 --android-product mako