< prev index next >

src/cpu/aarch32/vm/templateInterpreter_aarch32.cpp

Print this page
rev 8069 : 8164652: aarch32: C1 port

@@ -140,10 +140,16 @@
     __ pop(c_rarg2);
   }
   // expression stack must be empty before entering the VM if an
   // exception happened
   __ empty_expression_stack();
+  // FIXME shouldn't it be in rest of generate_* ?
+  // rdispatch assumed to cache dispatch table. This code can be called from
+  // signal handler, so it can't assume execption caller preserved the register,
+  // so restore it here
+  __ get_dispatch();
+  // FIXME shouldn't get_method be here ?
   // setup parameters
   __ lea(c_rarg1, Address((address)name));
   if (pass_oop) {
     __ call_VM(r0, CAST_FROM_FN_PTR(address,
                                     InterpreterRuntime::

@@ -506,11 +512,13 @@
   // check against the current stack bottom
   __ cmp(sp, r0);
   __ b(after_frame_check, Assembler::HI);
 
   // Remove the incoming args, peeling the machine SP back to where it
-  // was in the caller.
+  // was in the caller.  This is not strictly necessary, but unless we
+  // do so the stack frame may have a garbage FP; this ensures a
+  // correct call stack that we can always unwind.
   __ mov(sp, r4);
 
   // Note: the restored frame is not necessarily interpreted.
   // Use the shared runtime version of the StackOverflowError.
   assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "stub not yet generated");

@@ -1037,11 +1045,11 @@
   __ str(rscratch1, Address(rscratch2));
   __ reg_printf("before os::is_MP\n");
   if (os::is_MP()) {
     if (UseMembar) {
       // Force this write out before the read below
-      __ dsb(Assembler::SY);
+      __ membar(Assembler::AnyAny);
     } else {
       // Write serialization page so VM thread can do a pseudo remote membar.
       // We use the current thread pointer to calculate a thread specific
       // offset to write to within the page. This minimizes bus traffic
       // due to cache line collision.

@@ -1990,21 +1998,20 @@
 // Non-product code
 #ifndef PRODUCT
 address TemplateInterpreterGenerator::generate_trace_code(TosState state) {
   address entry = __ pc();
 
-  __ push(lr);
   __ push(state);
-  __ push(RegSet::range(r0, r12), sp);
+  // Save all registers on stack, so omit SP and PC
+  __ push(RegSet::range(r0, r12) + lr, sp);
   __ mov(c_rarg2, r0);  // Pass itos
   __ mov(c_rarg3, r1);  // Pass ltos/dtos high part
   __ call_VM(noreg,
              CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode),
              c_rarg1, c_rarg2, c_rarg3);
-  __ pop(RegSet::range(r0, r12), sp);
+  __ pop(RegSet::range(r0, r12) + lr, sp);
   __ pop(state);
-  __ pop(lr);
   __ b(lr);                                   // return from result handler
 
   return entry;
 }
 
< prev index next >