mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-24 04:54:40 +02:00
8020433: Crash when using -XX:+RestoreMXCSROnJNICalls
Remove StubRoutines::x86::_mxcsr_std and use StubRoutines::_mxcsr_std Reviewed-by: jrose
This commit is contained in:
parent
bb62cf25ed
commit
665bf36b6f
4 changed files with 71 additions and 12 deletions
|
@ -279,7 +279,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||||
__ stmxcsr(mxcsr_save);
|
__ stmxcsr(mxcsr_save);
|
||||||
__ movl(rax, mxcsr_save);
|
__ movl(rax, mxcsr_save);
|
||||||
__ andl(rax, MXCSR_MASK); // Only check control and mask bits
|
__ andl(rax, MXCSR_MASK); // Only check control and mask bits
|
||||||
ExternalAddress mxcsr_std(StubRoutines::x86::mxcsr_std());
|
ExternalAddress mxcsr_std(StubRoutines::addr_mxcsr_std());
|
||||||
__ cmp32(rax, mxcsr_std);
|
__ cmp32(rax, mxcsr_std);
|
||||||
__ jcc(Assembler::equal, skip_ldmx);
|
__ jcc(Assembler::equal, skip_ldmx);
|
||||||
__ ldmxcsr(mxcsr_std);
|
__ ldmxcsr(mxcsr_std);
|
||||||
|
@ -729,17 +729,18 @@ class StubGenerator: public StubCodeGenerator {
|
||||||
|
|
||||||
if (CheckJNICalls) {
|
if (CheckJNICalls) {
|
||||||
Label ok_ret;
|
Label ok_ret;
|
||||||
|
ExternalAddress mxcsr_std(StubRoutines::addr_mxcsr_std());
|
||||||
__ push(rax);
|
__ push(rax);
|
||||||
__ subptr(rsp, wordSize); // allocate a temp location
|
__ subptr(rsp, wordSize); // allocate a temp location
|
||||||
__ stmxcsr(mxcsr_save);
|
__ stmxcsr(mxcsr_save);
|
||||||
__ movl(rax, mxcsr_save);
|
__ movl(rax, mxcsr_save);
|
||||||
__ andl(rax, MXCSR_MASK); // Only check control and mask bits
|
__ andl(rax, MXCSR_MASK); // Only check control and mask bits
|
||||||
__ cmpl(rax, *(int *)(StubRoutines::x86::mxcsr_std()));
|
__ cmp32(rax, mxcsr_std);
|
||||||
__ jcc(Assembler::equal, ok_ret);
|
__ jcc(Assembler::equal, ok_ret);
|
||||||
|
|
||||||
__ warn("MXCSR changed by native JNI code, use -XX:+RestoreMXCSROnJNICall");
|
__ warn("MXCSR changed by native JNI code, use -XX:+RestoreMXCSROnJNICall");
|
||||||
|
|
||||||
__ ldmxcsr(ExternalAddress(StubRoutines::x86::mxcsr_std()));
|
__ ldmxcsr(mxcsr_std);
|
||||||
|
|
||||||
__ bind(ok_ret);
|
__ bind(ok_ret);
|
||||||
__ addptr(rsp, wordSize);
|
__ addptr(rsp, wordSize);
|
||||||
|
@ -3729,12 +3730,35 @@ class StubGenerator: public StubCodeGenerator {
|
||||||
return stub->entry_point();
|
return stub->entry_point();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void create_control_words() {
|
||||||
|
// Round to nearest, 53-bit mode, exceptions masked
|
||||||
|
StubRoutines::_fpu_cntrl_wrd_std = 0x027F;
|
||||||
|
// Round to zero, 53-bit mode, exception mased
|
||||||
|
StubRoutines::_fpu_cntrl_wrd_trunc = 0x0D7F;
|
||||||
|
// Round to nearest, 24-bit mode, exceptions masked
|
||||||
|
StubRoutines::_fpu_cntrl_wrd_24 = 0x007F;
|
||||||
|
// Round to nearest, 64-bit mode, exceptions masked
|
||||||
|
StubRoutines::_fpu_cntrl_wrd_64 = 0x037F;
|
||||||
|
// Round to nearest, 64-bit mode, exceptions masked
|
||||||
|
StubRoutines::_mxcsr_std = 0x1F80;
|
||||||
|
// Note: the following two constants are 80-bit values
|
||||||
|
// layout is critical for correct loading by FPU.
|
||||||
|
// Bias for strict fp multiply/divide
|
||||||
|
StubRoutines::_fpu_subnormal_bias1[0]= 0x00000000; // 2^(-15360) == 0x03ff 8000 0000 0000 0000
|
||||||
|
StubRoutines::_fpu_subnormal_bias1[1]= 0x80000000;
|
||||||
|
StubRoutines::_fpu_subnormal_bias1[2]= 0x03ff;
|
||||||
|
// Un-Bias for strict fp multiply/divide
|
||||||
|
StubRoutines::_fpu_subnormal_bias2[0]= 0x00000000; // 2^(+15360) == 0x7bff 8000 0000 0000 0000
|
||||||
|
StubRoutines::_fpu_subnormal_bias2[1]= 0x80000000;
|
||||||
|
StubRoutines::_fpu_subnormal_bias2[2]= 0x7bff;
|
||||||
|
}
|
||||||
|
|
||||||
// Initialization
|
// Initialization
|
||||||
void generate_initial() {
|
void generate_initial() {
|
||||||
// Generates all stubs and initializes the entry points
|
// Generates all stubs and initializes the entry points
|
||||||
|
|
||||||
// This platform-specific stub is needed by generate_call_stub()
|
// This platform-specific settings are needed by generate_call_stub()
|
||||||
StubRoutines::x86::_mxcsr_std = generate_fp_mask("mxcsr_std", 0x0000000000001F80);
|
create_control_words();
|
||||||
|
|
||||||
// entry points that exist in all platforms Note: This is code
|
// entry points that exist in all platforms Note: This is code
|
||||||
// that could be shared among different platforms - however the
|
// that could be shared among different platforms - however the
|
||||||
|
|
|
@ -42,4 +42,3 @@ address StubRoutines::x86::_float_sign_mask = NULL;
|
||||||
address StubRoutines::x86::_float_sign_flip = NULL;
|
address StubRoutines::x86::_float_sign_flip = NULL;
|
||||||
address StubRoutines::x86::_double_sign_mask = NULL;
|
address StubRoutines::x86::_double_sign_mask = NULL;
|
||||||
address StubRoutines::x86::_double_sign_flip = NULL;
|
address StubRoutines::x86::_double_sign_flip = NULL;
|
||||||
address StubRoutines::x86::_mxcsr_std = NULL;
|
|
||||||
|
|
|
@ -52,7 +52,6 @@ class x86 {
|
||||||
static address _float_sign_flip;
|
static address _float_sign_flip;
|
||||||
static address _double_sign_mask;
|
static address _double_sign_mask;
|
||||||
static address _double_sign_flip;
|
static address _double_sign_flip;
|
||||||
static address _mxcsr_std;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -106,11 +105,6 @@ class x86 {
|
||||||
return _double_sign_flip;
|
return _double_sign_flip;
|
||||||
}
|
}
|
||||||
|
|
||||||
static address mxcsr_std()
|
|
||||||
{
|
|
||||||
return _mxcsr_std;
|
|
||||||
}
|
|
||||||
|
|
||||||
# include "stubRoutines_x86.hpp"
|
# include "stubRoutines_x86.hpp"
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
42
hotspot/test/compiler/cpuflags/RestoreMXCSR.java
Normal file
42
hotspot/test/compiler/cpuflags/RestoreMXCSR.java
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 8020433
|
||||||
|
* @summary Crash when using -XX:+RestoreMXCSROnJNICalls
|
||||||
|
* @library /testlibrary
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
import com.oracle.java.testlibrary.*;
|
||||||
|
|
||||||
|
public class RestoreMXCSR {
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
ProcessBuilder pb;
|
||||||
|
OutputAnalyzer out;
|
||||||
|
|
||||||
|
pb = ProcessTools.createJavaProcessBuilder("-XX:+RestoreMXCSROnJNICalls", "-version");
|
||||||
|
out = new OutputAnalyzer(pb.start());
|
||||||
|
out.shouldHaveExitValue(0);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue