-
Bug
-
Resolution: Fixed
-
P4
-
port-stage-aarch32-8, port-stage-aarch32-9
-
None
-
aarch32
-
linux
There is a bug on slowdebug. JVM crashes with SIGILL when using
-XX:+TraceBytecodes. The illegal instruction is
pop{r0,r1,...sp,lr,pc}, the sp can only be in the list before ARMv7,
and it's illegal in ARMv7.
This instruction is generated by following codes:
/************************code start**************************/
address TemplateInterpreterGenerator::generate_trace_code(TosState state) {
address entry = __ pc();
__ push(lr);
__ push(state);
__ push(RegSet::range(r0, r15), sp);
__ mov(c_rarg2, r0); // Pass itos
__ call_VM(noreg,
CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode),
c_rarg1, c_rarg2, c_rarg3);
__ pop(RegSet::range(r0, r15), sp);
__ pop(state);
__ pop(lr);
__ b(lr); // return from result handler
return entry;
}
/************************code end***************************/
r13 can't be in the pop/ldmia list, r14 is already pushed, and
push/pop pc also cause an another problem.
The patch use push/pop(RegSet::range(r0,12),sp) instead of using
push/pop(RegSet::range(r0,15),sp).
/************************patch start**************************/
--- a/src/cpu/aarch32/vm/templateInterpreter_aarch32.cpp Mon
Jan 11 14:58:34 2016 +0000
+++ b/src/cpu/aarch32/vm/templateInterpreter_aarch32.cpp Tue
Jan 19 11:03:03 2016 +0800
@@ -1864,12 +1864,12 @@
__ push(lr);
__ push(state);
- __ push(RegSet::range(r0, r15), sp);
+ __ push(RegSet::range(r0, r12), sp);
__ mov(c_rarg2, r0); // Pass itos
__ call_VM(noreg,
CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode),
c_rarg1, c_rarg2, c_rarg3);
- __ pop(RegSet::range(r0, r15), sp);
+ __ pop(RegSet::range(r0, r12), sp);
__ pop(state);
__ pop(lr);
__ b(lr);
/************************patch end****************************/
-XX:+TraceBytecodes. The illegal instruction is
pop{r0,r1,...sp,lr,pc}, the sp can only be in the list before ARMv7,
and it's illegal in ARMv7.
This instruction is generated by following codes:
/************************code start**************************/
address TemplateInterpreterGenerator::generate_trace_code(TosState state) {
address entry = __ pc();
__ push(lr);
__ push(state);
__ push(RegSet::range(r0, r15), sp);
__ mov(c_rarg2, r0); // Pass itos
__ call_VM(noreg,
CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode),
c_rarg1, c_rarg2, c_rarg3);
__ pop(RegSet::range(r0, r15), sp);
__ pop(state);
__ pop(lr);
__ b(lr); // return from result handler
return entry;
}
/************************code end***************************/
r13 can't be in the pop/ldmia list, r14 is already pushed, and
push/pop pc also cause an another problem.
The patch use push/pop(RegSet::range(r0,12),sp) instead of using
push/pop(RegSet::range(r0,15),sp).
/************************patch start**************************/
--- a/src/cpu/aarch32/vm/templateInterpreter_aarch32.cpp Mon
Jan 11 14:58:34 2016 +0000
+++ b/src/cpu/aarch32/vm/templateInterpreter_aarch32.cpp Tue
Jan 19 11:03:03 2016 +0800
@@ -1864,12 +1864,12 @@
__ push(lr);
__ push(state);
- __ push(RegSet::range(r0, r15), sp);
+ __ push(RegSet::range(r0, r12), sp);
__ mov(c_rarg2, r0); // Pass itos
__ call_VM(noreg,
CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode),
c_rarg1, c_rarg2, c_rarg3);
- __ pop(RegSet::range(r0, r15), sp);
+ __ pop(RegSet::range(r0, r12), sp);
__ pop(state);
__ pop(lr);
__ b(lr);
/************************patch end****************************/
- relates to
-
JDK-8149548 aarch32: slowdebug build crashes if -XX:+TraceBytecodes flag is used
-
- Resolved
-