OpenJDK / bsd-port / jdk9 / hotspot
changeset 8634:cd16fcb838d2
8130120: Handling of SHA intrinsics inconsistent across platforms
Summary: Introduce common warning message and common processing of SHA intrinsic-related arguments.
Reviewed-by: kvn, mcberg
author | zmajo |
---|---|
date | Fri, 03 Jul 2015 09:33:04 +0200 |
parents | 90922865a9d6 |
children | 5b039c8f1c37 |
files | src/cpu/aarch64/vm/vm_version_aarch64.cpp src/cpu/sparc/vm/vm_version_sparc.cpp src/cpu/x86/vm/vm_version_x86.cpp src/share/vm/runtime/globals.hpp test/compiler/intrinsics/sha/cli/SHAOptionsBase.java test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java |
diffstat | 8 files changed, 130 insertions(+), 115 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cpu/aarch64/vm/vm_version_aarch64.cpp Fri Jul 03 07:25:03 2015 +0200 +++ b/src/cpu/aarch64/vm/vm_version_aarch64.cpp Fri Jul 03 09:33:04 2015 +0200 @@ -214,34 +214,31 @@ FLAG_SET_DEFAULT(UseSHA, false); } - if (!UseSHA) { + if (UseSHA && (auxv & HWCAP_SHA1)) { + if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA1Intrinsics, true); + } + } else if (UseSHA1Intrinsics) { + warning("Intrinsics for SHA-1 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); - FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); + } + + if (UseSHA && (auxv & HWCAP_SHA2)) { + if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA256Intrinsics, true); + } + } else if (UseSHA256Intrinsics) { + warning("Intrinsics for SHA-224 and SHA-256 crypto hash functions not available on this CPU."); + FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); + } + + if (UseSHA512Intrinsics) { + warning("Intrinsics for SHA-384 and SHA-512 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); - } else { - if (auxv & HWCAP_SHA1) { - if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA1Intrinsics, true); - } - } else if (UseSHA1Intrinsics) { - warning("SHA1 instruction is not available on this CPU."); - FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); - } - if (auxv & HWCAP_SHA2) { - if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA256Intrinsics, true); - } - } else if (UseSHA256Intrinsics) { - warning("SHA256 instruction (for SHA-224 and SHA-256) is not available on this CPU."); - FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); - } - if (UseSHA512Intrinsics) { - warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU."); - FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); - } - if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA, false); - } + } + + if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA, false); } // This machine allows unaligned memory accesses
--- a/src/cpu/sparc/vm/vm_version_sparc.cpp Fri Jul 03 07:25:03 2015 +0200 +++ b/src/cpu/sparc/vm/vm_version_sparc.cpp Fri Jul 03 09:33:04 2015 +0200 @@ -329,39 +329,35 @@ FLAG_SET_DEFAULT(UseSHA, false); } - if (!UseSHA) { + if (UseSHA && has_sha1()) { + if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA1Intrinsics, true); + } + } else if (UseSHA1Intrinsics) { + warning("Intrinsics for SHA-1 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); + } + + if (UseSHA && has_sha256()) { + if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA256Intrinsics, true); + } + } else if (UseSHA256Intrinsics) { + warning("Intrinsics for SHA-224 and SHA-256 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); + } + + if (UseSHA && has_sha512()) { + if (FLAG_IS_DEFAULT(UseSHA512Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA512Intrinsics, true); + } + } else if (UseSHA512Intrinsics) { + warning("Intrinsics for SHA-384 and SHA-512 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); - } else { - if (has_sha1()) { - if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA1Intrinsics, true); - } - } else if (UseSHA1Intrinsics) { - warning("SHA1 instruction is not available on this CPU."); - FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); - } - if (has_sha256()) { - if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA256Intrinsics, true); - } - } else if (UseSHA256Intrinsics) { - warning("SHA256 instruction (for SHA-224 and SHA-256) is not available on this CPU."); - FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); - } + } - if (has_sha512()) { - if (FLAG_IS_DEFAULT(UseSHA512Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA512Intrinsics, true); - } - } else if (UseSHA512Intrinsics) { - warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU."); - FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); - } - if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA, false); - } + if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA, false); } // SPARC T4 and above should have support for CRC32C instruction
--- a/src/cpu/x86/vm/vm_version_x86.cpp Fri Jul 03 07:25:03 2015 +0200 +++ b/src/cpu/x86/vm/vm_version_x86.cpp Fri Jul 03 09:33:04 2015 +0200 @@ -692,10 +692,19 @@ warning("SHA instructions are not available on this CPU"); FLAG_SET_DEFAULT(UseSHA, false); } - if (UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics) { - warning("SHA intrinsics are not available on this CPU"); + + if (UseSHA1Intrinsics) { + warning("Intrinsics for SHA-1 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); + } + + if (UseSHA256Intrinsics) { + warning("Intrinsics for SHA-224 and SHA-256 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); + } + + if (UseSHA512Intrinsics) { + warning("Intrinsics for SHA-384 and SHA-512 crypto hash functions not available on this CPU."); FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); }
--- a/src/share/vm/runtime/globals.hpp Fri Jul 03 07:25:03 2015 +0200 +++ b/src/share/vm/runtime/globals.hpp Fri Jul 03 09:33:04 2015 +0200 @@ -728,7 +728,8 @@ "Control whether AES instructions can be used on x86/x64") \ \ product(bool, UseSHA, false, \ - "Control whether SHA instructions can be used on SPARC") \ + "Control whether SHA instructions can be used " \ + "on SPARC and on ARM") \ \ product(bool, UseGHASHIntrinsics, false, \ "Use intrinsics for GHASH versions of crypto") \ @@ -837,13 +838,16 @@ "Use intrinsics for AES versions of crypto") \ \ product(bool, UseSHA1Intrinsics, false, \ - "Use intrinsics for SHA-1 crypto hash function") \ + "Use intrinsics for SHA-1 crypto hash function. " \ + "Requires that UseSHA is enabled.") \ \ product(bool, UseSHA256Intrinsics, false, \ - "Use intrinsics for SHA-224 and SHA-256 crypto hash functions") \ + "Use intrinsics for SHA-224 and SHA-256 crypto hash functions. " \ + "Requires that UseSHA is enabled.") \ \ product(bool, UseSHA512Intrinsics, false, \ - "Use intrinsics for SHA-384 and SHA-512 crypto hash functions") \ + "Use intrinsics for SHA-384 and SHA-512 crypto hash functions. " \ + "Requires that UseSHA is enabled.") \ \ product(bool, UseCRC32Intrinsics, false, \ "use intrinsics for java.util.zip.CRC32") \
--- a/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java Fri Jul 03 07:25:03 2015 +0200 +++ b/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java Fri Jul 03 09:33:04 2015 +0200 @@ -47,16 +47,12 @@ // expressions, not just a plain strings. protected static final String SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE = "SHA instructions are not available on this CPU"; - protected static final String SHA1_INSTRUCTION_IS_NOT_AVAILABLE - = "SHA1 instruction is not available on this CPU\\."; - protected static final String SHA256_INSTRUCTION_IS_NOT_AVAILABLE - = "SHA256 instruction \\(for SHA-224 and SHA-256\\) " - + "is not available on this CPU\\."; - protected static final String SHA512_INSTRUCTION_IS_NOT_AVAILABLE - = "SHA512 instruction \\(for SHA-384 and SHA-512\\) " - + "is not available on this CPU\\."; - protected static final String SHA_INTRINSICS_ARE_NOT_AVAILABLE - = "SHA intrinsics are not available on this CPU"; + protected static final String SHA1_INTRINSICS_ARE_NOT_AVAILABLE + = "Intrinsics for SHA-1 crypto hash functions not available on this CPU."; + protected static final String SHA256_INTRINSICS_ARE_NOT_AVAILABLE + = "Intrinsics for SHA-224 and SHA-256 crypto hash functions not available on this CPU."; + protected static final String SHA512_INTRINSICS_ARE_NOT_AVAILABLE + = "Intrinsics for SHA-384 and SHA-512 crypto hash functions not available on this CPU."; private final TestCase[] testCases; @@ -71,33 +67,23 @@ * instructions required by the option are not supported. */ protected static String getWarningForUnsupportedCPU(String optionName) { - if (Platform.isSparc() || Platform.isAArch64()) { + if (Platform.isSparc() || Platform.isAArch64() || + Platform.isX64() || Platform.isX86()) { switch (optionName) { - case SHAOptionsBase.USE_SHA_OPTION: - return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION: - return SHAOptionsBase.SHA1_INSTRUCTION_IS_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION: - return SHAOptionsBase.SHA256_INSTRUCTION_IS_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION: - return SHAOptionsBase.SHA512_INSTRUCTION_IS_NOT_AVAILABLE; - default: - throw new Error("Unexpected option " + optionName); - } - } else if (Platform.isX64() || Platform.isX86()) { - switch (optionName) { - case SHAOptionsBase.USE_SHA_OPTION: - return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION: - case SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION: - case SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION: - return SHAOptionsBase.SHA_INTRINSICS_ARE_NOT_AVAILABLE; - default: - throw new Error("Unexpected option " + optionName); + case SHAOptionsBase.USE_SHA_OPTION: + return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; + case SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION: + return SHAOptionsBase.SHA1_INTRINSICS_ARE_NOT_AVAILABLE; + case SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION: + return SHAOptionsBase.SHA256_INTRINSICS_ARE_NOT_AVAILABLE; + case SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION: + return SHAOptionsBase.SHA512_INTRINSICS_ARE_NOT_AVAILABLE; + default: + throw new Error("Unexpected option " + optionName); } } else { - throw new Error("Support for CPUs other then X86 or SPARC is not " - + "implemented."); + throw new Error("Support for CPUs different fromn X86, SPARC, and AARCH64 " + + "is not implemented"); } }
--- a/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java Fri Jul 03 07:25:03 2015 +0200 +++ b/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java Fri Jul 03 09:33:04 2015 +0200 @@ -64,18 +64,20 @@ SHAOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag(optionName, false)); - // Verify that it is possible to enable the tested option and disable - // all SHA intrinsics via -UseSHA without any warnings. - CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) - }, shouldPassMessage, String.format("It should be able to " - + "enable option '%s' even if %s was passed to JVM", - optionName, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, false)), - ExitCode.OK, - CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, false), - CommandLineOptionTest.prepareBooleanFlag(optionName, true)); + if (!optionName.equals(SHAOptionsBase.USE_SHA_OPTION)) { + // Verify that if -XX:-UseSHA is passed to the JVM, it is not possible + // to enable the tested option and a warning is printed. + CommandLineOptionTest.verifySameJVMStartup( + new String[] { SHAOptionsBase.getWarningForUnsupportedCPU(optionName) }, + null, + shouldPassMessage, + String.format("Enabling option '%s' should not be possible and should result in a warning if %s was passed to JVM", + optionName, + CommandLineOptionTest.prepareBooleanFlag(SHAOptionsBase.USE_SHA_OPTION, false)), + ExitCode.OK, + CommandLineOptionTest.prepareBooleanFlag(SHAOptionsBase.USE_SHA_OPTION, false), + CommandLineOptionTest.prepareBooleanFlag(optionName, true)); + } } @Override
--- a/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java Fri Jul 03 07:25:03 2015 +0200 +++ b/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java Fri Jul 03 09:33:04 2015 +0200 @@ -49,14 +49,22 @@ }, shouldPassMessage, shouldPassMessage, ExitCode.OK, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); - shouldPassMessage = String.format("JVM should start with '-XX:+" - + "%s' flag, but output should contain warning.", optionName); - // Verify that when the tested option is explicitly enabled, then - // a warning will occur in VM output. - CommandLineOptionTest.verifySameJVMStartup(new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) - }, null, shouldPassMessage, shouldPassMessage, ExitCode.OK, - CommandLineOptionTest.prepareBooleanFlag(optionName, true)); + shouldPassMessage = String.format("If JVM is started with '-XX:-" + + "%s' '-XX:+%s', output should contain warning.", + SHAOptionsBase.USE_SHA_OPTION, optionName); + + // Verify that when the tested option is enabled, then + // a warning will occur in VM output if UseSHA is disabled. + if (!optionName.equals(SHAOptionsBase.USE_SHA_OPTION)) { + CommandLineOptionTest.verifySameJVMStartup( + new String[] { SHAOptionsBase.getWarningForUnsupportedCPU(optionName) }, + null, + shouldPassMessage, + shouldPassMessage, + ExitCode.OK, + CommandLineOptionTest.prepareBooleanFlag(SHAOptionsBase.USE_SHA_OPTION, false), + CommandLineOptionTest.prepareBooleanFlag(optionName, true)); + } } @Override
--- a/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java Fri Jul 03 07:25:03 2015 +0200 +++ b/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java Fri Jul 03 09:33:04 2015 +0200 @@ -48,6 +48,19 @@ SHAOptionsBase.getWarningForUnsupportedCPU(optionName) }, shouldPassMessage, shouldPassMessage, ExitCode.OK, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); + + // Verify that when the tested option is enabled, then + // a warning will occur in VM output if UseSHA is disabled. + if (!optionName.equals(SHAOptionsBase.USE_SHA_OPTION)) { + CommandLineOptionTest.verifySameJVMStartup( + new String[] { SHAOptionsBase.getWarningForUnsupportedCPU(optionName) }, + null, + shouldPassMessage, + shouldPassMessage, + ExitCode.OK, + CommandLineOptionTest.prepareBooleanFlag(SHAOptionsBase.USE_SHA_OPTION, false), + CommandLineOptionTest.prepareBooleanFlag(optionName, true)); + } } @Override