diff --git a/.gitignore b/.gitignore index ce96dbb..3fdee85 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u201-b09.tar.xz +SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u212-b04.tar.xz SOURCES/systemtap_3.2_tapsets_hg-icedtea8-9d464368e06d.tar.xz diff --git a/.java-1.8.0-openjdk.metadata b/.java-1.8.0-openjdk.metadata index 7607966..2adc4ec 100644 --- a/.java-1.8.0-openjdk.metadata +++ b/.java-1.8.0-openjdk.metadata @@ -1,2 +1,2 @@ -2529357c6d61b884805898b347dad2e4432f6438 SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u201-b09.tar.xz +ca52171b9a47c3efd4714f974ca4e6c27d890c55 SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u212-b04.tar.xz cd8bf91753b9eb1401cfc529e78517105fc66011 SOURCES/systemtap_3.2_tapsets_hg-icedtea8-9d464368e06d.tar.xz diff --git a/SOURCES/jdk8029661-pr3642-rh1477159-add_tlsv1_2_support_to_pkcs11_provider.patch b/SOURCES/jdk8029661-pr3642-rh1477159-add_tlsv1_2_support_to_pkcs11_provider.patch deleted file mode 100644 index f7a816a..0000000 --- a/SOURCES/jdk8029661-pr3642-rh1477159-add_tlsv1_2_support_to_pkcs11_provider.patch +++ /dev/null @@ -1,2269 +0,0 @@ -# HG changeset patch -# User mbalao -# Date 1541016287 10800 -# Wed Oct 31 17:04:47 2018 -0300 -# Node ID fa06cdb4c6f7b5ca148f26d345090d48014fecff -# Parent 478a4add975beb90696a4ead5f8fcd9c17fc1a83 -8029661, PR3642, RH1477159: Support TLS v1.2 algorithm in SunPKCS11 provider -Summary: TLS v1.2 algorithms for key and MAC derivation added to SunPKCS11 crypto provider. 8210912 fix is included as part of this changeset. -Reviewed-by: valeriep - -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2005, 2018, 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 -@@ -95,9 +95,9 @@ - throw new InvalidAlgorithmParameterException("init() failed", e); - } - version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); -- if ((version < 0x0300) && (version > 0x0302)) { -- throw new InvalidAlgorithmParameterException -- ("Only SSL 3.0, TLS 1.0, and TLS 1.1 are supported"); -+ if ((version < 0x0300) && (version > 0x0303)) { -+ throw new InvalidAlgorithmParameterException("Only SSL 3.0," + -+ " TLS 1.0, TLS 1.1, and TLS 1.2 are supported"); - } - // we assume the token supports both the CKM_SSL3_* and the CKM_TLS_* - // mechanisms -@@ -112,8 +112,11 @@ - throw new IllegalStateException - ("TlsKeyMaterialGenerator must be initialized"); - } -- mechanism = (version == 0x0300) ? CKM_SSL3_KEY_AND_MAC_DERIVE -- : CKM_TLS_KEY_AND_MAC_DERIVE; -+ if (version == 0x0300) { -+ mechanism = CKM_SSL3_KEY_AND_MAC_DERIVE; -+ } else if (version == 0x0301 || version == 0x0302) { -+ mechanism = CKM_TLS_KEY_AND_MAC_DERIVE; -+ } - int macBits = spec.getMacKeyLength() << 3; - int ivBits = spec.getIvLength() << 3; - -@@ -129,8 +132,18 @@ - - CK_SSL3_RANDOM_DATA random = new CK_SSL3_RANDOM_DATA - (spec.getClientRandom(), spec.getServerRandom()); -- CK_SSL3_KEY_MAT_PARAMS params = new CK_SSL3_KEY_MAT_PARAMS -- (macBits, keyBits, ivBits, isExportable, random); -+ Object params = null; -+ CK_MECHANISM ckMechanism = null; -+ if (version < 0x0303) { -+ params = new CK_SSL3_KEY_MAT_PARAMS -+ (macBits, keyBits, ivBits, isExportable, random); -+ ckMechanism = new CK_MECHANISM(mechanism, (CK_SSL3_KEY_MAT_PARAMS)params); -+ } else if (version == 0x0303) { -+ params = new CK_TLS12_KEY_MAT_PARAMS -+ (macBits, keyBits, ivBits, isExportable, random, -+ Functions.getHashMechId(spec.getPRFHashAlg())); -+ ckMechanism = new CK_MECHANISM(mechanism, (CK_TLS12_KEY_MAT_PARAMS)params); -+ } - - String cipherAlgorithm = spec.getCipherAlgorithm(); - long keyType = P11SecretKeyFactory.getKeyType(cipherAlgorithm); -@@ -162,9 +175,14 @@ - (O_GENERATE, CKO_SECRET_KEY, keyType, attributes); - // the returned keyID is a dummy, ignore - long keyID = token.p11.C_DeriveKey(session.id(), -- new CK_MECHANISM(mechanism, params), p11Key.keyID, attributes); -+ ckMechanism, p11Key.keyID, attributes); - -- CK_SSL3_KEY_MAT_OUT out = params.pReturnedKeyMaterial; -+ CK_SSL3_KEY_MAT_OUT out = null; -+ if (params instanceof CK_SSL3_KEY_MAT_PARAMS) { -+ out = ((CK_SSL3_KEY_MAT_PARAMS)params).pReturnedKeyMaterial; -+ } else if (params instanceof CK_TLS12_KEY_MAT_PARAMS) { -+ out = ((CK_TLS12_KEY_MAT_PARAMS)params).pReturnedKeyMaterial; -+ } - // Note that the MAC keys do not inherit all attributes from the - // template, but they do inherit the sensitive/extractable/token - // flags, which is all P11Key cares about. -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2005, 2018, 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 -@@ -89,9 +89,9 @@ - throw new InvalidAlgorithmParameterException("init() failed", e); - } - version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); -- if ((version < 0x0300) || (version > 0x0302)) { -- throw new InvalidAlgorithmParameterException -- ("Only SSL 3.0, TLS 1.0, and TLS 1.1 supported"); -+ if ((version < 0x0300) && (version > 0x0303)) { -+ throw new InvalidAlgorithmParameterException("Only SSL 3.0," + -+ " TLS 1.0, TLS 1.1, and TLS 1.2 are supported"); - } - // We assume the token supports the required mechanism. If it does not, - // generateKey() will fail and the failover should take care of us. -@@ -106,10 +106,20 @@ - throw new IllegalStateException - ("TlsMasterSecretGenerator must be initialized"); - } -+ final boolean isTlsRsaPremasterSecret = -+ p11Key.getAlgorithm().equals("TlsRsaPremasterSecret"); -+ if (version == 0x0300) { -+ mechanism = isTlsRsaPremasterSecret ? -+ CKM_SSL3_MASTER_KEY_DERIVE : CKM_SSL3_MASTER_KEY_DERIVE_DH; -+ } else if (version == 0x0301 || version == 0x0302) { -+ mechanism = isTlsRsaPremasterSecret ? -+ CKM_TLS_MASTER_KEY_DERIVE : CKM_TLS_MASTER_KEY_DERIVE_DH; -+ } else if (version == 0x0303) { -+ mechanism = isTlsRsaPremasterSecret ? -+ CKM_TLS12_MASTER_KEY_DERIVE : CKM_TLS12_MASTER_KEY_DERIVE_DH; -+ } - CK_VERSION ckVersion; -- if (p11Key.getAlgorithm().equals("TlsRsaPremasterSecret")) { -- mechanism = (version == 0x0300) ? CKM_SSL3_MASTER_KEY_DERIVE -- : CKM_TLS_MASTER_KEY_DERIVE; -+ if (isTlsRsaPremasterSecret) { - ckVersion = new CK_VERSION(0, 0); - } else { - // Note: we use DH for all non-RSA premaster secrets. That includes -@@ -118,16 +128,23 @@ - // TLS PRF (or the SSL equivalent). - // The only thing special about RSA master secret calculation is - // that it extracts the version numbers from the premaster secret. -- mechanism = (version == 0x0300) ? CKM_SSL3_MASTER_KEY_DERIVE_DH -- : CKM_TLS_MASTER_KEY_DERIVE_DH; - ckVersion = null; - } - byte[] clientRandom = spec.getClientRandom(); - byte[] serverRandom = spec.getServerRandom(); - CK_SSL3_RANDOM_DATA random = - new CK_SSL3_RANDOM_DATA(clientRandom, serverRandom); -- CK_SSL3_MASTER_KEY_DERIVE_PARAMS params = -- new CK_SSL3_MASTER_KEY_DERIVE_PARAMS(random, ckVersion); -+ CK_MECHANISM ckMechanism = null; -+ if (version < 0x0303) { -+ CK_SSL3_MASTER_KEY_DERIVE_PARAMS params = -+ new CK_SSL3_MASTER_KEY_DERIVE_PARAMS(random, ckVersion); -+ ckMechanism = new CK_MECHANISM(mechanism, params); -+ } else if (version == 0x0303) { -+ CK_TLS12_MASTER_KEY_DERIVE_PARAMS params = -+ new CK_TLS12_MASTER_KEY_DERIVE_PARAMS(random, ckVersion, -+ Functions.getHashMechId(spec.getPRFHashAlg())); -+ ckMechanism = new CK_MECHANISM(mechanism, params); -+ } - - Session session = null; - try { -@@ -135,9 +152,8 @@ - CK_ATTRIBUTE[] attributes = token.getAttributes(O_GENERATE, - CKO_SECRET_KEY, CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]); - long keyID = token.p11.C_DeriveKey(session.id(), -- new CK_MECHANISM(mechanism, params), p11Key.keyID, attributes); -+ ckMechanism, p11Key.keyID, attributes); - int major, minor; -- ckVersion = params.pVersion; - if (ckVersion == null) { - major = -1; - minor = -1; -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2005, 2018, 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 -@@ -124,8 +124,46 @@ - if (spec == null) { - throw new IllegalStateException("TlsPrfGenerator must be initialized"); - } -+ byte[] seed = spec.getSeed(); -+ -+ // TLS 1.2 -+ if (mechanism == CKM_TLS_MAC) { -+ SecretKey k = null; -+ int ulServerOrClient = 0; -+ if (spec.getLabel().equals("server finished")) { -+ ulServerOrClient = 1; -+ } -+ if (spec.getLabel().equals("client finished")) { -+ ulServerOrClient = 2; -+ } -+ -+ if (ulServerOrClient != 0) { -+ // Finished message -+ CK_TLS_MAC_PARAMS params = new CK_TLS_MAC_PARAMS( -+ Functions.getHashMechId(spec.getPRFHashAlg()), -+ spec.getOutputLength(), ulServerOrClient); -+ Session session = null; -+ try { -+ session = token.getOpSession(); -+ token.p11.C_SignInit(session.id(), -+ new CK_MECHANISM(mechanism, params), p11Key.keyID); -+ token.p11.C_SignUpdate(session.id(), 0, seed, 0, seed.length); -+ byte[] out = token.p11.C_SignFinal -+ (session.id(), spec.getOutputLength()); -+ k = new SecretKeySpec(out, "TlsPrf"); -+ } catch (PKCS11Exception e) { -+ throw new ProviderException("Could not calculate PRF", e); -+ } finally { -+ token.releaseSession(session); -+ } -+ } else { -+ throw new ProviderException("Only Finished message authentication code"+ -+ " generation supported for TLS 1.2."); -+ } -+ return k; -+ } -+ - byte[] label = P11Util.getBytesUTF8(spec.getLabel()); -- byte[] seed = spec.getSeed(); - - if (mechanism == CKM_NSS_TLS_PRF_GENERAL) { - Session session = null; -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2005, 2018, 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 -@@ -57,6 +57,8 @@ - // mechanism id - private long mechanism; - -+ private int version; -+ - private TlsRsaPremasterSecretParameterSpec spec; - - P11TlsRsaPremasterSecretGenerator(Token token, String algorithm, long mechanism) -@@ -77,6 +79,11 @@ - throw new InvalidAlgorithmParameterException(MSG); - } - this.spec = (TlsRsaPremasterSecretParameterSpec)params; -+ version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); -+ if ((version < 0x0300) && (version > 0x0303)) { -+ throw new InvalidAlgorithmParameterException -+ ("Only SSL 3.0, TLS 1.0, TLS 1.1, and TLS 1.2 are supported"); -+ } - } - - protected void engineInit(int keysize, SecureRandom random) { -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java openjdk/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2003, 2018, 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 -@@ -720,38 +720,28 @@ - s("1.2.840.113549.1.1.13", "OID.1.2.840.113549.1.1.13"), - m(CKM_SHA512_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509)); - -- /* -- * TLS 1.2 uses a different hash algorithm than 1.0/1.1 for the -- * PRF calculations. As of 2010, there is no PKCS11-level -- * support for TLS 1.2 PRF calculations, and no known OS's have -- * an internal variant we could use. Therefore for TLS 1.2, we -- * are updating JSSE to request different provider algorithms -- * (e.g. "SunTls12Prf"), and currently only SunJCE has these -- * TLS 1.2 algorithms. -- * -- * If we reused the names such as "SunTlsPrf", the PKCS11 -- * providers would need be updated to fail correctly when -- * presented with the wrong version number (via -- * Provider.Service.supportsParameters()), and we would also -- * need to add the appropriate supportsParamters() checks into -- * KeyGenerators (not currently there). -- * -- * In the future, if PKCS11 support is added, we will restructure -- * this. -- */ - d(KG, "SunTlsRsaPremasterSecret", - "sun.security.pkcs11.P11TlsRsaPremasterSecretGenerator", -+ s("SunTls12RsaPremasterSecret"), - m(CKM_SSL3_PRE_MASTER_KEY_GEN, CKM_TLS_PRE_MASTER_KEY_GEN)); - d(KG, "SunTlsMasterSecret", - "sun.security.pkcs11.P11TlsMasterSecretGenerator", - m(CKM_SSL3_MASTER_KEY_DERIVE, CKM_TLS_MASTER_KEY_DERIVE, - CKM_SSL3_MASTER_KEY_DERIVE_DH, - CKM_TLS_MASTER_KEY_DERIVE_DH)); -+ d(KG, "SunTls12MasterSecret", -+ "sun.security.pkcs11.P11TlsMasterSecretGenerator", -+ m(CKM_TLS12_MASTER_KEY_DERIVE, CKM_TLS12_MASTER_KEY_DERIVE_DH)); - d(KG, "SunTlsKeyMaterial", - "sun.security.pkcs11.P11TlsKeyMaterialGenerator", - m(CKM_SSL3_KEY_AND_MAC_DERIVE, CKM_TLS_KEY_AND_MAC_DERIVE)); -+ d(KG, "SunTls12KeyMaterial", -+ "sun.security.pkcs11.P11TlsKeyMaterialGenerator", -+ m(CKM_TLS12_KEY_AND_MAC_DERIVE)); - d(KG, "SunTlsPrf", "sun.security.pkcs11.P11TlsPrfGenerator", - m(CKM_TLS_PRF, CKM_NSS_TLS_PRF_GENERAL)); -+ d(KG, "SunTls12Prf", "sun.security.pkcs11.P11TlsPrfGenerator", -+ m(CKM_TLS_MAC)); - } - - // background thread that periodically checks for token insertion -@@ -1016,13 +1006,16 @@ - if (algorithm == "SunTlsRsaPremasterSecret") { - return new P11TlsRsaPremasterSecretGenerator( - token, algorithm, mechanism); -- } else if (algorithm == "SunTlsMasterSecret") { -+ } else if (algorithm == "SunTlsMasterSecret" -+ || algorithm == "SunTls12MasterSecret") { - return new P11TlsMasterSecretGenerator( - token, algorithm, mechanism); -- } else if (algorithm == "SunTlsKeyMaterial") { -+ } else if (algorithm == "SunTlsKeyMaterial" -+ || algorithm == "SunTls12KeyMaterial") { - return new P11TlsKeyMaterialGenerator( - token, algorithm, mechanism); -- } else if (algorithm == "SunTlsPrf") { -+ } else if (algorithm == "SunTlsPrf" -+ || algorithm == "SunTls12Prf") { - return new P11TlsPrfGenerator(token, algorithm, mechanism); - } else { - return new P11KeyGenerator(token, algorithm, mechanism); -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - */ - - /* Copyright (c) 2002 Graz University of Technology. All rights reserved. -@@ -112,14 +112,26 @@ - init(mechanism, params); - } - -+ public CK_MECHANISM(long mechanism, CK_TLS12_MASTER_KEY_DERIVE_PARAMS params) { -+ init(mechanism, params); -+ } -+ - public CK_MECHANISM(long mechanism, CK_SSL3_KEY_MAT_PARAMS params) { - init(mechanism, params); - } - -+ public CK_MECHANISM(long mechanism, CK_TLS12_KEY_MAT_PARAMS params) { -+ init(mechanism, params); -+ } -+ - public CK_MECHANISM(long mechanism, CK_TLS_PRF_PARAMS params) { - init(mechanism, params); - } - -+ public CK_MECHANISM(long mechanism, CK_TLS_MAC_PARAMS params) { -+ init(mechanism, params); -+ } -+ - public CK_MECHANISM(long mechanism, CK_ECDH1_DERIVE_PARAMS params) { - init(mechanism, params); - } -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS12_KEY_MAT_PARAMS.java openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS12_KEY_MAT_PARAMS.java -new file mode 100644 ---- /dev/null -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS12_KEY_MAT_PARAMS.java -@@ -0,0 +1,151 @@ -+/* -+ * Copyright (c) 2018, Red Hat, Inc. 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. Oracle designates this -+ * particular file as subject to the "Classpath" exception as provided -+ * by Oracle in the LICENSE file that accompanied this code. -+ * -+ * 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. -+ */ -+ -+package sun.security.pkcs11.wrapper; -+ -+/** -+ * CK_TLS12_KEY_MAT_PARAMS from PKCS#11 v2.40. -+ */ -+public class CK_TLS12_KEY_MAT_PARAMS { -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_ULONG ulMacSizeInBits;
-+     * 
-+ */ -+ public long ulMacSizeInBits; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_ULONG ulKeySizeInBits;
-+     * 
-+ */ -+ public long ulKeySizeInBits; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_ULONG ulIVSizeInBits;
-+     * 
-+ */ -+ public long ulIVSizeInBits; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_BBOOL bIsExport;
-+     * 
-+ */ -+ public boolean bIsExport; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_SSL3_RANDOM_DATA RandomInfo;
-+     * 
-+ */ -+ public CK_SSL3_RANDOM_DATA RandomInfo; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_SSL3_KEY_MAT_OUT_PTR pReturnedKeyMaterial;
-+     * 
-+ */ -+ public CK_SSL3_KEY_MAT_OUT pReturnedKeyMaterial; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_MECHANISM_TYPE prfHashMechanism;
-+     * 
-+ */ -+ public long prfHashMechanism; -+ -+ public CK_TLS12_KEY_MAT_PARAMS( -+ int macSize, int keySize, int ivSize, boolean export, -+ CK_SSL3_RANDOM_DATA random, long prfHashMechanism) { -+ ulMacSizeInBits = macSize; -+ ulKeySizeInBits = keySize; -+ ulIVSizeInBits = ivSize; -+ bIsExport = export; -+ RandomInfo = random; -+ pReturnedKeyMaterial = new CK_SSL3_KEY_MAT_OUT(); -+ if (ivSize != 0) { -+ int n = ivSize >> 3; -+ pReturnedKeyMaterial.pIVClient = new byte[n]; -+ pReturnedKeyMaterial.pIVServer = new byte[n]; -+ } -+ this.prfHashMechanism = prfHashMechanism; -+ } -+ -+ /** -+ * Returns the string representation of CK_TLS12_KEY_MAT_PARAMS. -+ * -+ * @return the string representation of CK_TLS12_KEY_MAT_PARAMS -+ */ -+ public String toString() { -+ StringBuilder buffer = new StringBuilder(); -+ -+ buffer.append(Constants.INDENT); -+ buffer.append("ulMacSizeInBits: "); -+ buffer.append(ulMacSizeInBits); -+ buffer.append(Constants.NEWLINE); -+ -+ buffer.append(Constants.INDENT); -+ buffer.append("ulKeySizeInBits: "); -+ buffer.append(ulKeySizeInBits); -+ buffer.append(Constants.NEWLINE); -+ -+ buffer.append(Constants.INDENT); -+ buffer.append("ulIVSizeInBits: "); -+ buffer.append(ulIVSizeInBits); -+ buffer.append(Constants.NEWLINE); -+ -+ buffer.append(Constants.INDENT); -+ buffer.append("bIsExport: "); -+ buffer.append(bIsExport); -+ buffer.append(Constants.NEWLINE); -+ -+ buffer.append(Constants.INDENT); -+ buffer.append("RandomInfo: "); -+ buffer.append(RandomInfo); -+ buffer.append(Constants.NEWLINE); -+ -+ buffer.append(Constants.INDENT); -+ buffer.append("pReturnedKeyMaterial: "); -+ buffer.append(pReturnedKeyMaterial); -+ buffer.append(Constants.NEWLINE); -+ -+ buffer.append(Constants.INDENT); -+ buffer.append("prfHashMechanism: "); -+ buffer.append(prfHashMechanism); -+ -+ return buffer.toString(); -+ } -+ -+} -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS12_MASTER_KEY_DERIVE_PARAMS.java openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS12_MASTER_KEY_DERIVE_PARAMS.java -new file mode 100644 ---- /dev/null -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS12_MASTER_KEY_DERIVE_PARAMS.java -@@ -0,0 +1,65 @@ -+/* -+ * Copyright (c) 2018, Red Hat, Inc. 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. Oracle designates this -+ * particular file as subject to the "Classpath" exception as provided -+ * by Oracle in the LICENSE file that accompanied this code. -+ * -+ * 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. -+ */ -+ -+package sun.security.pkcs11.wrapper; -+ -+/** -+ * CK_TLS12_MASTER_KEY_DERIVE_PARAMS from PKCS#11 v2.40. -+ */ -+public class CK_TLS12_MASTER_KEY_DERIVE_PARAMS { -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_SSL3_RANDOM_DATA RandomInfo;
-+     * 
-+ */ -+ public CK_SSL3_RANDOM_DATA RandomInfo; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_VERSION_PTR pVersion;
-+     * 
-+ */ -+ public CK_VERSION pVersion; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_MECHANISM_TYPE prfHashMechanism;
-+     * 
-+ */ -+ public long prfHashMechanism; -+ -+ public CK_TLS12_MASTER_KEY_DERIVE_PARAMS( -+ CK_SSL3_RANDOM_DATA random, CK_VERSION version, -+ long prfHashMechanism) { -+ RandomInfo = random; -+ pVersion = version; -+ this.prfHashMechanism = prfHashMechanism; -+ } -+ -+} -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS_MAC_PARAMS.java openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS_MAC_PARAMS.java -new file mode 100644 ---- /dev/null -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TLS_MAC_PARAMS.java -@@ -0,0 +1,64 @@ -+/* -+ * Copyright (c) 2018, Red Hat, Inc. 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. Oracle designates this -+ * particular file as subject to the "Classpath" exception as provided -+ * by Oracle in the LICENSE file that accompanied this code. -+ * -+ * 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. -+ */ -+ -+package sun.security.pkcs11.wrapper; -+ -+/** -+ * CK_TLS_MAC_PARAMS from PKCS#11 v2.40. -+ */ -+public class CK_TLS_MAC_PARAMS { -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_MECHANISM_TYPE prfMechanism;
-+     * 
-+ */ -+ public long prfMechanism; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_ULONG ulMacLength;
-+     * 
-+ */ -+ public long ulMacLength; -+ -+ /** -+ * PKCS#11: -+ *
-+     *   CK_ULONG ulServerOrClient;
-+     * 
-+ */ -+ public long ulServerOrClient; -+ -+ public CK_TLS_MAC_PARAMS(long prfMechanism, -+ long ulMacLength, long ulServerOrClient) { -+ this.prfMechanism = prfMechanism; -+ this.ulMacLength = ulMacLength; -+ this.ulServerOrClient = ulServerOrClient; -+ } -+ -+} -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - */ - - /* Copyright (c) 2002 Graz University of Technology. All rights reserved. -@@ -73,6 +73,9 @@ - private static final Map mechIds = - new HashMap(); - -+ private static final Map hashMechIds = -+ new HashMap(); -+ - // key types (CKK_*) - private static final Map keyNames = - new HashMap(); -@@ -94,7 +97,6 @@ - private static final Map objectClassIds = - new HashMap(); - -- - /** - * For converting numbers to their hex presentation. - */ -@@ -444,6 +446,10 @@ - return getId(objectClassIds, name); - } - -+ public static long getHashMechId(String name) { -+ return hashMechIds.get(name); -+ } -+ - /** - * Check the given arrays for equalitiy. This method considers both arrays as - * equal, if both are null or both have the same length and -@@ -589,6 +595,10 @@ - addMapping(objectClassNames, objectClassIds, id, name); - } - -+ private static void addHashMech(long id, String name) { -+ hashMechIds.put(name, id); -+ } -+ - static { - addMech(CKM_RSA_PKCS_KEY_PAIR_GEN, "CKM_RSA_PKCS_KEY_PAIR_GEN"); - addMech(CKM_RSA_PKCS, "CKM_RSA_PKCS"); -@@ -719,6 +729,10 @@ - addMech(CKM_TLS_PRF, "CKM_TLS_PRF"); - addMech(CKM_SSL3_MD5_MAC, "CKM_SSL3_MD5_MAC"); - addMech(CKM_SSL3_SHA1_MAC, "CKM_SSL3_SHA1_MAC"); -+ addMech(CKM_TLS12_MASTER_KEY_DERIVE, "CKM_TLS12_MASTER_KEY_DERIVE"); -+ addMech(CKM_TLS12_KEY_AND_MAC_DERIVE, "CKM_TLS12_KEY_AND_MAC_DERIVE"); -+ addMech(CKM_TLS12_MASTER_KEY_DERIVE_DH, "CKM_TLS12_MASTER_KEY_DERIVE_DH"); -+ addMech(CKM_TLS_MAC, "CKM_TLS_MAC"); - addMech(CKM_MD5_KEY_DERIVATION, "CKM_MD5_KEY_DERIVATION"); - addMech(CKM_MD2_KEY_DERIVATION, "CKM_MD2_KEY_DERIVATION"); - addMech(CKM_SHA1_KEY_DERIVATION, "CKM_SHA1_KEY_DERIVATION"); -@@ -794,6 +808,12 @@ - addMech(PCKM_SECURERANDOM, "SecureRandom"); - addMech(PCKM_KEYSTORE, "KeyStore"); - -+ addHashMech(CKM_SHA_1, "SHA-1"); -+ addHashMech(CKM_SHA224, "SHA-224"); -+ addHashMech(CKM_SHA256, "SHA-256"); -+ addHashMech(CKM_SHA384, "SHA-384"); -+ addHashMech(CKM_SHA512, "SHA-512"); -+ - addKeyType(CKK_RSA, "CKK_RSA"); - addKeyType(CKK_DSA, "CKK_DSA"); - addKeyType(CKK_DH, "CKK_DH"); -diff --git openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java ---- openjdk.orig/jdk/src/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java -+++ openjdk/jdk/src/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - */ - - /* Copyright (c) 2002 Graz University of Technology. All rights reserved. -@@ -625,6 +625,14 @@ - public static final long CKM_PKCS5_PBKD2 = 0x000003B0L; - - public static final long CKM_PBA_SHA1_WITH_SHA1_HMAC = 0x000003C0L; -+ -+ /* CKM_TLS12_MASTER_KEY_DERIVE, CKM_TLS12_KEY_AND_MAC_DERIVE, -+ * CKM_TLS12_MASTER_KEY_DERIVE_DH and CKM_TLS_MAC are new for v2.40 */ -+ public static final long CKM_TLS12_MASTER_KEY_DERIVE = 0x000003E0L; -+ public static final long CKM_TLS12_KEY_AND_MAC_DERIVE = 0x000003E1L; -+ public static final long CKM_TLS12_MASTER_KEY_DERIVE_DH = 0x000003E2L; -+ public static final long CKM_TLS_MAC = 0x000003E4L; -+ - public static final long CKM_KEY_WRAP_LYNKS = 0x00000400L; - public static final long CKM_KEY_WRAP_SET_OAEP = 0x00000401L; - -diff --git openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c ---- openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c -+++ openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - */ - - /* Copyright (c) 2002 Graz University of Technology. All rights reserved. -@@ -457,67 +457,113 @@ - return ckAttribute ; - } - --/* -- * converts the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to a -- * CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure -- * -- * @param env - used to call JNI funktions to get the Java classes and objects -- * @param jParam - the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to convert -- * @return - the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure -- */ --CK_SSL3_MASTER_KEY_DERIVE_PARAMS jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam) --{ -- // XXX don't return structs -- // XXX prefetch class and field ids -- jclass jSsl3MasterKeyDeriveParamsClass; -- CK_SSL3_MASTER_KEY_DERIVE_PARAMS ckParam; -+void masterKeyDeriveParamToCKMasterKeyDeriveParam(JNIEnv *env, jobject jParam, -+ jclass masterKeyDeriveParamClass, -+ CK_VERSION_PTR* cKMasterKeyDeriveParamVersion, -+ CK_SSL3_RANDOM_DATA* cKMasterKeyDeriveParamRandomInfo) { - jfieldID fieldID; - jclass jSsl3RandomDataClass; - jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion; -- memset(&ckParam, 0, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); - - /* get RandomInfo */ -- jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); -- if (jSsl3MasterKeyDeriveParamsClass == NULL) { return ckParam; } -- fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "RandomInfo", "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;"); -- if (fieldID == NULL) { return ckParam; } -+ fieldID = (*env)->GetFieldID(env, masterKeyDeriveParamClass, "RandomInfo", -+ "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;"); -+ if (fieldID == NULL) { return; } - jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID); - - /* get pClientRandom and ulClientRandomLength out of RandomInfo */ - jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA); -- if (jSsl3RandomDataClass == NULL) { return ckParam; } -+ if (jSsl3RandomDataClass == NULL) { return; } - fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B"); -- if (fieldID == NULL) { return ckParam; } -+ if (fieldID == NULL) { return; } - jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); - - /* get pServerRandom and ulServerRandomLength out of RandomInfo */ - fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B"); -- if (fieldID == NULL) { return ckParam; } -+ if (fieldID == NULL) { return; } - jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); - - /* get pVersion */ -- fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "pVersion", "Lsun/security/pkcs11/wrapper/CK_VERSION;"); -- if (fieldID == NULL) { return ckParam; } -+ fieldID = (*env)->GetFieldID(env, masterKeyDeriveParamClass, "pVersion", -+ "Lsun/security/pkcs11/wrapper/CK_VERSION;"); -+ if (fieldID == NULL) { return; } - jVersion = (*env)->GetObjectField(env, jParam, fieldID); - - /* populate java values */ -- ckParam.pVersion = jVersionToCKVersionPtr(env, jVersion); -- if ((*env)->ExceptionCheck(env)) { return ckParam; } -- jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen)); -+ *cKMasterKeyDeriveParamVersion = jVersionToCKVersionPtr(env, jVersion); -+ if ((*env)->ExceptionCheck(env)) { return; } -+ jByteArrayToCKByteArray(env, jRIClientRandom, -+ &(cKMasterKeyDeriveParamRandomInfo->pClientRandom), -+ &(cKMasterKeyDeriveParamRandomInfo->ulClientRandomLen)); - if ((*env)->ExceptionCheck(env)) { -- free(ckParam.pVersion); -- return ckParam; -+ free(*cKMasterKeyDeriveParamVersion); -+ return; - } -- jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen)); -+ jByteArrayToCKByteArray(env, jRIServerRandom, -+ &(cKMasterKeyDeriveParamRandomInfo->pServerRandom), -+ &(cKMasterKeyDeriveParamRandomInfo->ulServerRandomLen)); - if ((*env)->ExceptionCheck(env)) { -- free(ckParam.pVersion); -- free(ckParam.RandomInfo.pClientRandom); -- return ckParam; -+ free(*cKMasterKeyDeriveParamVersion); -+ free(cKMasterKeyDeriveParamRandomInfo->pClientRandom); -+ return; - } -- -- return ckParam ; - } - -+/* -+ * converts the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to a -+ * CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure -+ * -+ * @param env - used to call JNI functions to get the Java classes and objects -+ * @param jParam - the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to convert -+ * @return - the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure -+ */ -+CK_SSL3_MASTER_KEY_DERIVE_PARAMS -+jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, -+ jobject jParam) -+{ -+ CK_SSL3_MASTER_KEY_DERIVE_PARAMS ckParam; -+ jclass jSsl3MasterKeyDeriveParamsClass; -+ memset(&ckParam, 0, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); -+ jSsl3MasterKeyDeriveParamsClass = -+ (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); -+ if (jSsl3MasterKeyDeriveParamsClass == NULL) { return ckParam; } -+ masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam, -+ jSsl3MasterKeyDeriveParamsClass, -+ &ckParam.pVersion, &ckParam.RandomInfo); -+ return ckParam; -+} -+ -+/* -+ * converts the Java CK_TLS12_MASTER_KEY_DERIVE_PARAMS object to a -+ * CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure -+ * -+ * @param env - used to call JNI functions to get the Java classes and objects -+ * @param jParam - the Java CK_TLS12_MASTER_KEY_DERIVE_PARAMS object to convert -+ * @return - the new CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure -+ */ -+CK_TLS12_MASTER_KEY_DERIVE_PARAMS -+jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(JNIEnv *env, -+ jobject jParam) -+{ -+ CK_TLS12_MASTER_KEY_DERIVE_PARAMS ckParam; -+ jclass jTls12MasterKeyDeriveParamsClass; -+ jfieldID fieldID; -+ memset(&ckParam, 0, sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); -+ jTls12MasterKeyDeriveParamsClass = -+ (*env)->FindClass(env, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); -+ if (jTls12MasterKeyDeriveParamsClass == NULL) { return ckParam; } -+ masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam, -+ jTls12MasterKeyDeriveParamsClass, &ckParam.pVersion, -+ &ckParam.RandomInfo); -+ fieldID = (*env)->GetFieldID(env, -+ jTls12MasterKeyDeriveParamsClass, "prfHashMechanism", "J"); -+ if (fieldID != NULL) { -+ jlong prfHashMechanism = -+ (*env)->GetLongField(env, jParam, fieldID); -+ ckParam.prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; -+ } -+ return ckParam; -+} - - /* - * converts the Java CK_TLS_PRF_PARAMS object to a CK_TLS_PRF_PARAMS structure -@@ -576,126 +622,220 @@ - } - - /* -- * converts the Java CK_SSL3_KEY_MAT_PARAMS object to a CK_SSL3_KEY_MAT_PARAMS structure -- * -- * @param env - used to call JNI funktions to get the Java classes and objects -- * @param jParam - the Java CK_SSL3_KEY_MAT_PARAMS object to convert -- * @return - the new CK_SSL3_KEY_MAT_PARAMS structure -+ * converts the Java CK_TLS_MAC_PARAMS object to a CK_TLS_MAC_PARAMS structure - */ --CK_SSL3_KEY_MAT_PARAMS jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam) -+CK_TLS_MAC_PARAMS jTlsMacParamsToCKTlsMacParam(JNIEnv *env, jobject jParam) - { -- // XXX don't return structs -- // XXX prefetch class and field ids -- jclass jSsl3KeyMatParamsClass, jSsl3RandomDataClass, jSsl3KeyMatOutClass; -- CK_SSL3_KEY_MAT_PARAMS ckParam; -+ jclass jTlsMacParamsClass; -+ CK_TLS_MAC_PARAMS ckParam; -+ jfieldID fieldID; -+ jlong jPrfMechanism, jUlMacLength, jUlServerOrClient; -+ memset(&ckParam, 0, sizeof(CK_TLS_MAC_PARAMS)); -+ -+ jTlsMacParamsClass = (*env)->FindClass(env, CLASS_TLS_MAC_PARAMS); -+ if (jTlsMacParamsClass == NULL) { return ckParam; } -+ -+ /* get prfMechanism */ -+ fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "prfMechanism", "J"); -+ if (fieldID == NULL) { return ckParam; } -+ jPrfMechanism = (*env)->GetLongField(env, jParam, fieldID); -+ -+ /* get ulMacLength */ -+ fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulMacLength", "J"); -+ if (fieldID == NULL) { return ckParam; } -+ jUlMacLength = (*env)->GetLongField(env, jParam, fieldID); -+ -+ /* get ulServerOrClient */ -+ fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulServerOrClient", "J"); -+ if (fieldID == NULL) { return ckParam; } -+ jUlServerOrClient = (*env)->GetLongField(env, jParam, fieldID); -+ -+ /* populate java values */ -+ ckParam.prfMechanism = jLongToCKULong(jPrfMechanism); -+ ckParam.ulMacLength = jLongToCKULong(jUlMacLength); -+ ckParam.ulServerOrClient = jLongToCKULong(jUlServerOrClient); -+ -+ return ckParam; -+} -+ -+void keyMatParamToCKKeyMatParam(JNIEnv *env, jobject jParam, -+ jclass jKeyMatParamClass, -+ CK_ULONG* cKKeyMatParamUlMacSizeInBits, -+ CK_ULONG* cKKeyMatParamUlKeySizeInBits, -+ CK_ULONG* cKKeyMatParamUlIVSizeInBits, -+ CK_BBOOL* cKKeyMatParamBIsExport, -+ CK_SSL3_RANDOM_DATA* cKKeyMatParamRandomInfo, -+ CK_SSL3_KEY_MAT_OUT_PTR* cKKeyMatParamPReturnedKeyMaterial) -+{ -+ jclass jSsl3RandomDataClass, jSsl3KeyMatOutClass; - jfieldID fieldID; - jlong jMacSizeInBits, jKeySizeInBits, jIVSizeInBits; - jboolean jIsExport; - jobject jRandomInfo, jRIClientRandom, jRIServerRandom; - jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer; - CK_ULONG ckTemp; -- memset(&ckParam, 0, sizeof(CK_SSL3_KEY_MAT_PARAMS)); - - /* get ulMacSizeInBits */ -- jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS); -- if (jSsl3KeyMatParamsClass == NULL) { return ckParam; } -- fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulMacSizeInBits", "J"); -- if (fieldID == NULL) { return ckParam; } -+ fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulMacSizeInBits", "J"); -+ if (fieldID == NULL) { return; } - jMacSizeInBits = (*env)->GetLongField(env, jParam, fieldID); - - /* get ulKeySizeInBits */ -- fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulKeySizeInBits", "J"); -- if (fieldID == NULL) { return ckParam; } -+ fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulKeySizeInBits", "J"); -+ if (fieldID == NULL) { return; } - jKeySizeInBits = (*env)->GetLongField(env, jParam, fieldID); - - /* get ulIVSizeInBits */ -- fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulIVSizeInBits", "J"); -- if (fieldID == NULL) { return ckParam; } -+ fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulIVSizeInBits", "J"); -+ if (fieldID == NULL) { return; } - jIVSizeInBits = (*env)->GetLongField(env, jParam, fieldID); - - /* get bIsExport */ -- fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "bIsExport", "Z"); -- if (fieldID == NULL) { return ckParam; } -+ fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "bIsExport", "Z"); -+ if (fieldID == NULL) { return; } - jIsExport = (*env)->GetBooleanField(env, jParam, fieldID); - - /* get RandomInfo */ - jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA); -- if (jSsl3RandomDataClass == NULL) { return ckParam; } -- fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "RandomInfo", "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;"); -- if (fieldID == NULL) { return ckParam; } -+ if (jSsl3RandomDataClass == NULL) { return; } -+ fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "RandomInfo", -+ "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;"); -+ if (fieldID == NULL) { return; } - jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID); - - /* get pClientRandom and ulClientRandomLength out of RandomInfo */ - fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B"); -- if (fieldID == NULL) { return ckParam; } -+ if (fieldID == NULL) { return; } - jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); - - /* get pServerRandom and ulServerRandomLength out of RandomInfo */ - fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B"); -- if (fieldID == NULL) { return ckParam; } -+ if (fieldID == NULL) { return; } - jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID); - - /* get pReturnedKeyMaterial */ - jSsl3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT); -- if (jSsl3KeyMatOutClass == NULL) { return ckParam; } -- fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "pReturnedKeyMaterial", "Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;"); -- if (fieldID == NULL) { return ckParam; } -+ if (jSsl3KeyMatOutClass == NULL) { return; } -+ fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "pReturnedKeyMaterial", -+ "Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;"); -+ if (fieldID == NULL) { return; } - jReturnedKeyMaterial = (*env)->GetObjectField(env, jParam, fieldID); - - /* get pIVClient out of pReturnedKeyMaterial */ - fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B"); -- if (fieldID == NULL) { return ckParam; } -+ if (fieldID == NULL) { return; } - jRMIvClient = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID); - - /* get pIVServer out of pReturnedKeyMaterial */ - fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B"); -- if (fieldID == NULL) { return ckParam; } -+ if (fieldID == NULL) { return; } - jRMIvServer = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID); - - /* populate java values */ -- ckParam.ulMacSizeInBits = jLongToCKULong(jMacSizeInBits); -- ckParam.ulKeySizeInBits = jLongToCKULong(jKeySizeInBits); -- ckParam.ulIVSizeInBits = jLongToCKULong(jIVSizeInBits); -- ckParam.bIsExport = jBooleanToCKBBool(jIsExport); -- jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen)); -- if ((*env)->ExceptionCheck(env)) { return ckParam; } -- jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen)); -+ *cKKeyMatParamUlMacSizeInBits = jLongToCKULong(jMacSizeInBits); -+ *cKKeyMatParamUlKeySizeInBits = jLongToCKULong(jKeySizeInBits); -+ *cKKeyMatParamUlIVSizeInBits = jLongToCKULong(jIVSizeInBits); -+ *cKKeyMatParamBIsExport = jBooleanToCKBBool(jIsExport); -+ jByteArrayToCKByteArray(env, jRIClientRandom, -+ &(cKKeyMatParamRandomInfo->pClientRandom), -+ &(cKKeyMatParamRandomInfo->ulClientRandomLen)); -+ if ((*env)->ExceptionCheck(env)) { return; } -+ jByteArrayToCKByteArray(env, jRIServerRandom, -+ &(cKKeyMatParamRandomInfo->pServerRandom), -+ &(cKKeyMatParamRandomInfo->ulServerRandomLen)); - if ((*env)->ExceptionCheck(env)) { -- free(ckParam.RandomInfo.pClientRandom); -- return ckParam; -+ free(cKKeyMatParamRandomInfo->pClientRandom); -+ return; - } - /* allocate memory for pRetrunedKeyMaterial */ -- ckParam.pReturnedKeyMaterial = (CK_SSL3_KEY_MAT_OUT_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_OUT)); -- if (ckParam.pReturnedKeyMaterial == NULL) { -- free(ckParam.RandomInfo.pClientRandom); -- free(ckParam.RandomInfo.pServerRandom); -+ *cKKeyMatParamPReturnedKeyMaterial = -+ (CK_SSL3_KEY_MAT_OUT_PTR)malloc(sizeof(CK_SSL3_KEY_MAT_OUT)); -+ if (*cKKeyMatParamPReturnedKeyMaterial == NULL) { -+ free(cKKeyMatParamRandomInfo->pClientRandom); -+ free(cKKeyMatParamRandomInfo->pServerRandom); - throwOutOfMemoryError(env, 0); -- return ckParam; -+ return; - } - - // the handles are output params only, no need to fetch them from Java -- ckParam.pReturnedKeyMaterial->hClientMacSecret = 0; -- ckParam.pReturnedKeyMaterial->hServerMacSecret = 0; -- ckParam.pReturnedKeyMaterial->hClientKey = 0; -- ckParam.pReturnedKeyMaterial->hServerKey = 0; -+ (*cKKeyMatParamPReturnedKeyMaterial)->hClientMacSecret = 0; -+ (*cKKeyMatParamPReturnedKeyMaterial)->hServerMacSecret = 0; -+ (*cKKeyMatParamPReturnedKeyMaterial)->hClientKey = 0; -+ (*cKKeyMatParamPReturnedKeyMaterial)->hServerKey = 0; - -- jByteArrayToCKByteArray(env, jRMIvClient, &(ckParam.pReturnedKeyMaterial->pIVClient), &ckTemp); -+ jByteArrayToCKByteArray(env, jRMIvClient, -+ &((*cKKeyMatParamPReturnedKeyMaterial)->pIVClient), &ckTemp); - if ((*env)->ExceptionCheck(env)) { -- free(ckParam.RandomInfo.pClientRandom); -- free(ckParam.RandomInfo.pServerRandom); -- free(ckParam.pReturnedKeyMaterial); -- return ckParam; -+ free(cKKeyMatParamRandomInfo->pClientRandom); -+ free(cKKeyMatParamRandomInfo->pServerRandom); -+ free((*cKKeyMatParamPReturnedKeyMaterial)); -+ return; - } -- jByteArrayToCKByteArray(env, jRMIvServer, &(ckParam.pReturnedKeyMaterial->pIVServer), &ckTemp); -+ jByteArrayToCKByteArray(env, jRMIvServer, -+ &((*cKKeyMatParamPReturnedKeyMaterial)->pIVServer), &ckTemp); - if ((*env)->ExceptionCheck(env)) { -- free(ckParam.RandomInfo.pClientRandom); -- free(ckParam.RandomInfo.pServerRandom); -- free(ckParam.pReturnedKeyMaterial->pIVClient); -- free(ckParam.pReturnedKeyMaterial); -- return ckParam; -+ free(cKKeyMatParamRandomInfo->pClientRandom); -+ free(cKKeyMatParamRandomInfo->pServerRandom); -+ free((*cKKeyMatParamPReturnedKeyMaterial)->pIVClient); -+ free((*cKKeyMatParamPReturnedKeyMaterial)); -+ return; - } - -- return ckParam ; -+ return; -+} -+/* -+ * converts the Java CK_SSL3_KEY_MAT_PARAMS object to a -+ * CK_SSL3_KEY_MAT_PARAMS structure -+ * -+ * @param env - used to call JNI funktions to get the Java classes and objects -+ * @param jParam - the Java CK_SSL3_KEY_MAT_PARAMS object to convert -+ * @return - the new CK_SSL3_KEY_MAT_PARAMS structure -+ */ -+CK_SSL3_KEY_MAT_PARAMS -+jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam) -+{ -+ CK_SSL3_KEY_MAT_PARAMS ckParam; -+ jclass jSsl3KeyMatParamsClass; -+ memset(&ckParam, 0, sizeof(CK_SSL3_KEY_MAT_PARAMS)); -+ jSsl3KeyMatParamsClass = (*env)->FindClass(env, -+ CLASS_SSL3_KEY_MAT_PARAMS); -+ if (jSsl3KeyMatParamsClass == NULL) { return ckParam; } -+ keyMatParamToCKKeyMatParam(env, jParam, jSsl3KeyMatParamsClass, -+ &ckParam.ulMacSizeInBits, &ckParam.ulKeySizeInBits, -+ &ckParam.ulIVSizeInBits, &ckParam.bIsExport, -+ &ckParam.RandomInfo, &ckParam.pReturnedKeyMaterial); -+ return ckParam; -+} -+ -+/* -+ * converts the Java CK_TLS12_KEY_MAT_PARAMS object to a -+ * CK_TLS12_KEY_MAT_PARAMS structure -+ * -+ * @param env - used to call JNI functions to get the Java classes and objects -+ * @param jParam - the Java CK_TLS12_KEY_MAT_PARAMS object to convert -+ * @return - the new CK_TLS12_KEY_MAT_PARAMS structure -+ */ -+CK_TLS12_KEY_MAT_PARAMS jTls12KeyMatParamToCKTls12KeyMatParam(JNIEnv *env, -+ jobject jParam) -+{ -+ CK_TLS12_KEY_MAT_PARAMS ckParam; -+ jclass jTls12KeyMatParamsClass; -+ jfieldID fieldID; -+ memset(&ckParam, 0, sizeof(CK_TLS12_KEY_MAT_PARAMS)); -+ jTls12KeyMatParamsClass = (*env)->FindClass(env, -+ CLASS_TLS12_KEY_MAT_PARAMS); -+ if (jTls12KeyMatParamsClass == NULL) { return ckParam; } -+ keyMatParamToCKKeyMatParam(env, jParam, jTls12KeyMatParamsClass, -+ &ckParam.ulMacSizeInBits, &ckParam.ulKeySizeInBits, -+ &ckParam.ulIVSizeInBits, &ckParam.bIsExport, -+ &ckParam.RandomInfo, &ckParam.pReturnedKeyMaterial); -+ fieldID = (*env)->GetFieldID(env, jTls12KeyMatParamsClass, -+ "prfHashMechanism", "J"); -+ if (fieldID != NULL) { -+ jlong prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID); -+ ckParam.prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; -+ } -+ return ckParam; - } - - /* -@@ -980,8 +1120,11 @@ - void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength) - { - /* get all Java mechanism parameter classes */ -- jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass; -- jclass jTlsPrfParamsClass, jAesCtrParamsClass, jRsaPkcsOaepParamsClass; -+ jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass; -+ jclass jTls12MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass; -+ jclass jTls12KeyMatParamsClass; -+ jclass jTlsPrfParamsClass, jTlsMacParamsClass, jAesCtrParamsClass; -+ jclass jRsaPkcsOaepParamsClass; - jclass jPbeParamsClass, jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass; - jclass jEcdh1DeriveParamsClass, jEcdh2DeriveParamsClass; - jclass jX942Dh1DeriveParamsClass, jX942Dh2DeriveParamsClass; -@@ -1061,6 +1204,62 @@ - return; - } - -+ jTls12KeyMatParamsClass = (*env)->FindClass(env, CLASS_TLS12_KEY_MAT_PARAMS); -+ if (jTls12KeyMatParamsClass == NULL) { return; } -+ if ((*env)->IsInstanceOf(env, jParam, jTls12KeyMatParamsClass)) { -+ /* -+ * CK_TLS12_KEY_MAT_PARAMS -+ */ -+ CK_TLS12_KEY_MAT_PARAMS_PTR ckpParam; -+ -+ ckpParam = (CK_TLS12_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_TLS12_KEY_MAT_PARAMS)); -+ if (ckpParam == NULL) { -+ throwOutOfMemoryError(env, 0); -+ return; -+ } -+ -+ /* convert jParameter to CKParameter */ -+ *ckpParam = jTls12KeyMatParamToCKTls12KeyMatParam(env, jParam); -+ if ((*env)->ExceptionCheck(env)) { -+ free(ckpParam); -+ return; -+ } -+ -+ /* get length and pointer of parameter */ -+ *ckpLength = sizeof(CK_TLS12_KEY_MAT_PARAMS); -+ *ckpParamPtr = ckpParam; -+ return; -+ } -+ -+ jTls12MasterKeyDeriveParamsClass = -+ (*env)->FindClass(env, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); -+ if (jTls12MasterKeyDeriveParamsClass == NULL) { return; } -+ if ((*env)->IsInstanceOf(env, jParam, jTls12MasterKeyDeriveParamsClass)) { -+ /* -+ * CK_TLS12_MASTER_KEY_DERIVE_PARAMS -+ */ -+ CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR ckpParam; -+ -+ ckpParam = (CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR)malloc( -+ sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); -+ if (ckpParam == NULL) { -+ throwOutOfMemoryError(env, 0); -+ return; -+ } -+ -+ /* convert jParameter to CKParameter */ -+ *ckpParam = jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(env, jParam); -+ if ((*env)->ExceptionCheck(env)) { -+ free(ckpParam); -+ return; -+ } -+ -+ /* get length and pointer of parameter */ -+ *ckpLength = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS); -+ *ckpParamPtr = ckpParam; -+ return; -+ } -+ - jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS); - if (jTlsPrfParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) { -@@ -1088,6 +1287,30 @@ - return; - } - -+ jTlsMacParamsClass = (*env)->FindClass(env, CLASS_TLS_MAC_PARAMS); -+ if (jTlsMacParamsClass == NULL) { return; } -+ if ((*env)->IsInstanceOf(env, jParam, jTlsMacParamsClass)) { -+ CK_TLS_MAC_PARAMS_PTR ckpParam; -+ -+ ckpParam = (CK_TLS_MAC_PARAMS_PTR) malloc(sizeof(CK_TLS_MAC_PARAMS)); -+ if (ckpParam == NULL) { -+ throwOutOfMemoryError(env, 0); -+ return; -+ } -+ -+ /* convert jParameter to CKParameter */ -+ *ckpParam = jTlsMacParamsToCKTlsMacParam(env, jParam); -+ if ((*env)->ExceptionCheck(env)) { -+ free(ckpParam); -+ return; -+ } -+ -+ /* get length and pointer of parameter */ -+ *ckpLength = sizeof(CK_TLS_MAC_PARAMS); -+ *ckpParamPtr = ckpParam; -+ return; -+ } -+ - jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS); - if (jAesCtrParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) { -diff --git openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c ---- openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c -+++ openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - */ - - /* Copyright (c) 2002 Graz University of Technology. All rights reserved. -@@ -355,25 +355,38 @@ - - #ifdef P11_ENABLE_C_DERIVEKEY - --void freeMasterKeyDeriveParams(CK_MECHANISM_PTR ckMechanism) { -+static void freeMasterKeyDeriveParams(CK_SSL3_RANDOM_DATA *RandomInfo, CK_VERSION_PTR pVersion) { -+ if (RandomInfo->pClientRandom != NULL) { -+ free(RandomInfo->pClientRandom); -+ } -+ if (RandomInfo->pServerRandom != NULL) { -+ free(RandomInfo->pServerRandom); -+ } -+ if (pVersion != NULL) { -+ free(pVersion); -+ } -+} -+ -+void ssl3FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckMechanism) { - CK_SSL3_MASTER_KEY_DERIVE_PARAMS *params = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *) ckMechanism->pParameter; - if (params == NULL) { - return; - } -+ freeMasterKeyDeriveParams(&(params->RandomInfo), params->pVersion); -+} - -- if (params->RandomInfo.pClientRandom != NULL) { -- free(params->RandomInfo.pClientRandom); -+void tls12FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckMechanism) { -+ CK_TLS12_MASTER_KEY_DERIVE_PARAMS *params = -+ (CK_TLS12_MASTER_KEY_DERIVE_PARAMS *)ckMechanism->pParameter; -+ if (params == NULL) { -+ return; - } -- if (params->RandomInfo.pServerRandom != NULL) { -- free(params->RandomInfo.pServerRandom); -- } -- if (params->pVersion != NULL) { -- free(params->pVersion); -- } -+ freeMasterKeyDeriveParams(&(params->RandomInfo), params->pVersion); - } - - void freeEcdh1DeriveParams(CK_MECHANISM_PTR ckMechanism) { -- CK_ECDH1_DERIVE_PARAMS *params = (CK_ECDH1_DERIVE_PARAMS *) ckMechanism->pParameter; -+ CK_ECDH1_DERIVE_PARAMS *params = -+ (CK_ECDH1_DERIVE_PARAMS *)ckMechanism->pParameter; - if (params == NULL) { - return; - } -@@ -498,6 +511,7 @@ - switch (ckMechanism.mechanism) { - case CKM_SSL3_KEY_AND_MAC_DERIVE: - case CKM_TLS_KEY_AND_MAC_DERIVE: -+ case CKM_TLS12_KEY_AND_MAC_DERIVE: - case CKM_TLS_PRF: - // these mechanism do not return a key handle via phKey - // set to NULL in case pedantic implementations check for it -@@ -519,17 +533,28 @@ - case CKM_SSL3_MASTER_KEY_DERIVE: - case CKM_TLS_MASTER_KEY_DERIVE: - /* we must copy back the client version */ -- copyBackClientVersion(env, &ckMechanism, jMechanism); -- freeMasterKeyDeriveParams(&ckMechanism); -+ ssl3CopyBackClientVersion(env, &ckMechanism, jMechanism); -+ ssl3FreeMasterKeyDeriveParams(&ckMechanism); -+ break; -+ case CKM_TLS12_MASTER_KEY_DERIVE: -+ tls12CopyBackClientVersion(env, &ckMechanism, jMechanism); -+ tls12FreeMasterKeyDeriveParams(&ckMechanism); - break; - case CKM_SSL3_MASTER_KEY_DERIVE_DH: - case CKM_TLS_MASTER_KEY_DERIVE_DH: -- freeMasterKeyDeriveParams(&ckMechanism); -+ ssl3FreeMasterKeyDeriveParams(&ckMechanism); -+ break; -+ case CKM_TLS12_MASTER_KEY_DERIVE_DH: -+ tls12FreeMasterKeyDeriveParams(&ckMechanism); - break; - case CKM_SSL3_KEY_AND_MAC_DERIVE: - case CKM_TLS_KEY_AND_MAC_DERIVE: - /* we must copy back the unwrapped key info to the jMechanism object */ -- copyBackSSLKeyMatParams(env, &ckMechanism, jMechanism); -+ ssl3CopyBackKeyMatParams(env, &ckMechanism, jMechanism); -+ break; -+ case CKM_TLS12_KEY_AND_MAC_DERIVE: -+ /* we must copy back the unwrapped key info to the jMechanism object */ -+ tls12CopyBackKeyMatParams(env, &ckMechanism, jMechanism); - break; - case CKM_TLS_PRF: - copyBackTLSPrfParams(env, &ckMechanism, jMechanism); -@@ -550,53 +575,42 @@ - return jKeyHandle ; - } - --/* -- * Copy back the client version information from the native -- * structure to the Java object. This is only used for the -- * CKM_SSL3_MASTER_KEY_DERIVE mechanism when used for deriving a key. -- * -- */ --void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism) -+static void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism, -+ CK_VERSION *ckVersion, const char *class_master_key_derive_params) - { -- jclass jMechanismClass, jSSL3MasterKeyDeriveParamsClass, jVersionClass; -- CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ckSSL3MasterKeyDeriveParams; -- CK_VERSION *ckVersion; -- jfieldID fieldID; -- CK_MECHANISM_TYPE ckMechanismType; -- jlong jMechanismType; -- jobject jSSL3MasterKeyDeriveParams; -- jobject jVersion; -+ jclass jMasterKeyDeriveParamsClass, jMechanismClass, jVersionClass; -+ jobject jMasterKeyDeriveParams; -+ jfieldID fieldID; -+ CK_MECHANISM_TYPE ckMechanismType; -+ jlong jMechanismType; -+ jobject jVersion; - -- /* get mechanism */ -- jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM); -- if (jMechanismClass == NULL) { return; } -- fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J"); -- if (fieldID == NULL) { return; } -- jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); -- ckMechanismType = jLongToCKULong(jMechanismType); -- if (ckMechanismType != ckMechanism->mechanism) { -- /* we do not have maching types, this should not occur */ -- return; -- } -+ /* get mechanism */ -+ jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM); -+ if (jMechanismClass == NULL) { return; } -+ fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J"); -+ if (fieldID == NULL) { return; } -+ jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); -+ ckMechanismType = jLongToCKULong(jMechanismType); -+ if (ckMechanismType != ckMechanism->mechanism) { -+ /* we do not have maching types, this should not occur */ -+ return; -+ } - -- /* get the native CK_SSL3_MASTER_KEY_DERIVE_PARAMS */ -- ckSSL3MasterKeyDeriveParams = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *) ckMechanism->pParameter; -- if (ckSSL3MasterKeyDeriveParams != NULL_PTR) { -- /* get the native CK_VERSION */ -- ckVersion = ckSSL3MasterKeyDeriveParams->pVersion; - if (ckVersion != NULL_PTR) { - /* get the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS (pParameter) */ - fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;"); - if (fieldID == NULL) { return; } - -- jSSL3MasterKeyDeriveParams = (*env)->GetObjectField(env, jMechanism, fieldID); -+ jMasterKeyDeriveParams = (*env)->GetObjectField(env, jMechanism, fieldID); - - /* get the Java CK_VERSION */ -- jSSL3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); -- if (jSSL3MasterKeyDeriveParamsClass == NULL) { return; } -- fieldID = (*env)->GetFieldID(env, jSSL3MasterKeyDeriveParamsClass, "pVersion", "L"CLASS_VERSION";"); -+ jMasterKeyDeriveParamsClass = (*env)->FindClass(env, class_master_key_derive_params); -+ if (jMasterKeyDeriveParamsClass == NULL) { return; } -+ fieldID = (*env)->GetFieldID(env, jMasterKeyDeriveParamsClass, -+ "pVersion", "L"CLASS_VERSION";"); - if (fieldID == NULL) { return; } -- jVersion = (*env)->GetObjectField(env, jSSL3MasterKeyDeriveParams, fieldID); -+ jVersion = (*env)->GetObjectField(env, jMasterKeyDeriveParams, fieldID); - - /* now copy back the version from the native structure to the Java structure */ - -@@ -612,92 +626,126 @@ - if (fieldID == NULL) { return; } - (*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->minor)); - } -- } - } - -+/* -+ * Copy back the client version information from the native -+ * structure to the Java object. This is only used for -+ * CKM_SSL3_MASTER_KEY_DERIVE and CKM_TLS_MASTER_KEY_DERIVE -+ * mechanisms when used for deriving a key. -+ * -+ */ -+void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, -+ jobject jMechanism) -+{ -+ CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ckSSL3MasterKeyDeriveParams; -+ ckSSL3MasterKeyDeriveParams = -+ (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *)ckMechanism->pParameter; -+ if (ckSSL3MasterKeyDeriveParams != NULL_PTR) { -+ copyBackClientVersion(env, ckMechanism, jMechanism, -+ ckSSL3MasterKeyDeriveParams->pVersion, -+ CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); -+ } -+} - - /* -- * Copy back the derived keys and initialization vectors from the native -- * structure to the Java object. This is only used for the -- * CKM_SSL3_KEY_AND_MAC_DERIVE mechanism when used for deriving a key. -+ * Copy back the client version information from the native -+ * structure to the Java object. This is only used for -+ * CKM_TLS12_MASTER_KEY_DERIVE mechanism when used for deriving a key. - * - */ --void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism) -+void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, -+ jobject jMechanism) - { -- jclass jMechanismClass, jSSL3KeyMatParamsClass, jSSL3KeyMatOutClass; -- CK_SSL3_KEY_MAT_PARAMS *ckSSL3KeyMatParam; -- CK_SSL3_KEY_MAT_OUT *ckSSL3KeyMatOut; -- jfieldID fieldID; -- CK_MECHANISM_TYPE ckMechanismType; -- jlong jMechanismType; -- CK_BYTE_PTR iv; -- jobject jSSL3KeyMatParam; -- jobject jSSL3KeyMatOut; -- jobject jIV; -- jint jLength; -- jbyte* jBytes; -- int i; -+ CK_TLS12_MASTER_KEY_DERIVE_PARAMS *ckTLS12MasterKeyDeriveParams; -+ ckTLS12MasterKeyDeriveParams = -+ (CK_TLS12_MASTER_KEY_DERIVE_PARAMS *)ckMechanism->pParameter; -+ if (ckTLS12MasterKeyDeriveParams != NULL_PTR) { -+ copyBackClientVersion(env, ckMechanism, jMechanism, -+ ckTLS12MasterKeyDeriveParams->pVersion, -+ CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); -+ } -+} - -- /* get mechanism */ -- jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM); -- if (jMechanismClass == NULL) { return; } -- fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J"); -- if (fieldID == NULL) { return; } -- jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); -- ckMechanismType = jLongToCKULong(jMechanismType); -- if (ckMechanismType != ckMechanism->mechanism) { -- /* we do not have maching types, this should not occur */ -- return; -- } -+static void copyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, -+ jobject jMechanism, CK_SSL3_RANDOM_DATA *RandomInfo, -+ CK_SSL3_KEY_MAT_OUT_PTR ckSSL3KeyMatOut, const char *class_key_mat_params) -+{ -+ jclass jMechanismClass, jKeyMatParamsClass, jSSL3KeyMatOutClass; -+ jfieldID fieldID; -+ CK_MECHANISM_TYPE ckMechanismType; -+ jlong jMechanismType; -+ CK_BYTE_PTR iv; -+ jobject jKeyMatParam; -+ jobject jSSL3KeyMatOut; -+ jobject jIV; -+ jint jLength; -+ jbyte* jBytes; -+ int i; - -- /* get the native CK_SSL3_KEY_MAT_PARAMS */ -- ckSSL3KeyMatParam = (CK_SSL3_KEY_MAT_PARAMS *) ckMechanism->pParameter; -- if (ckSSL3KeyMatParam != NULL_PTR) { -- // free malloc'd data -- if (ckSSL3KeyMatParam->RandomInfo.pClientRandom != NULL) { -- free(ckSSL3KeyMatParam->RandomInfo.pClientRandom); -- } -- if (ckSSL3KeyMatParam->RandomInfo.pServerRandom != NULL) { -- free(ckSSL3KeyMatParam->RandomInfo.pServerRandom); -+ /* get mechanism */ -+ jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM); -+ if (jMechanismClass == NULL) { return; } -+ fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J"); -+ if (fieldID == NULL) { return; } -+ jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); -+ ckMechanismType = jLongToCKULong(jMechanismType); -+ if (ckMechanismType != ckMechanism->mechanism) { -+ /* we do not have maching types, this should not occur */ -+ return; - } - -- /* get the native CK_SSL3_KEY_MAT_OUT */ -- ckSSL3KeyMatOut = ckSSL3KeyMatParam->pReturnedKeyMaterial; -+ // free malloc'd data -+ if (RandomInfo->pClientRandom != NULL) { -+ free(RandomInfo->pClientRandom); -+ } -+ if (RandomInfo->pServerRandom != NULL) { -+ free(RandomInfo->pServerRandom); -+ } -+ - if (ckSSL3KeyMatOut != NULL_PTR) { -- /* get the Java CK_SSL3_KEY_MAT_PARAMS (pParameter) */ -- fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;"); -+ /* get the Java params object (pParameter) */ -+ fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", -+ "Ljava/lang/Object;"); - if (fieldID == NULL) { return; } -- jSSL3KeyMatParam = (*env)->GetObjectField(env, jMechanism, fieldID); -+ jKeyMatParam = (*env)->GetObjectField(env, jMechanism, fieldID); - - /* get the Java CK_SSL3_KEY_MAT_OUT */ -- jSSL3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS); -- if (jSSL3KeyMatParamsClass == NULL) { return; } -- fieldID = (*env)->GetFieldID(env, jSSL3KeyMatParamsClass, "pReturnedKeyMaterial", "L"CLASS_SSL3_KEY_MAT_OUT";"); -+ jKeyMatParamsClass = (*env)->FindClass(env, class_key_mat_params); -+ if (jKeyMatParamsClass == NULL) { return; } -+ fieldID = (*env)->GetFieldID(env, jKeyMatParamsClass, -+ "pReturnedKeyMaterial", "L"CLASS_SSL3_KEY_MAT_OUT";"); - if (fieldID == NULL) { return; } -- jSSL3KeyMatOut = (*env)->GetObjectField(env, jSSL3KeyMatParam, fieldID); -+ jSSL3KeyMatOut = (*env)->GetObjectField(env, jKeyMatParam, fieldID); - - /* now copy back all the key handles and the initialization vectors */ - /* copy back client MAC secret handle */ - jSSL3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT); - if (jSSL3KeyMatOutClass == NULL) { return; } -- fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientMacSecret", "J"); -+ fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, -+ "hClientMacSecret", "J"); - if (fieldID == NULL) { return; } -- (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientMacSecret)); -+ (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, -+ ckULongToJLong(ckSSL3KeyMatOut->hClientMacSecret)); - - /* copy back server MAC secret handle */ -- fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerMacSecret", "J"); -+ fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, -+ "hServerMacSecret", "J"); - if (fieldID == NULL) { return; } -- (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerMacSecret)); -+ (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, -+ ckULongToJLong(ckSSL3KeyMatOut->hServerMacSecret)); - - /* copy back client secret key handle */ - fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientKey", "J"); - if (fieldID == NULL) { return; } -- (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientKey)); -+ (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, -+ ckULongToJLong(ckSSL3KeyMatOut->hClientKey)); - - /* copy back server secret key handle */ - fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerKey", "J"); - if (fieldID == NULL) { return; } -- (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerKey)); -+ (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, -+ ckULongToJLong(ckSSL3KeyMatOut->hServerKey)); - - /* copy back the client IV */ - fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVClient", "[B"); -@@ -740,7 +788,45 @@ - free(ckSSL3KeyMatOut->pIVServer); - free(ckSSL3KeyMatOut); - } -- } -+} -+ -+/* -+ * Copy back the derived keys and initialization vectors from the native -+ * structure to the Java object. This is only used for -+ * CKM_SSL3_KEY_AND_MAC_DERIVE and CKM_TLS_KEY_AND_MAC_DERIVE mechanisms -+ * when used for deriving a key. -+ * -+ */ -+void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, -+ jobject jMechanism) -+{ -+ CK_SSL3_KEY_MAT_PARAMS *ckSSL3KeyMatParam; -+ ckSSL3KeyMatParam = (CK_SSL3_KEY_MAT_PARAMS *)ckMechanism->pParameter; -+ if (ckSSL3KeyMatParam != NULL_PTR) { -+ copyBackKeyMatParams(env, ckMechanism, jMechanism, -+ &(ckSSL3KeyMatParam->RandomInfo), -+ ckSSL3KeyMatParam->pReturnedKeyMaterial, -+ CLASS_SSL3_KEY_MAT_PARAMS); -+ } -+} -+ -+/* -+ * Copy back the derived keys and initialization vectors from the native -+ * structure to the Java object. This is only used for -+ * CKM_TLS12_KEY_AND_MAC_DERIVE mechanism when used for deriving a key. -+ * -+ */ -+void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, -+ jobject jMechanism) -+{ -+ CK_TLS12_KEY_MAT_PARAMS *ckTLS12KeyMatParam; -+ ckTLS12KeyMatParam = (CK_TLS12_KEY_MAT_PARAMS *) ckMechanism->pParameter; -+ if (ckTLS12KeyMatParam != NULL_PTR) { -+ copyBackKeyMatParams(env, ckMechanism, jMechanism, -+ &(ckTLS12KeyMatParam->RandomInfo), -+ ckTLS12KeyMatParam->pReturnedKeyMaterial, -+ CLASS_TLS12_KEY_MAT_PARAMS); -+ } - } - - #endif -diff --git openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11t.h openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11t.h ---- openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11t.h -+++ openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11t.h -@@ -807,6 +807,12 @@ - #define CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE 0x000003D4 - #define CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE 0x000003D5 - -+/* new for v2.40 */ -+#define CKM_TLS12_MASTER_KEY_DERIVE 0x000003E0 -+#define CKM_TLS12_KEY_AND_MAC_DERIVE 0x000003E1 -+#define CKM_TLS12_MASTER_KEY_DERIVE_DH 0x000003E2 -+#define CKM_TLS_MAC 0x000003E4 -+ - #define CKM_KEY_WRAP_LYNKS 0x00000400 - #define CKM_KEY_WRAP_SET_OAEP 0x00000401 - -@@ -1682,4 +1688,34 @@ - - typedef CK_PKCS5_PBKD2_PARAMS CK_PTR CK_PKCS5_PBKD2_PARAMS_PTR; - -+/* new for v2.40 */ -+ -+typedef struct CK_TLS12_MASTER_KEY_DERIVE_PARAMS { -+ CK_SSL3_RANDOM_DATA RandomInfo; -+ CK_VERSION_PTR pVersion; -+ CK_MECHANISM_TYPE prfHashMechanism; -+} CK_TLS12_MASTER_KEY_DERIVE_PARAMS; -+ -+typedef CK_TLS12_MASTER_KEY_DERIVE_PARAMS CK_PTR CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR; -+ -+typedef struct CK_TLS12_KEY_MAT_PARAMS { -+ CK_ULONG ulMacSizeInBits; -+ CK_ULONG ulKeySizeInBits; -+ CK_ULONG ulIVSizeInBits; -+ CK_BBOOL bIsExport; -+ CK_SSL3_RANDOM_DATA RandomInfo; -+ CK_SSL3_KEY_MAT_OUT_PTR pReturnedKeyMaterial; -+ CK_MECHANISM_TYPE prfHashMechanism; -+} CK_TLS12_KEY_MAT_PARAMS; -+ -+typedef CK_TLS12_KEY_MAT_PARAMS CK_PTR CK_TLS12_KEY_MAT_PARAMS_PTR; -+ -+typedef struct CK_TLS_MAC_PARAMS { -+ CK_MECHANISM_TYPE prfMechanism; -+ CK_ULONG ulMacLength; -+ CK_ULONG ulServerOrClient; -+} CK_TLS_MAC_PARAMS; -+ -+typedef CK_TLS_MAC_PARAMS CK_PTR CK_TLS_MAC_PARAMS_PTR; -+ - #endif -diff --git openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h ---- openjdk.orig/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h -+++ openjdk/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - */ - - /* Copyright (c) 2002 Graz University of Technology. All rights reserved. -@@ -268,10 +268,13 @@ - #define CLASS_SSL3_RANDOM_DATA "sun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA" - // CLASS_SSL3_RANDOM_DATA is used by CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS - #define CLASS_SSL3_KEY_MAT_OUT "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT" --// CLASS_SSL3_KEY_MAT_OUT is used by CLASS_SSL3_KEY_MAT_PARAMS -+// CLASS_SSL3_KEY_MAT_OUT is used by CLASS_SSL3_KEY_MAT_PARAMS and CK_TLS12_KEY_MAT_PARAMS - #define CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_MASTER_KEY_DERIVE_PARAMS" -+#define CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_TLS12_MASTER_KEY_DERIVE_PARAMS" - #define CLASS_SSL3_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_PARAMS" -+#define CLASS_TLS12_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_TLS12_KEY_MAT_PARAMS" - #define CLASS_TLS_PRF_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_PRF_PARAMS" -+#define CLASS_TLS_MAC_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_MAC_PARAMS" - #define CLASS_AES_CTR_PARAMS "sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS" - - /* function to convert a PKCS#11 return value other than CK_OK into a Java Exception -@@ -361,9 +364,11 @@ - CK_KEY_WRAP_SET_OAEP_PARAMS jKeyWrapSetOaepParamToCKKeyWrapSetOaepParam(JNIEnv *env, jobject jParam); - void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); - CK_SSL3_MASTER_KEY_DERIVE_PARAMS jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam); --void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); -+void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); -+void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); - CK_SSL3_KEY_MAT_PARAMS jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam); --void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); -+void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); -+void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); - CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam); - CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam); - CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam); -diff --git openjdk.orig/jdk/test/sun/security/pkcs11/fips/TestTLS12.java openjdk/jdk/test/sun/security/pkcs11/fips/TestTLS12.java -new file mode 100644 ---- /dev/null -+++ openjdk/jdk/test/sun/security/pkcs11/fips/TestTLS12.java -@@ -0,0 +1,449 @@ -+/* -+ * Copyright (c) 2018, Red Hat, Inc. 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 8029661 -+ * @summary Test TLS 1.2 -+ * @library .. -+ * @run main/othervm/timeout=120 TestTLS12 -+ */ -+ -+import java.io.File; -+import java.io.FileInputStream; -+import java.io.InputStream; -+import java.nio.ByteBuffer; -+ -+import java.security.interfaces.RSAPrivateKey; -+import java.security.interfaces.RSAPublicKey; -+import java.security.KeyStore; -+import java.security.NoSuchAlgorithmException; -+import java.security.Provider; -+import java.security.SecureRandom; -+import java.security.Security; -+ -+import java.util.Arrays; -+ -+import javax.crypto.Cipher; -+import javax.crypto.KeyGenerator; -+import javax.crypto.SecretKey; -+import javax.crypto.spec.SecretKeySpec; -+ -+import javax.net.ssl.KeyManagerFactory; -+import javax.net.ssl.SSLContext; -+import javax.net.ssl.SSLEngine; -+import javax.net.ssl.SSLEngineResult; -+import javax.net.ssl.SSLEngineResult.HandshakeStatus; -+import javax.net.ssl.SSLParameters; -+import javax.net.ssl.SSLSession; -+import javax.net.ssl.TrustManagerFactory; -+ -+import sun.security.internal.spec.TlsMasterSecretParameterSpec; -+import sun.security.internal.spec.TlsPrfParameterSpec; -+import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; -+ -+public final class TestTLS12 extends SecmodTest { -+ -+ private static final boolean enableDebug = true; -+ -+ private static Provider sunPKCS11NSSProvider; -+ private static Provider sunJCEProvider; -+ private static com.sun.net.ssl.internal.ssl.Provider jsseProvider; -+ private static KeyStore ks; -+ private static KeyStore ts; -+ private static char[] passphrase = "JAHshj131@@".toCharArray(); -+ private static RSAPrivateKey privateKey; -+ private static RSAPublicKey publicKey; -+ -+ public static void main(String[] args) throws Exception { -+ try { -+ initialize(); -+ } catch (Exception e) { -+ System.out.println("Test skipped: failure during" + -+ " initialization"); -+ return; -+ } -+ -+ if (shouldRun()) { -+ // Test against JCE -+ testTlsAuthenticationCodeGeneration(); -+ -+ // Self-integrity test (complete TLS 1.2 communication) -+ new testTLS12SunPKCS11Communication().run(); -+ -+ System.out.println("Test PASS - OK"); -+ } else { -+ System.out.println("Test skipped: TLS 1.2 mechanisms" + -+ " not supported by current SunPKCS11 back-end"); -+ } -+ } -+ -+ private static boolean shouldRun() { -+ if (sunPKCS11NSSProvider == null) { -+ return false; -+ } -+ try { -+ KeyGenerator.getInstance("SunTls12MasterSecret", -+ sunPKCS11NSSProvider); -+ KeyGenerator.getInstance( -+ "SunTls12RsaPremasterSecret", sunPKCS11NSSProvider); -+ KeyGenerator.getInstance("SunTls12Prf", sunPKCS11NSSProvider); -+ } catch (NoSuchAlgorithmException e) { -+ return false; -+ } -+ return true; -+ } -+ -+ private static void testTlsAuthenticationCodeGeneration() -+ throws Exception { -+ // Generate RSA Pre-Master Secret in SunPKCS11 provider -+ SecretKey rsaPreMasterSecret = null; -+ @SuppressWarnings("deprecation") -+ TlsRsaPremasterSecretParameterSpec rsaPreMasterSecretSpec = -+ new TlsRsaPremasterSecretParameterSpec(0x0303, 0x0303); -+ { -+ KeyGenerator rsaPreMasterSecretKG = KeyGenerator.getInstance( -+ "SunTls12RsaPremasterSecret", sunPKCS11NSSProvider); -+ rsaPreMasterSecretKG.init(rsaPreMasterSecretSpec, null); -+ rsaPreMasterSecret = rsaPreMasterSecretKG.generateKey(); -+ } -+ -+ // Get RSA Pre-Master Secret in plain (from SunPKCS11 provider) -+ byte[] rsaPlainPreMasterSecret = null; -+ { -+ Cipher rsaPreMasterSecretWrapperCipher = -+ Cipher.getInstance("RSA/ECB/PKCS1Padding", -+ sunPKCS11NSSProvider); -+ rsaPreMasterSecretWrapperCipher.init(Cipher.WRAP_MODE, publicKey, -+ new SecureRandom()); -+ byte[] rsaEncryptedPreMasterSecret = -+ rsaPreMasterSecretWrapperCipher.wrap(rsaPreMasterSecret); -+ Cipher rsaPreMasterSecretUnwrapperCipher = -+ Cipher.getInstance("RSA/ECB/PKCS1Padding", sunJCEProvider); -+ rsaPreMasterSecretUnwrapperCipher.init(Cipher.UNWRAP_MODE, -+ privateKey, rsaPreMasterSecretSpec); -+ rsaPlainPreMasterSecret = rsaPreMasterSecretUnwrapperCipher.unwrap( -+ rsaEncryptedPreMasterSecret, "TlsRsaPremasterSecret", -+ Cipher.SECRET_KEY).getEncoded(); -+ -+ if (enableDebug) { -+ System.out.println("rsaPlainPreMasterSecret:"); -+ for (byte b : rsaPlainPreMasterSecret) { -+ System.out.printf("%02X, ", b); -+ } -+ System.out.println(""); -+ } -+ } -+ -+ // Generate Master Secret -+ SecretKey sunPKCS11MasterSecret = null; -+ SecretKey jceMasterSecret = null; -+ { -+ KeyGenerator sunPKCS11MasterSecretGenerator = -+ KeyGenerator.getInstance("SunTls12MasterSecret", -+ sunPKCS11NSSProvider); -+ KeyGenerator jceMasterSecretGenerator = KeyGenerator.getInstance( -+ "SunTls12MasterSecret", sunJCEProvider); -+ @SuppressWarnings("deprecation") -+ TlsMasterSecretParameterSpec sunPKCS11MasterSecretSpec = -+ new TlsMasterSecretParameterSpec(rsaPreMasterSecret, 3, 3, -+ new byte[32], new byte[32], "SHA-256", 32, 64); -+ @SuppressWarnings("deprecation") -+ TlsMasterSecretParameterSpec jceMasterSecretSpec = -+ new TlsMasterSecretParameterSpec( -+ new SecretKeySpec(rsaPlainPreMasterSecret, -+ "Generic"), 3, 3, new byte[32], -+ new byte[32], "SHA-256", 32, 64); -+ sunPKCS11MasterSecretGenerator.init(sunPKCS11MasterSecretSpec, -+ null); -+ jceMasterSecretGenerator.init(jceMasterSecretSpec, null); -+ sunPKCS11MasterSecret = -+ sunPKCS11MasterSecretGenerator.generateKey(); -+ jceMasterSecret = jceMasterSecretGenerator.generateKey(); -+ if (enableDebug) { -+ System.out.println("Master Secret (SunJCE):"); -+ if (jceMasterSecret != null) { -+ for (byte b : jceMasterSecret.getEncoded()) { -+ System.out.printf("%02X, ", b); -+ } -+ System.out.println(""); -+ } -+ } -+ } -+ -+ // Generate authentication codes -+ byte[] sunPKCS11AuthenticationCode = null; -+ byte[] jceAuthenticationCode = null; -+ { -+ // Generate SunPKCS11 authentication code -+ { -+ @SuppressWarnings("deprecation") -+ TlsPrfParameterSpec sunPKCS11AuthenticationCodeSpec = -+ new TlsPrfParameterSpec(sunPKCS11MasterSecret, -+ "client finished", "a".getBytes(), 12, -+ "SHA-256", 32, 64); -+ KeyGenerator sunPKCS11AuthCodeGenerator = -+ KeyGenerator.getInstance("SunTls12Prf", -+ sunPKCS11NSSProvider); -+ sunPKCS11AuthCodeGenerator.init( -+ sunPKCS11AuthenticationCodeSpec); -+ sunPKCS11AuthenticationCode = -+ sunPKCS11AuthCodeGenerator.generateKey().getEncoded(); -+ } -+ -+ // Generate SunJCE authentication code -+ { -+ @SuppressWarnings("deprecation") -+ TlsPrfParameterSpec jceAuthenticationCodeSpec = -+ new TlsPrfParameterSpec(jceMasterSecret, -+ "client finished", "a".getBytes(), 12, -+ "SHA-256", 32, 64); -+ KeyGenerator jceAuthCodeGenerator = -+ KeyGenerator.getInstance("SunTls12Prf", -+ sunJCEProvider); -+ jceAuthCodeGenerator.init(jceAuthenticationCodeSpec); -+ jceAuthenticationCode = -+ jceAuthCodeGenerator.generateKey().getEncoded(); -+ } -+ -+ if (enableDebug) { -+ System.out.println("SunPKCS11 Authentication Code: "); -+ for (byte b : sunPKCS11AuthenticationCode) { -+ System.out.printf("%02X, ", b); -+ } -+ System.out.println(""); -+ System.out.println("SunJCE Authentication Code: "); -+ for (byte b : jceAuthenticationCode) { -+ System.out.printf("%02X, ", b); -+ } -+ System.out.println(""); -+ } -+ } -+ -+ if (sunPKCS11AuthenticationCode == null || -+ jceAuthenticationCode == null || -+ sunPKCS11AuthenticationCode.length == 0 || -+ jceAuthenticationCode.length == 0 || -+ !Arrays.equals(sunPKCS11AuthenticationCode, -+ jceAuthenticationCode)) { -+ throw new Exception("Authentication codes from JCE" + -+ " and SunPKCS11 differ."); -+ } -+ } -+ -+ private static class testTLS12SunPKCS11Communication { -+ public static void run() throws Exception { -+ SSLEngine[][] enginesToTest = getSSLEnginesToTest(); -+ -+ for (SSLEngine[] engineToTest : enginesToTest) { -+ -+ SSLEngine clientSSLEngine = engineToTest[0]; -+ SSLEngine serverSSLEngine = engineToTest[1]; -+ -+ // SSLEngine code based on RedhandshakeFinished.java -+ -+ boolean dataDone = false; -+ -+ ByteBuffer clientOut = null; -+ ByteBuffer clientIn = null; -+ ByteBuffer serverOut = null; -+ ByteBuffer serverIn = null; -+ ByteBuffer cTOs; -+ ByteBuffer sTOc; -+ -+ SSLSession session = clientSSLEngine.getSession(); -+ int appBufferMax = session.getApplicationBufferSize(); -+ int netBufferMax = session.getPacketBufferSize(); -+ -+ clientIn = ByteBuffer.allocate(appBufferMax + 50); -+ serverIn = ByteBuffer.allocate(appBufferMax + 50); -+ -+ cTOs = ByteBuffer.allocateDirect(netBufferMax); -+ sTOc = ByteBuffer.allocateDirect(netBufferMax); -+ -+ clientOut = ByteBuffer.wrap( -+ "Hi Server, I'm Client".getBytes()); -+ serverOut = ByteBuffer.wrap( -+ "Hello Client, I'm Server".getBytes()); -+ -+ SSLEngineResult clientResult; -+ SSLEngineResult serverResult; -+ -+ while (!dataDone) { -+ clientResult = clientSSLEngine.wrap(clientOut, cTOs); -+ runDelegatedTasks(clientResult, clientSSLEngine); -+ serverResult = serverSSLEngine.wrap(serverOut, sTOc); -+ runDelegatedTasks(serverResult, serverSSLEngine); -+ cTOs.flip(); -+ sTOc.flip(); -+ -+ if (enableDebug) { -+ System.out.println("Client -> Network"); -+ printTlsNetworkPacket("", cTOs); -+ System.out.println(""); -+ System.out.println("Server -> Network"); -+ printTlsNetworkPacket("", sTOc); -+ System.out.println(""); -+ } -+ -+ clientResult = clientSSLEngine.unwrap(sTOc, clientIn); -+ runDelegatedTasks(clientResult, clientSSLEngine); -+ serverResult = serverSSLEngine.unwrap(cTOs, serverIn); -+ runDelegatedTasks(serverResult, serverSSLEngine); -+ -+ cTOs.compact(); -+ sTOc.compact(); -+ -+ if (!dataDone && -+ (clientOut.limit() == serverIn.position()) && -+ (serverOut.limit() == clientIn.position())) { -+ checkTransfer(serverOut, clientIn); -+ checkTransfer(clientOut, serverIn); -+ dataDone = true; -+ } -+ } -+ } -+ } -+ -+ static void printTlsNetworkPacket(String prefix, ByteBuffer bb) { -+ ByteBuffer slice = bb.slice(); -+ byte[] buffer = new byte[slice.remaining()]; -+ slice.get(buffer); -+ for (int i = 0; i < buffer.length; i++) { -+ System.out.printf("%02X, ", (byte)(buffer[i] & (byte)0xFF)); -+ if (i % 8 == 0 && i % 16 != 0) { -+ System.out.print(" "); -+ } -+ if (i % 16 == 0) { -+ System.out.println(""); -+ } -+ } -+ System.out.flush(); -+ } -+ -+ private static void checkTransfer(ByteBuffer a, ByteBuffer b) -+ throws Exception { -+ a.flip(); -+ b.flip(); -+ if (!a.equals(b)) { -+ throw new Exception("Data didn't transfer cleanly"); -+ } -+ a.position(a.limit()); -+ b.position(b.limit()); -+ a.limit(a.capacity()); -+ b.limit(b.capacity()); -+ } -+ -+ private static void runDelegatedTasks(SSLEngineResult result, -+ SSLEngine engine) throws Exception { -+ -+ if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { -+ Runnable runnable; -+ while ((runnable = engine.getDelegatedTask()) != null) { -+ runnable.run(); -+ } -+ HandshakeStatus hsStatus = engine.getHandshakeStatus(); -+ if (hsStatus == HandshakeStatus.NEED_TASK) { -+ throw new Exception( -+ "handshake shouldn't need additional tasks"); -+ } -+ } -+ } -+ -+ private static SSLEngine[][] getSSLEnginesToTest() throws Exception { -+ SSLEngine[][] enginesToTest = new SSLEngine[2][2]; -+ String[][] preferredSuites = new String[][]{ new String[] { -+ "TLS_RSA_WITH_AES_128_CBC_SHA256" -+ }, new String[] { -+ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256" -+ }}; -+ for (int i = 0; i < enginesToTest.length; i++) { -+ enginesToTest[i][0] = createSSLEngine(true); -+ enginesToTest[i][1] = createSSLEngine(false); -+ enginesToTest[i][0].setEnabledCipherSuites(preferredSuites[i]); -+ enginesToTest[i][1].setEnabledCipherSuites(preferredSuites[i]); -+ } -+ return enginesToTest; -+ } -+ -+ static private SSLEngine createSSLEngine(boolean client) -+ throws Exception { -+ SSLEngine ssle; -+ KeyManagerFactory kmf = KeyManagerFactory.getInstance("PKIX", -+ jsseProvider); -+ kmf.init(ks, passphrase); -+ -+ TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX", -+ jsseProvider); -+ tmf.init(ts); -+ -+ SSLContext sslCtx = SSLContext.getInstance("TLSv1.2", -+ jsseProvider); -+ sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); -+ ssle = sslCtx.createSSLEngine("localhost", 443); -+ ssle.setUseClientMode(client); -+ SSLParameters sslParameters = ssle.getSSLParameters(); -+ ssle.setSSLParameters(sslParameters); -+ -+ return ssle; -+ } -+ } -+ -+ private static void initialize() throws Exception { -+ if (initSecmod() == false) { -+ return; -+ } -+ String configName = BASE + SEP + "fips.cfg"; -+ sunPKCS11NSSProvider = getSunPKCS11(configName); -+ System.out.println("SunPKCS11 provider: " + sunPKCS11NSSProvider); -+ Security.addProvider(sunPKCS11NSSProvider); -+ -+ sunJCEProvider = new com.sun.crypto.provider.SunJCE(); -+ Security.addProvider(sunJCEProvider); -+ -+ Security.removeProvider("SunJSSE"); -+ jsseProvider =new com.sun.net.ssl.internal.ssl.Provider( -+ sunPKCS11NSSProvider); -+ Security.addProvider(jsseProvider); -+ System.out.println(jsseProvider.getInfo()); -+ -+ ks = KeyStore.getInstance("PKCS11", sunPKCS11NSSProvider); -+ ks.load(null, "test12".toCharArray()); -+ ts = ks; -+ -+ KeyStore ksPlain = readTestKeyStore(); -+ privateKey = (RSAPrivateKey)ksPlain.getKey("rh_rsa_sha256", -+ passphrase); -+ publicKey = (RSAPublicKey)ksPlain.getCertificate( -+ "rh_rsa_sha256").getPublicKey(); -+ } -+ -+ private static KeyStore readTestKeyStore() throws Exception { -+ File file = new File(System.getProperty("test.src", "."), "keystore"); -+ InputStream in = new FileInputStream(file); -+ KeyStore ks = KeyStore.getInstance("JKS"); -+ ks.load(in, "passphrase".toCharArray()); -+ in.close(); -+ return ks; -+ } -+} -\ No newline at end of file diff --git a/SOURCES/jdk8044235-src_zip_should_include_all_sources.patch b/SOURCES/jdk8044235-src_zip_should_include_all_sources.patch deleted file mode 100644 index 1beda6d..0000000 --- a/SOURCES/jdk8044235-src_zip_should_include_all_sources.patch +++ /dev/null @@ -1,109 +0,0 @@ -# HG changeset patch -# User omajid -# Date 1401638044 14400 -# Sun Jun 01 11:54:04 2014 -0400 -# Node ID fd78f7e83f3f1ce7d363b681b97583138218afcb -# Parent 8d0af21b5b9789f97b05edacc221a63f851d13b8 -8044235: src.zip should include all sources -Reviewed-by: andrew, dholmes - -diff --git a/make/CreateJars.gmk b/make/CreateJars.gmk ---- openjdk/jdk/make/CreateJars.gmk -+++ openjdk/jdk/make/CreateJars.gmk -@@ -584,40 +584,53 @@ - - ########################################################################################## - --SRC_ZIP_INCLUDES = \ -- com/sun/corba \ -- com/sun/image/codec/jpeg \ -- com/sun/imageio \ -- com/sun/java_cup \ -- com/sun/javadoc \ -- com/sun/java/swing \ -- com/sun/jmx \ -- com/sun/naming \ -- com/sun/org/apache \ -- com/sun/security/auth \ -- com/sun/security/jgss \ -- com/sun/source \ -- java \ -- javax/accessibility \ -- javax/annotation \ -- javax/imageio \ -- javax/lang \ -- javax/management \ -- javax/naming \ -- javax/print \ -- javax/rmi \ -- javax/script \ -- javax/security \ -- javax/sound \ -- javax/sql \ -- javax/swing \ -- javax/tools \ -- javax/xml \ -- org/ietf \ -- org/omg \ -- org/w3c/dom \ -- org/xml/sax \ -- # -+ifdef OPENJDK -+ SRC_ZIP_INCLUDES = \ -+ com \ -+ java \ -+ javax \ -+ jdk \ -+ org \ -+ sun \ -+ # -+ SRC_ZIP_EXCLUDES = -+else -+ SRC_ZIP_INCLUDES = \ -+ com/sun/corba \ -+ com/sun/image/codec/jpeg \ -+ com/sun/imageio \ -+ com/sun/java_cup \ -+ com/sun/javadoc \ -+ com/sun/java/swing \ -+ com/sun/jmx \ -+ com/sun/naming \ -+ com/sun/org/apache \ -+ com/sun/security/auth \ -+ com/sun/security/jgss \ -+ com/sun/source \ -+ java \ -+ javax/accessibility \ -+ javax/annotation \ -+ javax/imageio \ -+ javax/lang \ -+ javax/management \ -+ javax/naming \ -+ javax/print \ -+ javax/rmi \ -+ javax/script \ -+ javax/security \ -+ javax/sound \ -+ javax/sql \ -+ javax/swing \ -+ javax/tools \ -+ javax/xml \ -+ org/ietf \ -+ org/omg \ -+ org/w3c/dom \ -+ org/xml/sax \ -+ # -+ SRC_ZIP_EXCLUDES = javax/swing/beaninfo -+endif - - SRC_ZIP_SRCS = $(JDK_TOPDIR)/src/share/classes $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes - SRC_ZIP_SRCS += $(JDK_OUTPUTDIR)/gensrc -@@ -648,7 +661,7 @@ - $(eval $(call SetupZipArchive,BUILD_SRC_ZIP, \ - SRC := $(SRC_ZIP_SRCS) $(IMAGES_OUTPUTDIR)/src, \ - INCLUDES := $(SRC_ZIP_INCLUDES) launcher, \ -- EXCLUDES := javax/swing/beaninfo, \ -+ EXCLUDES := $(SRC_ZIP_EXCLUDES), \ - SUFFIXES := .java .c .h, \ - ZIP := $(IMAGES_OUTPUTDIR)/src.zip, \ - EXTRA_DEPS := $(LAUNCHER_ZIP_SRC))) diff --git a/SOURCES/jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_jdk.patch b/SOURCES/jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_jdk.patch deleted file mode 100644 index f79be53..0000000 --- a/SOURCES/jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_jdk.patch +++ /dev/null @@ -1,98 +0,0 @@ -# HG changeset patch -# User sgehwolf -# Date 1537884792 -7200 -# Tue Sep 25 16:13:12 2018 +0200 -# Node ID fd140d7550992267e3f0f08a20b461b2ce9fa740 -# Parent 21056af0d1eabbd04d7a223c01a28320c7010bfe -8073139: PPC64: User-visible arch directory and os.arch value on ppc64le cause issues with Java tooling -Reviewed-by: erikj, goetz, dholmes - -diff --git openjdk.orig/jdk/make/lib/SoundLibraries.gmk openjdk/jdk/make/lib/SoundLibraries.gmk ---- openjdk/jdk/make/lib/SoundLibraries.gmk Tue Jan 12 21:01:12 2016 +0000 -+++ openjdk/jdk/make/lib/SoundLibraries.gmk Wed Jan 13 00:18:02 2016 +0000 -@@ -140,6 +140,10 @@ - LIBJSOUND_CFLAGS += -DX_ARCH=X_PPC64 - endif - -+ ifeq ($(OPENJDK_TARGET_CPU), ppc64le) -+ LIBJSOUND_CFLAGS += -DX_ARCH=X_PPC64LE -+ endif -+ - ifeq ($(OPENJDK_TARGET_CPU), aarch64) - LIBJSOUND_CFLAGS += -DX_ARCH=X_AARCH64 - endif -diff -r 1fe56343ecc8 openjdk/jdk/src/share/native/com/sun/media/sound/SoundDefs.h ---- openjdk.orig/jdk/src/share/native/com/sun/media/sound/SoundDefs.h Tue Jan 12 21:01:12 2016 +0000 -+++ openjdk/jdk/src/share/native/com/sun/media/sound/SoundDefs.h Wed Jan 13 00:18:02 2016 +0000 -@@ -44,6 +44,8 @@ - #define X_ARM 7 - #define X_PPC 8 - #define X_AARCH64 9 -+#define X_PPC64 10 -+#define X_PPC64LE 11 - - // ********************************** - // Make sure you set X_PLATFORM and X_ARCH defines correctly. -diff --git openjdk.orig/jdk/src/solaris/bin/ppc64le/jvm.cfg openjdk/jdk/src/solaris/bin/ppc64le/jvm.cfg -new file mode 100644 ---- /dev/null -+++ openjdk/jdk/src/solaris/bin/ppc64le/jvm.cfg -@@ -0,0 +1,34 @@ -+# Copyright (c) 2011, 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. Oracle designates this -+# particular file as subject to the "Classpath" exception as provided -+# by Oracle in the LICENSE file that accompanied this code. -+# -+# 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. -+# -+# List of JVMs that can be used as an option to java, javac, etc. -+# Order is important -- first in this list is the default JVM. -+# NOTE that this both this file and its format are UNSUPPORTED and -+# WILL GO AWAY in a future release. -+# -+# You may also select a JVM in an arbitrary location with the -+# "-XXaltjvm=" option, but that too is unsupported -+# and may not be available in a future release. -+# -+-server KNOWN -+-client IGNORE -diff --git openjdk.orig/test/sun/security/pkcs11/PKCS11Test.java openjdk/test/sun/security/pkcs11/PKCS11Test.java ---- openjdk.orig/jdk/test/sun/security/pkcs11/PKCS11Test.java -+++ openjdk/jdk/test/sun/security/pkcs11/PKCS11Test.java -@@ -505,6 +505,8 @@ - osMap.put("Linux-amd64-64", new String[]{ - "/usr/lib/x86_64-linux-gnu/", "/usr/lib/x86_64-linux-gnu/nss/", - "/usr/lib64/"}); -+ osMap.put("Linux-ppc64-64", new String[]{"/usr/lib64/"}); -+ osMap.put("Linux-ppc64le-64", new String[]{"/usr/lib64/"}); - osMap.put("Windows-x86-32", new String[]{ - PKCS11_BASE + "/nss/lib/windows-i586/".replace('/', SEP)}); - osMap.put("Windows-amd64-64", new String[]{ -diff --git openjdk.orig/jdk/test/tools/launcher/Settings.java openjdk/jdk/test/tools/launcher/Settings.java ---- openjdk.orig/jdk/test/tools/launcher/Settings.java -+++ openjdk/jdk/test/tools/launcher/Settings.java -@@ -74,7 +74,7 @@ - - static void runTestOptionDefault() throws IOException { - String stackSize = "256"; // in kb -- if (getArch().equals("ppc64")) { -+ if (getArch().equals("ppc64") || getArch().equals("ppc64le")) { - stackSize = "800"; - } - TestResult tr = null; diff --git a/SOURCES/jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_root.patch b/SOURCES/jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_root.patch deleted file mode 100644 index 67fc620..0000000 --- a/SOURCES/jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_root.patch +++ /dev/null @@ -1,47 +0,0 @@ -# HG changeset patch -# User asmundak -# Date 1537883922 -7200 -# Tue Sep 25 15:58:42 2018 +0200 -# Node ID 2fabe07c0bd8bf21400313f3bb9b8e80fcb31724 -# Parent 91867683f73de3882ef88981a79995beeeb1e980 -8073139: PPC64: User-visible arch directory and os.arch value on ppc64le cause issues with Java tooling -Reviewed-by: erikj, goetz, dholmes -Contributed-by: Andrew Hughes , Alexander Smundak - -diff --git openjdk.orig///common/autoconf/flags.m4 openjdk///common/autoconf/flags.m4 ---- openjdk.orig///common/autoconf/flags.m4 -+++ openjdk///common/autoconf/flags.m4 -@@ -549,6 +549,9 @@ - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN" - fi - fi -+ if test "x$OPENJDK_TARGET_CPU" = xppc64le; then -+ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DABI_ELFv2" -+ fi - - # Setup target OS define. Use OS target name but in upper case. - OPENJDK_TARGET_OS_UPPERCASE=`$ECHO $OPENJDK_TARGET_OS | $TR 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` -diff --git openjdk.orig///common/autoconf/jdk-options.m4 openjdk///common/autoconf/jdk-options.m4 ---- openjdk.orig///common/autoconf/jdk-options.m4 -+++ openjdk///common/autoconf/jdk-options.m4 -@@ -158,7 +158,7 @@ - if test "x$JVM_VARIANT_ZEROSHARK" = xtrue ; then - INCLUDE_SA=false - fi -- if test "x$VAR_CPU" = xppc64 ; then -+ if test "x$VAR_CPU" = xppc64 -o "x$VAR_CPU" = xppc64le ; then - INCLUDE_SA=false - fi - AC_SUBST(INCLUDE_SA) -diff --git openjdk.orig///common/autoconf/platform.m4 openjdk///common/autoconf/platform.m4 ---- openjdk.orig///common/autoconf/platform.m4 -+++ openjdk///common/autoconf/platform.m4 -@@ -67,7 +67,7 @@ - VAR_CPU_ENDIAN=big - ;; - powerpc64le) -- VAR_CPU=ppc64 -+ VAR_CPU=ppc64le - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=little diff --git a/SOURCES/jdk8073139-pr2236-rh1191652--use_ppc64le_as_the_arch_directory_on_that_platform_and_report_it_in_os_arch_aarch64_forest.patch b/SOURCES/jdk8073139-pr2236-rh1191652--use_ppc64le_as_the_arch_directory_on_that_platform_and_report_it_in_os_arch_aarch64_forest.patch deleted file mode 100644 index a5afea0..0000000 --- a/SOURCES/jdk8073139-pr2236-rh1191652--use_ppc64le_as_the_arch_directory_on_that_platform_and_report_it_in_os_arch_aarch64_forest.patch +++ /dev/null @@ -1,130 +0,0 @@ -# HG changeset patch -# User sgehwolf -# Date 1537885415 -7200 -# Tue Sep 25 16:23:35 2018 +0200 -# Node ID 5044428520866481f438bfd1375da75adbc89243 -# Parent a3df1579a8647b06559f41d345da7bea162b26e9 -8073139: PPC64: User-visible arch directory and os.arch value on ppc64le cause issues with Java tooling -Reviewed-by: erikj, goetz, dholmes - -diff --git a/make/defs.make b/make/defs.make ---- openjdk/hotspot/make/defs.make -+++ openjdk/hotspot/make/defs.make -@@ -285,7 +285,7 @@ ifneq ($(OSNAME),windows) - - # Use uname output for SRCARCH, but deal with platform differences. If ARCH - # is not explicitly listed below, it is treated as x86. -- SRCARCH ?= $(ARCH/$(filter sparc sparc64 ia64 amd64 x86_64 ppc ppc64 zero aarch64,$(ARCH))) -+ SRCARCH ?= $(ARCH/$(filter sparc sparc64 ia64 amd64 x86_64 ppc ppc64 ppc64le zero aarch64,$(ARCH))) - ARCH/ = x86 - ARCH/sparc = sparc - ARCH/sparc64= sparc -@@ -293,6 +293,7 @@ ifneq ($(OSNAME),windows) - ARCH/amd64 = x86 - ARCH/x86_64 = x86 - ARCH/ppc64 = ppc -+ ARCH/ppc64le= ppc - ARCH/ppc = ppc - ARCH/zero = zero - ARCH/aarch64 = aarch64 -@@ -316,7 +317,12 @@ - endif - endif - -- # LIBARCH is 1:1 mapping from BUILDARCH -+ # LIBARCH is 1:1 mapping from BUILDARCH, except for ARCH=ppc64le -+ ifeq ($(ARCH),ppc64le) -+ LIBARCH ?= ppc64le -+ else -+ LIBARCH ?= $(LIBARCH/$(BUILDARCH)) -+ endif - LIBARCH ?= $(LIBARCH/$(BUILDARCH)) - LIBARCH/i486 = i386 - LIBARCH/amd64 = amd64 -diff --git a/src/os/linux/vm/os_linux.cpp b/src/os/linux/vm/os_linux.cpp ---- openjdk/hotspot/src/os/linux/vm/os_linux.cpp -+++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp -@@ -1956,7 +1956,7 @@ - {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, - {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, - #if defined(VM_LITTLE_ENDIAN) -- {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2LSB, (char*)"Power PC 64"}, -+ {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2LSB, (char*)"Power PC 64 LE"}, - #else - {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"}, - #endif -diff --git a/src/share/tools/hsdis/Makefile b/src/share/tools/hsdis/Makefile ---- openjdk/hotspot/src/share/tools/hsdis/Makefile -+++ openjdk/hotspot/src/share/tools/hsdis/Makefile -@@ -97,6 +97,7 @@ - CFLAGS/sparcv9 += -m64 - CFLAGS/amd64 += -m64 - CFLAGS/ppc64 += -m64 -+CFLAGS/ppc64le += -m64 -DABI_ELFv2 - else - ARCH=$(ARCH1:amd64=i386) - CFLAGS/i386 += -m32 -diff --git a/src/share/tools/hsdis/hsdis-demo.c b/src/share/tools/hsdis/hsdis-demo.c ---- openjdk/hotspot/src/share/tools/hsdis/hsdis-demo.c -+++ openjdk/hotspot/src/share/tools/hsdis/hsdis-demo.c -@@ -88,7 +88,7 @@ - printf("...And now for something completely different:\n"); - void *start = (void*) &main; - void *end = (void*) &end_of_file; --#if defined(__ia64) || defined(__powerpc__) -+#if defined(__ia64) || (defined(__powerpc__) && !defined(ABI_ELFv2)) - /* On IA64 and PPC function pointers are pointers to function descriptors */ - start = *((void**)start); - end = *((void**)end); -diff --git a/src/share/tools/hsdis/hsdis.c b/src/share/tools/hsdis/hsdis.c ---- openjdk/hotspot/src/share/tools/hsdis/hsdis.c -+++ openjdk/hotspot/src/share/tools/hsdis/hsdis.c -@@ -461,7 +461,7 @@ static const char* native_arch_name() { - #ifdef LIBARCH_sparcv9 - res = "sparc:v9b"; - #endif --#ifdef LIBARCH_ppc64 -+#if defined(LIBARCH_ppc64) || defined(LIBARCH_ppc64le) - res = "powerpc:common64"; - #endif - #else -diff --git a/src/share/vm/runtime/vm_version.cpp b/src/share/vm/runtime/vm_version.cpp ---- openjdk/hotspot/src/share/vm/runtime/vm_version.cpp -+++ openjdk/hotspot/src/share/vm/runtime/vm_version.cpp -@@ -187,11 +187,16 @@ const char* Abstract_VM_Version::jre_release_version() { - #ifndef CPU - #ifdef ZERO - #define CPU ZERO_LIBARCH -+#elif defined(PPC64) -+#if defined(VM_LITTLE_ENDIAN) -+#define CPU "ppc64le" -+#else -+#define CPU "ppc64" -+#endif - #else - #define CPU IA32_ONLY("x86") \ - IA64_ONLY("ia64") \ - AMD64_ONLY("amd64") \ -- PPC64_ONLY("ppc64") \ - AARCH64_ONLY("aarch64") \ - SPARC_ONLY("sparc") - #endif // ZERO -diff --git a/test/test_env.sh b/test/test_env.sh ---- openjdk/hotspot/test/test_env.sh -+++ openjdk/hotspot/test/test_env.sh -@@ -185,6 +185,15 @@ - if [ $? = 0 ] - then - VM_CPU="ppc" -+ if [ $VM_BITS = "64" ] -+ then -+ VM_CPU="ppc64" -+ grep "ppc64le" vm_version.out > ${NULL} -+ if [ $? = 0 ] -+ then -+ VM_CPU="ppc64le" -+ fi -+ fi - fi - grep "ia64" vm_version.out > ${NULL} - if [ $? = 0 ] diff --git a/SOURCES/jdk8131048-pr3574-rh1498936-ppc_crc32.patch b/SOURCES/jdk8131048-pr3574-rh1498936-ppc_crc32.patch deleted file mode 100644 index d7b94e6..0000000 --- a/SOURCES/jdk8131048-pr3574-rh1498936-ppc_crc32.patch +++ /dev/null @@ -1,1417 +0,0 @@ -# HG changeset patch -# User gromero -# Date 1537823918 14400 -# Mon Sep 24 17:18:38 2018 -0400 -# Node ID 567e95df42f866b890dc3f0670e086d266915112 -# Parent 678bb67e02aedd54e32819a9011962326164274e -8131048, PR3574, RH1498936: ppc implement CRC32 intrinsic -Reviewed-by: goetz - -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/interpreterGenerator_ppc.hpp openjdk/hotspot/src/cpu/ppc/vm/interpreterGenerator_ppc.hpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/interpreterGenerator_ppc.hpp -+++ openjdk/hotspot/src/cpu/ppc/vm/interpreterGenerator_ppc.hpp -@@ -33,5 +33,7 @@ - address generate_abstract_entry(void); - address generate_accessor_entry(void); - address generate_Reference_get_entry(void); -+ address generate_CRC32_update_entry(); -+ address generate_CRC32_updateBytes_entry(AbstractInterpreter::MethodKind kind); - - #endif // CPU_PPC_VM_INTERPRETERGENERATOR_PPC_HPP -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp openjdk/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp -+++ openjdk/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp -@@ -49,6 +49,7 @@ - #else - #define BLOCK_COMMENT(str) block_comment(str) - #endif -+#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") - - #ifdef ASSERT - // On RISC, there's no benefit to verifying instruction boundaries. -@@ -3022,6 +3023,418 @@ - bind(Ldone_false); - } - -+// Helpers for Intrinsic Emitters -+// -+// Revert the byte order of a 32bit value in a register -+// src: 0x44556677 -+// dst: 0x77665544 -+// Three steps to obtain the result: -+// 1) Rotate src (as doubleword) left 5 bytes. That puts the leftmost byte of the src word -+// into the rightmost byte position. Afterwards, everything left of the rightmost byte is cleared. -+// This value initializes dst. -+// 2) Rotate src (as word) left 3 bytes. That puts the rightmost byte of the src word into the leftmost -+// byte position. Furthermore, byte 5 is rotated into byte 6 position where it is supposed to go. -+// This value is mask inserted into dst with a [0..23] mask of 1s. -+// 3) Rotate src (as word) left 1 byte. That puts byte 6 into byte 5 position. -+// This value is mask inserted into dst with a [8..15] mask of 1s. -+void MacroAssembler::load_reverse_32(Register dst, Register src) { -+ assert_different_registers(dst, src); -+ -+ rldicl(dst, src, (4+1)*8, 56); // Rotate byte 4 into position 7 (rightmost), clear all to the left. -+ rlwimi(dst, src, 3*8, 0, 23); // Insert byte 5 into position 6, 7 into 4, leave pos 7 alone. -+ rlwimi(dst, src, 1*8, 8, 15); // Insert byte 6 into position 5, leave the rest alone. -+} -+ -+// Calculate the column addresses of the crc32 lookup table into distinct registers. -+// This loop-invariant calculation is moved out of the loop body, reducing the loop -+// body size from 20 to 16 instructions. -+// Returns the offset that was used to calculate the address of column tc3. -+// Due to register shortage, setting tc3 may overwrite table. With the return offset -+// at hand, the original table address can be easily reconstructed. -+int MacroAssembler::crc32_table_columns(Register table, Register tc0, Register tc1, Register tc2, Register tc3) { -+ -+#ifdef VM_LITTLE_ENDIAN -+ // This is what we implement (the DOLIT4 part): -+ // ========================================================================= */ -+ // #define DOLIT4 c ^= *buf4++; \ -+ // c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ -+ // crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -+ // #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 -+ // ========================================================================= */ -+ const int ix0 = 3*(4*CRC32_COLUMN_SIZE); -+ const int ix1 = 2*(4*CRC32_COLUMN_SIZE); -+ const int ix2 = 1*(4*CRC32_COLUMN_SIZE); -+ const int ix3 = 0*(4*CRC32_COLUMN_SIZE); -+#else -+ // This is what we implement (the DOBIG4 part): -+ // ========================================================================= -+ // #define DOBIG4 c ^= *++buf4; \ -+ // c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ -+ // crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -+ // #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 -+ // ========================================================================= -+ const int ix0 = 4*(4*CRC32_COLUMN_SIZE); -+ const int ix1 = 5*(4*CRC32_COLUMN_SIZE); -+ const int ix2 = 6*(4*CRC32_COLUMN_SIZE); -+ const int ix3 = 7*(4*CRC32_COLUMN_SIZE); -+#endif -+ assert_different_registers(table, tc0, tc1, tc2); -+ assert(table == tc3, "must be!"); -+ -+ if (ix0 != 0) addi(tc0, table, ix0); -+ if (ix1 != 0) addi(tc1, table, ix1); -+ if (ix2 != 0) addi(tc2, table, ix2); -+ if (ix3 != 0) addi(tc3, table, ix3); -+ -+ return ix3; -+} -+ -+/** -+ * uint32_t crc; -+ * timesXtoThe32[crc & 0xFF] ^ (crc >> 8); -+ */ -+void MacroAssembler::fold_byte_crc32(Register crc, Register val, Register table, Register tmp) { -+ assert_different_registers(crc, table, tmp); -+ assert_different_registers(val, table); -+ -+ if (crc == val) { // Must rotate first to use the unmodified value. -+ rlwinm(tmp, val, 2, 24-2, 31-2); // Insert (rightmost) byte 7 of val, shifted left by 2, into byte 6..7 of tmp, clear the rest. -+ // As we use a word (4-byte) instruction, we have to adapt the mask bit positions. -+ srwi(crc, crc, 8); // Unsigned shift, clear leftmost 8 bits. -+ } else { -+ srwi(crc, crc, 8); // Unsigned shift, clear leftmost 8 bits. -+ rlwinm(tmp, val, 2, 24-2, 31-2); // Insert (rightmost) byte 7 of val, shifted left by 2, into byte 6..7 of tmp, clear the rest. -+ } -+ lwzx(tmp, table, tmp); -+ xorr(crc, crc, tmp); -+} -+ -+/** -+ * uint32_t crc; -+ * timesXtoThe32[crc & 0xFF] ^ (crc >> 8); -+ */ -+void MacroAssembler::fold_8bit_crc32(Register crc, Register table, Register tmp) { -+ fold_byte_crc32(crc, crc, table, tmp); -+} -+ -+/** -+ * Emits code to update CRC-32 with a byte value according to constants in table. -+ * -+ * @param [in,out]crc Register containing the crc. -+ * @param [in]val Register containing the byte to fold into the CRC. -+ * @param [in]table Register containing the table of crc constants. -+ * -+ * uint32_t crc; -+ * val = crc_table[(val ^ crc) & 0xFF]; -+ * crc = val ^ (crc >> 8); -+ */ -+void MacroAssembler::update_byte_crc32(Register crc, Register val, Register table) { -+ BLOCK_COMMENT("update_byte_crc32:"); -+ xorr(val, val, crc); -+ fold_byte_crc32(crc, val, table, val); -+} -+ -+/** -+ * @param crc register containing existing CRC (32-bit) -+ * @param buf register pointing to input byte buffer (byte*) -+ * @param len register containing number of bytes -+ * @param table register pointing to CRC table -+ */ -+void MacroAssembler::update_byteLoop_crc32(Register crc, Register buf, Register len, Register table, -+ Register data, bool loopAlignment, bool invertCRC) { -+ assert_different_registers(crc, buf, len, table, data); -+ -+ Label L_mainLoop, L_done; -+ const int mainLoop_stepping = 1; -+ const int mainLoop_alignment = loopAlignment ? 32 : 4; // (InputForNewCode > 4 ? InputForNewCode : 32) : 4; -+ -+ // Process all bytes in a single-byte loop. -+ cmpdi(CCR0, len, 0); // Anything to do? -+ mtctr(len); -+ beq(CCR0, L_done); -+ -+ if (invertCRC) { -+ nand(crc, crc, crc); // ~c -+ } -+ -+ align(mainLoop_alignment); -+ BIND(L_mainLoop); -+ lbz(data, 0, buf); // Byte from buffer, zero-extended. -+ addi(buf, buf, mainLoop_stepping); // Advance buffer position. -+ update_byte_crc32(crc, data, table); -+ bdnz(L_mainLoop); // Iterate. -+ -+ if (invertCRC) { -+ nand(crc, crc, crc); // ~c -+ } -+ -+ bind(L_done); -+} -+ -+/** -+ * Emits code to update CRC-32 with a 4-byte value according to constants in table -+ * Implementation according to jdk/src/share/native/java/util/zip/zlib-1.2.8/crc32.c -+ */ -+// A not on the lookup table address(es): -+// The lookup table consists of two sets of four columns each. -+// The columns {0..3} are used for little-endian machines. -+// The columns {4..7} are used for big-endian machines. -+// To save the effort of adding the column offset to the table address each time -+// a table element is looked up, it is possible to pass the pre-calculated -+// column addresses. -+// Uses R9..R12 as work register. Must be saved/restored by caller, if necessary. -+void MacroAssembler::update_1word_crc32(Register crc, Register buf, Register table, int bufDisp, int bufInc, -+ Register t0, Register t1, Register t2, Register t3, -+ Register tc0, Register tc1, Register tc2, Register tc3) { -+ assert_different_registers(crc, t3); -+ -+ // XOR crc with next four bytes of buffer. -+ lwz(t3, bufDisp, buf); -+ if (bufInc != 0) { -+ addi(buf, buf, bufInc); -+ } -+ xorr(t3, t3, crc); -+ -+ // Chop crc into 4 single-byte pieces, shifted left 2 bits, to form the table indices. -+ rlwinm(t0, t3, 2, 24-2, 31-2); // ((t1 >> 0) & 0xff) << 2 -+ rlwinm(t1, t3, 32+(2- 8), 24-2, 31-2); // ((t1 >> 8) & 0xff) << 2 -+ rlwinm(t2, t3, 32+(2-16), 24-2, 31-2); // ((t1 >> 16) & 0xff) << 2 -+ rlwinm(t3, t3, 32+(2-24), 24-2, 31-2); // ((t1 >> 24) & 0xff) << 2 -+ -+ // Use the pre-calculated column addresses. -+ // Load pre-calculated table values. -+ lwzx(t0, tc0, t0); -+ lwzx(t1, tc1, t1); -+ lwzx(t2, tc2, t2); -+ lwzx(t3, tc3, t3); -+ -+ // Calculate new crc from table values. -+ xorr(t0, t0, t1); -+ xorr(t2, t2, t3); -+ xorr(crc, t0, t2); // Now crc contains the final checksum value. -+} -+ -+/** -+ * @param crc register containing existing CRC (32-bit) -+ * @param buf register pointing to input byte buffer (byte*) -+ * @param len register containing number of bytes -+ * @param table register pointing to CRC table -+ * -+ * Uses R9..R12 as work register. Must be saved/restored by caller! -+ */ -+void MacroAssembler::kernel_crc32_2word(Register crc, Register buf, Register len, Register table, -+ Register t0, Register t1, Register t2, Register t3, -+ Register tc0, Register tc1, Register tc2, Register tc3) { -+ assert_different_registers(crc, buf, len, table); -+ -+ Label L_mainLoop, L_tail; -+ Register tmp = t0; -+ Register data = t0; -+ Register tmp2 = t1; -+ const int mainLoop_stepping = 8; -+ const int tailLoop_stepping = 1; -+ const int log_stepping = exact_log2(mainLoop_stepping); -+ const int mainLoop_alignment = 32; // InputForNewCode > 4 ? InputForNewCode : 32; -+ const int complexThreshold = 2*mainLoop_stepping; -+ -+ // Don't test for len <= 0 here. This pathological case should not occur anyway. -+ // Optimizing for it by adding a test and a branch seems to be a waste of CPU cycles. -+ // The situation itself is detected and handled correctly by the conditional branches -+ // following aghi(len, -stepping) and aghi(len, +stepping). -+ assert(tailLoop_stepping == 1, "check tailLoop_stepping!"); -+ -+ BLOCK_COMMENT("kernel_crc32_2word {"); -+ -+ nand(crc, crc, crc); // ~c -+ -+ // Check for short ( mainLoop_stepping) { -+ sub(len, len, tmp2); // Remaining bytes for main loop (>=mainLoop_stepping is guaranteed). -+ } else { -+ sub(tmp, len, tmp2); // Remaining bytes for main loop. -+ cmpdi(CCR0, tmp, mainLoop_stepping); -+ blt(CCR0, L_tail); // For less than one mainloop_stepping left, do only tail processing -+ mr(len, tmp); // remaining bytes for main loop (>=mainLoop_stepping is guaranteed). -+ } -+ update_byteLoop_crc32(crc, buf, tmp2, table, data, false, false); -+ } -+ -+ srdi(tmp2, len, log_stepping); // #iterations for mainLoop -+ andi(len, len, mainLoop_stepping-1); // remaining bytes for tailLoop -+ mtctr(tmp2); -+ -+#ifdef VM_LITTLE_ENDIAN -+ Register crc_rv = crc; -+#else -+ Register crc_rv = tmp; // Load_reverse needs separate registers to work on. -+ // Occupies tmp, but frees up crc. -+ load_reverse_32(crc_rv, crc); // Revert byte order because we are dealing with big-endian data. -+ tmp = crc; -+#endif -+ -+ int reconstructTableOffset = crc32_table_columns(table, tc0, tc1, tc2, tc3); -+ -+ align(mainLoop_alignment); // Octoword-aligned loop address. Shows 2% improvement. -+ BIND(L_mainLoop); -+ update_1word_crc32(crc_rv, buf, table, 0, 0, crc_rv, t1, t2, t3, tc0, tc1, tc2, tc3); -+ update_1word_crc32(crc_rv, buf, table, 4, mainLoop_stepping, crc_rv, t1, t2, t3, tc0, tc1, tc2, tc3); -+ bdnz(L_mainLoop); -+ -+#ifndef VM_LITTLE_ENDIAN -+ load_reverse_32(crc, crc_rv); // Revert byte order because we are dealing with big-endian data. -+ tmp = crc_rv; // Tmp uses it's original register again. -+#endif -+ -+ // Restore original table address for tailLoop. -+ if (reconstructTableOffset != 0) { -+ addi(table, table, -reconstructTableOffset); -+ } -+ -+ // Process last few ( 4 ? InputForNewCode : 32; -+ const int complexThreshold = 2*mainLoop_stepping; -+ -+ // Don't test for len <= 0 here. This pathological case should not occur anyway. -+ // Optimizing for it by adding a test and a branch seems to be a waste of CPU cycles. -+ // The situation itself is detected and handled correctly by the conditional branches -+ // following aghi(len, -stepping) and aghi(len, +stepping). -+ assert(tailLoop_stepping == 1, "check tailLoop_stepping!"); -+ -+ BLOCK_COMMENT("kernel_crc32_1word {"); -+ -+ nand(crc, crc, crc); // ~c -+ -+ // Check for short ( mainLoop_stepping) { -+ sub(len, len, tmp2); // Remaining bytes for main loop (>=mainLoop_stepping is guaranteed). -+ } else { -+ sub(tmp, len, tmp2); // Remaining bytes for main loop. -+ cmpdi(CCR0, tmp, mainLoop_stepping); -+ blt(CCR0, L_tail); // For less than one mainloop_stepping left, do only tail processing -+ mr(len, tmp); // remaining bytes for main loop (>=mainLoop_stepping is guaranteed). -+ } -+ update_byteLoop_crc32(crc, buf, tmp2, table, data, false, false); -+ } -+ -+ srdi(tmp2, len, log_stepping); // #iterations for mainLoop -+ andi(len, len, mainLoop_stepping-1); // remaining bytes for tailLoop -+ mtctr(tmp2); -+ -+#ifdef VM_LITTLE_ENDIAN -+ Register crc_rv = crc; -+#else -+ Register crc_rv = tmp; // Load_reverse needs separate registers to work on. -+ // Occupies tmp, but frees up crc. -+ load_reverse_32(crc_rv, crc); // evert byte order because we are dealing with big-endian data. -+ tmp = crc; -+#endif -+ -+ int reconstructTableOffset = crc32_table_columns(table, tc0, tc1, tc2, tc3); -+ -+ align(mainLoop_alignment); // Octoword-aligned loop address. Shows 2% improvement. -+ BIND(L_mainLoop); -+ update_1word_crc32(crc_rv, buf, table, 0, mainLoop_stepping, crc_rv, t1, t2, t3, tc0, tc1, tc2, tc3); -+ bdnz(L_mainLoop); -+ -+#ifndef VM_LITTLE_ENDIAN -+ load_reverse_32(crc, crc_rv); // Revert byte order because we are dealing with big-endian data. -+ tmp = crc_rv; // Tmp uses it's original register again. -+#endif -+ -+ // Restore original table address for tailLoop. -+ if (reconstructTableOffset != 0) { -+ addi(table, table, -reconstructTableOffset); -+ } -+ -+ // Process last few ( -+ -+// CRC32 Intrinsics. -+void StubRoutines::ppc64::generate_load_crc_table_addr(MacroAssembler* masm, Register table) { -+ __ load_const(table, StubRoutines::_crc_table_adr); -+} -+ -+// CRC32 Intrinsics. -+/** -+ * crc_table[] from jdk/src/share/native/java/util/zip/zlib-1.2.8/crc32.h -+ */ -+juint StubRoutines::ppc64::_crc_table[CRC32_TABLES][CRC32_COLUMN_SIZE] = { -+ { -+ 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, -+ 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, -+ 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, -+ 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, -+ 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, -+ 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, -+ 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, -+ 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, -+ 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, -+ 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, -+ 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, -+ 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, -+ 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, -+ 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, -+ 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, -+ 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, -+ 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, -+ 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, -+ 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, -+ 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, -+ 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, -+ 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, -+ 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, -+ 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, -+ 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, -+ 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, -+ 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, -+ 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, -+ 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, -+ 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, -+ 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, -+ 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, -+ 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, -+ 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, -+ 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, -+ 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, -+ 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, -+ 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, -+ 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, -+ 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, -+ 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, -+ 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, -+ 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, -+ 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, -+ 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, -+ 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, -+ 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, -+ 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, -+ 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, -+ 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, -+ 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, -+ 0x2d02ef8dUL -+#ifdef CRC32_BYFOUR -+ }, -+ { -+ 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, -+ 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, -+ 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, -+ 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, -+ 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, -+ 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, -+ 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, -+ 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, -+ 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, -+ 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, -+ 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, -+ 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, -+ 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, -+ 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, -+ 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, -+ 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, -+ 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, -+ 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, -+ 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, -+ 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, -+ 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, -+ 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, -+ 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, -+ 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, -+ 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, -+ 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, -+ 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, -+ 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, -+ 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, -+ 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, -+ 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, -+ 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, -+ 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, -+ 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, -+ 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, -+ 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, -+ 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, -+ 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, -+ 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, -+ 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, -+ 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, -+ 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, -+ 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, -+ 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, -+ 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, -+ 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, -+ 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, -+ 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, -+ 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, -+ 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, -+ 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, -+ 0x9324fd72UL -+ }, -+ { -+ 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, -+ 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, -+ 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, -+ 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, -+ 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, -+ 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, -+ 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, -+ 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, -+ 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, -+ 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, -+ 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, -+ 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, -+ 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, -+ 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, -+ 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, -+ 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, -+ 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, -+ 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, -+ 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, -+ 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, -+ 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, -+ 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, -+ 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, -+ 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, -+ 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, -+ 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, -+ 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, -+ 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, -+ 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, -+ 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, -+ 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, -+ 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, -+ 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, -+ 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, -+ 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, -+ 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, -+ 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, -+ 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, -+ 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, -+ 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, -+ 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, -+ 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, -+ 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, -+ 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, -+ 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, -+ 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, -+ 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, -+ 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, -+ 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, -+ 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, -+ 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, -+ 0xbe9834edUL -+ }, -+ { -+ 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, -+ 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, -+ 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, -+ 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, -+ 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, -+ 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, -+ 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, -+ 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, -+ 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, -+ 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, -+ 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, -+ 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, -+ 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, -+ 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, -+ 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, -+ 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, -+ 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, -+ 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, -+ 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, -+ 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, -+ 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, -+ 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, -+ 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, -+ 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, -+ 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, -+ 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, -+ 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, -+ 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, -+ 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, -+ 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, -+ 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, -+ 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, -+ 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, -+ 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, -+ 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, -+ 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, -+ 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, -+ 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, -+ 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, -+ 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, -+ 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, -+ 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, -+ 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, -+ 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, -+ 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, -+ 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, -+ 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, -+ 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, -+ 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, -+ 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, -+ 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, -+ 0xde0506f1UL -+ }, -+ { -+ 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, -+ 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, -+ 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, -+ 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, -+ 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, -+ 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, -+ 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, -+ 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, -+ 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, -+ 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, -+ 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, -+ 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, -+ 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, -+ 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, -+ 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, -+ 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, -+ 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, -+ 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, -+ 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, -+ 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, -+ 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, -+ 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, -+ 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, -+ 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, -+ 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, -+ 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, -+ 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, -+ 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, -+ 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, -+ 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, -+ 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, -+ 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, -+ 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, -+ 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, -+ 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, -+ 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, -+ 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, -+ 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, -+ 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, -+ 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, -+ 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, -+ 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, -+ 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, -+ 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, -+ 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, -+ 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, -+ 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, -+ 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, -+ 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, -+ 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, -+ 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, -+ 0x8def022dUL -+ }, -+ { -+ 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, -+ 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, -+ 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, -+ 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, -+ 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, -+ 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, -+ 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, -+ 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, -+ 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, -+ 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, -+ 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, -+ 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, -+ 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, -+ 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, -+ 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, -+ 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, -+ 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, -+ 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, -+ 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, -+ 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, -+ 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, -+ 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, -+ 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, -+ 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, -+ 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, -+ 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, -+ 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, -+ 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, -+ 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, -+ 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, -+ 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, -+ 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, -+ 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, -+ 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, -+ 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, -+ 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, -+ 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, -+ 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, -+ 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, -+ 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, -+ 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, -+ 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, -+ 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, -+ 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, -+ 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, -+ 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, -+ 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, -+ 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, -+ 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, -+ 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, -+ 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, -+ 0x72fd2493UL -+ }, -+ { -+ 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, -+ 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, -+ 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, -+ 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, -+ 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, -+ 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, -+ 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, -+ 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, -+ 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, -+ 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, -+ 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, -+ 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, -+ 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, -+ 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, -+ 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, -+ 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, -+ 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, -+ 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, -+ 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, -+ 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, -+ 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, -+ 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, -+ 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, -+ 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, -+ 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, -+ 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, -+ 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, -+ 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, -+ 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, -+ 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, -+ 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, -+ 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, -+ 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, -+ 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, -+ 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, -+ 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, -+ 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, -+ 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, -+ 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, -+ 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, -+ 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, -+ 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, -+ 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, -+ 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, -+ 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, -+ 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, -+ 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, -+ 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, -+ 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, -+ 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, -+ 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, -+ 0xed3498beUL -+ }, -+ { -+ 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, -+ 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, -+ 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, -+ 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, -+ 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, -+ 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, -+ 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, -+ 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, -+ 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, -+ 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, -+ 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, -+ 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, -+ 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, -+ 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, -+ 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, -+ 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, -+ 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, -+ 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, -+ 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, -+ 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, -+ 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, -+ 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, -+ 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, -+ 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, -+ 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, -+ 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, -+ 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, -+ 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, -+ 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, -+ 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, -+ 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, -+ 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, -+ 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, -+ 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, -+ 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, -+ 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, -+ 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, -+ 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, -+ 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, -+ 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, -+ 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, -+ 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, -+ 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, -+ 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, -+ 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, -+ 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, -+ 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, -+ 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, -+ 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, -+ 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, -+ 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, -+ 0xf10605deUL -+#endif -+ } -+}; -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp openjdk/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp -+++ openjdk/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp -@@ -1,6 +1,6 @@ - /* -- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. -- * Copyright 2012, 2013 SAP AG. All rights reserved. -+ * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2012, 2018 SAP SE. 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 -@@ -30,11 +30,35 @@ - // definition. See stubRoutines.hpp for a description on how to - // extend it. - --static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; } -+static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; } - - enum platform_dependent_constants { - code_size1 = 20000, // simply increase if too small (assembler will crash if too small) - code_size2 = 20000 // simply increase if too small (assembler will crash if too small) - }; - -+// CRC32 Intrinsics. -+#define CRC32_COLUMN_SIZE 256 -+#define CRC32_BYFOUR -+#ifdef CRC32_BYFOUR -+ #define CRC32_TABLES 8 -+#else -+ #define CRC32_TABLES 1 -+#endif -+ -+class ppc64 { -+ friend class StubGenerator; -+ -+ private: -+ -+ // CRC32 Intrinsics. -+ static juint _crc_table[CRC32_TABLES][CRC32_COLUMN_SIZE]; -+ -+ public: -+ -+ // CRC32 Intrinsics. -+ static void generate_load_crc_table_addr(MacroAssembler* masm, Register table); -+ -+}; -+ - #endif // CPU_PPC_VM_STUBROUTINES_PPC_64_HPP -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp openjdk/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp -+++ openjdk/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp -@@ -57,7 +57,7 @@ - #define BLOCK_COMMENT(str) __ block_comment(str) - #endif - --#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") -+#define BIND(label) __ bind(label); BLOCK_COMMENT(#label ":") - - //----------------------------------------------------------------------------- - -@@ -783,7 +783,7 @@ - } - generate_counter_incr(&invocation_counter_overflow, NULL, NULL); - -- __ BIND(continue_after_compile); -+ BIND(continue_after_compile); - // Reset the _do_not_unlock_if_synchronized flag. - if (synchronized) { - __ li(R0, 0); -@@ -843,7 +843,7 @@ - __ ld(signature_handler_fd, method_(signature_handler)); - __ twi_0(signature_handler_fd); // Order wrt. load of klass mirror and entry point (isync is below). - -- __ BIND(call_signature_handler); -+ BIND(call_signature_handler); - - // Before we call the signature handler we push a new frame to - // protect the interpreter frame volatile registers when we return -@@ -913,7 +913,7 @@ - __ std(R0/*mirror*/, _ijava_state_neg(oop_tmp), R11_scratch1); - // R4_ARG2 = &state->_oop_temp; - __ addi(R4_ARG2, R11_scratch1, _ijava_state_neg(oop_tmp)); -- __ BIND(method_is_not_static); -+ BIND(method_is_not_static); - } - - // At this point, arguments have been copied off the stack into -@@ -1126,14 +1126,14 @@ - // interpreter will do the correct thing. If it isn't interpreted - // (call stub/compiled code) we will change our return and continue. - -- __ BIND(exception_return_sync_check); -+ BIND(exception_return_sync_check); - - if (synchronized) { - // Don't check for exceptions since we're still in the i2n frame. Do that - // manually afterwards. - unlock_method(false); - } -- __ BIND(exception_return_sync_check_already_unlocked); -+ BIND(exception_return_sync_check_already_unlocked); - - const Register return_pc = R31; - -@@ -1327,6 +1327,12 @@ - case Interpreter::java_lang_math_exp : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; - case Interpreter::java_lang_ref_reference_get - : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; -+ case Interpreter::java_util_zip_CRC32_update -+ : entry_point = ((InterpreterGenerator*)this)->generate_CRC32_update_entry(); break; -+ case Interpreter::java_util_zip_CRC32_updateBytes -+ : // fall thru -+ case Interpreter::java_util_zip_CRC32_updateByteBuffer -+ : entry_point = ((InterpreterGenerator*)this)->generate_CRC32_updateBytes_entry(kind); break; - default : ShouldNotReachHere(); break; - } - -@@ -1337,6 +1343,179 @@ - return ((InterpreterGenerator*) this)->generate_normal_entry(synchronized); - } - -+// CRC32 Intrinsics. -+// -+// Contract on scratch and work registers. -+// ======================================= -+// -+// On ppc, the register set {R2..R12} is available in the interpreter as scratch/work registers. -+// You should, however, keep in mind that {R3_ARG1..R10_ARG8} is the C-ABI argument register set. -+// You can't rely on these registers across calls. -+// -+// The generators for CRC32_update and for CRC32_updateBytes use the -+// scratch/work register set internally, passing the work registers -+// as arguments to the MacroAssembler emitters as required. -+// -+// R3_ARG1..R6_ARG4 are preset to hold the incoming java arguments. -+// Their contents is not constant but may change according to the requirements -+// of the emitted code. -+// -+// All other registers from the scratch/work register set are used "internally" -+// and contain garbage (i.e. unpredictable values) once blr() is reached. -+// Basically, only R3_RET contains a defined value which is the function result. -+// -+/** -+ * Method entry for static native methods: -+ * int java.util.zip.CRC32.update(int crc, int b) -+ */ -+address InterpreterGenerator::generate_CRC32_update_entry() { -+ address start = __ pc(); // Remember stub start address (is rtn value). -+ -+ if (UseCRC32Intrinsics) { -+ Label slow_path; -+ -+ // Safepoint check -+ const Register sync_state = R11_scratch1; -+ int sync_state_offs = __ load_const_optimized(sync_state, SafepointSynchronize::address_of_state(), /*temp*/R0, true); -+ __ lwz(sync_state, sync_state_offs, sync_state); -+ __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized); -+ __ bne(CCR0, slow_path); -+ -+ // We don't generate local frame and don't align stack because -+ // we not even call stub code (we generate the code inline) -+ // and there is no safepoint on this path. -+ -+ // Load java parameters. -+ // R15_esp is callers operand stack pointer, i.e. it points to the parameters. -+ const Register argP = R15_esp; -+ const Register crc = R3_ARG1; // crc value -+ const Register data = R4_ARG2; // address of java byte value (kernel_crc32 needs address) -+ const Register dataLen = R5_ARG3; // source data len (1 byte). Not used because calling the single-byte emitter. -+ const Register table = R6_ARG4; // address of crc32 table -+ const Register tmp = dataLen; // Reuse unused len register to show we don't actually need a separate tmp here. -+ -+ BLOCK_COMMENT("CRC32_update {"); -+ -+ // Arguments are reversed on java expression stack -+#ifdef VM_LITTLE_ENDIAN -+ __ addi(data, argP, 0+1*wordSize); // (stack) address of byte value. Emitter expects address, not value. -+ // Being passed as an int, the single byte is at offset +0. -+#else -+ __ addi(data, argP, 3+1*wordSize); // (stack) address of byte value. Emitter expects address, not value. -+ // Being passed from java as an int, the single byte is at offset +3. -+#endif -+ __ lwz(crc, 2*wordSize, argP); // Current crc state, zero extend to 64 bit to have a clean register. -+ -+ StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table); -+ __ kernel_crc32_singleByte(crc, data, dataLen, table, tmp); -+ -+ // Restore caller sp for c2i case and return. -+ __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started. -+ __ blr(); -+ -+ // Generate a vanilla native entry as the slow path. -+ BLOCK_COMMENT("} CRC32_update"); -+ BIND(slow_path); -+ } -+ -+ (void) generate_native_entry(false); -+ -+ return start; -+} -+ -+// CRC32 Intrinsics. -+/** -+ * Method entry for static native methods: -+ * int java.util.zip.CRC32.updateBytes( int crc, byte[] b, int off, int len) -+ * int java.util.zip.CRC32.updateByteBuffer(int crc, long* buf, int off, int len) -+ */ -+address InterpreterGenerator::generate_CRC32_updateBytes_entry(AbstractInterpreter::MethodKind kind) { -+ address start = __ pc(); // Remember stub start address (is rtn value). -+ -+ if (UseCRC32Intrinsics) { -+ Label slow_path; -+ -+ // Safepoint check -+ const Register sync_state = R11_scratch1; -+ int sync_state_offs = __ load_const_optimized(sync_state, SafepointSynchronize::address_of_state(), /*temp*/R0, true); -+ __ lwz(sync_state, sync_state_offs, sync_state); -+ __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized); -+ __ bne(CCR0, slow_path); -+ -+ // We don't generate local frame and don't align stack because -+ // we not even call stub code (we generate the code inline) -+ // and there is no safepoint on this path. -+ -+ // Load parameters. -+ // Z_esp is callers operand stack pointer, i.e. it points to the parameters. -+ const Register argP = R15_esp; -+ const Register crc = R3_ARG1; // crc value -+ const Register data = R4_ARG2; // address of java byte array -+ const Register dataLen = R5_ARG3; // source data len -+ const Register table = R6_ARG4; // address of crc32 table -+ -+ const Register t0 = R9; // scratch registers for crc calculation -+ const Register t1 = R10; -+ const Register t2 = R11; -+ const Register t3 = R12; -+ -+ const Register tc0 = R2; // registers to hold pre-calculated column addresses -+ const Register tc1 = R7; -+ const Register tc2 = R8; -+ const Register tc3 = table; // table address is reconstructed at the end of kernel_crc32_* emitters -+ -+ const Register tmp = t0; // Only used very locally to calculate byte buffer address. -+ -+ // Arguments are reversed on java expression stack. -+ // Calculate address of start element. -+ if (kind == Interpreter::java_util_zip_CRC32_updateByteBuffer) { // Used for "updateByteBuffer direct". -+ BLOCK_COMMENT("CRC32_updateByteBuffer {"); -+ // crc @ (SP + 5W) (32bit) -+ // buf @ (SP + 3W) (64bit ptr to long array) -+ // off @ (SP + 2W) (32bit) -+ // dataLen @ (SP + 1W) (32bit) -+ // data = buf + off -+ __ ld( data, 3*wordSize, argP); // start of byte buffer -+ __ lwa( tmp, 2*wordSize, argP); // byte buffer offset -+ __ lwa( dataLen, 1*wordSize, argP); // #bytes to process -+ __ lwz( crc, 5*wordSize, argP); // current crc state -+ __ add( data, data, tmp); // Add byte buffer offset. -+ } else { // Used for "updateBytes update". -+ BLOCK_COMMENT("CRC32_updateBytes {"); -+ // crc @ (SP + 4W) (32bit) -+ // buf @ (SP + 3W) (64bit ptr to byte array) -+ // off @ (SP + 2W) (32bit) -+ // dataLen @ (SP + 1W) (32bit) -+ // data = buf + off + base_offset -+ __ ld( data, 3*wordSize, argP); // start of byte buffer -+ __ lwa( tmp, 2*wordSize, argP); // byte buffer offset -+ __ lwa( dataLen, 1*wordSize, argP); // #bytes to process -+ __ add( data, data, tmp); // add byte buffer offset -+ __ lwz( crc, 4*wordSize, argP); // current crc state -+ __ addi(data, data, arrayOopDesc::base_offset_in_bytes(T_BYTE)); -+ } -+ -+ StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table); -+ -+ // Performance measurements show the 1word and 2word variants to be almost equivalent, -+ // with very light advantages for the 1word variant. We chose the 1word variant for -+ // code compactness. -+ __ kernel_crc32_1word(crc, data, dataLen, table, t0, t1, t2, t3, tc0, tc1, tc2, tc3); -+ -+ // Restore caller sp for c2i case and return. -+ __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started. -+ __ blr(); -+ -+ // Generate a vanilla native entry as the slow path. -+ BLOCK_COMMENT("} CRC32_updateBytes(Buffer)"); -+ BIND(slow_path); -+ } -+ -+ (void) generate_native_entry(false); -+ -+ return start; -+} -+ - // These should never be compiled since the interpreter will prefer - // the compiled version to the intrinsic version. - bool AbstractInterpreter::can_be_compiled(methodHandle m) { -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp -+++ openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp -@@ -150,10 +150,12 @@ - - assert(AllocatePrefetchStyle >= 0, "AllocatePrefetchStyle should be positive"); - -- if (UseCRC32Intrinsics) { -- if (!FLAG_IS_DEFAULT(UseCRC32Intrinsics)) -- warning("CRC32 intrinsics are not available on this CPU"); -- FLAG_SET_DEFAULT(UseCRC32Intrinsics, false); -+ // Implementation does not use any of the vector instructions -+ // available with Power8. Their exploitation is still pending. -+ if (!UseCRC32Intrinsics) { -+ if (FLAG_IS_DEFAULT(UseCRC32Intrinsics)) { -+ FLAG_SET_DEFAULT(UseCRC32Intrinsics, true); -+ } - } - - // The AES intrinsic stubs require AES instruction support. -diff --git openjdk.orig/hotspot/src/share/vm/opto/library_call.cpp openjdk/hotspot/src/share/vm/opto/library_call.cpp ---- openjdk.orig/hotspot/src/share/vm/opto/library_call.cpp -+++ openjdk/hotspot/src/share/vm/opto/library_call.cpp -@@ -6225,10 +6225,16 @@ - // Call the stub. - address stubAddr = StubRoutines::updateBytesCRC32(); - const char *stubName = "updateBytesCRC32"; -- -- Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), -- stubAddr, stubName, TypePtr::BOTTOM, -- crc, src_start, length); -+ Node* call; -+ if (CCallingConventionRequiresIntsAsLongs) { -+ call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), -+ stubAddr, stubName, TypePtr::BOTTOM, -+ crc XTOP, src_start, length XTOP); -+ } else { -+ call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), -+ stubAddr, stubName, TypePtr::BOTTOM, -+ crc, src_start, length); -+ } - Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); - set_result(result); - return true; -@@ -6257,10 +6263,16 @@ - // Call the stub. - address stubAddr = StubRoutines::updateBytesCRC32(); - const char *stubName = "updateBytesCRC32"; -- -- Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), -- stubAddr, stubName, TypePtr::BOTTOM, -- crc, src_start, length); -+ Node* call; -+ if (CCallingConventionRequiresIntsAsLongs) { -+ call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), -+ stubAddr, stubName, TypePtr::BOTTOM, -+ crc XTOP, src_start, length XTOP); -+ } else { -+ call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), -+ stubAddr, stubName, TypePtr::BOTTOM, -+ crc, src_start, length); -+ } - Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); - set_result(result); - return true; -diff --git openjdk.orig/hotspot/src/share/vm/opto/runtime.cpp openjdk/hotspot/src/share/vm/opto/runtime.cpp ---- openjdk.orig/hotspot/src/share/vm/opto/runtime.cpp -+++ openjdk/hotspot/src/share/vm/opto/runtime.cpp -@@ -848,13 +848,24 @@ - */ - const TypeFunc* OptoRuntime::updateBytesCRC32_Type() { - // create input type (domain) -- int num_args = 3; -+ int num_args = 3; - int argcnt = num_args; -+ if (CCallingConventionRequiresIntsAsLongs) { -+ argcnt += 2; -+ } - const Type** fields = TypeTuple::fields(argcnt); - int argp = TypeFunc::Parms; -- fields[argp++] = TypeInt::INT; // crc -- fields[argp++] = TypePtr::NOTNULL; // src -- fields[argp++] = TypeInt::INT; // len -+ if (CCallingConventionRequiresIntsAsLongs) { -+ fields[argp++] = TypeLong::LONG; // crc -+ fields[argp++] = Type::HALF; -+ fields[argp++] = TypePtr::NOTNULL; // src -+ fields[argp++] = TypeLong::LONG; // len -+ fields[argp++] = Type::HALF; -+ } else { -+ fields[argp++] = TypeInt::INT; // crc -+ fields[argp++] = TypePtr::NOTNULL; // src -+ fields[argp++] = TypeInt::INT; // len -+ } - assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); - const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); - diff --git a/SOURCES/jdk8145096-pr3693-undefined_behaviour.patch b/SOURCES/jdk8145096-pr3693-undefined_behaviour.patch deleted file mode 100644 index 51aed3c..0000000 --- a/SOURCES/jdk8145096-pr3693-undefined_behaviour.patch +++ /dev/null @@ -1,280 +0,0 @@ -# HG changeset patch -# User aph -# Date 1549014450 -3600 -# Fri Feb 01 10:47:30 2019 +0100 -# Node ID f43f77de876acfbf29c02803418d4d06d83e7dc3 -# Parent 28f68e5c6fb323c521a489cfc92e8a129379378f -8145096: Undefined behaviour in HotSpot -Summary: Fix some integer overflows -Reviewed-by: jrose, kvn, kbarrett, adinn, iklam - -diff --git openjdk.orig/hotspot/src/os/posix/vm/os_posix.cpp openjdk/hotspot/src/os/posix/vm/os_posix.cpp ---- openjdk.orig/hotspot/src/os/posix/vm/os_posix.cpp -+++ openjdk/hotspot/src/os/posix/vm/os_posix.cpp -@@ -604,7 +604,11 @@ - strncpy(buffer, "none", size); - - const struct { -- int i; -+ // NB: i is an unsigned int here because SA_RESETHAND is on some -+ // systems 0x80000000, which is implicitly unsigned. Assignining -+ // it to an int field would be an overflow in unsigned-to-signed -+ // conversion. -+ unsigned int i; - const char* s; - } flaginfo [] = { - { SA_NOCLDSTOP, "SA_NOCLDSTOP" }, -diff --git openjdk.orig/hotspot/src/share/vm/opto/addnode.cpp openjdk/hotspot/src/share/vm/opto/addnode.cpp ---- openjdk.orig/hotspot/src/share/vm/opto/addnode.cpp -+++ openjdk/hotspot/src/share/vm/opto/addnode.cpp -@@ -344,8 +344,8 @@ - const Type *AddINode::add_ring( const Type *t0, const Type *t1 ) const { - const TypeInt *r0 = t0->is_int(); // Handy access - const TypeInt *r1 = t1->is_int(); -- int lo = r0->_lo + r1->_lo; -- int hi = r0->_hi + r1->_hi; -+ int lo = java_add(r0->_lo, r1->_lo); -+ int hi = java_add(r0->_hi, r1->_hi); - if( !(r0->is_con() && r1->is_con()) ) { - // Not both constants, compute approximate result - if( (r0->_lo & r1->_lo) < 0 && lo >= 0 ) { -@@ -462,8 +462,8 @@ - const Type *AddLNode::add_ring( const Type *t0, const Type *t1 ) const { - const TypeLong *r0 = t0->is_long(); // Handy access - const TypeLong *r1 = t1->is_long(); -- jlong lo = r0->_lo + r1->_lo; -- jlong hi = r0->_hi + r1->_hi; -+ jlong lo = java_add(r0->_lo, r1->_lo); -+ jlong hi = java_add(r0->_hi, r1->_hi); - if( !(r0->is_con() && r1->is_con()) ) { - // Not both constants, compute approximate result - if( (r0->_lo & r1->_lo) < 0 && lo >= 0 ) { -diff --git openjdk.orig/hotspot/src/share/vm/opto/loopTransform.cpp openjdk/hotspot/src/share/vm/opto/loopTransform.cpp ---- openjdk.orig/hotspot/src/share/vm/opto/loopTransform.cpp -+++ openjdk/hotspot/src/share/vm/opto/loopTransform.cpp -@@ -1310,8 +1310,8 @@ - limit = new (C) Opaque2Node( C, limit ); - register_new_node( limit, opaq_ctrl ); - } -- if (stride_con > 0 && ((limit_type->_lo - stride_con) < limit_type->_lo) || -- stride_con < 0 && ((limit_type->_hi - stride_con) > limit_type->_hi)) { -+ if (stride_con > 0 && (java_subtract(limit_type->_lo, stride_con) < limit_type->_lo) || -+ stride_con < 0 && (java_subtract(limit_type->_hi, stride_con) > limit_type->_hi)) { - // No underflow. - new_limit = new (C) SubINode(limit, stride); - } else { -diff --git openjdk.orig/hotspot/src/share/vm/opto/mulnode.cpp openjdk/hotspot/src/share/vm/opto/mulnode.cpp ---- openjdk.orig/hotspot/src/share/vm/opto/mulnode.cpp -+++ openjdk/hotspot/src/share/vm/opto/mulnode.cpp -@@ -244,13 +244,13 @@ - double d = (double)hi1; - - // Compute all endpoints & check for overflow -- int32 A = lo0*lo1; -+ int32 A = java_multiply(lo0, lo1); - if( (double)A != a*c ) return TypeInt::INT; // Overflow? -- int32 B = lo0*hi1; -+ int32 B = java_multiply(lo0, hi1); - if( (double)B != a*d ) return TypeInt::INT; // Overflow? -- int32 C = hi0*lo1; -+ int32 C = java_multiply(hi0, lo1); - if( (double)C != b*c ) return TypeInt::INT; // Overflow? -- int32 D = hi0*hi1; -+ int32 D = java_multiply(hi0, hi1); - if( (double)D != b*d ) return TypeInt::INT; // Overflow? - - if( A < B ) { lo0 = A; hi0 = B; } // Sort range endpoints -@@ -340,13 +340,13 @@ - double d = (double)hi1; - - // Compute all endpoints & check for overflow -- jlong A = lo0*lo1; -+ jlong A = java_multiply(lo0, lo1); - if( (double)A != a*c ) return TypeLong::LONG; // Overflow? -- jlong B = lo0*hi1; -+ jlong B = java_multiply(lo0, hi1); - if( (double)B != a*d ) return TypeLong::LONG; // Overflow? -- jlong C = hi0*lo1; -+ jlong C = java_multiply(hi0, lo1); - if( (double)C != b*c ) return TypeLong::LONG; // Overflow? -- jlong D = hi0*hi1; -+ jlong D = java_multiply(hi0, hi1); - if( (double)D != b*d ) return TypeLong::LONG; // Overflow? - - if( A < B ) { lo0 = A; hi0 = B; } // Sort range endpoints -@@ -573,7 +573,8 @@ - // Masking off high bits which are always zero is useless. - const TypeLong* t1 = phase->type( in(1) )->isa_long(); - if (t1 != NULL && t1->_lo >= 0) { -- jlong t1_support = ((jlong)1 << (1 + log2_long(t1->_hi))) - 1; -+ int bit_count = log2_long(t1->_hi) + 1; -+ jlong t1_support = jlong(max_julong >> (BitsPerJavaLong - bit_count)); - if ((t1_support & con) == t1_support) - return usr; - } -@@ -801,7 +802,7 @@ - - // Check for ((x & ((CONST64(1)<<(64-c0))-1)) << c0) which ANDs off high bits - // before shifting them away. -- const jlong bits_mask = ((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - con)) - CONST64(1); -+ const jlong bits_mask = jlong(max_julong >> con); - if( add1_op == Op_AndL && - phase->type(add1->in(2)) == TypeLong::make( bits_mask ) ) - return new (phase->C) LShiftLNode( add1->in(1), in(2) ); -@@ -1253,7 +1254,7 @@ - if ( con == 0 ) return NULL; // let Identity() handle a 0 shift count - // note: mask computation below does not work for 0 shift count - // We'll be wanting the right-shift amount as a mask of that many bits -- const jlong mask = (((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - con)) -1); -+ const jlong mask = jlong(max_julong >> con); - - // Check for ((x << z) + Y) >>> z. Replace with x + con>>>z - // The idiom for rounding to a power of 2 is "(Q+(2^z-1)) >>> z". -diff --git openjdk.orig/hotspot/src/share/vm/opto/subnode.cpp openjdk/hotspot/src/share/vm/opto/subnode.cpp ---- openjdk.orig/hotspot/src/share/vm/opto/subnode.cpp -+++ openjdk/hotspot/src/share/vm/opto/subnode.cpp -@@ -252,8 +252,8 @@ - const Type *SubINode::sub( const Type *t1, const Type *t2 ) const { - const TypeInt *r0 = t1->is_int(); // Handy access - const TypeInt *r1 = t2->is_int(); -- int32 lo = r0->_lo - r1->_hi; -- int32 hi = r0->_hi - r1->_lo; -+ int32 lo = java_subtract(r0->_lo, r1->_hi); -+ int32 hi = java_subtract(r0->_hi, r1->_lo); - - // We next check for 32-bit overflow. - // If that happens, we just assume all integers are possible. -@@ -361,8 +361,8 @@ - const Type *SubLNode::sub( const Type *t1, const Type *t2 ) const { - const TypeLong *r0 = t1->is_long(); // Handy access - const TypeLong *r1 = t2->is_long(); -- jlong lo = r0->_lo - r1->_hi; -- jlong hi = r0->_hi - r1->_lo; -+ jlong lo = java_subtract(r0->_lo, r1->_hi); -+ jlong hi = java_subtract(r0->_hi, r1->_lo); - - // We next check for 32-bit overflow. - // If that happens, we just assume all integers are possible. -diff --git openjdk.orig/hotspot/src/share/vm/opto/type.cpp openjdk/hotspot/src/share/vm/opto/type.cpp ---- openjdk.orig/hotspot/src/share/vm/opto/type.cpp -+++ openjdk/hotspot/src/share/vm/opto/type.cpp -@@ -1329,8 +1329,8 @@ - - // The new type narrows the old type, so look for a "death march". - // See comments on PhaseTransform::saturate. -- juint nrange = _hi - _lo; -- juint orange = ohi - olo; -+ juint nrange = (juint)_hi - _lo; -+ juint orange = (juint)ohi - olo; - if (nrange < max_juint - 1 && nrange > (orange >> 1) + (SMALLINT*2)) { - // Use the new type only if the range shrinks a lot. - // We do not want the optimizer computing 2^31 point by point. -@@ -1363,7 +1363,7 @@ - //------------------------------hash------------------------------------------- - // Type-specific hashing function. - int TypeInt::hash(void) const { -- return _lo+_hi+_widen+(int)Type::Int; -+ return java_add(java_add(_lo, _hi), java_add(_widen, (int)Type::Int)); - } - - //------------------------------is_finite-------------------------------------- -@@ -1544,7 +1544,7 @@ - // If neither endpoint is extremal yet, push out the endpoint - // which is closer to its respective limit. - if (_lo >= 0 || // easy common case -- (julong)(_lo - min) >= (julong)(max - _hi)) { -+ ((julong)_lo - min) >= ((julong)max - _hi)) { - // Try to widen to an unsigned range type of 32/63 bits: - if (max >= max_juint && _hi < max_juint) - return make(_lo, max_juint, WidenMax); -@@ -2314,7 +2314,7 @@ - //------------------------------hash------------------------------------------- - // Type-specific hashing function. - int TypePtr::hash(void) const { -- return _ptr + _offset; -+ return java_add(_ptr, _offset); - } - - //------------------------------dump2------------------------------------------ -@@ -2904,12 +2904,8 @@ - // Type-specific hashing function. - int TypeOopPtr::hash(void) const { - return -- (const_oop() ? const_oop()->hash() : 0) + -- _klass_is_exact + -- _instance_id + -- hash_speculative() + -- _inline_depth + -- TypePtr::hash(); -+ java_add(java_add(java_add(const_oop() ? const_oop()->hash() : 0, _klass_is_exact), -+ java_add(_instance_id , hash_speculative())), java_add(_inline_depth , TypePtr::hash())); - } - - //------------------------------dump2------------------------------------------ -@@ -3635,7 +3631,7 @@ - //------------------------------hash------------------------------------------- - // Type-specific hashing function. - int TypeInstPtr::hash(void) const { -- int hash = klass()->hash() + TypeOopPtr::hash(); -+ int hash = java_add(klass()->hash(), TypeOopPtr::hash()); - return hash; - } - -@@ -4530,7 +4526,7 @@ - //------------------------------hash------------------------------------------- - // Type-specific hashing function. - int TypeKlassPtr::hash(void) const { -- return klass()->hash() + TypePtr::hash(); -+ return java_add(klass()->hash(), TypePtr::hash()); - } - - //------------------------------singleton-------------------------------------- -diff --git openjdk.orig/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp openjdk/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp ---- openjdk.orig/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp -+++ openjdk/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp -@@ -131,7 +131,8 @@ - } - - double AdvancedThresholdPolicy::weight(Method* method) { -- return (method->rate() + 1) * ((method->invocation_count() + 1) * (method->backedge_count() + 1)); -+ return (double)(method->rate() + 1) * -+ (method->invocation_count() + 1) * (method->backedge_count() + 1); - } - - // Apply heuristics and return true if x should be compiled before y -diff --git openjdk.orig/hotspot/src/share/vm/utilities/globalDefinitions.hpp openjdk/hotspot/src/share/vm/utilities/globalDefinitions.hpp ---- openjdk.orig/hotspot/src/share/vm/utilities/globalDefinitions.hpp -+++ openjdk/hotspot/src/share/vm/utilities/globalDefinitions.hpp -@@ -1403,6 +1403,32 @@ - - #define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0])) - -+//---------------------------------------------------------------------------------------------------- -+// Sum and product which can never overflow: they wrap, just like the -+// Java operations. Note that we don't intend these to be used for -+// general-purpose arithmetic: their purpose is to emulate Java -+// operations. -+ -+// The goal of this code to avoid undefined or implementation-defined -+// behaviour. The use of an lvalue to reference cast is explicitly -+// permitted by Lvalues and rvalues [basic.lval]. [Section 3.10 Para -+// 15 in C++03] -+#define JAVA_INTEGER_OP(OP, NAME, TYPE, UNSIGNED_TYPE) \ -+inline TYPE NAME (TYPE in1, TYPE in2) { \ -+ UNSIGNED_TYPE ures = static_cast(in1); \ -+ ures OP ## = static_cast(in2); \ -+ return reinterpret_cast(ures); \ -+} -+ -+JAVA_INTEGER_OP(+, java_add, jint, juint) -+JAVA_INTEGER_OP(-, java_subtract, jint, juint) -+JAVA_INTEGER_OP(*, java_multiply, jint, juint) -+JAVA_INTEGER_OP(+, java_add, jlong, julong) -+JAVA_INTEGER_OP(-, java_subtract, jlong, julong) -+JAVA_INTEGER_OP(*, java_multiply, jlong, julong) -+ -+#undef JAVA_INTEGER_OP -+ - // Dereference vptr - // All C++ compilers that we know of have the vtbl pointer in the first - // word. If there are exceptions, this function needs to be made compiler diff --git a/SOURCES/jdk8160748-aarch64_ideal_reg.patch b/SOURCES/jdk8160748-aarch64_ideal_reg.patch deleted file mode 100644 index b3e6ea6..0000000 --- a/SOURCES/jdk8160748-aarch64_ideal_reg.patch +++ /dev/null @@ -1,39 +0,0 @@ -# HG changeset patch -# User kbarrett -# Date 1547614745 0 -# Wed Jan 16 04:59:05 2019 +0000 -# Node ID bca8195a3bc70df281a73d9a40032c673971676c -# Parent 09abae195e9a7e134a1cfd9b375a6f4d95091de7 -8160748: [AArch64] Inconsistent types for ideal_reg -Summary: Made ideal_reg consistently uint. -Reviewed-by: kvn, iveresov - -diff --git openjdk.orig/hotspot/src/cpu/aarch64/vm/aarch64.ad openjdk/hotspot/src/cpu/aarch64/vm/aarch64.ad ---- openjdk.orig/hotspot/src/cpu/aarch64/vm/aarch64.ad -+++ openjdk/hotspot/src/cpu/aarch64/vm/aarch64.ad -@@ -1,6 +1,6 @@ - // -+// Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. - // Copyright (c) 2013, Red Hat Inc. --// Copyright (c) 2003, 2012, Oracle and/or its affiliates. - // All rights reserved. - // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - // -@@ -3449,7 +3449,7 @@ - } - - // Vector ideal reg. --const int Matcher::vector_ideal_reg(int len) { -+const uint Matcher::vector_ideal_reg(int len) { - switch(len) { - case 8: return Op_VecD; - case 16: return Op_VecX; -@@ -3458,7 +3458,7 @@ - return 0; - } - --const int Matcher::vector_shift_count_ideal_reg(int size) { -+const uint Matcher::vector_shift_count_ideal_reg(int size) { - return Op_VecX; - } - diff --git a/SOURCES/jdk8164920-pr3574-rh1498936-ppc_crc32_enhancement.patch b/SOURCES/jdk8164920-pr3574-rh1498936-ppc_crc32_enhancement.patch deleted file mode 100644 index 27a2ed4..0000000 --- a/SOURCES/jdk8164920-pr3574-rh1498936-ppc_crc32_enhancement.patch +++ /dev/null @@ -1,1152 +0,0 @@ -# HG changeset patch -# User mdoerr -# Date 1474539444 -7200 -# Thu Sep 22 12:17:24 2016 +0200 -# Node ID de4f1f9fbcc5b7b30e1a796b7cf88a16943e785f -# Parent 567e95df42f866b890dc3f0670e086d266915112 -8164920, PR3574, RH1498936: ppc: enhancement of CRC32 intrinsic -Reviewed-by: goetz, mdoerr -Contributed-by: Hiroshi H Horii - -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp -+++ openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp -@@ -468,6 +468,10 @@ - LVSL_OPCODE = (31u << OPCODE_SHIFT | 6u << 1), - LVSR_OPCODE = (31u << OPCODE_SHIFT | 38u << 1), - -+ // Vector-Scalar (VSX) instruction support. -+ MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1), -+ MFVSRD_OPCODE = (31u << OPCODE_SHIFT | 51u << 1), -+ - // Vector Permute and Formatting - VPKPX_OPCODE = (4u << OPCODE_SHIFT | 782u ), - VPKSHSS_OPCODE = (4u << OPCODE_SHIFT | 398u ), -@@ -1938,6 +1942,10 @@ - inline void mtvscr( VectorRegister b); - inline void mfvscr( VectorRegister d); - -+ // Vector-Scalar (VSX) instructions. -+ inline void mtvrd( VectorRegister d, Register a); -+ inline void mfvrd( Register a, VectorRegister d); -+ - // AES (introduced with Power 8) - inline void vcipher( VectorRegister d, VectorRegister a, VectorRegister b); - inline void vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b); -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp -+++ openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp -@@ -623,6 +623,10 @@ - inline void Assembler::lvsl( VectorRegister d, Register s1, Register s2) { emit_int32( LVSL_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } - inline void Assembler::lvsr( VectorRegister d, Register s1, Register s2) { emit_int32( LVSR_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } - -+// Vector-Scalar (VSX) instructions. -+inline void Assembler::mtvrd( VectorRegister d, Register a) { emit_int32( MTVSRD_OPCODE | vrt(d) | ra(a) | 1u); } // 1u: d is treated as Vector (VMX/Altivec). -+inline void Assembler::mfvrd( Register a, VectorRegister d) { emit_int32( MFVSRD_OPCODE | vrt(d) | ra(a) | 1u); } // 1u: d is treated as Vector (VMX/Altivec). -+ - inline void Assembler::vpkpx( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKPX_OPCODE | vrt(d) | vra(a) | vrb(b)); } - inline void Assembler::vpkshss( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKSHSS_OPCODE | vrt(d) | vra(a) | vrb(b)); } - inline void Assembler::vpkswss( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKSWSS_OPCODE | vrt(d) | vra(a) | vrb(b)); } -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp openjdk/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp -+++ openjdk/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp -@@ -3423,6 +3423,565 @@ - BLOCK_COMMENT("} kernel_crc32_1byte"); - } - -+/** -+ * @param crc register containing existing CRC (32-bit) -+ * @param buf register pointing to input byte buffer (byte*) -+ * @param len register containing number of bytes -+ * @param table register pointing to CRC table -+ * @param constants register pointing to CRC table for 128-bit aligned memory -+ * @param barretConstants register pointing to table for barrett reduction -+ * @param t0 volatile register -+ * @param t1 volatile register -+ * @param t2 volatile register -+ * @param t3 volatile register -+ */ -+void MacroAssembler::kernel_crc32_1word_vpmsumd(Register crc, Register buf, Register len, Register table, -+ Register constants, Register barretConstants, -+ Register t0, Register t1, Register t2, Register t3, Register t4) { -+ assert_different_registers(crc, buf, len, table); -+ -+ Label L_alignedHead, L_tail, L_alignTail, L_start, L_end; -+ -+ Register prealign = t0; -+ Register postalign = t0; -+ -+ BLOCK_COMMENT("kernel_crc32_1word_vpmsumb {"); -+ -+ // 1. use kernel_crc32_1word for shorter than 384bit -+ clrldi(len, len, 32); -+ cmpdi(CCR0, len, 384); -+ bge(CCR0, L_start); -+ -+ Register tc0 = t4; -+ Register tc1 = constants; -+ Register tc2 = barretConstants; -+ kernel_crc32_1word(crc, buf, len, table,t0, t1, t2, t3, tc0, tc1, tc2, table); -+ b(L_end); -+ -+ BIND(L_start); -+ -+ // 2. ~c -+ nand(crc, crc, crc); -+ -+ // 3. calculate from 0 to first 128bit-aligned address -+ clrldi_(prealign, buf, 57); -+ beq(CCR0, L_alignedHead); -+ -+ subfic(prealign, prealign, 128); -+ -+ subf(len, prealign, len); -+ update_byteLoop_crc32(crc, buf, prealign, table, t2, false, false); -+ -+ // 4. calculate from first 128bit-aligned address to last 128bit-aligned address -+ BIND(L_alignedHead); -+ -+ clrldi(postalign, len, 57); -+ subf(len, postalign, len); -+ -+ // len must be more than 256bit -+ kernel_crc32_1word_aligned(crc, buf, len, constants, barretConstants, t1, t2, t3); -+ -+ // 5. calculate remaining -+ cmpdi(CCR0, postalign, 0); -+ beq(CCR0, L_tail); -+ -+ update_byteLoop_crc32(crc, buf, postalign, table, t2, false, false); -+ -+ BIND(L_tail); -+ -+ // 6. ~c -+ nand(crc, crc, crc); -+ -+ BIND(L_end); -+ -+ BLOCK_COMMENT("} kernel_crc32_1word_vpmsumb"); -+} -+ -+/** -+ * @param crc register containing existing CRC (32-bit) -+ * @param buf register pointing to input byte buffer (byte*) -+ * @param len register containing number of bytes -+ * @param constants register pointing to CRC table for 128-bit aligned memory -+ * @param barretConstants register pointing to table for barrett reduction -+ * @param t0 volatile register -+ * @param t1 volatile register -+ * @param t2 volatile register -+ */ -+void MacroAssembler::kernel_crc32_1word_aligned(Register crc, Register buf, Register len, -+ Register constants, Register barretConstants, Register t0, Register t1, Register t2) { -+ Label L_mainLoop, L_tail, L_alignTail, L_barrett_reduction, L_end, L_first_warm_up_done, L_first_cool_down, L_second_cool_down, L_XOR, L_test; -+ Label L_lv0, L_lv1, L_lv2, L_lv3, L_lv4, L_lv5, L_lv6, L_lv7, L_lv8, L_lv9, L_lv10, L_lv11, L_lv12, L_lv13, L_lv14, L_lv15; -+ Label L_1, L_2, L_3, L_4; -+ -+ Register rLoaded = t0; -+ Register rTmp1 = t1; -+ Register rTmp2 = t2; -+ Register off16 = R22; -+ Register off32 = R23; -+ Register off48 = R24; -+ Register off64 = R25; -+ Register off80 = R26; -+ Register off96 = R27; -+ Register off112 = R28; -+ Register rIdx = R29; -+ Register rMax = R30; -+ Register constantsPos = R31; -+ -+ VectorRegister mask_32bit = VR24; -+ VectorRegister mask_64bit = VR25; -+ VectorRegister zeroes = VR26; -+ VectorRegister const1 = VR27; -+ VectorRegister const2 = VR28; -+ -+ // Save non-volatile vector registers (frameless). -+ Register offset = t1; int offsetInt = 0; -+ offsetInt -= 16; li(offset, -16); stvx(VR20, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR21, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR22, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR23, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR24, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR25, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR26, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR27, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); stvx(VR28, offset, R1_SP); -+ offsetInt -= 8; std(R22, offsetInt, R1_SP); -+ offsetInt -= 8; std(R23, offsetInt, R1_SP); -+ offsetInt -= 8; std(R24, offsetInt, R1_SP); -+ offsetInt -= 8; std(R25, offsetInt, R1_SP); -+ offsetInt -= 8; std(R26, offsetInt, R1_SP); -+ offsetInt -= 8; std(R27, offsetInt, R1_SP); -+ offsetInt -= 8; std(R28, offsetInt, R1_SP); -+ offsetInt -= 8; std(R29, offsetInt, R1_SP); -+ offsetInt -= 8; std(R30, offsetInt, R1_SP); -+ offsetInt -= 8; std(R31, offsetInt, R1_SP); -+ -+ // Set constants -+ li(off16, 16); -+ li(off32, 32); -+ li(off48, 48); -+ li(off64, 64); -+ li(off80, 80); -+ li(off96, 96); -+ li(off112, 112); -+ -+ clrldi(crc, crc, 32); -+ -+ vxor(zeroes, zeroes, zeroes); -+ vspltisw(VR0, -1); -+ -+ vsldoi(mask_32bit, zeroes, VR0, 4); -+ vsldoi(mask_64bit, zeroes, VR0, -8); -+ -+ // Get the initial value into v8 -+ vxor(VR8, VR8, VR8); -+ mtvrd(VR8, crc); -+ vsldoi(VR8, zeroes, VR8, -8); // shift into bottom 32 bits -+ -+ li (rLoaded, 0); -+ -+ rldicr(rIdx, len, 0, 56); -+ -+ { -+ BIND(L_1); -+ // Checksum in blocks of MAX_SIZE (32768) -+ lis(rMax, 0); -+ ori(rMax, rMax, 32768); -+ mr(rTmp2, rMax); -+ cmpd(CCR0, rIdx, rMax); -+ bgt(CCR0, L_2); -+ mr(rMax, rIdx); -+ -+ BIND(L_2); -+ subf(rIdx, rMax, rIdx); -+ -+ // our main loop does 128 bytes at a time -+ srdi(rMax, rMax, 7); -+ -+ /* -+ * Work out the offset into the constants table to start at. Each -+ * constant is 16 bytes, and it is used against 128 bytes of input -+ * data - 128 / 16 = 8 -+ */ -+ sldi(rTmp1, rMax, 4); -+ srdi(rTmp2, rTmp2, 3); -+ subf(rTmp1, rTmp1, rTmp2); -+ -+ // We reduce our final 128 bytes in a separate step -+ addi(rMax, rMax, -1); -+ mtctr(rMax); -+ -+ // Find the start of our constants -+ add(constantsPos, constants, rTmp1); -+ -+ // zero VR0-v7 which will contain our checksums -+ vxor(VR0, VR0, VR0); -+ vxor(VR1, VR1, VR1); -+ vxor(VR2, VR2, VR2); -+ vxor(VR3, VR3, VR3); -+ vxor(VR4, VR4, VR4); -+ vxor(VR5, VR5, VR5); -+ vxor(VR6, VR6, VR6); -+ vxor(VR7, VR7, VR7); -+ -+ lvx(const1, constantsPos); -+ -+ /* -+ * If we are looping back to consume more data we use the values -+ * already in VR16-v23. -+ */ -+ cmpdi(CCR0, rLoaded, 1); -+ beq(CCR0, L_3); -+ { -+ -+ // First warm up pass -+ lvx(VR16, buf); -+ lvx(VR17, off16, buf); -+ lvx(VR18, off32, buf); -+ lvx(VR19, off48, buf); -+ lvx(VR20, off64, buf); -+ lvx(VR21, off80, buf); -+ lvx(VR22, off96, buf); -+ lvx(VR23, off112, buf); -+ addi(buf, buf, 8*16); -+ -+ // xor in initial value -+ vxor(VR16, VR16, VR8); -+ } -+ -+ BIND(L_3); -+ bdz(L_first_warm_up_done); -+ -+ addi(constantsPos, constantsPos, 16); -+ lvx(const2, constantsPos); -+ -+ // Second warm up pass -+ vpmsumd(VR8, VR16, const1); -+ lvx(VR16, buf); -+ -+ vpmsumd(VR9, VR17, const1); -+ lvx(VR17, off16, buf); -+ -+ vpmsumd(VR10, VR18, const1); -+ lvx(VR18, off32, buf); -+ -+ vpmsumd(VR11, VR19, const1); -+ lvx(VR19, off48, buf); -+ -+ vpmsumd(VR12, VR20, const1); -+ lvx(VR20, off64, buf); -+ -+ vpmsumd(VR13, VR21, const1); -+ lvx(VR21, off80, buf); -+ -+ vpmsumd(VR14, VR22, const1); -+ lvx(VR22, off96, buf); -+ -+ vpmsumd(VR15, VR23, const1); -+ lvx(VR23, off112, buf); -+ -+ addi(buf, buf, 8 * 16); -+ -+ bdz(L_first_cool_down); -+ -+ /* -+ * main loop. We modulo schedule it such that it takes three iterations -+ * to complete - first iteration load, second iteration vpmsum, third -+ * iteration xor. -+ */ -+ { -+ BIND(L_4); -+ lvx(const1, constantsPos); addi(constantsPos, constantsPos, 16); -+ -+ vxor(VR0, VR0, VR8); -+ vpmsumd(VR8, VR16, const2); -+ lvx(VR16, buf); -+ -+ vxor(VR1, VR1, VR9); -+ vpmsumd(VR9, VR17, const2); -+ lvx(VR17, off16, buf); -+ -+ vxor(VR2, VR2, VR10); -+ vpmsumd(VR10, VR18, const2); -+ lvx(VR18, off32, buf); -+ -+ vxor(VR3, VR3, VR11); -+ vpmsumd(VR11, VR19, const2); -+ lvx(VR19, off48, buf); -+ lvx(const2, constantsPos); -+ -+ vxor(VR4, VR4, VR12); -+ vpmsumd(VR12, VR20, const1); -+ lvx(VR20, off64, buf); -+ -+ vxor(VR5, VR5, VR13); -+ vpmsumd(VR13, VR21, const1); -+ lvx(VR21, off80, buf); -+ -+ vxor(VR6, VR6, VR14); -+ vpmsumd(VR14, VR22, const1); -+ lvx(VR22, off96, buf); -+ -+ vxor(VR7, VR7, VR15); -+ vpmsumd(VR15, VR23, const1); -+ lvx(VR23, off112, buf); -+ -+ addi(buf, buf, 8 * 16); -+ -+ bdnz(L_4); -+ } -+ -+ BIND(L_first_cool_down); -+ -+ // First cool down pass -+ lvx(const1, constantsPos); -+ addi(constantsPos, constantsPos, 16); -+ -+ vxor(VR0, VR0, VR8); -+ vpmsumd(VR8, VR16, const1); -+ -+ vxor(VR1, VR1, VR9); -+ vpmsumd(VR9, VR17, const1); -+ -+ vxor(VR2, VR2, VR10); -+ vpmsumd(VR10, VR18, const1); -+ -+ vxor(VR3, VR3, VR11); -+ vpmsumd(VR11, VR19, const1); -+ -+ vxor(VR4, VR4, VR12); -+ vpmsumd(VR12, VR20, const1); -+ -+ vxor(VR5, VR5, VR13); -+ vpmsumd(VR13, VR21, const1); -+ -+ vxor(VR6, VR6, VR14); -+ vpmsumd(VR14, VR22, const1); -+ -+ vxor(VR7, VR7, VR15); -+ vpmsumd(VR15, VR23, const1); -+ -+ BIND(L_second_cool_down); -+ // Second cool down pass -+ vxor(VR0, VR0, VR8); -+ vxor(VR1, VR1, VR9); -+ vxor(VR2, VR2, VR10); -+ vxor(VR3, VR3, VR11); -+ vxor(VR4, VR4, VR12); -+ vxor(VR5, VR5, VR13); -+ vxor(VR6, VR6, VR14); -+ vxor(VR7, VR7, VR15); -+ -+ /* -+ * vpmsumd produces a 96 bit result in the least significant bits -+ * of the register. Since we are bit reflected we have to shift it -+ * left 32 bits so it occupies the least significant bits in the -+ * bit reflected domain. -+ */ -+ vsldoi(VR0, VR0, zeroes, 4); -+ vsldoi(VR1, VR1, zeroes, 4); -+ vsldoi(VR2, VR2, zeroes, 4); -+ vsldoi(VR3, VR3, zeroes, 4); -+ vsldoi(VR4, VR4, zeroes, 4); -+ vsldoi(VR5, VR5, zeroes, 4); -+ vsldoi(VR6, VR6, zeroes, 4); -+ vsldoi(VR7, VR7, zeroes, 4); -+ -+ // xor with last 1024 bits -+ lvx(VR8, buf); -+ lvx(VR9, off16, buf); -+ lvx(VR10, off32, buf); -+ lvx(VR11, off48, buf); -+ lvx(VR12, off64, buf); -+ lvx(VR13, off80, buf); -+ lvx(VR14, off96, buf); -+ lvx(VR15, off112, buf); -+ addi(buf, buf, 8 * 16); -+ -+ vxor(VR16, VR0, VR8); -+ vxor(VR17, VR1, VR9); -+ vxor(VR18, VR2, VR10); -+ vxor(VR19, VR3, VR11); -+ vxor(VR20, VR4, VR12); -+ vxor(VR21, VR5, VR13); -+ vxor(VR22, VR6, VR14); -+ vxor(VR23, VR7, VR15); -+ -+ li(rLoaded, 1); -+ cmpdi(CCR0, rIdx, 0); -+ addi(rIdx, rIdx, 128); -+ bne(CCR0, L_1); -+ } -+ -+ // Work out how many bytes we have left -+ andi_(len, len, 127); -+ -+ // Calculate where in the constant table we need to start -+ subfic(rTmp1, len, 128); -+ add(constantsPos, constantsPos, rTmp1); -+ -+ // How many 16 byte chunks are in the tail -+ srdi(rIdx, len, 4); -+ mtctr(rIdx); -+ -+ /* -+ * Reduce the previously calculated 1024 bits to 64 bits, shifting -+ * 32 bits to include the trailing 32 bits of zeros -+ */ -+ lvx(VR0, constantsPos); -+ lvx(VR1, off16, constantsPos); -+ lvx(VR2, off32, constantsPos); -+ lvx(VR3, off48, constantsPos); -+ lvx(VR4, off64, constantsPos); -+ lvx(VR5, off80, constantsPos); -+ lvx(VR6, off96, constantsPos); -+ lvx(VR7, off112, constantsPos); -+ addi(constantsPos, constantsPos, 8 * 16); -+ -+ vpmsumw(VR0, VR16, VR0); -+ vpmsumw(VR1, VR17, VR1); -+ vpmsumw(VR2, VR18, VR2); -+ vpmsumw(VR3, VR19, VR3); -+ vpmsumw(VR4, VR20, VR4); -+ vpmsumw(VR5, VR21, VR5); -+ vpmsumw(VR6, VR22, VR6); -+ vpmsumw(VR7, VR23, VR7); -+ -+ // Now reduce the tail (0 - 112 bytes) -+ cmpdi(CCR0, rIdx, 0); -+ beq(CCR0, L_XOR); -+ -+ lvx(VR16, buf); addi(buf, buf, 16); -+ lvx(VR17, constantsPos); -+ vpmsumw(VR16, VR16, VR17); -+ vxor(VR0, VR0, VR16); -+ beq(CCR0, L_XOR); -+ -+ lvx(VR16, buf); addi(buf, buf, 16); -+ lvx(VR17, off16, constantsPos); -+ vpmsumw(VR16, VR16, VR17); -+ vxor(VR0, VR0, VR16); -+ beq(CCR0, L_XOR); -+ -+ lvx(VR16, buf); addi(buf, buf, 16); -+ lvx(VR17, off32, constantsPos); -+ vpmsumw(VR16, VR16, VR17); -+ vxor(VR0, VR0, VR16); -+ beq(CCR0, L_XOR); -+ -+ lvx(VR16, buf); addi(buf, buf, 16); -+ lvx(VR17, off48,constantsPos); -+ vpmsumw(VR16, VR16, VR17); -+ vxor(VR0, VR0, VR16); -+ beq(CCR0, L_XOR); -+ -+ lvx(VR16, buf); addi(buf, buf, 16); -+ lvx(VR17, off64, constantsPos); -+ vpmsumw(VR16, VR16, VR17); -+ vxor(VR0, VR0, VR16); -+ beq(CCR0, L_XOR); -+ -+ lvx(VR16, buf); addi(buf, buf, 16); -+ lvx(VR17, off80, constantsPos); -+ vpmsumw(VR16, VR16, VR17); -+ vxor(VR0, VR0, VR16); -+ beq(CCR0, L_XOR); -+ -+ lvx(VR16, buf); addi(buf, buf, 16); -+ lvx(VR17, off96, constantsPos); -+ vpmsumw(VR16, VR16, VR17); -+ vxor(VR0, VR0, VR16); -+ -+ // Now xor all the parallel chunks together -+ BIND(L_XOR); -+ vxor(VR0, VR0, VR1); -+ vxor(VR2, VR2, VR3); -+ vxor(VR4, VR4, VR5); -+ vxor(VR6, VR6, VR7); -+ -+ vxor(VR0, VR0, VR2); -+ vxor(VR4, VR4, VR6); -+ -+ vxor(VR0, VR0, VR4); -+ -+ b(L_barrett_reduction); -+ -+ BIND(L_first_warm_up_done); -+ lvx(const1, constantsPos); -+ addi(constantsPos, constantsPos, 16); -+ vpmsumd(VR8, VR16, const1); -+ vpmsumd(VR9, VR17, const1); -+ vpmsumd(VR10, VR18, const1); -+ vpmsumd(VR11, VR19, const1); -+ vpmsumd(VR12, VR20, const1); -+ vpmsumd(VR13, VR21, const1); -+ vpmsumd(VR14, VR22, const1); -+ vpmsumd(VR15, VR23, const1); -+ b(L_second_cool_down); -+ -+ BIND(L_barrett_reduction); -+ -+ lvx(const1, barretConstants); -+ addi(barretConstants, barretConstants, 16); -+ lvx(const2, barretConstants); -+ -+ vsldoi(VR1, VR0, VR0, -8); -+ vxor(VR0, VR0, VR1); // xor two 64 bit results together -+ -+ // shift left one bit -+ vspltisb(VR1, 1); -+ vsl(VR0, VR0, VR1); -+ -+ vand(VR0, VR0, mask_64bit); -+ -+ /* -+ * The reflected version of Barrett reduction. Instead of bit -+ * reflecting our data (which is expensive to do), we bit reflect our -+ * constants and our algorithm, which means the intermediate data in -+ * our vector registers goes from 0-63 instead of 63-0. We can reflect -+ * the algorithm because we don't carry in mod 2 arithmetic. -+ */ -+ vand(VR1, VR0, mask_32bit); // bottom 32 bits of a -+ vpmsumd(VR1, VR1, const1); // ma -+ vand(VR1, VR1, mask_32bit); // bottom 32bits of ma -+ vpmsumd(VR1, VR1, const2); // qn */ -+ vxor(VR0, VR0, VR1); // a - qn, subtraction is xor in GF(2) -+ -+ /* -+ * Since we are bit reflected, the result (ie the low 32 bits) is in -+ * the high 32 bits. We just need to shift it left 4 bytes -+ * V0 [ 0 1 X 3 ] -+ * V0 [ 0 X 2 3 ] -+ */ -+ vsldoi(VR0, VR0, zeroes, 4); // shift result into top 64 bits of -+ -+ // Get it into r3 -+ mfvrd(crc, VR0); -+ -+ BIND(L_end); -+ -+ offsetInt = 0; -+ // Restore non-volatile Vector registers (frameless). -+ offsetInt -= 16; li(offset, -16); lvx(VR20, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR21, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR22, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR23, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR24, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR25, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR26, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR27, offset, R1_SP); -+ offsetInt -= 16; addi(offset, offset, -16); lvx(VR28, offset, R1_SP); -+ offsetInt -= 8; ld(R22, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R23, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R24, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R25, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R26, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R27, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R28, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R29, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R30, offsetInt, R1_SP); -+ offsetInt -= 8; ld(R31, offsetInt, R1_SP); -+} -+ - void MacroAssembler::kernel_crc32_singleByte(Register crc, Register buf, Register len, Register table, Register tmp) { - assert_different_registers(crc, buf, /* len, not used!! */ table, tmp); - -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp openjdk/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp -+++ openjdk/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp -@@ -656,6 +656,13 @@ - Register tc0, Register tc1, Register tc2, Register tc3); - void kernel_crc32_1byte(Register crc, Register buf, Register len, Register table, - Register t0, Register t1, Register t2, Register t3); -+ void kernel_crc32_1word_vpmsumd(Register crc, Register buf, Register len, Register table, -+ Register constants, Register barretConstants, -+ Register t0, Register t1, Register t2, Register t3, Register t4); -+ void kernel_crc32_1word_aligned(Register crc, Register buf, Register len, -+ Register constants, Register barretConstants, -+ Register t0, Register t1, Register t2); -+ - void kernel_crc32_singleByte(Register crc, Register buf, Register len, Register table, Register tmp); - - // -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp openjdk/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp -+++ openjdk/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp -@@ -2482,9 +2482,7 @@ - * R5_ARG3 - int length (of buffer) - * - * scratch: -- * R6_ARG4 - crc table address -- * R7_ARG5 - tmp1 -- * R8_ARG6 - tmp2 -+ * R2, R6-R12 - * - * Ouput: - * R3_RET - int crc result -@@ -2496,28 +2494,62 @@ - address start = __ function_entry(); // Remember stub start address (is rtn value). - - // arguments to kernel_crc32: -- Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call. -- Register data = R4_ARG2; // source byte array -- Register dataLen = R5_ARG3; // #bytes to process -- Register table = R6_ARG4; // crc table address -- -- Register t0 = R9; // work reg for kernel* emitters -- Register t1 = R10; // work reg for kernel* emitters -- Register t2 = R11; // work reg for kernel* emitters -- Register t3 = R12; // work reg for kernel* emitters -- -- BLOCK_COMMENT("Stub body {"); -- assert_different_registers(crc, data, dataLen, table); -- -- StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table); -- -- __ kernel_crc32_1byte(crc, data, dataLen, table, t0, t1, t2, t3); -- -- BLOCK_COMMENT("return"); -- __ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET). -- __ blr(); -- -- BLOCK_COMMENT("} Stub body"); -+ const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call. -+ const Register data = R4_ARG2; // source byte array -+ const Register dataLen = R5_ARG3; // #bytes to process -+ -+ const Register table = R6; // crc table address -+ -+#ifdef VM_LITTLE_ENDIAN -+ if (VM_Version::has_vpmsumb()) { -+ const Register constants = R2; // constants address -+ const Register bconstants = R8; // barret table address -+ -+ const Register t0 = R9; -+ const Register t1 = R10; -+ const Register t2 = R11; -+ const Register t3 = R12; -+ const Register t4 = R7; -+ -+ BLOCK_COMMENT("Stub body {"); -+ assert_different_registers(crc, data, dataLen, table); -+ -+ StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table); -+ StubRoutines::ppc64::generate_load_crc_constants_addr(_masm, constants); -+ StubRoutines::ppc64::generate_load_crc_barret_constants_addr(_masm, bconstants); -+ -+ __ kernel_crc32_1word_vpmsumd(crc, data, dataLen, table, constants, bconstants, t0, t1, t2, t3, t4); -+ -+ BLOCK_COMMENT("return"); -+ __ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET). -+ __ blr(); -+ -+ BLOCK_COMMENT("} Stub body"); -+ } else -+#endif -+ { -+ const Register t0 = R2; -+ const Register t1 = R7; -+ const Register t2 = R8; -+ const Register t3 = R9; -+ const Register tc0 = R10; -+ const Register tc1 = R11; -+ const Register tc2 = R12; -+ -+ BLOCK_COMMENT("Stub body {"); -+ assert_different_registers(crc, data, dataLen, table); -+ -+ StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table); -+ -+ __ kernel_crc32_1word(crc, data, dataLen, table, t0, t1, t2, t3, tc0, tc1, tc2, table); -+ -+ BLOCK_COMMENT("return"); -+ __ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET). -+ __ blr(); -+ -+ BLOCK_COMMENT("} Stub body"); -+ } -+ - return start; - } - -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.cpp openjdk/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.cpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.cpp -+++ openjdk/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.cpp -@@ -37,6 +37,311 @@ - __ load_const(table, StubRoutines::_crc_table_adr); - } - -+void StubRoutines::ppc64::generate_load_crc_constants_addr(MacroAssembler* masm, Register table) { -+ __ load_const_optimized(table, (address)StubRoutines::ppc64::_constants, R0); -+} -+ -+void StubRoutines::ppc64::generate_load_crc_barret_constants_addr(MacroAssembler* masm, Register table) { -+ __ load_const_optimized(table, (address)StubRoutines::ppc64::_barret_constants, R0); -+} -+ -+juint* StubRoutines::ppc64::generate_crc_constants() { -+ juint constants[CRC32_CONSTANTS_SIZE] = { -+ // Reduce 262144 kbits to 1024 bits -+ 0x99ea94a8UL, 0x00000000UL, 0x651797d2UL, 0x00000001UL, // x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 -+ 0x945a8420UL, 0x00000000UL, 0x21e0d56cUL, 0x00000000UL, // x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 -+ 0x30762706UL, 0x00000000UL, 0x0f95ecaaUL, 0x00000000UL, // x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 -+ 0xa52fc582UL, 0x00000001UL, 0xebd224acUL, 0x00000001UL, // x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 -+ 0xa4a7167aUL, 0x00000001UL, 0x0ccb97caUL, 0x00000000UL, // x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 -+ 0x0c18249aUL, 0x00000000UL, 0x006ec8a8UL, 0x00000001UL, // x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 -+ 0xa924ae7cUL, 0x00000000UL, 0x4f58f196UL, 0x00000001UL, // x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 -+ 0xe12ccc12UL, 0x00000001UL, 0xa7192ca6UL, 0x00000001UL, // x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 -+ 0xa0b9d4acUL, 0x00000000UL, 0x9a64bab2UL, 0x00000001UL, // x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 -+ 0x95e8ddfeUL, 0x00000000UL, 0x14f4ed2eUL, 0x00000000UL, // x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 -+ 0x233fddc4UL, 0x00000000UL, 0x1092b6a2UL, 0x00000001UL, // x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 -+ 0xb4529b62UL, 0x00000001UL, 0xc8a1629cUL, 0x00000000UL, // x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 -+ 0xa7fa0e64UL, 0x00000001UL, 0x7bf32e8eUL, 0x00000001UL, // x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 -+ 0xb5334592UL, 0x00000001UL, 0xf8cc6582UL, 0x00000001UL, // x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 -+ 0x1f8ee1b4UL, 0x00000001UL, 0x8631ddf0UL, 0x00000000UL, // x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 -+ 0x6252e632UL, 0x00000000UL, 0x7e5a76d0UL, 0x00000000UL, // x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 -+ 0xab973e84UL, 0x00000000UL, 0x2b09b31cUL, 0x00000000UL, // x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 -+ 0x7734f5ecUL, 0x00000000UL, 0xb2df1f84UL, 0x00000001UL, // x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 -+ 0x7c547798UL, 0x00000000UL, 0xd6f56afcUL, 0x00000001UL, // x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 -+ 0x7ec40210UL, 0x00000000UL, 0xb9b5e70cUL, 0x00000001UL, // x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 -+ 0xab1695a8UL, 0x00000001UL, 0x34b626d2UL, 0x00000000UL, // x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 -+ 0x90494bbaUL, 0x00000000UL, 0x4c53479aUL, 0x00000001UL, // x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 -+ 0x123fb816UL, 0x00000001UL, 0xa6d179a4UL, 0x00000001UL, // x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 -+ 0xe188c74cUL, 0x00000001UL, 0x5abd16b4UL, 0x00000001UL, // x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 -+ 0xc2d3451cUL, 0x00000001UL, 0x018f9852UL, 0x00000000UL, // x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 -+ 0xf55cf1caUL, 0x00000000UL, 0x1fb3084aUL, 0x00000000UL, // x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 -+ 0xa0531540UL, 0x00000001UL, 0xc53dfb04UL, 0x00000000UL, // x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 -+ 0x32cd7ebcUL, 0x00000001UL, 0xe10c9ad6UL, 0x00000000UL, // x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 -+ 0x73ab7f36UL, 0x00000000UL, 0x25aa994aUL, 0x00000000UL, // x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 -+ 0x41aed1c2UL, 0x00000000UL, 0xfa3a74c4UL, 0x00000000UL, // x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 -+ 0x36c53800UL, 0x00000001UL, 0x33eb3f40UL, 0x00000000UL, // x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 -+ 0x26835a30UL, 0x00000001UL, 0x7193f296UL, 0x00000001UL, // x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 -+ 0x6241b502UL, 0x00000000UL, 0x43f6c86aUL, 0x00000000UL, // x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 -+ 0xd5196ad4UL, 0x00000000UL, 0x6b513ec6UL, 0x00000001UL, // x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 -+ 0x9cfa769aUL, 0x00000000UL, 0xc8f25b4eUL, 0x00000000UL, // x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 -+ 0x920e5df4UL, 0x00000000UL, 0xa45048ecUL, 0x00000001UL, // x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 -+ 0x69dc310eUL, 0x00000001UL, 0x0c441004UL, 0x00000000UL, // x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 -+ 0x09fc331cUL, 0x00000000UL, 0x0e17cad6UL, 0x00000000UL, // x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 -+ 0x0d94a81eUL, 0x00000001UL, 0x253ae964UL, 0x00000001UL, // x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 -+ 0x27a20ab2UL, 0x00000000UL, 0xd7c88ebcUL, 0x00000001UL, // x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 -+ 0x14f87504UL, 0x00000001UL, 0xe7ca913aUL, 0x00000001UL, // x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 -+ 0x4b076d96UL, 0x00000000UL, 0x33ed078aUL, 0x00000000UL, // x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 -+ 0xda4d1e74UL, 0x00000000UL, 0xe1839c78UL, 0x00000000UL, // x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 -+ 0x1b81f672UL, 0x00000000UL, 0x322b267eUL, 0x00000001UL, // x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 -+ 0x9367c988UL, 0x00000000UL, 0x638231b6UL, 0x00000000UL, // x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 -+ 0x717214caUL, 0x00000001UL, 0xee7f16f4UL, 0x00000001UL, // x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 -+ 0x9f47d820UL, 0x00000000UL, 0x17d9924aUL, 0x00000001UL, // x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 -+ 0x0d9a47d2UL, 0x00000001UL, 0xe1a9e0c4UL, 0x00000000UL, // x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 -+ 0xa696c58cUL, 0x00000000UL, 0x403731dcUL, 0x00000001UL, // x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 -+ 0x2aa28ec6UL, 0x00000000UL, 0xa5ea9682UL, 0x00000001UL, // x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 -+ 0xfe18fd9aUL, 0x00000001UL, 0x01c5c578UL, 0x00000001UL, // x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 -+ 0x9d4fc1aeUL, 0x00000001UL, 0xdddf6494UL, 0x00000000UL, // x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 -+ 0xba0e3deaUL, 0x00000001UL, 0xf1c3db28UL, 0x00000000UL, // x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 -+ 0x74b59a5eUL, 0x00000000UL, 0x3112fb9cUL, 0x00000001UL, // x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 -+ 0xf2b5ea98UL, 0x00000000UL, 0xb680b906UL, 0x00000000UL, // x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 -+ 0x87132676UL, 0x00000001UL, 0x1a282932UL, 0x00000000UL, // x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 -+ 0x0a8c6ad4UL, 0x00000001UL, 0x89406e7eUL, 0x00000000UL, // x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 -+ 0xe21dfe70UL, 0x00000001UL, 0xdef6be8cUL, 0x00000001UL, // x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 -+ 0xda0050e4UL, 0x00000001UL, 0x75258728UL, 0x00000000UL, // x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 -+ 0x772172aeUL, 0x00000000UL, 0x9536090aUL, 0x00000001UL, // x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 -+ 0xe47724aaUL, 0x00000000UL, 0xf2455bfcUL, 0x00000000UL, // x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 -+ 0x3cd63ac4UL, 0x00000000UL, 0x8c40baf4UL, 0x00000001UL, // x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 -+ 0xbf47d352UL, 0x00000001UL, 0x4cd390d4UL, 0x00000000UL, // x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 -+ 0x8dc1d708UL, 0x00000001UL, 0xe4ece95aUL, 0x00000001UL, // x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 -+ 0x2d4620a4UL, 0x00000000UL, 0x1a3ee918UL, 0x00000000UL, // x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 -+ 0x58fd1740UL, 0x00000000UL, 0x7c652fb8UL, 0x00000000UL, // x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 -+ 0xdadd9bfcUL, 0x00000000UL, 0x1c67842cUL, 0x00000001UL, // x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 -+ 0xea2140beUL, 0x00000001UL, 0x254f759cUL, 0x00000000UL, // x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 -+ 0x9de128baUL, 0x00000000UL, 0x7ece94caUL, 0x00000000UL, // x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 -+ 0x3ac3aa8eUL, 0x00000001UL, 0x38f258c2UL, 0x00000000UL, // x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 -+ 0x99980562UL, 0x00000000UL, 0xcdf17b00UL, 0x00000001UL, // x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 -+ 0xc1579c86UL, 0x00000001UL, 0x1f882c16UL, 0x00000001UL, // x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 -+ 0x68dbbf94UL, 0x00000000UL, 0x00093fc8UL, 0x00000001UL, // x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 -+ 0x4509fb04UL, 0x00000000UL, 0xcd684f16UL, 0x00000001UL, // x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 -+ 0x202f6398UL, 0x00000001UL, 0x4bc6a70aUL, 0x00000000UL, // x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 -+ 0x3aea243eUL, 0x00000001UL, 0x4fc7e8e4UL, 0x00000000UL, // x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 -+ 0xb4052ae6UL, 0x00000001UL, 0x30103f1cUL, 0x00000001UL, // x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 -+ 0xcd2a0ae8UL, 0x00000001UL, 0x11b0024cUL, 0x00000001UL, // x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 -+ 0xfe4aa8b4UL, 0x00000001UL, 0x0b3079daUL, 0x00000001UL, // x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 -+ 0xd1559a42UL, 0x00000001UL, 0x0192bcc2UL, 0x00000001UL, // x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 -+ 0xf3e05eccUL, 0x00000001UL, 0x74838d50UL, 0x00000000UL, // x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 -+ 0x04ddd2ccUL, 0x00000001UL, 0x1b20f520UL, 0x00000000UL, // x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 -+ 0x5393153cUL, 0x00000001UL, 0x50c3590aUL, 0x00000000UL, // x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 -+ 0x57e942c6UL, 0x00000000UL, 0xb41cac8eUL, 0x00000000UL, // x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 -+ 0x2c633850UL, 0x00000001UL, 0x0c72cc78UL, 0x00000000UL, // x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 -+ 0xebcaae4cUL, 0x00000000UL, 0x30cdb032UL, 0x00000000UL, // x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 -+ 0x3ee532a6UL, 0x00000001UL, 0x3e09fc32UL, 0x00000001UL, // x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 -+ 0xbf0cbc7eUL, 0x00000001UL, 0x1ed624d2UL, 0x00000000UL, // x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 -+ 0xd50b7a5aUL, 0x00000000UL, 0x781aee1aUL, 0x00000000UL, // x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 -+ 0x02fca6e8UL, 0x00000000UL, 0xc4d8348cUL, 0x00000001UL, // x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 -+ 0x7af40044UL, 0x00000000UL, 0x57a40336UL, 0x00000000UL, // x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 -+ 0x16178744UL, 0x00000000UL, 0x85544940UL, 0x00000000UL, // x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 -+ 0x4c177458UL, 0x00000001UL, 0x9cd21e80UL, 0x00000001UL, // x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 -+ 0x1b6ddf04UL, 0x00000001UL, 0x3eb95bc0UL, 0x00000001UL, // x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 -+ 0xf3e29cccUL, 0x00000001UL, 0xdfc9fdfcUL, 0x00000001UL, // x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 -+ 0x35ae7562UL, 0x00000001UL, 0xcd028bc2UL, 0x00000000UL, // x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 -+ 0x90ef812cUL, 0x00000001UL, 0x90db8c44UL, 0x00000000UL, // x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 -+ 0x67a2c786UL, 0x00000000UL, 0x0010a4ceUL, 0x00000001UL, // x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 -+ 0x48b9496cUL, 0x00000000UL, 0xc8f4c72cUL, 0x00000001UL, // x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 -+ 0x5a422de6UL, 0x00000001UL, 0x1c26170cUL, 0x00000000UL, // x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 -+ 0xef0e3640UL, 0x00000001UL, 0xe3fccf68UL, 0x00000000UL, // x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 -+ 0x006d2d26UL, 0x00000001UL, 0xd513ed24UL, 0x00000000UL, // x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 -+ 0x170d56d6UL, 0x00000001UL, 0x141beadaUL, 0x00000000UL, // x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 -+ 0xa5fb613cUL, 0x00000000UL, 0x1071aea0UL, 0x00000001UL, // x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 -+ 0x40bbf7fcUL, 0x00000000UL, 0x2e19080aUL, 0x00000001UL, // x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 -+ 0x6ac3a5b2UL, 0x00000001UL, 0x00ecf826UL, 0x00000001UL, // x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 -+ 0xabf16230UL, 0x00000000UL, 0x69b09412UL, 0x00000000UL, // x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 -+ 0xebe23facUL, 0x00000001UL, 0x22297bacUL, 0x00000001UL, // x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 -+ 0x8b6a0894UL, 0x00000000UL, 0xe9e4b068UL, 0x00000000UL, // x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 -+ 0x288ea478UL, 0x00000001UL, 0x4b38651aUL, 0x00000000UL, // x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 -+ 0x6619c442UL, 0x00000001UL, 0x468360e2UL, 0x00000001UL, // x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 -+ 0x86230038UL, 0x00000000UL, 0x121c2408UL, 0x00000000UL, // x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 -+ 0x7746a756UL, 0x00000001UL, 0xda7e7d08UL, 0x00000000UL, // x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 -+ 0x91b8f8f8UL, 0x00000001UL, 0x058d7652UL, 0x00000001UL, // x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 -+ 0x8e167708UL, 0x00000000UL, 0x4a098a90UL, 0x00000001UL, // x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 -+ 0x48b22d54UL, 0x00000001UL, 0x20dbe72eUL, 0x00000000UL, // x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 -+ 0x44ba2c3cUL, 0x00000000UL, 0x1e7323e8UL, 0x00000001UL, // x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 -+ 0xb54d2b52UL, 0x00000000UL, 0xd5d4bf94UL, 0x00000000UL, // x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 -+ 0x05a4fd8aUL, 0x00000000UL, 0x99d8746cUL, 0x00000001UL, // x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 -+ 0x39f9fc46UL, 0x00000001UL, 0xce9ca8a0UL, 0x00000000UL, // x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 -+ 0x5a1fa824UL, 0x00000001UL, 0x136edeceUL, 0x00000000UL, // x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 -+ 0x0a61ae4cUL, 0x00000000UL, 0x9b92a068UL, 0x00000001UL, // x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 -+ 0x45e9113eUL, 0x00000001UL, 0x71d62206UL, 0x00000000UL, // x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 -+ 0x6a348448UL, 0x00000000UL, 0xdfc50158UL, 0x00000000UL, // x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 -+ 0x4d80a08cUL, 0x00000000UL, 0x517626bcUL, 0x00000001UL, // x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 -+ 0x4b6837a0UL, 0x00000001UL, 0x48d1e4faUL, 0x00000001UL, // x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 -+ 0x6896a7fcUL, 0x00000001UL, 0x94d8266eUL, 0x00000000UL, // x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 -+ 0x4f187140UL, 0x00000001UL, 0x606c5e34UL, 0x00000000UL, // x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 -+ 0x9581b9daUL, 0x00000001UL, 0x9766beaaUL, 0x00000001UL, // x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 -+ 0x091bc984UL, 0x00000001UL, 0xd80c506cUL, 0x00000001UL, // x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 -+ 0x1067223cUL, 0x00000000UL, 0x1e73837cUL, 0x00000000UL, // x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 -+ 0xab16ea02UL, 0x00000001UL, 0x64d587deUL, 0x00000000UL, // x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 -+ 0x3c4598a8UL, 0x00000001UL, 0xf4a507b0UL, 0x00000000UL, // x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 -+ 0xb3735430UL, 0x00000000UL, 0x40e342fcUL, 0x00000000UL, // x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 -+ 0xbb3fc0c0UL, 0x00000001UL, 0xd5ad9c3aUL, 0x00000001UL, // x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 -+ 0x570ae19cUL, 0x00000001UL, 0x94a691a4UL, 0x00000000UL, // x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 -+ 0xea910712UL, 0x00000001UL, 0x271ecdfaUL, 0x00000001UL, // x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 -+ 0x67127128UL, 0x00000001UL, 0x9e54475aUL, 0x00000000UL, // x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 -+ 0x19e790a2UL, 0x00000000UL, 0xc9c099eeUL, 0x00000000UL, // x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 -+ 0x3788f710UL, 0x00000000UL, 0x9a2f736cUL, 0x00000000UL, // x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 -+ 0x682a160eUL, 0x00000001UL, 0xbb9f4996UL, 0x00000000UL, // x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 -+ 0x7f0ebd2eUL, 0x00000000UL, 0xdb688050UL, 0x00000001UL, // x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 -+ 0x2b032080UL, 0x00000000UL, 0xe9b10af4UL, 0x00000000UL, // x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 -+ 0xcfd1664aUL, 0x00000000UL, 0x2d4545e4UL, 0x00000001UL, // x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 -+ 0xaa1181c2UL, 0x00000000UL, 0x0361139cUL, 0x00000000UL, // x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 -+ 0xddd08002UL, 0x00000000UL, 0xa5a1a3a8UL, 0x00000001UL, // x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 -+ 0xe8dd0446UL, 0x00000000UL, 0x6844e0b0UL, 0x00000000UL, // x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 -+ 0xbbd94a00UL, 0x00000001UL, 0xc3762f28UL, 0x00000000UL, // x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 -+ 0xab6cd180UL, 0x00000000UL, 0xd26287a2UL, 0x00000001UL, // x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 -+ 0x31803ce2UL, 0x00000000UL, 0xf6f0bba8UL, 0x00000001UL, // x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 -+ 0x24f40b0cUL, 0x00000000UL, 0x2ffabd62UL, 0x00000000UL, // x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 -+ 0xba1d9834UL, 0x00000001UL, 0xfb4516b8UL, 0x00000000UL, // x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 -+ 0x04de61aaUL, 0x00000001UL, 0x8cfa961cUL, 0x00000001UL, // x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 -+ 0x13e40d46UL, 0x00000001UL, 0x9e588d52UL, 0x00000001UL, // x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 -+ 0x415598a0UL, 0x00000001UL, 0x180f0bbcUL, 0x00000001UL, // x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 -+ 0xbf6c8c90UL, 0x00000000UL, 0xe1d9177aUL, 0x00000000UL, // x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 -+ 0x788b0504UL, 0x00000001UL, 0x05abc27cUL, 0x00000001UL, // x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 -+ 0x38385d02UL, 0x00000000UL, 0x972e4a58UL, 0x00000000UL, // x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 -+ 0xb6c83844UL, 0x00000001UL, 0x83499a5eUL, 0x00000001UL, // x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 -+ 0x51061a8aUL, 0x00000000UL, 0xc96a8ccaUL, 0x00000001UL, // x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 -+ 0x7351388aUL, 0x00000001UL, 0xa1a5b60cUL, 0x00000001UL, // x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 -+ 0x32928f92UL, 0x00000001UL, 0xe4b6ac9cUL, 0x00000000UL, // x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 -+ 0xe6b4f48aUL, 0x00000000UL, 0x807e7f5aUL, 0x00000001UL, // x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 -+ 0x39d15e90UL, 0x00000000UL, 0x7a7e3bc8UL, 0x00000001UL, // x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 -+ 0x312d6074UL, 0x00000000UL, 0xd73975daUL, 0x00000000UL, // x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 -+ 0x7bbb2cc4UL, 0x00000001UL, 0x7375d038UL, 0x00000001UL, // x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 -+ 0x6ded3e18UL, 0x00000001UL, 0x193680bcUL, 0x00000000UL, // x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 -+ 0xf1638b16UL, 0x00000000UL, 0x999b06f6UL, 0x00000000UL, // x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 -+ 0xd38b9eccUL, 0x00000001UL, 0xf685d2b8UL, 0x00000001UL, // x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 -+ 0x8b8d09dcUL, 0x00000001UL, 0xf4ecbed2UL, 0x00000001UL, // x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 -+ 0xe7bc27d2UL, 0x00000000UL, 0xba16f1a0UL, 0x00000000UL, // x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 -+ 0x275e1e96UL, 0x00000000UL, 0x15aceac4UL, 0x00000001UL, // x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 -+ 0xe2e3031eUL, 0x00000000UL, 0xaeff6292UL, 0x00000001UL, // x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 -+ 0x041c84d8UL, 0x00000001UL, 0x9640124cUL, 0x00000000UL, // x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 -+ 0x706ce672UL, 0x00000000UL, 0x14f41f02UL, 0x00000001UL, // x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 -+ 0x5d5070daUL, 0x00000001UL, 0x9c5f3586UL, 0x00000000UL, // x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 -+ 0x38f9493aUL, 0x00000000UL, 0x878275faUL, 0x00000001UL, // x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 -+ 0xa3348a76UL, 0x00000000UL, 0xddc42ce8UL, 0x00000000UL, // x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 -+ 0xad0aab92UL, 0x00000001UL, 0x81d2c73aUL, 0x00000001UL, // x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 -+ 0x9e85f712UL, 0x00000001UL, 0x41c9320aUL, 0x00000001UL, // x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 -+ 0x5a871e76UL, 0x00000000UL, 0x5235719aUL, 0x00000001UL, // x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 -+ 0x7249c662UL, 0x00000001UL, 0xbe27d804UL, 0x00000000UL, // x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 -+ 0x3a084712UL, 0x00000000UL, 0x6242d45aUL, 0x00000000UL, // x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 -+ 0xed438478UL, 0x00000000UL, 0x9a53638eUL, 0x00000000UL, // x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 -+ 0xabac34ccUL, 0x00000000UL, 0x001ecfb6UL, 0x00000001UL, // x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 -+ 0x5f35ef3eUL, 0x00000000UL, 0x6d7c2d64UL, 0x00000001UL, // x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 -+ 0x47d6608cUL, 0x00000000UL, 0xd0ce46c0UL, 0x00000001UL, // x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 -+ 0x2d01470eUL, 0x00000000UL, 0x24c907b4UL, 0x00000001UL, // x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 -+ 0x58bbc7b0UL, 0x00000001UL, 0x18a555caUL, 0x00000000UL, // x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 -+ 0xc0a23e8eUL, 0x00000000UL, 0x6b0980bcUL, 0x00000000UL, // x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 -+ 0xebd85c88UL, 0x00000001UL, 0x8bbba964UL, 0x00000000UL, // x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 -+ 0x9ee20bb2UL, 0x00000001UL, 0x070a5a1eUL, 0x00000001UL, // x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 -+ 0xacabf2d6UL, 0x00000001UL, 0x2204322aUL, 0x00000000UL, // x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 -+ 0xb7963d56UL, 0x00000001UL, 0xa27524d0UL, 0x00000000UL, // x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 -+ 0x7bffa1feUL, 0x00000001UL, 0x20b1e4baUL, 0x00000000UL, // x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 -+ 0x1f15333eUL, 0x00000000UL, 0x32cc27fcUL, 0x00000000UL, // x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 -+ 0x8593129eUL, 0x00000001UL, 0x44dd22b8UL, 0x00000000UL, // x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 -+ 0x9cb32602UL, 0x00000001UL, 0xdffc9e0aUL, 0x00000000UL, // x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 -+ 0x42b05cc8UL, 0x00000001UL, 0xb7a0ed14UL, 0x00000001UL, // x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 -+ 0xbe49e7a4UL, 0x00000001UL, 0xc7842488UL, 0x00000000UL, // x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 -+ 0x08f69d6cUL, 0x00000001UL, 0xc02a4feeUL, 0x00000001UL, // x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 -+ 0x6c0971f0UL, 0x00000000UL, 0x3c273778UL, 0x00000000UL, // x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 -+ 0x5b16467aUL, 0x00000000UL, 0xd63f8894UL, 0x00000001UL, // x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 -+ 0x551a628eUL, 0x00000001UL, 0x6be557d6UL, 0x00000000UL, // x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 -+ 0x9e42ea92UL, 0x00000001UL, 0x6a7806eaUL, 0x00000000UL, // x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 -+ 0x2fa83ff2UL, 0x00000001UL, 0x6155aa0cUL, 0x00000001UL, // x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 -+ 0x1ca9cde0UL, 0x00000001UL, 0x908650acUL, 0x00000000UL, // x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 -+ 0xc8e5cd74UL, 0x00000000UL, 0xaa5a8084UL, 0x00000000UL, // x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 -+ 0x96c27f0cUL, 0x00000000UL, 0x91bb500aUL, 0x00000001UL, // x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 -+ 0x2baed926UL, 0x00000000UL, 0x64e9bed0UL, 0x00000000UL, // x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 -+ 0x7c8de8d2UL, 0x00000001UL, 0x9444f302UL, 0x00000000UL, // x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 -+ 0xd43d6068UL, 0x00000000UL, 0x9db07d3cUL, 0x00000001UL, // x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 -+ 0xcb2c4b26UL, 0x00000000UL, 0x359e3e6eUL, 0x00000001UL, // x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 -+ 0x45b8da26UL, 0x00000001UL, 0xe4f10dd2UL, 0x00000001UL, // x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 -+ 0x8fff4b08UL, 0x00000001UL, 0x24f5735eUL, 0x00000001UL, // x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 -+ 0x50b58ed0UL, 0x00000001UL, 0x24760a4cUL, 0x00000001UL, // x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 -+ 0x549f39bcUL, 0x00000001UL, 0x0f1fc186UL, 0x00000000UL, // x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 -+ 0xef4d2f42UL, 0x00000000UL, 0x150e4cc4UL, 0x00000000UL, // x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 -+ 0xb1468572UL, 0x00000001UL, 0x2a6204e8UL, 0x00000000UL, // x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 -+ 0x3d7403b2UL, 0x00000001UL, 0xbeb1d432UL, 0x00000000UL, // x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 -+ 0xa4681842UL, 0x00000001UL, 0x35f3f1f0UL, 0x00000001UL, // x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 -+ 0x67714492UL, 0x00000001UL, 0x74fe2232UL, 0x00000000UL, // x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 -+ 0xe599099aUL, 0x00000001UL, 0x1ac6e2baUL, 0x00000000UL, // x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 -+ 0xfe128194UL, 0x00000000UL, 0x13fca91eUL, 0x00000000UL, // x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 -+ 0x77e8b990UL, 0x00000000UL, 0x83f4931eUL, 0x00000001UL, // x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 -+ 0xa267f63aUL, 0x00000001UL, 0xb6d9b4e4UL, 0x00000000UL, // x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 -+ 0x945c245aUL, 0x00000001UL, 0xb5188656UL, 0x00000000UL, // x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 -+ 0x49002e76UL, 0x00000001UL, 0x27a81a84UL, 0x00000000UL, // x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 -+ 0xbb8310a4UL, 0x00000001UL, 0x25699258UL, 0x00000001UL, // x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 -+ 0x9ec60bccUL, 0x00000001UL, 0xb23de796UL, 0x00000001UL, // x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 -+ 0x2d8590aeUL, 0x00000001UL, 0xfe4365dcUL, 0x00000000UL, // x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 -+ 0x65b00684UL, 0x00000000UL, 0xc68f497aUL, 0x00000000UL, // x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 -+ 0x5e5aeadcUL, 0x00000001UL, 0xfbf521eeUL, 0x00000000UL, // x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 -+ 0xb77ff2b0UL, 0x00000000UL, 0x5eac3378UL, 0x00000001UL, // x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 -+ 0x88da2ff6UL, 0x00000001UL, 0x34914b90UL, 0x00000001UL, // x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 -+ 0x63da929aUL, 0x00000000UL, 0x16335cfeUL, 0x00000000UL, // x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 -+ 0x389caa80UL, 0x00000001UL, 0x0372d10cUL, 0x00000001UL, // x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 -+ 0x3db599d2UL, 0x00000001UL, 0x5097b908UL, 0x00000001UL, // x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 -+ 0x22505a86UL, 0x00000001UL, 0x227a7572UL, 0x00000001UL, // x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 -+ 0x6bd72746UL, 0x00000001UL, 0x9a8f75c0UL, 0x00000000UL, // x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 -+ 0xc3faf1d4UL, 0x00000001UL, 0x682c77a2UL, 0x00000000UL, // x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 -+ 0x111c826cUL, 0x00000001UL, 0x231f091cUL, 0x00000000UL, // x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 -+ 0x153e9fb2UL, 0x00000000UL, 0x7d4439f2UL, 0x00000000UL, // x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 -+ 0x2b1f7b60UL, 0x00000000UL, 0x7e221efcUL, 0x00000001UL, // x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 -+ 0xb1dba570UL, 0x00000000UL, 0x67457c38UL, 0x00000001UL, // x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 -+ 0xf6397b76UL, 0x00000001UL, 0xbdf081c4UL, 0x00000000UL, // x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 -+ 0x56335214UL, 0x00000001UL, 0x6286d6b0UL, 0x00000001UL, // x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 -+ 0xd70e3986UL, 0x00000001UL, 0xc84f001cUL, 0x00000000UL, // x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 -+ 0x3701a774UL, 0x00000000UL, 0x64efe7c0UL, 0x00000000UL, // x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 -+ 0xac81ef72UL, 0x00000000UL, 0x0ac2d904UL, 0x00000000UL, // x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 -+ 0x33212464UL, 0x00000001UL, 0xfd226d14UL, 0x00000000UL, // x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 -+ 0xe4e45610UL, 0x00000000UL, 0x1cfd42e0UL, 0x00000001UL, // x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 -+ 0x0c1bd370UL, 0x00000000UL, 0x6e5a5678UL, 0x00000001UL, // x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 -+ 0xa7b9e7a6UL, 0x00000001UL, 0xd888fe22UL, 0x00000001UL, // x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 -+ 0x7d657a10UL, 0x00000000UL, 0xaf77fcd4UL, 0x00000001UL, // x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 -+ -+ // Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros -+ 0xec447f11UL, 0x99168a18UL, 0x13e8221eUL, 0xed837b26UL, // x^2048 mod p(x)`, x^2016 mod p(x)`, x^1984 mod p(x)`, x^1952 mod p(x)` -+ 0x8fd2cd3cUL, 0xe23e954eUL, 0x47b9ce5aUL, 0xc8acdd81UL, // x^1920 mod p(x)`, x^1888 mod p(x)`, x^1856 mod p(x)`, x^1824 mod p(x)` -+ 0x6b1d2b53UL, 0x92f8befeUL, 0xd4277e25UL, 0xd9ad6d87UL, // x^1792 mod p(x)`, x^1760 mod p(x)`, x^1728 mod p(x)`, x^1696 mod p(x)` -+ 0x291ea462UL, 0xf38a3556UL, 0x33fbca3bUL, 0xc10ec5e0UL, // x^1664 mod p(x)`, x^1632 mod p(x)`, x^1600 mod p(x)`, x^1568 mod p(x)` -+ 0x62b6ca4bUL, 0x974ac562UL, 0x82e02e2fUL, 0xc0b55b0eUL, // x^1536 mod p(x)`, x^1504 mod p(x)`, x^1472 mod p(x)`, x^1440 mod p(x)` -+ 0x784d2a56UL, 0x855712b3UL, 0xe172334dUL, 0x71aa1df0UL, // x^1408 mod p(x)`, x^1376 mod p(x)`, x^1344 mod p(x)`, x^1312 mod p(x)` -+ 0x0eaee722UL, 0xa5abe9f8UL, 0x3969324dUL, 0xfee3053eUL, // x^1280 mod p(x)`, x^1248 mod p(x)`, x^1216 mod p(x)`, x^1184 mod p(x)` -+ 0xdb54814cUL, 0x1fa0943dUL, 0x3eb2bd08UL, 0xf44779b9UL, // x^1152 mod p(x)`, x^1120 mod p(x)`, x^1088 mod p(x)`, x^1056 mod p(x)` -+ 0xd7bbfe6aUL, 0xa53ff440UL, 0x00cc3374UL, 0xf5449b3fUL, // x^1024 mod p(x)`, x^992 mod p(x)`, x^960 mod p(x)`, x^928 mod p(x)` -+ 0x6325605cUL, 0xebe7e356UL, 0xd777606eUL, 0x6f8346e1UL, // x^896 mod p(x)`, x^864 mod p(x)`, x^832 mod p(x)`, x^800 mod p(x)` -+ 0xe5b592b8UL, 0xc65a272cUL, 0xc0b95347UL, 0xe3ab4f2aUL, // x^768 mod p(x)`, x^736 mod p(x)`, x^704 mod p(x)`, x^672 mod p(x)` -+ 0x4721589fUL, 0x5705a9caUL, 0x329ecc11UL, 0xaa2215eaUL, // x^640 mod p(x)`, x^608 mod p(x)`, x^576 mod p(x)`, x^544 mod p(x)` -+ 0x88d14467UL, 0xe3720acbUL, 0xd95efd26UL, 0x1ed8f66eUL, // x^512 mod p(x)`, x^480 mod p(x)`, x^448 mod p(x)`, x^416 mod p(x)` -+ 0x15141c31UL, 0xba1aca03UL, 0xa700e96aUL, 0x78ed02d5UL, // x^384 mod p(x)`, x^352 mod p(x)`, x^320 mod p(x)`, x^288 mod p(x)` -+ 0xed627daeUL, 0xad2a31b3UL, 0x32b39da3UL, 0xba8ccbe8UL, // x^256 mod p(x)`, x^224 mod p(x)`, x^192 mod p(x)`, x^160 mod p(x)` -+ 0xa06a2517UL, 0x6655004fUL, 0xb1e6b092UL, 0xedb88320UL // x^128 mod p(x)`, x^96 mod p(x)`, x^64 mod p(x)`, x^32 mod p(x)` -+ }; -+ -+ juint* ptr = (juint*) malloc(sizeof(juint) * CRC32_CONSTANTS_SIZE); -+ guarantee(((intptr_t)ptr & 0xF) == 0, "16-byte alignment needed"); -+ guarantee(ptr != NULL, "allocation error of a crc table"); -+ memcpy((void*)ptr, constants, sizeof(juint) * CRC32_CONSTANTS_SIZE); -+ return ptr; -+} -+ -+juint* StubRoutines::ppc64::generate_crc_barret_constants() { -+ juint barret_constants[CRC32_BARRET_CONSTANTS] = { -+ 0xf7011641UL, 0x00000001UL, 0x00000000UL, 0x00000000UL, -+ 0xdb710641UL, 0x00000001UL, 0x00000000UL, 0x00000000UL -+ }; -+ juint* ptr = (juint*) malloc(sizeof(juint) * CRC32_CONSTANTS_SIZE); -+ guarantee(((intptr_t)ptr & 0xF) == 0, "16-byte alignment needed"); -+ guarantee(ptr != NULL, "allocation error of a crc table"); -+ memcpy((void*) ptr, barret_constants, sizeof(juint) * CRC32_BARRET_CONSTANTS); -+ return ptr; -+} -+ - // CRC32 Intrinsics. - /** - * crc_table[] from jdk/src/share/native/java/util/zip/zlib-1.2.8/crc32.h -@@ -477,3 +782,7 @@ - #endif - } - }; -+ -+juint* StubRoutines::ppc64::_constants = StubRoutines::ppc64::generate_crc_constants(); -+ -+juint* StubRoutines::ppc64::_barret_constants = StubRoutines::ppc64::generate_crc_barret_constants(); -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp openjdk/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp -+++ openjdk/hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp -@@ -45,6 +45,8 @@ - #else - #define CRC32_TABLES 1 - #endif -+#define CRC32_CONSTANTS_SIZE 1084 -+#define CRC32_BARRET_CONSTANTS 10 - - class ppc64 { - friend class StubGenerator; -@@ -53,11 +55,17 @@ - - // CRC32 Intrinsics. - static juint _crc_table[CRC32_TABLES][CRC32_COLUMN_SIZE]; -+ static juint* _constants; -+ static juint* _barret_constants; - - public: - - // CRC32 Intrinsics. - static void generate_load_crc_table_addr(MacroAssembler* masm, Register table); -+ static void generate_load_crc_constants_addr(MacroAssembler* masm, Register table); -+ static void generate_load_crc_barret_constants_addr(MacroAssembler* masm, Register table); -+ static juint* generate_crc_constants(); -+ static juint* generate_crc_barret_constants(); - - }; - -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp -+++ openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp -@@ -102,7 +102,7 @@ - // Create and print feature-string. - char buf[(num_features+1) * 16]; // Max 16 chars per feature. - jio_snprintf(buf, sizeof(buf), -- "ppc64%s%s%s%s%s%s%s%s%s", -+ "ppc64%s%s%s%s%s%s%s%s%s%s", - (has_fsqrt() ? " fsqrt" : ""), - (has_isel() ? " isel" : ""), - (has_lxarxeh() ? " lxarxeh" : ""), -@@ -112,7 +112,8 @@ - (has_popcntw() ? " popcntw" : ""), - (has_fcfids() ? " fcfids" : ""), - (has_vand() ? " vand" : ""), -- (has_vcipher() ? " aes" : "") -+ (has_vcipher() ? " aes" : ""), -+ (has_vpmsumb() ? " vpmsumb" : "") - // Make sure number of %s matches num_features! - ); - _features_str = strdup(buf); -@@ -490,6 +491,7 @@ - a->fcfids(F3, F4); // code[8] -> fcfids - a->vand(VR0, VR0, VR0); // code[9] -> vand - a->vcipher(VR0, VR1, VR2); // code[10] -> vcipher -+ a->vpmsumb(VR0, VR1, VR2); // code[11] -> vpmsumb - a->blr(); - - // Emit function to set one cache line to zero. Emit function descriptor and get pointer to it. -@@ -534,6 +536,7 @@ - if (code[feature_cntr++]) features |= fcfids_m; - if (code[feature_cntr++]) features |= vand_m; - if (code[feature_cntr++]) features |= vcipher_m; -+ if (code[feature_cntr++]) features |= vpmsumb_m; - - // Print the detection code. - if (PrintAssembly) { -diff --git openjdk.orig/hotspot/src/cpu/ppc/vm/vm_version_ppc.hpp openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.hpp ---- openjdk.orig/hotspot/src/cpu/ppc/vm/vm_version_ppc.hpp -+++ openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.hpp -@@ -43,6 +43,7 @@ - vand, - dcba, - vcipher, -+ vpmsumb, - num_features // last entry to count features - }; - enum Feature_Flag_Set { -@@ -58,6 +59,7 @@ - vand_m = (1 << vand ), - dcba_m = (1 << dcba ), - vcipher_m = (1 << vcipher), -+ vpmsumb_m = (1 << vpmsumb), - all_features_m = -1 - }; - static int _features; -@@ -86,6 +88,7 @@ - static bool has_vand() { return (_features & vand_m) != 0; } - static bool has_dcba() { return (_features & dcba_m) != 0; } - static bool has_vcipher() { return (_features & vcipher_m) != 0; } -+ static bool has_vpmsumb() { return (_features & vpmsumb_m) != 0; } - - static const char* cpu_features() { return _features_str; } - diff --git a/SOURCES/jdk8165852-pr3468-mount_point_not_found_for_a_file_which_is_present_in_overlayfs.patch b/SOURCES/jdk8165852-pr3468-mount_point_not_found_for_a_file_which_is_present_in_overlayfs.patch deleted file mode 100644 index 6be87a7..0000000 --- a/SOURCES/jdk8165852-pr3468-mount_point_not_found_for_a_file_which_is_present_in_overlayfs.patch +++ /dev/null @@ -1,87 +0,0 @@ - -# HG changeset patch -# User bpb -# Date 1515783982 28800 -# Node ID b8843bca95b5e0eed5bbb4dc195c89c727c7aede -# Parent 61d7ce442d95f5f30c84037a50cf6361bf7c37e1 -8165852: (fs) Mount point not found for a file which is present in overlayfs -Summary: Check /proc/mounts when the device ID boundary is reached -Reviewed-by: alanb - -diff -r 61d7ce442d95 -r b8843bca95b5 src/solaris/classes/sun/nio/fs/LinuxFileStore.java ---- openjdk/jdk/src/solaris/classes/sun/nio/fs/LinuxFileStore.java Tue Jul 24 05:10:45 2018 -0400 -+++ openjdk/jdk/src/solaris/classes/sun/nio/fs/LinuxFileStore.java Fri Jan 12 11:06:22 2018 -0800 -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2008, 2018, 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 -@@ -66,6 +66,8 @@ - } - - // step 2: find mount point -+ List procMountsEntries = -+ fs.getMountEntries("/proc/mounts"); - UnixPath parent = path.getParent(); - while (parent != null) { - UnixFileAttributes attrs = null; -@@ -74,16 +76,23 @@ - } catch (UnixException x) { - x.rethrowAsIOException(parent); - } -- if (attrs.dev() != dev()) -- break; -+ if (attrs.dev() != dev()) { -+ // step 3: lookup mounted file systems (use /proc/mounts to -+ // ensure we find the file system even when not in /etc/mtab) -+ byte[] dir = path.asByteArray(); -+ for (UnixMountEntry entry : procMountsEntries) { -+ if (Arrays.equals(dir, entry.dir())) -+ return entry; -+ } -+ } - path = parent; - parent = parent.getParent(); - } - -- // step 3: lookup mounted file systems (use /proc/mounts to ensure we -- // find the file system even when not in /etc/mtab) -+ // step 3: lookup mounted file systems (use /proc/mounts to -+ // ensure we find the file system even when not in /etc/mtab) - byte[] dir = path.asByteArray(); -- for (UnixMountEntry entry: fs.getMountEntries("/proc/mounts")) { -+ for (UnixMountEntry entry : procMountsEntries) { - if (Arrays.equals(dir, entry.dir())) - return entry; - } -diff -r 61d7ce442d95 -r b8843bca95b5 src/solaris/classes/sun/nio/fs/LinuxFileSystem.java ---- openjdk/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java Tue Jul 24 05:10:45 2018 -0400 -+++ openjdk/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java Fri Jan 12 11:06:22 2018 -0800 -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2008, 2018, 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 -@@ -75,7 +75,7 @@ - /** - * Returns object to iterate over the mount entries in the given fstab file. - */ -- Iterable getMountEntries(String fstab) { -+ List getMountEntries(String fstab) { - ArrayList entries = new ArrayList<>(); - try { - long fp = setmntent(Util.toBytes(fstab), Util.toBytes("r")); -@@ -101,7 +101,7 @@ - * Returns object to iterate over the mount entries in /etc/mtab - */ - @Override -- Iterable getMountEntries() { -+ List getMountEntries() { - return getMountEntries("/etc/mtab"); - } - - diff --git a/SOURCES/jdk8172850-rh1640127-01-register_allocator_crash.patch b/SOURCES/jdk8172850-rh1640127-01-register_allocator_crash.patch deleted file mode 100644 index 294e313..0000000 --- a/SOURCES/jdk8172850-rh1640127-01-register_allocator_crash.patch +++ /dev/null @@ -1,213 +0,0 @@ - -# HG changeset patch -# User thartmann -# Date 1539594027 -7200 -# Node ID e044997c2edaeae97866394a7f8e2ddebbd41392 -# Parent 99212080341058548d449a22d1381e79353ec5b5 -8172850: Anti-dependency on membar causes crash in register allocator due to invalid instruction scheduling -Summary: Regression test and additional asserts. The problem is fixed by 8087341. -Reviewed-by: kvn - -diff -r 992120803410 -r e044997c2eda src/share/vm/opto/cfgnode.cpp ---- openjdk/hotspot/src/share/vm/opto/cfgnode.cpp Mon Oct 22 05:26:38 2018 -0400 -+++ openjdk/hotspot/src/share/vm/opto/cfgnode.cpp Mon Oct 15 11:00:27 2018 +0200 -@@ -2016,6 +2016,7 @@ - uint ideal_reg = _type->ideal_reg(); - assert( ideal_reg != Node::NotAMachineReg, "invalid type at Phi" ); - if( ideal_reg == 0 ) return RegMask::Empty; -+ assert(ideal_reg != Op_RegFlags, "flags register is not spillable"); - return *(Compile::current()->matcher()->idealreg2spillmask[ideal_reg]); - } - -diff -r 992120803410 -r e044997c2eda src/share/vm/opto/coalesce.cpp ---- openjdk/hotspot/src/share/vm/opto/coalesce.cpp Mon Oct 22 05:26:38 2018 -0400 -+++ openjdk/hotspot/src/share/vm/opto/coalesce.cpp Mon Oct 15 11:00:27 2018 +0200 -@@ -292,7 +292,14 @@ - // Copy any flags as well - _phc.clone_projs(pred, pred->end_idx(), m, copy, _phc._lrg_map); - } else { -- const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()]; -+ int ireg = m->ideal_reg(); -+ if (ireg == 0 || ireg == Op_RegFlags) { -+ assert(false, err_msg("attempted to spill a non-spillable item: %d: %s, ireg = %d", -+ m->_idx, m->Name(), ireg)); -+ C->record_method_not_compilable("attempted to spill a non-spillable item"); -+ return; -+ } -+ const RegMask *rm = C->matcher()->idealreg2spillmask[ireg]; - copy = new (C) MachSpillCopyNode(m, *rm, *rm); - // Find a good place to insert. Kinda tricky, use a subroutine - insert_copy_with_overlap(pred,copy,phi_name,src_name); -@@ -326,7 +333,14 @@ - b->insert_node(copy, l++); - l += _phc.clone_projs(b, l, m, copy, _phc._lrg_map); - } else { -- const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()]; -+ int ireg = m->ideal_reg(); -+ if (ireg == 0 || ireg == Op_RegFlags) { -+ assert(false, err_msg("attempted to spill a non-spillable item: %d: %s, ireg = %d", -+ m->_idx, m->Name(), ireg)); -+ C->record_method_not_compilable("attempted to spill a non-spillable item"); -+ return; -+ } -+ const RegMask *rm = C->matcher()->idealreg2spillmask[ireg]; - copy = new (C) MachSpillCopyNode(m, *rm, *rm); - // Insert the copy in the basic block, just before us - b->insert_node(copy, l++); -@@ -373,7 +387,14 @@ - if( k < b->_num_succs ) - continue; // Live out; do not pre-split - // Split the lrg at this use -- const RegMask *rm = C->matcher()->idealreg2spillmask[inp->ideal_reg()]; -+ int ireg = inp->ideal_reg(); -+ if (ireg == 0 || ireg == Op_RegFlags) { -+ assert(false, err_msg("attempted to spill a non-spillable item: %d: %s, ireg = %d", -+ inp->_idx, inp->Name(), ireg)); -+ C->record_method_not_compilable("attempted to spill a non-spillable item"); -+ return; -+ } -+ const RegMask *rm = C->matcher()->idealreg2spillmask[ireg]; - Node *copy = new (C) MachSpillCopyNode( inp, *rm, *rm ); - // Insert the copy in the use-def chain - n->set_req(inpidx, copy ); -diff -r 992120803410 -r e044997c2eda src/share/vm/opto/machnode.cpp ---- openjdk/hotspot/src/share/vm/opto/machnode.cpp Mon Oct 22 05:26:38 2018 -0400 -+++ openjdk/hotspot/src/share/vm/opto/machnode.cpp Mon Oct 15 11:00:27 2018 +0200 -@@ -619,6 +619,7 @@ - } - - // Values outside the domain represent debug info -+ assert(in(idx)->ideal_reg() != Op_RegFlags, "flags register is not spillable"); - return *Compile::current()->matcher()->idealreg2spillmask[in(idx)->ideal_reg()]; - } - -diff -r 992120803410 -r e044997c2eda src/share/vm/opto/matcher.cpp ---- openjdk/hotspot/src/share/vm/opto/matcher.cpp Mon Oct 22 05:26:38 2018 -0400 -+++ openjdk/hotspot/src/share/vm/opto/matcher.cpp Mon Oct 15 11:00:27 2018 +0200 -@@ -95,6 +95,7 @@ - idealreg2spillmask [Op_VecD] = NULL; - idealreg2spillmask [Op_VecX] = NULL; - idealreg2spillmask [Op_VecY] = NULL; -+ idealreg2spillmask [Op_RegFlags] = NULL; - - idealreg2debugmask [Op_RegI] = NULL; - idealreg2debugmask [Op_RegN] = NULL; -@@ -106,6 +107,7 @@ - idealreg2debugmask [Op_VecD] = NULL; - idealreg2debugmask [Op_VecX] = NULL; - idealreg2debugmask [Op_VecY] = NULL; -+ idealreg2debugmask [Op_RegFlags] = NULL; - - idealreg2mhdebugmask[Op_RegI] = NULL; - idealreg2mhdebugmask[Op_RegN] = NULL; -@@ -117,6 +119,7 @@ - idealreg2mhdebugmask[Op_VecD] = NULL; - idealreg2mhdebugmask[Op_VecX] = NULL; - idealreg2mhdebugmask[Op_VecY] = NULL; -+ idealreg2mhdebugmask[Op_RegFlags] = NULL; - - debug_only(_mem_node = NULL;) // Ideal memory node consumed by mach node - } -diff -r 992120803410 -r e044997c2eda test/compiler/gcbarriers/TestMembarDependencies.java ---- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ openjdk/hotspot/test/compiler/gcbarriers/TestMembarDependencies.java Mon Oct 15 11:00:27 2018 +0200 -@@ -0,0 +1,98 @@ -+/* -+ * Copyright (c) 2017, 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 TestMembarDependencies -+ * @bug 8172850 -+ * @summary Tests correct scheduling of memory loads around MembarVolatile emitted by GC barriers. -+ * @library /testlibrary -+ * @run driver compiler.membars.TestMembarDependencies -+ */ -+ -+package compiler.membars; -+ -+import com.oracle.java.testlibrary.*; -+ -+public class TestMembarDependencies { -+ private static TestMembarDependencies f1; -+ private static TestMembarDependencies f2; -+ -+ public static void main(String args[]) throws Throwable { -+ if (args.length == 0) { -+ // For debugging, add "-XX:+TraceOptoPipelining" -+ OutputAnalyzer oa = ProcessTools.executeTestJvm("-XX:+IgnoreUnrecognizedVMOptions", -+ "-XX:-TieredCompilation", "-XX:-BackgroundCompilation", "-XX:+PrintOpto", -+ "-XX:CompileCommand=compileonly,compiler.membars.TestMembarDependencies::test*", -+ "-XX:CompileCommand=dontinline,compiler.membars.TestMembarDependencies::test_m1", -+ TestMembarDependencies.class.getName(), "run"); -+ // C2 should not crash or bail out from compilation -+ oa.shouldHaveExitValue(0); -+ oa.shouldNotMatch("Bailout: Recompile without subsuming loads"); -+ System.out.println(oa.getOutput()); -+ } else { -+ f2 = new TestMembarDependencies(); -+ // Trigger compilation of test1 and test2 -+ for (int i = 0; i < 10_000; ++i) { -+ f2.test1(f2); -+ f2.test2(f2); -+ } -+ } -+ } -+ -+ public void test_m1() { } -+ public void test_m2() { } -+ -+ public void test1(TestMembarDependencies obj) { -+ // Try/catch/finally is used to create a CFG block without a test + jmpCon -+ // allowing GCM to schedule the testN_mem_reg0 instruction into that block. -+ try { -+ // Method call defines memory state that is then -+ // used by subsequent instructions/blocks (see below). -+ test_m1(); -+ } catch (Exception e) { -+ -+ } finally { -+ // Oop write to field emits a GC post-barrier with a MembarVolatile -+ // which has a wide memory effect (kills all memory). This creates an -+ // anti-dependency on all surrounding memory loads. -+ f1 = obj; -+ } -+ // The empty method m2 is inlined but the null check of f2 remains. It is encoded -+ // as CmpN(LoadN(MEM), NULL) where MEM is the memory after the call to test_m1(). -+ // This is matched to testN_mem_reg0 on x86 which is scheduled before the barrier -+ // in the try/catch block due to the anti-dependency on the MembarVolatile. -+ // C2 crashes in the register allocator when trying to spill the flag register -+ // to keep the result of the testN instruction live from the try/catch block -+ // until it is here. -+ f2.test_m2(); -+ } -+ -+ public void test2(TestMembarDependencies obj) { -+ // Same as test1 but without try/catch/finally. -+ // This causes C2 to bail out in block local scheduling because testN_mem_reg0 is -+ // scheduled into a block that already contains another test + jmpCon instruction. -+ test_m1(); -+ f1 = obj; -+ f2.test_m2(); -+ } -+} - diff --git a/SOURCES/jdk8184309-pr3596-build_warnings_from_gcc_7_1_on_fedora_26.patch b/SOURCES/jdk8184309-pr3596-build_warnings_from_gcc_7_1_on_fedora_26.patch deleted file mode 100644 index 00b6125..0000000 --- a/SOURCES/jdk8184309-pr3596-build_warnings_from_gcc_7_1_on_fedora_26.patch +++ /dev/null @@ -1,21 +0,0 @@ -# HG changeset patch -# User ysuenaga -# Date 1527498573 -3600 -# Mon May 28 10:09:33 2018 +0100 -# Node ID ef176cb429c49d1c330d9575938f66b04e3fb730 -# Parent 6915dc9ae18cce5625d3a3fc74b37da70a5b4215 -8184309, PR3596: Build warnings from GCC 7.1 on Fedora 26 -Reviewed-by: kbarrett, vlivanov - -diff --git openjdk.orig/hotspot/src/share/vm/code/dependencies.cpp openjdk/hotspot/src/share/vm/code/dependencies.cpp ---- openjdk.orig/hotspot/src/share/vm/code/dependencies.cpp -+++ openjdk/hotspot/src/share/vm/code/dependencies.cpp -@@ -525,7 +525,7 @@ - xtty->object("x", arg.metadata_value()); - } - } else { -- char xn[10]; sprintf(xn, "x%d", j); -+ char xn[12]; sprintf(xn, "x%d", j); - if (arg.is_oop()) { - xtty->object(xn, arg.oop_value()); - } else { diff --git a/SOURCES/jdk8189170-aarch64_primordial_thread.patch b/SOURCES/jdk8189170-aarch64_primordial_thread.patch deleted file mode 100644 index 876cfdf..0000000 --- a/SOURCES/jdk8189170-aarch64_primordial_thread.patch +++ /dev/null @@ -1,30 +0,0 @@ -# HG changeset patch -# User dbuck -# Date 1547622839 0 -# Wed Jan 16 07:13:59 2019 +0000 -# Node ID 34c6b4b813caf9b3a6fd1859596a87a24a49c423 -# Parent bca8195a3bc70df281a73d9a40032c673971676c -8189170: [AArch64] Add option to disable stack overflow checking in primordial thread for use with JNI_CreateJavaJVM -Reviewed-by: dcubed - -diff --git openjdk.orig/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp openjdk/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp ---- openjdk.orig/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp -+++ openjdk/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 1999, 2018, 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 -@@ -550,8 +550,8 @@ - // pthread_attr_getstack() - - static void current_stack_region(address * bottom, size_t * size) { -- if (os::Linux::is_initial_thread()) { -- // initial thread needs special handling because pthread_getattr_np() -+ if (os::is_primordial_thread()) { -+ // primordial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); diff --git a/SOURCES/jdk8197429-pr3546-rh1536622-increased_stack_guard_causes_segfaults_on_x86_32.patch b/SOURCES/jdk8197429-pr3546-rh1536622-increased_stack_guard_causes_segfaults_on_x86_32.patch deleted file mode 100644 index 6d7f743..0000000 --- a/SOURCES/jdk8197429-pr3546-rh1536622-increased_stack_guard_causes_segfaults_on_x86_32.patch +++ /dev/null @@ -1,286 +0,0 @@ -# HG changeset patch -# User aph -# Date 1530894306 -3600 -# Fri Jul 06 17:25:06 2018 +0100 -# Node ID 1485461a0fd1ff977a6acb8f2ed1069aaaf3b07e -# Parent d7bcbcfde5057ad066ad2fb55a87d19a5827ddee -8197429: Increased stack guard causes segfaults on x86-32 -Reviewed-by: dholmes - -diff --git openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp openjdk/hotspot/src/os/linux/vm/os_linux.cpp ---- openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp -+++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp -@@ -724,6 +724,10 @@ - } - } - -+void os::Linux::expand_stack_to(address bottom) { -+ _expand_stack_to(bottom); -+} -+ - bool os::Linux::manually_expand_stack(JavaThread * t, address addr) { - assert(t!=NULL, "just checking"); - assert(t->osthread()->expanding_stack(), "expand should be set"); -diff --git openjdk.orig/hotspot/src/os/linux/vm/os_linux.hpp openjdk/hotspot/src/os/linux/vm/os_linux.hpp ---- openjdk.orig/hotspot/src/os/linux/vm/os_linux.hpp -+++ openjdk/hotspot/src/os/linux/vm/os_linux.hpp -@@ -249,6 +249,8 @@ - static int safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime); - - private: -+ static void expand_stack_to(address bottom); -+ - typedef int (*sched_getcpu_func_t)(void); - typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen); - typedef int (*numa_max_node_func_t)(void); -diff --git openjdk.orig/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp ---- openjdk.orig/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp -+++ openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp -@@ -892,6 +892,27 @@ - void os::workaround_expand_exec_shield_cs_limit() { - #if defined(IA32) - size_t page_size = os::vm_page_size(); -+ -+ /* -+ * JDK-8197429 -+ * -+ * Expand the stack mapping to the end of the initial stack before -+ * attempting to install the codebuf. This is needed because newer -+ * Linux kernels impose a distance of a megabyte between stack -+ * memory and other memory regions. If we try to install the -+ * codebuf before expanding the stack the installation will appear -+ * to succeed but we'll get a segfault later if we expand the stack -+ * in Java code. -+ * -+ */ -+ if (os::is_primordial_thread()) { -+ address limit = Linux::initial_thread_stack_bottom(); -+ if (! DisablePrimordialThreadGuardPages) { -+ limit += (StackYellowPages + StackRedPages) * page_size; -+ } -+ os::Linux::expand_stack_to(limit); -+ } -+ - /* - * Take the highest VA the OS will give us and exec - * -@@ -910,6 +931,16 @@ - char* hint = (char*) (Linux::initial_thread_stack_bottom() - - ((StackYellowPages + StackRedPages + 1) * page_size)); - char* codebuf = os::attempt_reserve_memory_at(page_size, hint); -+ -+ if (codebuf == NULL) { -+ // JDK-8197429: There may be a stack gap of one megabyte between -+ // the limit of the stack and the nearest memory region: this is a -+ // Linux kernel workaround for CVE-2017-1000364. If we failed to -+ // map our codebuf, try again at an address one megabyte lower. -+ hint -= 1 * M; -+ codebuf = os::attempt_reserve_memory_at(page_size, hint); -+ } -+ - if ( (codebuf == NULL) || (!os::commit_memory(codebuf, page_size, true)) ) { - return; // No matter, we tried, best effort. - } -diff --git openjdk.orig/hotspot/test/runtime/StackGap/T.java openjdk/hotspot/test/runtime/StackGap/T.java -new file mode 100644 ---- /dev/null -+++ openjdk/hotspot/test/runtime/StackGap/T.java -@@ -0,0 +1,33 @@ -+/* -+ * Copyright (c) 2018, Red Hat, Inc. 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. -+ */ -+ -+public class T { -+ -+ public static void test(int n) { -+ if (n == 0) return; -+ System.out.println (n); -+ test (n - 1); -+ -+ } -+ -+} -diff --git openjdk.orig/hotspot/test/runtime/StackGap/exestack-gap.c openjdk/hotspot/test/runtime/StackGap/exestack-gap.c -new file mode 100644 ---- /dev/null -+++ openjdk/hotspot/test/runtime/StackGap/exestack-gap.c -@@ -0,0 +1,82 @@ -+/* -+ * Copyright (c) 2018, Red Hat, Inc. 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. -+ */ -+ -+#include -+#include -+#include -+ -+JNIEnv* create_vm(JavaVM **jvm, char *extra_option) -+{ -+ JNIEnv* env; -+ JavaVMInitArgs args; -+ JavaVMOption options[4]; -+ args.version = JNI_VERSION_1_8; -+ args.nOptions = 3 + (extra_option != NULL); -+ options[0].optionString = "-Xss2048k"; -+ char classpath[4096]; -+ snprintf(classpath, sizeof classpath, -+ "-Djava.class.path=%s", getenv("CLASSPATH")); -+ options[1].optionString = classpath; -+ options[2].optionString = "-XX:+UnlockExperimentalVMOptions"; -+ if (extra_option) { -+ options[3].optionString = extra_option; -+ } -+ args.options = &options[0]; -+ args.ignoreUnrecognized = 0; -+ int rv; -+ rv = JNI_CreateJavaVM(jvm, (void**)&env, &args); -+ if (rv < 0) return NULL; -+ return env; -+} -+ -+void run(char *extra_arg) { -+ JavaVM *jvm; -+ jclass T_class; -+ jmethodID test_method; -+ JNIEnv *env = create_vm(&jvm, extra_arg); -+ if (env == NULL) -+ exit(1); -+ T_class = (*env)->FindClass(env, "T"); -+ if ((*env)->ExceptionCheck(env) == JNI_TRUE) { -+ (*env)->ExceptionDescribe(env); -+ exit(1); -+ } -+ test_method = (*env)->GetStaticMethodID(env, T_class, "test", "(I)V"); -+ if ((*env)->ExceptionCheck(env) == JNI_TRUE) { -+ (*env)->ExceptionDescribe(env); -+ exit(1); -+ } -+ (*env)->CallStaticVoidMethod(env, T_class, test_method, 1000); -+} -+ -+ -+int main(int argc, char **argv) -+{ -+ if (argc > 1) { -+ run(argv[1]); -+ } else { -+ run(NULL); -+ } -+ -+ return 0; -+} -diff --git openjdk.orig/hotspot/test/runtime/StackGap/testme.sh openjdk/hotspot/test/runtime/StackGap/testme.sh -new file mode 100644 ---- /dev/null -+++ openjdk/hotspot/test/runtime/StackGap/testme.sh -@@ -0,0 +1,73 @@ -+# Copyright (c) 2014, 2018, 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. -+#!/bin/sh -+ -+# -+# @test testme.sh -+# @bug 8197429 -+# @summary Linux kernel stack guard should not cause segfaults on x86-32 -+# @compile T.java -+# @run shell testme.sh -+# -+ -+if [ "${TESTSRC}" = "" ] -+then -+ TESTSRC=${PWD} -+ echo "TESTSRC not set. Using "${TESTSRC}" as default" -+fi -+echo "TESTSRC=${TESTSRC}" -+## Adding common setup Variables for running shell tests. -+. ${TESTSRC}/../../test_env.sh -+ -+if [ "${VM_OS}" != "linux" ] -+then -+ echo "Test only valid for Linux" -+ exit 0 -+fi -+ -+gcc_cmd=`which gcc` -+if [ "x$gcc_cmd" = "x" ]; then -+ echo "WARNING: gcc not found. Cannot execute test." 2>&1 -+ exit 0; -+fi -+ -+CFLAGS="-m${VM_BITS}" -+ -+LD_LIBRARY_PATH=.:${COMPILEJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH -+export LD_LIBRARY_PATH -+ -+cp ${TESTSRC}${FS}exestack-gap.c . -+ -+# Copy the result of our @compile action: -+cp ${TESTCLASSES}${FS}T.class . -+ -+echo "Compilation flag: ${COMP_FLAG}" -+# Note pthread may not be found thus invoke creation will fail to be created. -+# Check to ensure you have a /usr/lib/libpthread.so if you don't please look -+# for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation. -+ -+$gcc_cmd -DLINUX ${CFLAGS} -o stack-gap \ -+ -I${COMPILEJAVA}/include -I${COMPILEJAVA}/include/linux \ -+ -L${COMPILEJAVA}/jre/lib/${VM_CPU}/${VM_TYPE} \ -+ -ljvm -lpthread exestack-gap.c -+ -+./stack-gap || exit $? -+./stack-gap -XX:+DisablePrimordialThreadGuardPages || exit $? diff --git a/SOURCES/jdk8203030-zero_s390_31_bit_size_t_type_conflicts_in_shared_code.patch b/SOURCES/jdk8203030-zero_s390_31_bit_size_t_type_conflicts_in_shared_code.patch index 6e0d762..843158e 100644 --- a/SOURCES/jdk8203030-zero_s390_31_bit_size_t_type_conflicts_in_shared_code.patch +++ b/SOURCES/jdk8203030-zero_s390_31_bit_size_t_type_conflicts_in_shared_code.patch @@ -1,5 +1,5 @@ -diff --git a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp openjdk/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @@ -2659,7 +2659,7 @@ if (ResizeOldPLAB && CMSOldPLABResizeQuicker) { @@ -10,8 +10,8 @@ diff --git a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeL } assert(n_blks > 0, "Error"); _cfls->par_get_chunk_of_blocks(word_sz, n_blks, fl); -diff --git a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp openjdk/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -957,7 +957,7 @@ if (free_percentage < desired_free_percentage) { @@ -40,10 +40,10 @@ diff --git a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSw // Do not give up existing stack until we have managed to // get the double capacity that we desired. ReservedSpace rs(ReservedSpace::allocation_align_size_up( -diff --git a/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/src/share/vm/gc_implementation/g1/concurrentMark.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp openjdk/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp -@@ -3903,7 +3903,7 @@ +@@ -3902,7 +3902,7 @@ // of things to do) or totally (at the very end). size_t target_size; if (partially) { @@ -52,7 +52,7 @@ diff --git a/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/src/share/vm } else { target_size = 0; } -@@ -4707,7 +4707,7 @@ +@@ -4706,7 +4706,7 @@ // The > 0 check is to deal with the prev and next live bytes which // could be 0. if (*hum_bytes > 0) { @@ -61,10 +61,10 @@ diff --git a/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/src/share/vm *hum_bytes -= bytes; } return bytes; -diff --git a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp openjdk/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp -@@ -1726,7 +1726,7 @@ +@@ -1729,7 +1729,7 @@ verify_region_sets_optional(); @@ -73,8 +73,8 @@ diff --git a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/src/share/v ergo_verbose1(ErgoHeapSizing, "attempt heap expansion", ergo_format_reason("allocation request failed") -diff --git a/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp b/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp openjdk/hotspot/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp @@ -117,7 +117,7 @@ return reserved_size() - committed_size(); @@ -85,8 +85,8 @@ diff --git a/src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp b/src return (addr - _low_boundary) / _page_size; } -diff --git a/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp b/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp openjdk/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp @@ -38,7 +38,7 @@ _cancel(false), @@ -97,8 +97,8 @@ diff --git a/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp b/src/shar _queues = NEW_C_HEAP_ARRAY(G1StringDedupWorkerQueue, _nqueues, mtGC); for (size_t i = 0; i < _nqueues; i++) { new (_queues + i) G1StringDedupWorkerQueue(G1StringDedupWorkerQueue::default_segment_size(), _max_cache_size, _max_size); -diff --git a/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp b/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp openjdk/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp @@ -120,7 +120,7 @@ }; @@ -109,8 +109,8 @@ diff --git a/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp b/src/shar _max_list_length(0), _cached(PaddedArray::create_unfreeable((uint)_nlists)), _overflowed(PaddedArray::create_unfreeable((uint)_nlists)) { -diff --git a/src/share/vm/gc_implementation/g1/heapRegion.cpp b/src/share/vm/gc_implementation/g1/heapRegion.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp openjdk/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp @@ -109,7 +109,7 @@ if (FLAG_IS_DEFAULT(G1HeapRegionSize)) { @@ -121,8 +121,8 @@ diff --git a/src/share/vm/gc_implementation/g1/heapRegion.cpp b/src/share/vm/gc_ } int region_size_log = log2_long((jlong) region_size); -diff --git a/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp openjdk/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp @@ -194,7 +194,7 @@ const size_t num_overflow_elems = of_stack->size(); @@ -133,8 +133,8 @@ diff --git a/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/src/sh num_overflow_elems); // Transfer the most recent num_take_elems from the overflow // stack to our work queue. -diff --git a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp ---- openjdk/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp openjdk/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +++ openjdk/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @@ -910,8 +910,8 @@ void PSParallelCompact::initialize_dead_wood_limiter() @@ -147,8 +147,8 @@ diff --git a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.c _dwl_first_term = 1.0 / (sqrt(2.0 * M_PI) * _dwl_std_dev); DEBUG_ONLY(_dwl_initialized = true;) _dwl_adjustment = normal_distribution(1.0); -diff --git a/src/share/vm/memory/collectorPolicy.cpp b/src/share/vm/memory/collectorPolicy.cpp ---- openjdk/hotspot/src/share/vm/memory/collectorPolicy.cpp +diff --git openjdk.orig/hotspot/src/share/vm/memory/collectorPolicy.cpp openjdk/hotspot/src/share/vm/memory/collectorPolicy.cpp +--- openjdk.orig/hotspot/src/share/vm/memory/collectorPolicy.cpp +++ openjdk/hotspot/src/share/vm/memory/collectorPolicy.cpp @@ -385,7 +385,7 @@ uintx calculated_size = NewSize + OldSize; @@ -207,10 +207,10 @@ diff --git a/src/share/vm/memory/collectorPolicy.cpp b/src/share/vm/memory/colle _initial_gen1_size = OldSize; // If the user has explicitly set an OldSize that is inconsistent -diff --git a/src/share/vm/memory/metaspace.cpp b/src/share/vm/memory/metaspace.cpp ---- openjdk/hotspot/src/share/vm/memory/metaspace.cpp +diff --git openjdk.orig/hotspot/src/share/vm/memory/metaspace.cpp openjdk/hotspot/src/share/vm/memory/metaspace.cpp +--- openjdk.orig/hotspot/src/share/vm/memory/metaspace.cpp +++ openjdk/hotspot/src/share/vm/memory/metaspace.cpp -@@ -1455,7 +1455,7 @@ +@@ -1482,7 +1482,7 @@ void MetaspaceGC::post_initialize() { // Reset the high-water mark once the VM initialization is done. @@ -219,8 +219,8 @@ diff --git a/src/share/vm/memory/metaspace.cpp b/src/share/vm/memory/metaspace.c } bool MetaspaceGC::can_expand(size_t word_size, bool is_class) { -@@ -1515,7 +1515,7 @@ - (size_t)MIN2(min_tmp, double(max_uintx)); +@@ -1542,7 +1542,7 @@ + (size_t)MIN2(min_tmp, double(MaxMetaspaceSize)); // Don't shrink less than the initial generation size minimum_desired_capacity = MAX2(minimum_desired_capacity, - MetaspaceSize); @@ -228,16 +228,16 @@ diff --git a/src/share/vm/memory/metaspace.cpp b/src/share/vm/memory/metaspace.c if (PrintGCDetails && Verbose) { gclog_or_tty->print_cr("\nMetaspaceGC::compute_new_size: "); -@@ -1573,7 +1573,7 @@ +@@ -1600,7 +1600,7 @@ const double max_tmp = used_after_gc / minimum_used_percentage; - size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx)); + size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(MaxMetaspaceSize)); maximum_desired_capacity = MAX2(maximum_desired_capacity, - MetaspaceSize); + (size_t)MetaspaceSize); if (PrintGCDetails && Verbose) { gclog_or_tty->print_cr(" " " maximum_free_percentage: %6.2f" -@@ -3285,7 +3285,7 @@ +@@ -3361,7 +3361,7 @@ // on the medium chunk list. The next chunk will be small and progress // from there. This size calculated by -version. _first_class_chunk_word_size = MIN2((size_t)MediumChunk*6, @@ -246,10 +246,10 @@ diff --git a/src/share/vm/memory/metaspace.cpp b/src/share/vm/memory/metaspace.c _first_class_chunk_word_size = align_word_size_up(_first_class_chunk_word_size); // Arbitrarily set the initial virtual space to a multiple // of the boot class loader size. -diff --git a/src/share/vm/memory/threadLocalAllocBuffer.cpp b/src/share/vm/memory/threadLocalAllocBuffer.cpp ---- openjdk/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp +diff --git openjdk.orig/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp openjdk/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp +--- openjdk.orig/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp +++ openjdk/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp -@@ -238,13 +238,13 @@ +@@ -250,13 +250,13 @@ size_t init_sz = 0; if (TLABSize > 0) { @@ -266,8 +266,8 @@ diff --git a/src/share/vm/memory/threadLocalAllocBuffer.cpp b/src/share/vm/memor init_sz = align_object_size(init_sz); } init_sz = MIN2(MAX2(init_sz, min_size()), max_size()); -diff --git a/src/share/vm/oops/objArrayKlass.inline.hpp b/src/share/vm/oops/objArrayKlass.inline.hpp ---- openjdk/hotspot/src/share/vm/oops/objArrayKlass.inline.hpp +diff --git openjdk.orig/hotspot/src/share/vm/oops/objArrayKlass.inline.hpp openjdk/hotspot/src/share/vm/oops/objArrayKlass.inline.hpp +--- openjdk.orig/hotspot/src/share/vm/oops/objArrayKlass.inline.hpp +++ openjdk/hotspot/src/share/vm/oops/objArrayKlass.inline.hpp @@ -48,7 +48,7 @@ const size_t beg_index = size_t(index); @@ -287,10 +287,10 @@ diff --git a/src/share/vm/oops/objArrayKlass.inline.hpp b/src/share/vm/oops/objA const size_t end_index = beg_index + stride; T* const base = (T*)a->base(); T* const beg = base + beg_index; -diff --git a/src/share/vm/runtime/arguments.cpp b/src/share/vm/runtime/arguments.cpp ---- openjdk/hotspot/src/share/vm/runtime/arguments.cpp +diff --git openjdk.orig/hotspot/src/share/vm/runtime/arguments.cpp openjdk/hotspot/src/share/vm/runtime/arguments.cpp +--- openjdk.orig/hotspot/src/share/vm/runtime/arguments.cpp +++ openjdk/hotspot/src/share/vm/runtime/arguments.cpp -@@ -1283,7 +1283,7 @@ +@@ -1289,7 +1289,7 @@ // NewSize was set on the command line and it is larger than // preferred_max_new_size. if (!FLAG_IS_DEFAULT(NewSize)) { // NewSize explicitly set at command-line @@ -299,7 +299,7 @@ diff --git a/src/share/vm/runtime/arguments.cpp b/src/share/vm/runtime/arguments } else { FLAG_SET_ERGO(uintx, MaxNewSize, preferred_max_new_size); } -@@ -1308,8 +1308,8 @@ +@@ -1314,8 +1314,8 @@ // Unless explicitly requested otherwise, make young gen // at least min_new, and at most preferred_max_new_size. if (FLAG_IS_DEFAULT(NewSize)) { @@ -310,7 +310,7 @@ diff --git a/src/share/vm/runtime/arguments.cpp b/src/share/vm/runtime/arguments if (PrintGCDetails && Verbose) { // Too early to use gclog_or_tty tty->print_cr("CMS ergo set NewSize: " SIZE_FORMAT, NewSize); -@@ -1319,7 +1319,7 @@ +@@ -1325,7 +1325,7 @@ // so it's NewRatio x of NewSize. if (FLAG_IS_DEFAULT(OldSize)) { if (max_heap > NewSize) { diff --git a/SOURCES/jdk8207057-pr3613-no_debug_info_for_assembler_files_hotspot.patch b/SOURCES/jdk8207057-pr3613-no_debug_info_for_assembler_files_hotspot.patch deleted file mode 100644 index c61d972..0000000 --- a/SOURCES/jdk8207057-pr3613-no_debug_info_for_assembler_files_hotspot.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- openjdk/hotspot/make/linux/makefiles/gcc.make 2018-09-17 15:40:56.933127667 +0200 -+++ openjdk/hotspot/make/linux/makefiles/gcc.make 2018-09-17 15:40:56.831127850 +0200 -@@ -184,6 +184,10 @@ - LFLAGS += $(ARCHFLAG) - ASFLAGS += $(ARCHFLAG) - -+ifeq ($(DEBUG_BINARIES), true) -+ ASFLAGS += $(ASFLAGS_DEBUG_SYMBOLS) -+endif -+ - # Use C++ Interpreter - ifdef CC_INTERP - CFLAGS += -DCC_INTERP diff --git a/SOURCES/jdk8207057-pr3613-no_debug_info_for_assembler_files_root.patch b/SOURCES/jdk8207057-pr3613-no_debug_info_for_assembler_files_root.patch deleted file mode 100644 index e4a007c..0000000 --- a/SOURCES/jdk8207057-pr3613-no_debug_info_for_assembler_files_root.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff --git openjdk.orig///common/autoconf/flags.m4 openjdk///common/autoconf/flags.m4 ---- openjdk.orig///common/autoconf/flags.m4 -+++ openjdk///common/autoconf/flags.m4 -@@ -282,9 +282,11 @@ - if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then - CFLAGS_DEBUG_SYMBOLS="-g1" - CXXFLAGS_DEBUG_SYMBOLS="-g1" -+ ASFLAGS_DEBUG_SYMBOLS="-g1" - else - CFLAGS_DEBUG_SYMBOLS="-g" - CXXFLAGS_DEBUG_SYMBOLS="-g" -+ ASFLAGS_DEBUG_SYMBOLS="-g" - fi - elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then - CFLAGS_DEBUG_SYMBOLS="-g -xs" -@@ -295,6 +297,7 @@ - fi - AC_SUBST(CFLAGS_DEBUG_SYMBOLS) - AC_SUBST(CXXFLAGS_DEBUG_SYMBOLS) -+ AC_SUBST(ASFLAGS_DEBUG_SYMBOLS) - - # Optimization levels - if test "x$TOOLCHAIN_TYPE" = xsolstudio; then -diff --git openjdk.orig///common/autoconf/spec.gmk.in openjdk///common/autoconf/spec.gmk.in ---- openjdk.orig///common/autoconf/spec.gmk.in -+++ openjdk///common/autoconf/spec.gmk.in -@@ -414,6 +414,7 @@ - # Options for generating debug symbols - ENABLE_DEBUG_SYMBOLS:=@ENABLE_DEBUG_SYMBOLS@ - CFLAGS_DEBUG_SYMBOLS:=@CFLAGS_DEBUG_SYMBOLS@ -+ASFLAGS_DEBUG_SYMBOLS:=@ASFLAGS_DEBUG_SYMBOLS@ - CXXFLAGS_DEBUG_SYMBOLS:=@CXXFLAGS_DEBUG_SYMBOLS@ - ZIP_DEBUGINFO_FILES:=@ZIP_DEBUGINFO_FILES@ - STRIP_POLICY:=@STRIP_POLICY@ -diff --git openjdk.orig///make/common/NativeCompilation.gmk openjdk///make/common/NativeCompilation.gmk ---- openjdk.orig///make/common/NativeCompilation.gmk -+++ openjdk///make/common/NativeCompilation.gmk -@@ -351,12 +351,14 @@ - # Always add debug symbols - $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS) - $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS) -+ $1_EXTRA_ASFLAGS+=$(ASFLAGS_DEBUG_SYMBOLS) - else - # Programs don't get the debug symbols added in the old build. It's not clear if - # this is intentional. - ifeq ($$($1_PROGRAM),) - $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS) - $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS) -+ $1_EXTRA_ASFLAGS+=$(ASFLAGS_DEBUG_SYMBOLS) - endif - endif - endif diff --git a/SOURCES/jdk8209639-rh1640127-02-coalesce_attempted_spill_non_spillable.patch b/SOURCES/jdk8209639-rh1640127-02-coalesce_attempted_spill_non_spillable.patch deleted file mode 100644 index 63c9cba..0000000 --- a/SOURCES/jdk8209639-rh1640127-02-coalesce_attempted_spill_non_spillable.patch +++ /dev/null @@ -1,114 +0,0 @@ - -# HG changeset patch -# User roland -# Date 1540370574 -7200 -# Node ID d853bac073f8a4851e313ba8fa9768b38396a204 -# Parent e044997c2edaeae97866394a7f8e2ddebbd41392 -8209639: assert failure in coalesce.cpp: attempted to spill a non-spillable item -Reviewed-by: neliasso, kvn - -diff -r e044997c2eda -r d853bac073f8 src/share/vm/opto/coalesce.cpp ---- openjdk/hotspot/src/share/vm/opto/coalesce.cpp Mon Oct 15 11:00:27 2018 +0200 -+++ openjdk/hotspot/src/share/vm/opto/coalesce.cpp Wed Oct 24 10:42:54 2018 +0200 -@@ -25,6 +25,7 @@ - #include "precompiled.hpp" - #include "memory/allocation.inline.hpp" - #include "opto/block.hpp" -+#include "opto/c2compiler.hpp" - #include "opto/cfgnode.hpp" - #include "opto/chaitin.hpp" - #include "opto/coalesce.hpp" -@@ -294,9 +295,13 @@ - } else { - int ireg = m->ideal_reg(); - if (ireg == 0 || ireg == Op_RegFlags) { -- assert(false, err_msg("attempted to spill a non-spillable item: %d: %s, ireg = %d", -- m->_idx, m->Name(), ireg)); -- C->record_method_not_compilable("attempted to spill a non-spillable item"); -+ if (C->subsume_loads()) { -+ C->record_failure(C2Compiler::retry_no_subsuming_loads()); -+ } else { -+ assert(false, err_msg("attempted to spill a non-spillable item: %d: %s, ireg = %d", -+ m->_idx, m->Name(), ireg)); -+ C->record_method_not_compilable("attempted to spill a non-spillable item"); -+ } - return; - } - const RegMask *rm = C->matcher()->idealreg2spillmask[ireg]; -diff -r e044997c2eda -r d853bac073f8 test/compiler/c2/SubsumingLoadsCauseFlagSpill.java ---- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ openjdk/hotspot/test/compiler/c2/SubsumingLoadsCauseFlagSpill.java Wed Oct 24 10:42:54 2018 +0200 -@@ -0,0 +1,72 @@ -+/* -+ * Copyright (c) 2018, Red Hat, Inc. 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 8209639 -+ * @summary assert failure in coalesce.cpp: attempted to spill a non-spillable item -+ * -+ * @run main/othervm -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,SubsumingLoadsCauseFlagSpill::not_inlined -Xmx1024m SubsumingLoadsCauseFlagSpill -+ * -+ */ -+ -+public class SubsumingLoadsCauseFlagSpill { -+ private static Object field; -+ private static boolean do_throw; -+ private static volatile boolean barrier; -+ -+ public static void main(String[] args) { -+ for (int i = 0; i < 20_000; i++) { -+ do_throw = true; -+ field = null; -+ test(0); -+ do_throw = false; -+ field = new Object(); -+ test(0); -+ } -+ } -+ -+ private static float test(float f) { -+ Object v = null; -+ try { -+ not_inlined(); -+ v = field; -+ } catch (MyException me) { -+ v = field; -+ barrier = true; -+ } -+ if (v == null) { -+ return f * f; -+ } -+ return f; -+ } -+ -+ private static void not_inlined() throws MyException{ -+ if (do_throw) { -+ throw new MyException(); -+ } -+ } -+ -+ private static class MyException extends Throwable { -+ } -+} - diff --git a/SOURCES/jdk8210647-rh1632174-libsaproc_is_being_compiled_without_optimization.patch b/SOURCES/jdk8210647-rh1632174-libsaproc_is_being_compiled_without_optimization.patch deleted file mode 100644 index 0ab09e4..0000000 --- a/SOURCES/jdk8210647-rh1632174-libsaproc_is_being_compiled_without_optimization.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git openjdk.orig/hotspot/make/linux/makefiles/saproc.make openjdk/hotspot/make/linux/makefiles/saproc.make ---- openjdk.orig/hotspot/make/linux/makefiles/saproc.make -+++ openjdk/hotspot/make/linux/makefiles/saproc.make -@@ -59,6 +59,11 @@ - SA_DEBUG_CFLAGS = -g - endif - -+# Optimize saproc lib at level -O3 unless it's a slowdebug build -+ifneq ($(DEBUG_LEVEL), slowdebug) -+ SA_OPT_FLAGS = $(OPT_CFLAGS) -+endif -+ - # if $(AGENT_DIR) does not exist, we don't build SA - # also, we don't build SA on Itanium or zero. - -@@ -95,6 +100,7 @@ - $(SASRCFILES) \ - $(SA_LFLAGS) \ - $(SA_DEBUG_CFLAGS) \ -+ $(SA_OPT_FLAGS) \ - $(EXTRA_CFLAGS) \ - -o $@ \ - -lthread_db diff --git a/SOURCES/jdk8223219-fstack-protector-hotspot.patch b/SOURCES/jdk8223219-fstack-protector-hotspot.patch new file mode 100644 index 0000000..ec69944 --- /dev/null +++ b/SOURCES/jdk8223219-fstack-protector-hotspot.patch @@ -0,0 +1,35 @@ +diff --git openjdk.orig/hotspot/make/bsd/makefiles/gcc.make openjdk/hotspot/make/bsd/makefiles/gcc.make +--- openjdk.orig/hotspot/make/bsd/makefiles/gcc.make ++++ openjdk/hotspot/make/bsd/makefiles/gcc.make +@@ -190,7 +190,7 @@ + CFLAGS += -fno-exceptions + ifeq ($(USE_CLANG),) + CFLAGS += -pthread +- CFLAGS += -fcheck-new -fstack-protector ++ CFLAGS += -fcheck-new + # version 4 and above support fvisibility=hidden (matches jni_x86.h file) + # except 4.1.2 gives pointless warnings that can't be disabled (afaik) + ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0" +diff --git openjdk.orig/hotspot/make/linux/makefiles/gcc.make openjdk/hotspot/make/linux/makefiles/gcc.make +--- openjdk.orig/hotspot/make/linux/makefiles/gcc.make ++++ openjdk/hotspot/make/linux/makefiles/gcc.make +@@ -150,7 +150,7 @@ + CFLAGS += -fno-exceptions + CFLAGS += -D_REENTRANT + ifeq ($(USE_CLANG),) +- CFLAGS += -fcheck-new -fstack-protector ++ CFLAGS += -fcheck-new + # version 4 and above support fvisibility=hidden (matches jni_x86.h file) + # except 4.1.2 gives pointless warnings that can't be disabled (afaik) + ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0" +diff --git openjdk.orig/hotspot/make/solaris/makefiles/gcc.make openjdk/hotspot/make/solaris/makefiles/gcc.make +--- openjdk.orig/hotspot/make/solaris/makefiles/gcc.make ++++ openjdk/hotspot/make/solaris/makefiles/gcc.make +@@ -75,7 +75,6 @@ + CFLAGS += -fno-exceptions + CFLAGS += -D_REENTRANT + CFLAGS += -fcheck-new +-CFLAGS += -fstack-protector + + ARCHFLAG = $(ARCHFLAG/$(BUILDARCH)) + diff --git a/SOURCES/jdk8223219-fstack-protector-root.patch b/SOURCES/jdk8223219-fstack-protector-root.patch new file mode 100644 index 0000000..a73761c --- /dev/null +++ b/SOURCES/jdk8223219-fstack-protector-root.patch @@ -0,0 +1,33 @@ +diff --git a/common/autoconf/flags.m4 b/common/autoconf/flags.m4 +--- openjdk.orig/common/autoconf/flags.m4 ++++ openjdk/common/autoconf/flags.m4 +@@ -388,16 +388,8 @@ + CFLAGS_JDK="${CFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt" + CXXFLAGS_JDK="${CXXFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt" + elif test "x$TOOLCHAIN_TYPE" = xgcc; then +- case $OPENJDK_TARGET_CPU_ARCH in +- x86 ) +- LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS -fstack-protector" +- LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS -fstack-protector" +- ;; +- x86_64 ) +- LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS -fstack-protector" +- LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS -fstack-protector" +- ;; +- esac ++ LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS -fstack-protector" ++ LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS -fstack-protector" + if test "x$OPENJDK_TARGET_OS" != xmacosx; then + LDFLAGS_JDK="$LDFLAGS_JDK -Wl,-z,relro" + LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS -Wl,-z,relro" +@@ -464,10 +456,6 @@ + ppc ) + # on ppc we don't prevent gcc to omit frame pointer nor strict-aliasing + ;; +- x86 ) +- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer -fstack-protector" +- CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing -fstack-protector" +- ;; + * ) + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer" + CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing" diff --git a/SOURCES/pr3559-use_ldrexd_for_atomic_reads_on_armv7_zero.patch b/SOURCES/pr3559-use_ldrexd_for_atomic_reads_on_armv7_zero.patch deleted file mode 100644 index 1c322fa..0000000 --- a/SOURCES/pr3559-use_ldrexd_for_atomic_reads_on_armv7_zero.patch +++ /dev/null @@ -1,29 +0,0 @@ -# HG changeset patch -# User aph -# Date 1338206478 14400 -# Mon May 28 08:01:18 2012 -0400 -# Node ID 6275d7b419091092752d5a1854194c98897892ba -# Parent be1379a186ba527b32c93a83e04c9600735fe44b -PR3559: Use ldrexd for atomic reads on ARMv7. - -2012-05-28 Andrew Haley - - * os_linux_zero.hpp (atomic_copy64): Use ldrexd for atomic reads - on ARMv7. - -diff --git openjdk.orig/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp openjdk/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp ---- openjdk.orig/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp -+++ openjdk/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp -@@ -54,6 +54,12 @@ - "std %0, %1\n" - : "=&f"(tmp), "=Q"(*(volatile double*)dst) - : "Q"(*(volatile double*)src)); -+#elif defined(__ARM_ARCH_7A__) -+ jlong tmp; -+ asm volatile ("ldrexd %0, [%1]\n" -+ : "=r"(tmp) -+ : "r"(src), "m"(src)); -+ *(jlong *) dst = tmp; - #else - *(jlong *) dst = *(jlong *) src; - #endif diff --git a/SOURCES/rh1566890-CVE_2018_3639-speculative_store_bypass.patch b/SOURCES/rh1566890-CVE_2018_3639-speculative_store_bypass.patch new file mode 100644 index 0000000..d8f3a5a --- /dev/null +++ b/SOURCES/rh1566890-CVE_2018_3639-speculative_store_bypass.patch @@ -0,0 +1,44 @@ +diff --git openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp openjdk/hotspot/src/os/linux/vm/os_linux.cpp +--- openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp ++++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp +@@ -103,6 +103,8 @@ + # include + # include + ++#include ++ + PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + #ifndef _GNU_SOURCE +@@ -4997,6 +4999,31 @@ + } + } + ++/* Per task speculation control */ ++#ifndef PR_GET_SPECULATION_CTRL ++#define PR_GET_SPECULATION_CTRL 52 ++#endif ++#ifndef PR_SET_SPECULATION_CTRL ++#define PR_SET_SPECULATION_CTRL 53 ++#endif ++/* Speculation control variants */ ++# undef PR_SPEC_STORE_BYPASS ++# define PR_SPEC_STORE_BYPASS 0 ++/* Return and control values for PR_SET/GET_SPECULATION_CTRL */ ++# undef PR_SPEC_NOT_AFFECTED ++# undef PR_SPEC_PRCTL ++# undef PR_SPEC_ENABLE ++# undef PR_SPEC_DISABLE ++# define PR_SPEC_NOT_AFFECTED 0 ++# define PR_SPEC_PRCTL (1UL << 0) ++# define PR_SPEC_ENABLE (1UL << 1) ++# define PR_SPEC_DISABLE (1UL << 2) ++ ++static void set_speculation() __attribute__((constructor)); ++static void set_speculation() { ++ prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0); ++} ++ + // this is called _before_ most of the global arguments have been parsed + void os::init(void) { + char dummy; /* used to get a guess on initial stack address */ diff --git a/SOURCES/rh1566890-CVE_2018_3639-speculative_store_bypass_toggle.patch b/SOURCES/rh1566890-CVE_2018_3639-speculative_store_bypass_toggle.patch new file mode 100644 index 0000000..94ef9d4 --- /dev/null +++ b/SOURCES/rh1566890-CVE_2018_3639-speculative_store_bypass_toggle.patch @@ -0,0 +1,54 @@ +diff --git openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp openjdk/hotspot/src/os/linux/vm/os_linux.cpp +--- openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp ++++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp +@@ -5001,26 +5001,43 @@ + + /* Per task speculation control */ + #ifndef PR_GET_SPECULATION_CTRL +-#define PR_GET_SPECULATION_CTRL 52 ++# define PR_GET_SPECULATION_CTRL 52 + #endif + #ifndef PR_SET_SPECULATION_CTRL +-#define PR_SET_SPECULATION_CTRL 53 ++# define PR_SET_SPECULATION_CTRL 53 + #endif + /* Speculation control variants */ +-# undef PR_SPEC_STORE_BYPASS ++#ifndef PR_SPEC_STORE_BYPASS + # define PR_SPEC_STORE_BYPASS 0 ++#endif + /* Return and control values for PR_SET/GET_SPECULATION_CTRL */ +-# undef PR_SPEC_NOT_AFFECTED +-# undef PR_SPEC_PRCTL +-# undef PR_SPEC_ENABLE +-# undef PR_SPEC_DISABLE ++ ++#ifndef PR_SPEC_NOT_AFFECTED + # define PR_SPEC_NOT_AFFECTED 0 ++#endif ++#ifndef PR_SPEC_PRCTL + # define PR_SPEC_PRCTL (1UL << 0) ++#endif ++#ifndef PR_SPEC_ENABLE + # define PR_SPEC_ENABLE (1UL << 1) ++#endif ++#ifndef PR_SPEC_DISABLE + # define PR_SPEC_DISABLE (1UL << 2) ++#endif ++#ifndef PR_SPEC_FORCE_DISABLE ++# define PR_SPEC_FORCE_DISABLE (1UL << 3) ++#endif ++#ifndef PR_SPEC_DISABLE_NOEXEC ++# define PR_SPEC_DISABLE_NOEXEC (1UL << 4) ++#endif + + static void set_speculation() __attribute__((constructor)); + static void set_speculation() { ++ if ( prctl(PR_SET_SPECULATION_CTRL, ++ PR_SPEC_STORE_BYPASS, ++ PR_SPEC_DISABLE_NOEXEC, 0, 0) == 0 ) { ++ return; ++ } + prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0); + } + diff --git a/SOURCES/rh1566890_speculative_store_bypass_so_added_more_per_task_speculation_control_CVE_2018_3639.patch b/SOURCES/rh1566890_speculative_store_bypass_so_added_more_per_task_speculation_control_CVE_2018_3639.patch deleted file mode 100644 index d8f3a5a..0000000 --- a/SOURCES/rh1566890_speculative_store_bypass_so_added_more_per_task_speculation_control_CVE_2018_3639.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff --git openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp openjdk/hotspot/src/os/linux/vm/os_linux.cpp ---- openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp -+++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp -@@ -103,6 +103,8 @@ - # include - # include - -+#include -+ - PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC - - #ifndef _GNU_SOURCE -@@ -4997,6 +4999,31 @@ - } - } - -+/* Per task speculation control */ -+#ifndef PR_GET_SPECULATION_CTRL -+#define PR_GET_SPECULATION_CTRL 52 -+#endif -+#ifndef PR_SET_SPECULATION_CTRL -+#define PR_SET_SPECULATION_CTRL 53 -+#endif -+/* Speculation control variants */ -+# undef PR_SPEC_STORE_BYPASS -+# define PR_SPEC_STORE_BYPASS 0 -+/* Return and control values for PR_SET/GET_SPECULATION_CTRL */ -+# undef PR_SPEC_NOT_AFFECTED -+# undef PR_SPEC_PRCTL -+# undef PR_SPEC_ENABLE -+# undef PR_SPEC_DISABLE -+# define PR_SPEC_NOT_AFFECTED 0 -+# define PR_SPEC_PRCTL (1UL << 0) -+# define PR_SPEC_ENABLE (1UL << 1) -+# define PR_SPEC_DISABLE (1UL << 2) -+ -+static void set_speculation() __attribute__((constructor)); -+static void set_speculation() { -+ prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0); -+} -+ - // this is called _before_ most of the global arguments have been parsed - void os::init(void) { - char dummy; /* used to get a guess on initial stack address */ diff --git a/SOURCES/s390-8214206_fix.patch b/SOURCES/s390-8214206_fix.patch new file mode 100644 index 0000000..93f12de --- /dev/null +++ b/SOURCES/s390-8214206_fix.patch @@ -0,0 +1,37 @@ +diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp openjdk/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp +--- openjdk.orig/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp ++++ openjdk/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp +@@ -78,7 +78,8 @@ + size_t num_target_elems = pointer_delta(end, bottom, mapping_granularity_in_bytes); + idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes; + address base = create_new_base_array(num_target_elems, target_elem_size_in_bytes); +- initialize_base(base, num_target_elems, bias, target_elem_size_in_bytes, log2_intptr(mapping_granularity_in_bytes)); ++ initialize_base(base, num_target_elems, bias, target_elem_size_in_bytes, ++ log2_intptr((uintptr_t) mapping_granularity_in_bytes)); + } + + size_t bias() const { return _bias; } +diff --git openjdk.orig/hotspot/src/share/vm/runtime/os.cpp openjdk/hotspot/src/share/vm/runtime/os.cpp +--- openjdk.orig/hotspot/src/share/vm/runtime/os.cpp ++++ openjdk/hotspot/src/share/vm/runtime/os.cpp +@@ -1284,7 +1284,7 @@ + } + + void os::set_memory_serialize_page(address page) { +- int count = log2_intptr(sizeof(class JavaThread)) - log2_int(64); ++ int count = log2_intptr((uintptr_t) sizeof(class JavaThread)) - log2_int(64); + _mem_serialize_page = (volatile int32_t *)page; + // We initialize the serialization page shift count here + // We assume a cache line size of 64 bytes +diff --git openjdk.orig/hotspot/src/share/vm/utilities/numberSeq.cpp openjdk/hotspot/src/share/vm/utilities/numberSeq.cpp +--- openjdk.orig/hotspot/src/share/vm/utilities/numberSeq.cpp ++++ openjdk/hotspot/src/share/vm/utilities/numberSeq.cpp +@@ -369,7 +369,7 @@ + void BinaryMagnitudeSeq::add(size_t val) { + Atomic::add(val, &_sum); + +- int mag = log2_intptr(val) + 1; ++ int mag = log2_intptr((uintptr_t) val) + 1; + + // Defensively saturate for product bits: + if (mag < 0) { diff --git a/SPECS/java-1.8.0-openjdk.spec b/SPECS/java-1.8.0-openjdk.spec index e21d588..566ed8f 100644 --- a/SPECS/java-1.8.0-openjdk.spec +++ b/SPECS/java-1.8.0-openjdk.spec @@ -206,7 +206,7 @@ # note, following three variables are sedded from update_sources if used correctly. Hardcode them rather there. %global shenandoah_project aarch64-port %global shenandoah_repo jdk8u-shenandoah -%global shenandoah_revision aarch64-shenandoah-jdk8u201-b09 +%global shenandoah_revision aarch64-shenandoah-jdk8u212-b04 # Define old aarch64/jdk8u tree variables for compatibility %global project %{shenandoah_project} %global repo %{shenandoah_repo} @@ -556,6 +556,8 @@ exit 0 %dir %{_jvmdir}/%{jredir -- %{?1}} %dir %{_jvmdir}/%{jredir -- %{?1}}/bin %dir %{_jvmdir}/%{jredir -- %{?1}}/lib +%{_jvmdir}/%{jredir -- %{?1}}/bin/clhsdb +%{_jvmdir}/%{jredir -- %{?1}}/bin/hsdb %{_jvmdir}/%{jredir -- %{?1}}/bin/java %{_jvmdir}/%{jredir -- %{?1}}/bin/jjs %{_jvmdir}/%{jredir -- %{?1}}/bin/keytool @@ -578,15 +580,15 @@ exit 0 %config(noreplace) %{etcjavadir -- %{?1}}/lib/security/blacklisted.certs %config(noreplace) %{etcjavadir -- %{?1}}/lib/logging.properties %config(noreplace) %{etcjavadir -- %{?1}}/lib/calendars.properties -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/unlimited/US_export_policy.jar -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/unlimited/local_policy.jar -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/limited/US_export_policy.jar -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/limited/local_policy.jar -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/java.policy -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/java.security -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/blacklisted.certs -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/logging.properties -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/calendars.properties +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/unlimited/US_export_policy.jar +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/unlimited/local_policy.jar +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/limited/US_export_policy.jar +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/policy/limited/local_policy.jar +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/java.policy +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/java.security +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/blacklisted.certs +%{_jvmdir}/%{jredir -- %{?1}}/lib/logging.properties +%{_jvmdir}/%{jredir -- %{?1}}/lib/calendars.properties %{_mandir}/man1/java-%{uniquesuffix -- %{?1}}.1* %{_mandir}/man1/jjs-%{uniquesuffix -- %{?1}}.1* %{_mandir}/man1/keytool-%{uniquesuffix -- %{?1}}.1* @@ -598,7 +600,7 @@ exit 0 %{_mandir}/man1/tnameserv-%{uniquesuffix -- %{?1}}.1* %{_mandir}/man1/unpack200-%{uniquesuffix -- %{?1}}.1* %{_mandir}/man1/policytool-%{uniquesuffix -- %{?1}}.1* -%config(noreplace) %{_jvmdir}/%{jredir -- %{?1}}/lib/security/nss.cfg +%{_jvmdir}/%{jredir -- %{?1}}/lib/security/nss.cfg %config(noreplace) %{etcjavadir -- %{?1}}/lib/security/nss.cfg %ifarch %{jit_arches} %ifnarch %{power64} @@ -701,7 +703,9 @@ exit 0 %dir %{_jvmdir}/%{sdkdir -- %{?1}}/include %dir %{_jvmdir}/%{sdkdir -- %{?1}}/lib %{_jvmdir}/%{sdkdir -- %{?1}}/bin/appletviewer +%{_jvmdir}/%{sdkdir -- %{?1}}/bin/clhsdb %{_jvmdir}/%{sdkdir -- %{?1}}/bin/extcheck +%{_jvmdir}/%{sdkdir -- %{?1}}/bin/hsdb %{_jvmdir}/%{sdkdir -- %{?1}}/bin/idlj %{_jvmdir}/%{sdkdir -- %{?1}}/bin/jar %{_jvmdir}/%{sdkdir -- %{?1}}/bin/jarsigner @@ -971,7 +975,7 @@ Provides: java-%{javaver}-%{origin}-accessibility = %{epoch}:%{version}-%{releas Name: java-%{javaver}-%{origin} Version: %{javaver}.%{updatever}.%{buildver} -Release: 2%{?dist} +Release: 1%{?dist} # java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons # and this change was brought into RHEL-4. java-1.5.0-ibm packages # also included the epoch in their virtual provides. This created a @@ -1079,7 +1083,8 @@ Patch523: pr2974-rh1337583-add_systemlineendings_option_to_keytool_and_use_line_ # PR3083, RH1346460: Regression in SSL debug output without an ECC provider Patch528: pr3083-rh1346460-for_ssl_debug_return_null_instead_of_exception_when_theres_no_ecc_provider.patch # RH1566890: CVE-2018-3639 -Patch529: rh1566890_speculative_store_bypass_so_added_more_per_task_speculation_control_CVE_2018_3639.patch +Patch529: rh1566890-CVE_2018_3639-speculative_store_bypass.patch +Patch531: rh1566890-CVE_2018_3639-speculative_store_bypass_toggle.patch # PR3601: Fix additional -Wreturn-type issues introduced by 8061651 Patch530: pr3601-fix_additional_Wreturn_type_issues_introduced_by_8061651_for_prims_jvm_cpp.patch # Support for building the SunEC provider with the system NSS installation @@ -1122,10 +1127,8 @@ Patch103: pr3593-s390_use_z_format_specifier_for_size_t_arguments_as_size_t_not_ Patch105: jdk8199936-pr3533-enable_mstackrealign_on_x86_linux_as_well_as_x86_mac_os_x.patch # AArch64: PR3519: Fix further functions with a missing return value (AArch64) Patch106: pr3519-fix_further_functions_with_a_missing_return_value.patch -# AArch64: JDK-8160748: [AArch64] Inconsistent types for ideal_reg -Patch107: jdk8160748-aarch64_ideal_reg.patch -# AArch64: JDK-8189170: [AArch64] Add option to disable stack overflow checking in primordial thread for use with JNI_CreateJavaJVM -Patch108: jdk8189170-aarch64_primordial_thread.patch +# S390 ambiguous log2_intptr calls +Patch107: s390-8214206_fix.patch ############################################# # @@ -1141,18 +1144,12 @@ Patch108: jdk8189170-aarch64_primordial_thread.patch Patch502: pr2462-resolve_disabled_warnings_for_libunpack_and_the_unpack200_binary.patch # S8154313: Generated javadoc scattered all over the place Patch400: jdk8154313-generated_javadoc_scattered_all_over_the_place.patch -# 8197429, PR3546, RH153662{2,3}: 32 bit java app started via JNI crashes with larger stack sizes -Patch561: jdk8197429-pr3546-rh1536622-increased_stack_guard_causes_segfaults_on_x86_32.patch # 8171000, PR3542, RH1402819: Robot.createScreenCapture() crashes in wayland mode Patch563: jdk8171000-pr3542-rh1402819-robot_createScreenCapture_crashes_in_wayland_mode.patch # 8197546, PR3542, RH1402819: Fix for 8171000 breaks Solaris + Linux builds Patch564: jdk8197546-pr3542-rh1402819-fix_for_8171000_breaks_solaris_linux_builds.patch -# PR3559: Use ldrexd for atomic reads on ARMv7. -Patch567: pr3559-use_ldrexd_for_atomic_reads_on_armv7_zero.patch # PR3591: Fix for bug 3533 doesn't add -mstackrealign to JDK code Patch571: jdk8199936-pr3591-enable_mstackrealign_on_x86_linux_as_well_as_x86_mac_os_x_jdk.patch -# 8184309, PR3596: Build warnings from GCC 7.1 on Fedora 26 -Patch572: jdk8184309-pr3596-build_warnings_from_gcc_7_1_on_fedora_26.patch # 8141570, PR3548: Fix Zero interpreter build for --disable-precompiled-headers Patch573: jdk8141570-pr3548-fix_zero_interpreter_build_for_disable_precompiled_headers.patch # 8143245, PR3548: Zero build requires disabled warnings @@ -1171,8 +1168,6 @@ Patch202: jdk8035341-allow_using_system_installed_libpng.patch Patch203: jdk8042159-allow_using_system_installed_lcms2.patch # 8210761: libjsig is being compiled without optimization Patch620: jdk8210761-rh1632174-libjsig_is_being_compiled_without_optimization.patch -# 8210647: libsaproc is being compiled without optimization -Patch621: jdk8210647-rh1632174-libsaproc_is_being_compiled_without_optimization.patch # 8210416: [linux] Poor StrictMath performance due to non-optimized compilation Patch622: jdk8210416-rh1632174-compile_fdlibm_with_o2_ffp_contract_off_on_gcc_clang_arches.patch # 8210425: [x86] sharedRuntimeTrig/sharedRuntimeTrans compiled without optimization @@ -1184,49 +1179,20 @@ Patch624: jdk8210425-rh1632174-02-compile_with_o2_and_ffp_contract_off_as_for_fd # 8210425: [x86] sharedRuntimeTrig/sharedRuntimeTrans compiled without optimization # Zero part of the fix for (arm/s390 arches) Patch625: jdk8210425-rh1632174-03-compile_with_o2_and_ffp_contract_off_as_for_fdlibm_zero.patch +# JDK-8223219: Backport of JDK-8199552 to OpenJDK 8 leads to duplicate -fstack-protector flags, +# overriding --with-extra-cflags +Patch626: jdk8223219-fstack-protector-root.patch +Patch627: jdk8223219-fstack-protector-hotspot.patch ############################################# # -# Patches appearing in 8u202 +# Patches appearing in 8u222 # # This section includes patches which are present # in the listed OpenJDK 8u release and should be # able to be removed once that release is out # and used by this RPM. ############################################# -# 8207057, PR3613: Enable debug information for assembly code files -Patch206: jdk8207057-pr3613-no_debug_info_for_assembler_files_hotspot.patch -Patch207: jdk8207057-pr3613-no_debug_info_for_assembler_files_root.patch -# 8165852, PR3468: (fs) Mount point not found for a file which is present in overlayfs -Patch210: jdk8165852-pr3468-mount_point_not_found_for_a_file_which_is_present_in_overlayfs.patch -# S8073139, RH1191652; fix name of ppc64le architecture -Patch601: jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_root.patch -Patch602: jdk8073139-pr1758-rh1191652-ppc64_le_says_its_arch_is_ppc64_not_ppc64le_jdk.patch -Patch603: jdk8073139-pr2236-rh1191652--use_ppc64le_as_the_arch_directory_on_that_platform_and_report_it_in_os_arch_aarch64_forest.patch -# 8044235: src.zip should include all sources -Patch7: jdk8044235-src_zip_should_include_all_sources.patch -# JDK-8172850, RH1640127: Anti-dependency on membar causes crash in register allocator due to invalid instruction scheduling -Patch583: jdk8172850-rh1640127-01-register_allocator_crash.patch -# JDK-8209639, RH1640127: assert failure in coalesce.cpp: attempted to spill a non-spillable item -Patch584: jdk8209639-rh1640127-02-coalesce_attempted_spill_non_spillable.patch -# JDK-8131048, PR3574, RH1498936: ppc implement CRC32 intrinsic -Patch586: jdk8131048-pr3574-rh1498936-ppc_crc32.patch -# JDK-8164920, PR3574, RH1498936: ppc: enhancement of CRC32 intrinsic -Patch587: jdk8164920-pr3574-rh1498936-ppc_crc32_enhancement.patch - -############################################# -# -# Patches appearing in 8u211 -# -# This section includes patches which are present -# in the listed OpenJDK 8u release and should be -# able to be removed once that release is out -# and used by this RPM. -############################################# -# JDK-8029661, PR3642, RH1477159: Support TLS v1.2 algorithm in SunPKCS11 provider -Patch585: jdk8029661-pr3642-rh1477159-add_tlsv1_2_support_to_pkcs11_provider.patch -# JDK-8145096, PR3693: Undefined behaviour in HotSpot -Patch588: jdk8145096-pr3693-undefined_behaviour.patch ############################################# # @@ -1552,36 +1518,25 @@ sh %{SOURCE12} %patch202 %patch203 -# Debugging fixes -%patch206 -%patch207 -%patch210 - +# System security policy fixes %patch300 %patch301 %patch1 %patch3 %patch5 -%patch7 # s390 build fixes %patch102 %patch103 +%patch107 # AArch64 fixes %patch106 -%patch107 -%patch108 # x86 fixes %patch105 -# ppc64le fixes -%patch603 -%patch601 -%patch602 - # Upstreamable fixes %patch502 %patch504 @@ -1597,30 +1552,23 @@ sh %{SOURCE12} %patch523 %patch528 %patch529 +%patch531 %patch530 -%patch561 %patch563 %patch564 -%patch567 %patch571 -%patch572 %patch573 %patch574 %patch575 %patch576 %patch577 %patch620 -%patch621 %patch622 %patch623 %patch624 %patch625 -%patch583 -%patch584 -%patch585 -%patch586 -%patch587 -%patch588 +%patch626 +%patch627 # RPM-only fixes %patch525 @@ -1701,8 +1649,8 @@ export CFLAGS="$CFLAGS -mieee" # We use ourcppflags because the OpenJDK build seems to # pass EXTRA_CFLAGS to the HotSpot C++ compiler... # Explicitly set the C++ standard as the default has changed on GCC >= 6 -EXTRA_CFLAGS="%ourcppflags -std=gnu++98 -Wno-error -fno-delete-null-pointer-checks -fno-lifetime-dse" -EXTRA_CPP_FLAGS="%ourcppflags -std=gnu++98 -fno-delete-null-pointer-checks -fno-lifetime-dse" +EXTRA_CFLAGS="%ourcppflags -Wno-error" +EXTRA_CPP_FLAGS="%ourcppflags" %ifarch %{power64} ppc # fix rpmlint warnings @@ -2224,6 +2172,72 @@ require "copy_jdk_configs.lua" %endif %changelog +* Thu May 02 2019 Andrew Hughes - 1:1.8.0.212.b04-1 +- Remove additions to EXTRA_CFLAGS and EXTRA_CPP_FLAGS which are now made by upstream. +- Resolves: rhbz#1693468 + +* Thu May 02 2019 Andrew Hughes - 1:1.8.0.212.b04-1 +- Add JDK-8223219 to avoid -fstack-protector overriding -fstack-protector-strong +- Resolves: rhbz#1693468 + +* Thu Apr 11 2019 Andrew Hughes - 1:1.8.0.212.b04-0 +- Update to aarch64-shenandoah-jdk8u212-b04. +- Resolves: rhbz#1693468 + +* Thu Apr 11 2019 Andrew Hughes - 1:1.8.0.212.b03-0 +- Update to aarch64-shenandoah-jdk8u212-b03. +- Resolves: rhbz#1693468 + +* Thu Apr 11 2019 Andrew Hughes - 1:1.8.0.212.b02-0 +- Add new clhsdb and hsdb binaries. +- Resolves: rhbz#1693468 + +* Tue Apr 09 2019 Andrew Hughes - 1:1.8.0.212.b02-0 +- Update to aarch64-shenandoah-jdk8u212-b02. +- Remove patches included upstream + - JDK-8197429/PR3546/RH153662{2,3} + - JDK-8184309/PR3596 + - JDK-8210647/RH1632174 + - JDK-8029661/PR3642/RH1477159 + - JDK-8145096/PR3693 +- Re-generate patches + - JDK-8203030 +- Add casts to resolve s390 ambiguity in calls to log2_intptr +- Resolves: rhbz#1693468 + +* Sun Apr 07 2019 Andrew Hughes - 1:1.8.0.202.b08-0 +- Update to aarch64-shenandoah-jdk8u202-b08. +- Remove patches included upstream + - JDK-8211387/PR3559 + - JDK-8207057/PR3613 + - JDK-8165852/PR3468 + - JDK-8073139/PR1758/RH1191652 + - JDK-8044235 + - JDK-8172850/RH1640127 + - JDK-8209639/RH1640127 + - JDK-8131048/PR3574/RH1498936 + - JDK-8164920/PR3574/RH1498936 +- Re-generate patches + - JDK-8210647/RH1632174 +- Resolves: rhbz#1693468 + +* Thu Apr 04 2019 Andrew Hughes - 1:1.8.0.201.b13-0 +- Update to aarch64-shenandoah-jdk8u201-b13. +- Drop JDK-8160748 & JDK-8189170 AArch64 patches now applied upstream. +- Resolves: rhbz#1693468 + +* Tue Apr 02 2019 Severin Gehwolf - 1:1.8.0.201.b09-4 +- Update patch for RH1566890. + - Renamed rh1566890_speculative_store_bypass_so_added_more_per_task_speculation_control_CVE_2018_3639 to + rh1566890-CVE_2018_3639-speculative_store_bypass.patch + - Added dependent patch, + rh1566890-CVE_2018_3639-speculative_store_bypass_toggle.patch +- Resolves: rhbz#1693468 + +* Mon Feb 11 2019 Jiri Vanek - 1:1.8.0.201.b09-3 +- removed config declaration from links to config files +- Resolves: rhbz#1661577 + * Thu Feb 07 2019 Andrew Hughes - 1:1.8.0.201.b09-2 - Fix invalid dates earlier in the ChangeLog. - Resolves: rhbz#1661577