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
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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);
- 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 (UseSHA && (auxv & HWCAP_SHA2)) {
+ if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, true);
}
- 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);
- }
+ } 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);
+ }
+
+ if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA, false);
}
// This machine allows unaligned memory accesses
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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);
- FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
- 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 (UseSHA && has_sha256()) {
+ if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, true);
}
- 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);
- }
+ } 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 (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 (UseSHA && has_sha512()) {
+ if (FLAG_IS_DEFAULT(UseSHA512Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, true);
}
- if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) {
- FLAG_SET_DEFAULT(UseSHA, false);
- }
+ } else if (UseSHA512Intrinsics) {
+ warning("Intrinsics for SHA-384 and SHA-512 crypto hash functions not available on this CPU.");
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
+ }
+
+ if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA, false);
}
// SPARC T4 and above should have support for CRC32C instruction
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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/hotspot/src/share/vm/runtime/globals.hpp Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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/hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java Fri Jul 03 07:25:03 2015 +0200
+++ b/hotspot/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