-
Bug
-
Resolution: Fixed
-
P3
-
11, 17, 18, 19
-
b05
-
arm
-
linux
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8279883 | 17.0.3 | Sergey Nazarkin | P3 | Resolved | Fixed | b01 |
JDK-8279863 | 11.0.15 | Sergey Nazarkin | P3 | Resolved | Fixed | b01 |
1. Release runtime crashes with SIGILL when executing JITed code
2. Debug runtime asserts at C1 thread
# Internal Error (/home/jenkins/18.04/workspace/jdk17/linux/armhf/c2/build/generic/sa/release/crossbuild/jdk17/src/hotspot/cpu/arm/assembler_arm_32.cpp:77), pid=32041, tid=32056
# assert((imm & 0x0ffffff0) == 0) failed: too complicated constant: -8 (fffffff8)
Investigation:
Both crashes are caused by the constant supplied to ARM32 logic instruction. C1 assembler doesn't guard incoming parameter with verification procedure as it is done for arithmetic ops or long arguments.
The fix:
void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dest) {
...
assert(right->is_constant(), "must be");
const uint c = (uint)right->as_constant_ptr()->as_jint();
+ if (!Assembler::is_arith_imm_in_range(c)) {
+ BAILOUT("illegal arithmetic operand");
+ }
switch (code) {
case lir_logic_and: __ and_32(res, lreg, c); break;
case lir_logic_or: __ orr_32(res, lreg, c); break;
case lir_logic_xor: __ eor_32(res, lreg, c); break;
default: ShouldNotReachHere();
}
....
Workaround:
Disable tiered compilation
- backported by
-
JDK-8279863 [arm32] SIGILL when running GetObjectSizeIntrinsicsTest
- Resolved
-
JDK-8279883 [arm32] SIGILL when running GetObjectSizeIntrinsicsTest
- Resolved
- relates to
-
JDK-8279301 c1 getObjectSize intrinsic should guard round mask constant
- Closed
- links to
-
Commit openjdk/jdk11u-dev/5a3a17bf
-
Commit openjdk/jdk17u-dev/68846354
-
Commit openjdk/jdk/6613ce64
-
Review openjdk/jdk11u-dev/748
-
Review openjdk/jdk17u-dev/72
-
Review openjdk/jdk/6937