changeset 5683:4df02e5f0433

Add some memory barriers for object creation and runtime calls.
author adinn
date Fri, 21 Nov 2014 19:18:22 +0000
parents ae4b26e6783b
children 93b1103ebb83
files src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp src/cpu/aarch64/vm/templateTable_aarch64.cpp
diffstat 3 files changed, 7 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp	Fri Nov 21 13:21:30 2014 +0000
+++ b/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp	Fri Nov 21 19:18:22 2014 +0000
@@ -319,7 +319,8 @@
   __ mov(c_rarg1, lr);
   __ lea(rscratch1, RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::fixup_callers_callsite)));
   __ blrt(rscratch1, 2, 0, 0);
- __ maybe_isb();
+  __ maybe_isb();
+  __ membar(Assembler::LoadLoad | Assembler::LoadStore);
 
   __ pop_CPU_state();
   // restore sp
--- a/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp	Fri Nov 21 13:21:30 2014 +0000
+++ b/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp	Fri Nov 21 19:18:22 2014 +0000
@@ -325,6 +325,7 @@
   address entry = __ pc();
   __ push(state);
   __ call_VM(noreg, runtime_entry);
+  __ membar(Assembler::AnyAny);
   __ dispatch_via(vtos, Interpreter::_normal_table.table_for(vtos));
   return entry;
 }
--- a/src/cpu/aarch64/vm/templateTable_aarch64.cpp	Fri Nov 21 13:21:30 2014 +0000
+++ b/src/cpu/aarch64/vm/templateTable_aarch64.cpp	Fri Nov 21 19:18:22 2014 +0000
@@ -3391,6 +3391,8 @@
 
   // continue
   __ bind(done);
+  // Must prevent reordering of stores for object initialization with stores that publish the new object.
+  __ membar(Assembler::StoreStore);
 }
 
 void TemplateTable::newarray() {
@@ -3399,6 +3401,7 @@
   __ mov(c_rarg2, r0);
   call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray),
           c_rarg1, c_rarg2);
+  __ membar(Assembler::StoreStore);
 }
 
 void TemplateTable::anewarray() {
@@ -3408,6 +3411,7 @@
   __ mov(c_rarg3, r0);
   call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray),
           c_rarg1, c_rarg2, c_rarg3);
+  __ membar(Assembler::StoreStore);
 }
 
 void TemplateTable::arraylength() {