[PATCH] Invalid value passed to critical JNI function (System V AMD64)
Ioannis Tsakpinis
iotsakp at gmail.com
Mon Oct 10 00:36:27 UTC 2016
This patch fixes invalid values passed to critical JNI functions on the
System V AMD64 ABI (tested on Linux and MacOS).
Specifically, this bug occurs when the arguments of a JNI method with 6 or
more parameters are shuffled to match the critical native function order.
The ABI provides 6 registers for passing arguments, so a temporary register
must be used to break the shuffling cycle (handled in ComputeMoveOrder). If
the temp register happens to be used for a 64bit argument, the target
register will receive an invalid value.
The fix is to call set2 when initializing the temp register to rbx. This
marks the VMRegPair as a single physical register, which is important when
copying 64bit values.
diff -r fec31089c2ef src/cpu/x86/vm/sharedRuntime_x86_64.cpp
--- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Thu Oct 06 18:05:53 2016 -0700
+++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Sun Oct 09 22:44:54 2016 +0300
@@ -2178,7 +2178,7 @@
// critical natives they are offset down.
GrowableArray<int> arg_order(2 * total_in_args);
VMRegPair tmp_vmreg;
- tmp_vmreg.set1(rbx->as_VMReg());
+ tmp_vmreg.set2(rbx->as_VMReg());
if (!is_critical_native) {
for (int i = total_in_args - 1, c_arg = total_c_args - 1; i >= 0;
i--, c_arg--) {
The shuffling implementation on AArch64 is similar and the same fix may be
required there, but I have not tested it.
Regards,
Ioannis
More information about the hotspot-dev
mailing list