diff options
| author | 2015-05-29 15:04:41 -0700 | |
|---|---|---|
| committer | 2015-06-02 11:46:14 -0700 | |
| commit | bfa5eb6e8d15ea73a36f8df449630f285a91e995 (patch) | |
| tree | de306b9ffb819e628c49f1c24d1f4ee33ad08319 | |
| parent | 61d894850cfcbae91ff472a24b5ae9e33394f24c (diff) | |
Add heap poisoning support to the entrypoints.
In preparation for full compiler/managed-code support.
Enable stub_test with heap poisoning.
Bug: 12687968
Change-Id: I79fc54ce6386c0a1eb9621759bb4cc23bc393a75
| -rw-r--r-- | runtime/arch/arm/asm_support_arm.S | 14 | ||||
| -rw-r--r-- | runtime/arch/arm/quick_entrypoints_arm.S | 5 | ||||
| -rw-r--r-- | runtime/arch/arm64/asm_support_arm64.S | 14 | ||||
| -rw-r--r-- | runtime/arch/arm64/quick_entrypoints_arm64.S | 5 | ||||
| -rw-r--r-- | runtime/arch/mips/asm_support_mips.S | 13 | ||||
| -rw-r--r-- | runtime/arch/mips/quick_entrypoints_mips.S | 4 | ||||
| -rw-r--r-- | runtime/arch/mips64/asm_support_mips64.S | 13 | ||||
| -rw-r--r-- | runtime/arch/mips64/quick_entrypoints_mips64.S | 4 | ||||
| -rw-r--r-- | runtime/arch/stub_test.cc | 22 | ||||
| -rw-r--r-- | runtime/arch/x86/asm_support_x86.S | 14 | ||||
| -rw-r--r-- | runtime/arch/x86/quick_entrypoints_x86.S | 21 | ||||
| -rw-r--r-- | runtime/arch/x86_64/asm_support_x86_64.S | 14 | ||||
| -rw-r--r-- | runtime/arch/x86_64/quick_entrypoints_x86_64.S | 13 | ||||
| -rw-r--r-- | runtime/common_runtime_test.h | 7 | ||||
| -rw-r--r-- | runtime/globals.h | 2 | ||||
| -rw-r--r-- | runtime/read_barrier_c.h | 4 |
16 files changed, 157 insertions, 12 deletions
diff --git a/runtime/arch/arm/asm_support_arm.S b/runtime/arch/arm/asm_support_arm.S index 2af636e4b5..665d2a3306 100644 --- a/runtime/arch/arm/asm_support_arm.S +++ b/runtime/arch/arm/asm_support_arm.S @@ -123,4 +123,18 @@ END \name .endm +// Macros to poison (negate) the reference for heap poisoning. +.macro POISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + rsb \rRef, \rRef, #0 +#endif // USE_HEAP_POISONING +.endm + +// Macros to unpoison (negate) the reference for heap poisoning. +.macro UNPOISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + rsb \rRef, \rRef, #0 +#endif // USE_HEAP_POISONING +.endm + #endif // ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_ diff --git a/runtime/arch/arm/quick_entrypoints_arm.S b/runtime/arch/arm/quick_entrypoints_arm.S index 064f5a6d98..e65e5ff7ca 100644 --- a/runtime/arch/arm/quick_entrypoints_arm.S +++ b/runtime/arch/arm/quick_entrypoints_arm.S @@ -616,12 +616,16 @@ END art_quick_aput_obj_with_bound_check ENTRY art_quick_aput_obj cbz r2, .Ldo_aput_null ldr r3, [r0, #MIRROR_OBJECT_CLASS_OFFSET] + UNPOISON_HEAP_REF r3 ldr ip, [r2, #MIRROR_OBJECT_CLASS_OFFSET] + UNPOISON_HEAP_REF ip ldr r3, [r3, #MIRROR_CLASS_COMPONENT_TYPE_OFFSET] + UNPOISON_HEAP_REF r3 cmp r3, ip @ value's type == array's component type - trivial assignability bne .Lcheck_assignability .Ldo_aput: add r3, r0, #MIRROR_OBJECT_ARRAY_DATA_OFFSET + POISON_HEAP_REF r2 str r2, [r3, r1, lsl #2] ldr r3, [r9, #THREAD_CARD_TABLE_OFFSET] lsr r0, r0, #7 @@ -649,6 +653,7 @@ ENTRY art_quick_aput_obj .cfi_restore lr .cfi_adjust_cfa_offset -16 add r3, r0, #MIRROR_OBJECT_ARRAY_DATA_OFFSET + POISON_HEAP_REF r2 str r2, [r3, r1, lsl #2] ldr r3, [r9, #THREAD_CARD_TABLE_OFFSET] lsr r0, r0, #7 diff --git a/runtime/arch/arm64/asm_support_arm64.S b/runtime/arch/arm64/asm_support_arm64.S index 051f40b450..bcf55e339e 100644 --- a/runtime/arch/arm64/asm_support_arm64.S +++ b/runtime/arch/arm64/asm_support_arm64.S @@ -55,4 +55,18 @@ END \name .endm +// Macros to poison (negate) the reference for heap poisoning. +.macro POISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + neg \rRef, \rRef +#endif // USE_HEAP_POISONING +.endm + +// Macros to unpoison (negate) the reference for heap poisoning. +.macro UNPOISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + neg \rRef, \rRef +#endif // USE_HEAP_POISONING +.endm + #endif // ART_RUNTIME_ARCH_ARM64_ASM_SUPPORT_ARM64_S_ diff --git a/runtime/arch/arm64/quick_entrypoints_arm64.S b/runtime/arch/arm64/quick_entrypoints_arm64.S index 790158e653..78d3116af7 100644 --- a/runtime/arch/arm64/quick_entrypoints_arm64.S +++ b/runtime/arch/arm64/quick_entrypoints_arm64.S @@ -1146,15 +1146,19 @@ ENTRY art_quick_aput_obj cbz x2, .Ldo_aput_null ldr w3, [x0, #MIRROR_OBJECT_CLASS_OFFSET] // Heap reference = 32b // This also zero-extends to x3 + UNPOISON_HEAP_REF w3 ldr w4, [x2, #MIRROR_OBJECT_CLASS_OFFSET] // Heap reference = 32b // This also zero-extends to x4 + UNPOISON_HEAP_REF w4 ldr w3, [x3, #MIRROR_CLASS_COMPONENT_TYPE_OFFSET] // Heap reference = 32b // This also zero-extends to x3 + UNPOISON_HEAP_REF w3 cmp w3, w4 // value's type == array's component type - trivial assignability bne .Lcheck_assignability .Ldo_aput: add x3, x0, #MIRROR_OBJECT_ARRAY_DATA_OFFSET // "Compress" = do nothing + POISON_HEAP_REF w2 str w2, [x3, x1, lsl #2] // Heap reference = 32b ldr x3, [xSELF, #THREAD_CARD_TABLE_OFFSET] lsr x0, x0, #7 @@ -1194,6 +1198,7 @@ ENTRY art_quick_aput_obj add x3, x0, #MIRROR_OBJECT_ARRAY_DATA_OFFSET // "Compress" = do nothing + POISON_HEAP_REF w2 str w2, [x3, x1, lsl #2] // Heap reference = 32b ldr x3, [xSELF, #THREAD_CARD_TABLE_OFFSET] lsr x0, x0, #7 diff --git a/runtime/arch/mips/asm_support_mips.S b/runtime/arch/mips/asm_support_mips.S index eea6537f01..51e224cbf3 100644 --- a/runtime/arch/mips/asm_support_mips.S +++ b/runtime/arch/mips/asm_support_mips.S @@ -115,5 +115,18 @@ #endif /* mips_isa_rev */ +// Macros to poison (negate) the reference for heap poisoning. +.macro POISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + subu \rRef, $zero, \rRef +#endif // USE_HEAP_POISONING +.endm + +// Macros to unpoison (negate) the reference for heap poisoning. +.macro UNPOISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + subu \rRef, $zero, \rRef +#endif // USE_HEAP_POISONING +.endm #endif // ART_RUNTIME_ARCH_MIPS_ASM_SUPPORT_MIPS_S_ diff --git a/runtime/arch/mips/quick_entrypoints_mips.S b/runtime/arch/mips/quick_entrypoints_mips.S index 9e1dab6dd3..3a0ea646e1 100644 --- a/runtime/arch/mips/quick_entrypoints_mips.S +++ b/runtime/arch/mips/quick_entrypoints_mips.S @@ -650,13 +650,17 @@ ENTRY art_quick_aput_obj beqz $a2, .Ldo_aput_null nop lw $t0, MIRROR_OBJECT_CLASS_OFFSET($a0) + UNPOISON_HEAP_REF $t0 lw $t1, MIRROR_OBJECT_CLASS_OFFSET($a2) + UNPOISON_HEAP_REF $t1 lw $t0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET($t0) + UNPOISON_HEAP_REF $t0 bne $t1, $t0, .Lcheck_assignability # value's type == array's component type - trivial assignability nop .Ldo_aput: sll $a1, $a1, 2 add $t0, $a0, $a1 + POISON_HEAP_REF $a2 sw $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0) lw $t0, THREAD_CARD_TABLE_OFFSET(rSELF) srl $t1, $a0, 7 diff --git a/runtime/arch/mips64/asm_support_mips64.S b/runtime/arch/mips64/asm_support_mips64.S index 26137777e3..b859c708ba 100644 --- a/runtime/arch/mips64/asm_support_mips64.S +++ b/runtime/arch/mips64/asm_support_mips64.S @@ -69,5 +69,18 @@ END \name .endm +// Macros to poison (negate) the reference for heap poisoning. +.macro POISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + subu \rRef, $zero, \rRef +#endif // USE_HEAP_POISONING +.endm + +// Macros to unpoison (negate) the reference for heap poisoning. +.macro UNPOISON_HEAP_REF rRef +#ifdef USE_HEAP_POISONING + subu \rRef, $zero, \rRef +#endif // USE_HEAP_POISONING +.endm #endif // ART_RUNTIME_ARCH_MIPS64_ASM_SUPPORT_MIPS64_S_ diff --git a/runtime/arch/mips64/quick_entrypoints_mips64.S b/runtime/arch/mips64/quick_entrypoints_mips64.S index 04385a2691..b2cd7f26c7 100644 --- a/runtime/arch/mips64/quick_entrypoints_mips64.S +++ b/runtime/arch/mips64/quick_entrypoints_mips64.S @@ -912,13 +912,17 @@ ENTRY art_quick_aput_obj beq $a2, $zero, .Ldo_aput_null nop lwu $t0, MIRROR_OBJECT_CLASS_OFFSET($a0) + UNPOISON_HEAP_REF $t0 lwu $t1, MIRROR_OBJECT_CLASS_OFFSET($a2) + UNPOISON_HEAP_REF $t1 lwu $t0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET($t0) + UNPOISON_HEAP_REF $t0 bne $t1, $t0, .Lcheck_assignability # value's type == array's component type - trivial assignability nop .Ldo_aput: dsll $a1, $a1, 2 daddu $t0, $a0, $a1 + POISON_HEAP_REF $a2 sw $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0) ld $t0, THREAD_CARD_TABLE_OFFSET(rSELF) dsrl $t1, $a0, 7 diff --git a/runtime/arch/stub_test.cc b/runtime/arch/stub_test.cc index 62a6962022..05b42f5604 100644 --- a/runtime/arch/stub_test.cc +++ b/runtime/arch/stub_test.cc @@ -1124,7 +1124,7 @@ TEST_F(StubTest, CheckCast) { TEST_F(StubTest, APutObj) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \ (defined(__x86_64__) && !defined(__APPLE__)) @@ -1258,7 +1258,7 @@ TEST_F(StubTest, APutObj) { } TEST_F(StubTest, AllocObject) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \ (defined(__x86_64__) && !defined(__APPLE__)) @@ -1385,7 +1385,7 @@ TEST_F(StubTest, AllocObject) { } TEST_F(StubTest, AllocObjectArray) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \ (defined(__x86_64__) && !defined(__APPLE__)) @@ -1474,7 +1474,7 @@ TEST_F(StubTest, AllocObjectArray) { TEST_F(StubTest, StringCompareTo) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) // TODO: Check the "Unresolved" allocation stubs @@ -2152,7 +2152,7 @@ static void TestFields(Thread* self, StubTest* test, Primitive::Type test_type) } TEST_F(StubTest, Fields8) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); Thread* self = Thread::Current(); @@ -2166,7 +2166,7 @@ TEST_F(StubTest, Fields8) { } TEST_F(StubTest, Fields16) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); Thread* self = Thread::Current(); @@ -2180,7 +2180,7 @@ TEST_F(StubTest, Fields16) { } TEST_F(StubTest, Fields32) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); Thread* self = Thread::Current(); @@ -2193,7 +2193,7 @@ TEST_F(StubTest, Fields32) { } TEST_F(StubTest, FieldsObj) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); Thread* self = Thread::Current(); @@ -2206,7 +2206,7 @@ TEST_F(StubTest, FieldsObj) { } TEST_F(StubTest, Fields64) { - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); Thread* self = Thread::Current(); @@ -2221,7 +2221,7 @@ TEST_F(StubTest, Fields64) { TEST_F(StubTest, IMT) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \ (defined(__x86_64__) && !defined(__APPLE__)) - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); Thread* self = Thread::Current(); @@ -2342,7 +2342,7 @@ TEST_F(StubTest, IMT) { TEST_F(StubTest, StringIndexOf) { #if defined(__arm__) || defined(__aarch64__) - TEST_DISABLED_FOR_HEAP_REFERENCE_POISONING(); + TEST_DISABLED_FOR_READ_BARRIER(); Thread* self = Thread::Current(); ScopedObjectAccess soa(self); diff --git a/runtime/arch/x86/asm_support_x86.S b/runtime/arch/x86/asm_support_x86.S index 122428b929..2159f0e717 100644 --- a/runtime/arch/x86/asm_support_x86.S +++ b/runtime/arch/x86/asm_support_x86.S @@ -179,4 +179,18 @@ MACRO1(SETUP_GOT_NOSAVE, got_reg) #endif END_MACRO +// Macros to poison (negate) the reference for heap poisoning. +MACRO1(POISON_HEAP_REF, rRef) +#ifdef USE_HEAP_POISONING + neg REG_VAR(rRef, 0) +#endif // USE_HEAP_POISONING +END_MACRO + +// Macros to unpoison (negate) the reference for heap poisoning. +MACRO1(UNPOISON_HEAP_REF, rRef) +#ifdef USE_HEAP_POISONING + neg REG_VAR(rRef, 0) +#endif // USE_HEAP_POISONING +END_MACRO + #endif // ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_ diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S index e0397ccf67..44b67ca61b 100644 --- a/runtime/arch/x86/quick_entrypoints_x86.S +++ b/runtime/arch/x86/quick_entrypoints_x86.S @@ -33,6 +33,7 @@ MACRO2(SETUP_SAVE_ALL_CALLEE_SAVE_FRAME, got_reg, temp_reg) movl SYMBOL(_ZN3art7Runtime9instance_E)@GOT(REG_VAR(got_reg, 0)), REG_VAR(temp_reg, 1) movl (REG_VAR(temp_reg, 1)), REG_VAR(temp_reg, 1) // Push save all callee-save method. + THIS_LOAD_REQUIRES_READ_BARRIER pushl RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET(REG_VAR(temp_reg, 1)) CFI_ADJUST_CFA_OFFSET(4) // Store esp as the top quick frame. @@ -59,6 +60,7 @@ MACRO2(SETUP_REFS_ONLY_CALLEE_SAVE_FRAME, got_reg, temp_reg) movl SYMBOL(_ZN3art7Runtime9instance_E)@GOT(REG_VAR(got_reg, 0)), REG_VAR(temp_reg, 1) movl (REG_VAR(temp_reg, 1)), REG_VAR(temp_reg, 1) // Push save all callee-save method. + THIS_LOAD_REQUIRES_READ_BARRIER pushl RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET(REG_VAR(temp_reg, 1)) CFI_ADJUST_CFA_OFFSET(4) // Store esp as the top quick frame. @@ -104,6 +106,7 @@ MACRO2(SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME, got_reg, temp_reg) movl SYMBOL(_ZN3art7Runtime9instance_E)@GOT(REG_VAR(got_reg, 0)), REG_VAR(temp_reg, 1) movl (REG_VAR(temp_reg, 1)), REG_VAR(temp_reg, 1) // Push save all callee-save method. + THIS_LOAD_REQUIRES_READ_BARRIER pushl RUNTIME_REFS_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET(REG_VAR(temp_reg, 1)) CFI_ADJUST_CFA_OFFSET(4) // Store esp as the stop quick frame. @@ -1142,11 +1145,22 @@ DEFINE_FUNCTION art_quick_aput_obj test %edx, %edx // store of null jz .Ldo_aput_null movl MIRROR_OBJECT_CLASS_OFFSET(%eax), %ebx + UNPOISON_HEAP_REF ebx movl MIRROR_CLASS_COMPONENT_TYPE_OFFSET(%ebx), %ebx + UNPOISON_HEAP_REF ebx // value's type == array's component type - trivial assignability +#ifdef USE_HEAP_POISONING + PUSH eax // save eax + movl MIRROR_OBJECT_CLASS_OFFSET(%edx), %eax + UNPOISON_HEAP_REF eax + cmpl %eax, %ebx + POP eax // restore eax +#else cmpl MIRROR_OBJECT_CLASS_OFFSET(%edx), %ebx +#endif jne .Lcheck_assignability .Ldo_aput: + POISON_HEAP_REF edx movl %edx, MIRROR_OBJECT_ARRAY_DATA_OFFSET(%eax, %ecx, 4) movl %fs:THREAD_CARD_TABLE_OFFSET, %edx shrl LITERAL(7), %eax @@ -1161,7 +1175,13 @@ DEFINE_FUNCTION art_quick_aput_obj PUSH edx subl LITERAL(8), %esp // alignment padding CFI_ADJUST_CFA_OFFSET(8) +#ifdef USE_HEAP_POISONING + movl MIRROR_OBJECT_CLASS_OFFSET(%edx), %eax // pass arg2 - type of the value to be stored + UNPOISON_HEAP_REF eax + PUSH eax +#else pushl MIRROR_OBJECT_CLASS_OFFSET(%edx) // pass arg2 - type of the value to be stored +#endif CFI_ADJUST_CFA_OFFSET(4) PUSH ebx // pass arg1 - component type of the array call SYMBOL(artIsAssignableFromCode) // (Class* a, Class* b) @@ -1172,6 +1192,7 @@ DEFINE_FUNCTION art_quick_aput_obj POP edx POP ecx POP eax + POISON_HEAP_REF edx movl %edx, MIRROR_OBJECT_ARRAY_DATA_OFFSET(%eax, %ecx, 4) // do the aput movl %fs:THREAD_CARD_TABLE_OFFSET, %edx shrl LITERAL(7), %eax diff --git a/runtime/arch/x86_64/asm_support_x86_64.S b/runtime/arch/x86_64/asm_support_x86_64.S index 5964314914..b2b6c2dbfb 100644 --- a/runtime/arch/x86_64/asm_support_x86_64.S +++ b/runtime/arch/x86_64/asm_support_x86_64.S @@ -170,4 +170,18 @@ MACRO0(UNTESTED) int3 END_MACRO +// Macros to poison (negate) the reference for heap poisoning. +MACRO1(POISON_HEAP_REF, rRef) +#ifdef USE_HEAP_POISONING + negl REG_VAR(rRef, 0) +#endif // USE_HEAP_POISONING +END_MACRO + +// Macros to unpoison (negate) the reference for heap poisoning. +MACRO1(UNPOISON_HEAP_REF, rRef) +#ifdef USE_HEAP_POISONING + negl REG_VAR(rRef, 0) +#endif // USE_HEAP_POISONING +END_MACRO + #endif // ART_RUNTIME_ARCH_X86_64_ASM_SUPPORT_X86_64_S_ diff --git a/runtime/arch/x86_64/quick_entrypoints_x86_64.S b/runtime/arch/x86_64/quick_entrypoints_x86_64.S index 48f59f3766..66dfe5a432 100644 --- a/runtime/arch/x86_64/quick_entrypoints_x86_64.S +++ b/runtime/arch/x86_64/quick_entrypoints_x86_64.S @@ -919,8 +919,10 @@ DEFINE_FUNCTION art_quick_alloc_object_tlab // RDI: uint32_t type_idx, RSI: ArtMethod* // RDX, RCX, R8, R9: free. RAX: return val. movl ART_METHOD_DEX_CACHE_TYPES_OFFSET(%rsi), %edx // Load dex cache resolved types array + UNPOISON_HEAP_REF edx // Load the class movl MIRROR_OBJECT_ARRAY_DATA_OFFSET(%rdx, %rdi, MIRROR_OBJECT_ARRAY_COMPONENT_SIZE), %edx + UNPOISON_HEAP_REF edx testl %edx, %edx // Check null class jz .Lart_quick_alloc_object_tlab_slow_path // Check class status. @@ -1189,12 +1191,21 @@ DEFINE_FUNCTION art_quick_aput_obj jz .Ldo_aput_null movl MIRROR_OBJECT_CLASS_OFFSET(%edi), %ecx // movq MIRROR_OBJECT_CLASS_OFFSET(%rdi), %rcx + UNPOISON_HEAP_REF ecx movl MIRROR_CLASS_COMPONENT_TYPE_OFFSET(%ecx), %ecx // movq MIRROR_CLASS_COMPONENT_TYPE_OFFSET(%rcx), %rcx + UNPOISON_HEAP_REF ecx +#ifdef USE_HEAP_POISONING + movl MIRROR_OBJECT_CLASS_OFFSET(%edx), %eax // rax is free. + UNPOISON_HEAP_REF eax + cmpl %eax, %ecx // value's type == array's component type - trivial assignability +#else cmpl MIRROR_OBJECT_CLASS_OFFSET(%edx), %ecx // value's type == array's component type - trivial assignability // cmpq MIRROR_CLASS_OFFSET(%rdx), %rcx +#endif jne .Lcheck_assignability .Ldo_aput: + POISON_HEAP_REF edx movl %edx, MIRROR_OBJECT_ARRAY_DATA_OFFSET(%edi, %esi, 4) // movq %rdx, MIRROR_OBJECT_ARRAY_DATA_OFFSET(%rdi, %rsi, 4) movq %gs:THREAD_CARD_TABLE_OFFSET, %rdx @@ -1217,6 +1228,7 @@ DEFINE_FUNCTION art_quick_aput_obj // "Uncompress" = do nothing, as already zero-extended on load. movl MIRROR_OBJECT_CLASS_OFFSET(%edx), %esi // Pass arg2 = value's class. + UNPOISON_HEAP_REF esi movq %rcx, %rdi // Pass arg1 = array's component type. call SYMBOL(artIsAssignableFromCode) // (Class* a, Class* b) @@ -1233,6 +1245,7 @@ DEFINE_FUNCTION art_quick_aput_obj POP rsi POP rdi + POISON_HEAP_REF edx movl %edx, MIRROR_OBJECT_ARRAY_DATA_OFFSET(%edi, %esi, 4) // movq %rdx, MIRROR_OBJECT_ARRAY_DATA_OFFSET(%rdi, %rsi, 4) movq %gs:THREAD_CARD_TABLE_OFFSET, %rdx diff --git a/runtime/common_runtime_test.h b/runtime/common_runtime_test.h index 34fdd8d76a..0987c00122 100644 --- a/runtime/common_runtime_test.h +++ b/runtime/common_runtime_test.h @@ -181,6 +181,13 @@ class CheckJniAbortCatcher { return; \ } +// TODO: When read barrier works with the compiler, get rid of this. +#define TEST_DISABLED_FOR_READ_BARRIER() \ + if (kUseReadBarrier) { \ + printf("WARNING: TEST DISABLED FOR READ BARRIER\n"); \ + return; \ + } + #define TEST_DISABLED_FOR_MIPS() \ if (kRuntimeISA == kMips) { \ printf("WARNING: TEST DISABLED FOR MIPS\n"); \ diff --git a/runtime/globals.h b/runtime/globals.h index fe699c6ff3..d70f3ab19b 100644 --- a/runtime/globals.h +++ b/runtime/globals.h @@ -97,7 +97,7 @@ static constexpr bool kUseReadBarrier = kUseBakerReadBarrier || kUseBrooksReadBa kUseTableLookupReadBarrier; // If true, references within the heap are poisoned (negated). -#ifdef ART_HEAP_POISONING +#ifdef USE_HEAP_POISONING static constexpr bool kPoisonHeapReferences = true; #else static constexpr bool kPoisonHeapReferences = false; diff --git a/runtime/read_barrier_c.h b/runtime/read_barrier_c.h index 88bda3a900..4f408dd5c1 100644 --- a/runtime/read_barrier_c.h +++ b/runtime/read_barrier_c.h @@ -31,6 +31,10 @@ // #define USE_TABLE_LOOKUP_READ_BARRIER #endif +#ifdef ART_HEAP_POISONING +#define USE_HEAP_POISONING +#endif + #if defined(USE_BAKER_READ_BARRIER) || defined(USE_BROOKS_READ_BARRIER) #define USE_BAKER_OR_BROOKS_READ_BARRIER #endif |