diff options
author | Simon Frankenberger <simon@fraho.eu> | 2019-02-10 20:49:38 +0100 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2019-12-26 09:12:03 +0000 |
commit | 2ab599f2bf602452603a4d9bf90f43d92143ab25 (patch) | |
tree | 067dcbb344566e1dc8c1e3229ef0662023f7540f /testing | |
parent | b0de7d61ddb7a3a48d97277449e888c69dcc478c (diff) | |
download | aports-2ab599f2bf602452603a4d9bf90f43d92143ab25.tar.bz2 aports-2ab599f2bf602452603a4d9bf90f43d92143ab25.tar.xz |
testing/openjdk12: New aport
Diffstat (limited to 'testing')
-rw-r--r-- | testing/openjdk12/APKBUILD | 308 | ||||
-rw-r--r-- | testing/openjdk12/Alpine_Bug_10126.java | 13 | ||||
-rw-r--r-- | testing/openjdk12/HelloWorld.java | 3 | ||||
-rw-r--r-- | testing/openjdk12/TestCryptoLevel.java | 72 | ||||
-rw-r--r-- | testing/openjdk12/TestECDSA.java | 49 | ||||
-rw-r--r-- | testing/openjdk12/aarch64.patch | 10 | ||||
-rw-r--r-- | testing/openjdk12/arm.patch | 28 | ||||
-rw-r--r-- | testing/openjdk12/build.patch | 517 | ||||
-rw-r--r-- | testing/openjdk12/ppc64le.patch | 183 | ||||
-rw-r--r-- | testing/openjdk12/x86.patch | 140 |
10 files changed, 1323 insertions, 0 deletions
diff --git a/testing/openjdk12/APKBUILD b/testing/openjdk12/APKBUILD new file mode 100644 index 0000000000..d1b0d74dcd --- /dev/null +++ b/testing/openjdk12/APKBUILD @@ -0,0 +1,308 @@ +# Contributor: Simon Frankenberger <simon-alpine@fraho.eu> +# Maintainer: Simon Frankenberger <simon-alpine@fraho.eu> +pkgname=openjdk12 +pkgver=12.0.2_p10 +_pkgver=${pkgver/_p/+} +pkgrel=0 +pkgdesc="Oracle OpenJDK 12" +url="https://hg.openjdk.java.net/jdk-updates/jdk12u" +arch="all !x86 !armhf !armv7" # oracle dopped support for 32 bit arches, so disable for now +license="GPL-2.0-with-classpath-exception" +makedepends="autoconf + bash + gawk + grep + make + openjdk11-jdk + zip + alsa-lib-dev + cups-dev + elfutils-dev + fontconfig-dev + freetype-dev + giflib-dev + lcms2-dev + libexecinfo-dev + libffi-dev + libjpeg-turbo-dev + libx11-dev + libxext-dev + libxrandr-dev + libxrender-dev + libxt-dev + libxtst-dev + linux-headers + zlib-dev" +depends="$pkgname-jmods $pkgname-demos $pkgname-doc $pkgname-jdk" # for the virtual openjdk12 package +subpackages="$pkgname-jmods:_jmods:noarch + $pkgname-demos:_demos:noarch + $pkgname-doc:_doc:noarch + $pkgname-dbg:_dbg + $pkgname-jre:_jre + $pkgname-src:_src:noarch + $pkgname-jre-headless:_jre_headless + $pkgname-jdk:_jdk" +source="jdk-$_pkgver.tar.bz2::http://hg.openjdk.java.net/jdk-updates/jdk12u/archive/jdk-$_pkgver.tar.bz2 + + build.patch + aarch64.patch + arm.patch + ppc64le.patch + x86.patch + + HelloWorld.java + TestECDSA.java + TestCryptoLevel.java + Alpine_Bug_10126.java +" +builddir="$srcdir/jdk12u-jdk-$_pkgver" + +_java_home="/usr/lib/jvm/java-12-openjdk" + +ldpath="$_java_home/lib:$_java_home/lib/server" +sonameprefix="$pkgname:" + +# enable running the JTReg tests in check? +# see comment in that function for explanation +_run_jtreg=${_run_jtreg:-0} +if [ $_run_jtreg -ne 0 ]; then + makedepends="$makedepends java-jtreg" + checkdepends="$checkdepends ttf-freefont xvfb-run" +fi + + +prepare() { + default_prepare + + # update autoconf files to detect alpine + update_config_sub + update_config_guess + + # remove not compilable module (hotspot jdk.hotspot.agent) + # this needs libthread_db which is only provided by glibc + # + # haven't found any way to disable this module so just remove it. + rm -r src/jdk.hotspot.agent +} + +build() { + if [ $_run_jtreg -ne 0 ]; then + _with_jtreg="--with-jtreg=/usr/share/java/jtreg" + else + _with_jtreg="--with-jtreg=no" + fi + + # CFLAGS, CXXFLAGS and LDFLAGS are ignored as shown by a warning + # in the output of ./configure unless used like such: + # --with-extra-cflags="${CFLAGS}" + # --with-extra-cxxflags="${CXXFLAGS}" + # --with-extra-ldflags="${LDFLAGS}" + # See also paragraph "Configure Control Variables" from "common/doc/building.md" + # shellcheck disable=2097 disable=2098 + CFLAGS='' CXXFLAGS='' LDFLAGS='' \ + bash ./configure \ + --build=$CBUILD \ + --host=$CHOST \ + --target=$CTARGET \ + --prefix="$_java_home" \ + --sysconfdir=/etc \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --localstatedir=/var \ + --with-extra-cflags="$CFLAGS" \ + --with-extra-cxxflags="$CXXFLAGS" \ + --with-extra-ldflags="$LDFLAGS" \ + --with-zlib=system \ + --with-libjpeg=system \ + --with-giflib=system \ + --with-libpng=system \ + --with-lcms=system \ + --with-jobs=${JOBS:-4} \ + --with-test-jobs=${JOBS:-4} \ + --with-native-debug-symbols=external \ + $_with_jtreg \ + --disable-warnings-as-errors \ + --disable-precompiled-headers \ + --enable-dtrace=no \ + --with-jvm-variants=server \ + --with-debug-level=release \ + --with-version-pre= \ + --with-version-opt=alpine-r${pkgrel} \ + --with-version-build=${_pkgver#*+} \ + --with-vendor-name="Alpine" \ + --with-vendor-url="https://alpinelinux.org/" \ + --with-vendor-bug-url="https://gitlab.alpinelinux.org/alpine/aports/issues" \ + --with-vendor-vm-bug-url="https://gitlab.alpinelinux.org/alpine/aports/issues" + MAKEFLAGS='' make jdk-image +} + +check() { + local _java_bin="./build/linux-*-server-release/images/jdk/bin" + + # 1) compile and run a simple hello world + $_java_bin/javac -d . "$srcdir"/HelloWorld.java + $_java_bin/java HelloWorld + + # 2) compile and run a testcase for unlimited policy + $_java_bin/javac -d . "$srcdir"/TestCryptoLevel.java + $_java_bin/java -cp . --add-opens java.base/javax.crypto=ALL-UNNAMED TestCryptoLevel + + # 3) compile and run a testcase for ECDSA signatures + $_java_bin/javac -d . "$srcdir"/TestECDSA.java + $_java_bin/java TestECDSA + + # 4) compile and run testcase for bug 10126 + $_java_bin/javac -d . "$srcdir"/Alpine_Bug_10126.java + $_java_bin/java Alpine_Bug_10126 + + # run the gtest unittest suites + # they don't take long, DO NOT DISABLE THEM! + MAKEFLAGS='' make test-hotspot-gtest + + # The jtreg tests take very, very long to finish and show some failures (9 - 12 on my machine, varying between runs) + # I think these are not critical and can be safely ignored. + # As the tests take too long, they are disabled by default. + # When updating this aport please let them run at least once on your machine to see if the failure count changes. + if [ $_run_jtreg -ne 0 ]; then + _logfile=$( mktemp -p "$builddir" ) + MAKEFLAGS='' xvfb-run make \ + run-test-tier1 \ + run-test-tier2 \ + run-test-tier3 \ + | tee "$_logfile" + msg "---------------------------------------" + msg "The build log can be found at $_logfile" + # abort the build so you may take a look at the logfile + false + return 1 + fi +} + +package() { + mkdir -p "$pkgdir/$_java_home" + cp -r build/linux-*-server-release/images/jdk/* "$pkgdir/$_java_home" +} + +_jmods() { + pkgdesc="Oracle OpenJDK 12 (jmods)" + depends="" + _fromroot="$pkgdir/$_java_home" + _toroot="$subpkgdir/$_java_home" + + mkdir -p "$_toroot" + mv "$_fromroot/jmods" "$_toroot" +} + +_demos() { + pkgdesc="Oracle OpenJDK 12 (demos)" + depends="" + _fromroot="$pkgdir/$_java_home" + _toroot="$subpkgdir/$_java_home" + + mkdir -p "$_toroot" + mv "$_fromroot/demo" "$_toroot" +} + +_doc() { + pkgdesc="Oracle OpenJDK 12 (Documentation)" + depends="" + _fromroot="$pkgdir/$_java_home" + _toroot="$subpkgdir/$_java_home" + + mkdir -p "$_toroot" + mv "$_fromroot/man" "$_toroot" +} + +_dbg() { + pkgdesc="Oracle OpenJDK 12 (debug)" + depends="$pkgname-jdk" + _fromroot="$pkgdir/$_java_home" + _toroot="$subpkgdir/$_java_home" + + mkdir -p "$_toroot/lib/server" + mv "$_fromroot"/lib/server/*.debuginfo "$_toroot"/lib/server + mv "$_fromroot"/lib/*.debuginfo "$_toroot"/lib +} + +_jre() { + pkgdesc="Oracle OpenJDK 12 (JRE)" + depends="$pkgname-jre-headless" + _fromroot="$pkgdir/$_java_home" + _toroot="$subpkgdir/$_java_home" + + mkdir -p "$_toroot/lib" + mv "$_fromroot/lib/libawt_xawt.so" \ + "$_fromroot/lib/libfontmanager.so" \ + "$_fromroot/lib/libjavajpeg.so" \ + "$_fromroot/lib/libjawt.so" \ + "$_fromroot/lib/libjsound.so" \ + "$_fromroot/lib/liblcms.so" \ + "$_fromroot/lib/libsplashscreen.so" \ + "$_toroot/lib" +} + +_src() { + pkgdesc="Oracle OpenJDK 12 (sources)" + depends="$pkgname-jre-headless" + mkdir -p "$subpkgdir/$_java_home"/lib + mv "$pkgdir"/$_java_home/lib/src.zip \ + "$subpkgdir"/$_java_home/lib/ +} + +_jre_headless() { + pkgdesc="Oracle OpenJDK 12 (JRE headless)" + depends="java-common java-cacerts" + _fromroot="$pkgdir/$_java_home" + _toroot="$subpkgdir/$_java_home" + + mkdir -p "$_toroot" + mv "$_fromroot/lib" "$_toroot" + + mkdir -p "$_toroot/bin" + for i in java \ + jjs \ + keytool \ + pack200 \ + rmid \ + rmiregistry \ + unpack200; do + mv "$_fromroot/bin/$i" "$_toroot/bin/$i" + done + + mv "$_fromroot/legal" "$_toroot" + mv "$_fromroot/conf" "$_toroot" + mv "$_fromroot/release" "$_toroot" + cp "$builddir/ASSEMBLY_EXCEPTION" "$_toroot" + cp "$builddir/LICENSE" "$_toroot" + cp "$builddir/README" "$_toroot" + + # symlink to shared cacerts store + rm "$_toroot/lib/security/cacerts" + ln -sf /etc/ssl/certs/java/cacerts \ + "$_toroot/lib/security/cacerts" + + # symlink for java-common to work (expects jre in $_java_home/jre) + ln -sf . "$_toroot/jre" +} + +_jdk() { + pkgdesc="Oracle OpenJDK 12 (JDK)" + depends="$pkgname-jre" + _fromroot="$pkgdir/$_java_home" + _toroot="$subpkgdir/$_java_home" + + mkdir -p "$_toroot" + mv "$_fromroot/bin" "$_toroot" + mv "$_fromroot/include" "$_toroot" +} + +sha512sums="62aa64ac500fa5a13349c9b27c54408c22336fe0573bc0575c94b9b3f9a6657cd8d19d45b1b9ae4f6c759892144d5abeed49f9ce0c004b84ade9f59c7aeaa923 jdk-12.0.2+10.tar.bz2 +fe1b54d6006e9f77c1ebc0705e28eb962f42571b4e4ee5cd73e0c7000cbf46f90df4a83b72421261e02abec488f493111d28893a27edf2af8eb43a9ecee00833 build.patch +8c0f1f8d2a78ebb30a8460bc0ea9cd2349cea98819df1577bf7de19a1dd82d06a593f36b4e17c282ed53d23f00163e387e3dd1f3c9e5a092726e78c3aa710370 aarch64.patch +56a74c4f4437358f62e2955724a9a8c547ccd765cf509476f435bf62b9dc07c323635a2679162bd6e83229e50cd60b7711cdf1e1dcb061f775f6be8c0a64a1f1 arm.patch +b6b1623a8dffd5a91bf122d7ef5a4b7cd2dff9dde072e9613eb38b1c95000c95b1eef7eb8ea8edc8bc3a59592ba3cf78bd32d31a8c6e3a30c24fc2030405a696 ppc64le.patch +0e4818b252e2af178f4c33e674de8dec934e7304f38c3f228aeb16ca8f3888b6bfdf0338a1b9fa48a44bc89bcf3ff4a48e22948a06f8df1fd9aeb93a7302d95a x86.patch +d1767dddd8e0956e25c0f77ed45c6fc86a1191bae1704a6dc33be490fd20eaa50461fe5c2a3349512059d555651e2eb41437dd3c1096c351e8ee68b4534a2579 HelloWorld.java +27e91edef89d26c0c5b9a813e2045f8d2b348745a506ae37b34b660fa7093da9a4e0e676ea41dc4a5c901bce02e5304d95e90f68d6c99cbf461b2da40a7a9853 TestECDSA.java +b02dff8d549f88317bb4c741a9e269e8d59eef990197d085388fc49c7423a4eb9367dbe1e02bffb10e7862f5980301eb58d4494e177d0e8f60af6b05c7fbbe60 TestCryptoLevel.java +fadd06c034614a25537246dfd66a4645c2a4c673f16b5d3e8abdd89c81baf04bd2797b26b0e589ec11ee08b90783b232a6d06c72589d211a5e10b8638a627911 Alpine_Bug_10126.java" diff --git a/testing/openjdk12/Alpine_Bug_10126.java b/testing/openjdk12/Alpine_Bug_10126.java new file mode 100644 index 0000000000..76574a1509 --- /dev/null +++ b/testing/openjdk12/Alpine_Bug_10126.java @@ -0,0 +1,13 @@ +public class Alpine_Bug_10126 { + public static void main(String[] args) throws Exception { + try (java.net.Socket sock = javax.net.ssl.SSLSocketFactory.getDefault().createSocket("bugs.alpinelinux.org", 443); + java.io.InputStream in = sock.getInputStream(); + java.io.OutputStream out = sock.getOutputStream()) { + out.write("GET / HTTP/1.0\n\nHost: gitlab.alpinelinux.org\n\nConnection: close\n\n\n\n".getBytes()); + out.flush(); + while (in.read(new byte[1024]) != -1) ; + } + System.out.println("Secured connection performed successfully"); + } +} + diff --git a/testing/openjdk12/HelloWorld.java b/testing/openjdk12/HelloWorld.java new file mode 100644 index 0000000000..0be813a190 --- /dev/null +++ b/testing/openjdk12/HelloWorld.java @@ -0,0 +1,3 @@ +public class HelloWorld { + public static void main(String[] args) { System.out.println("Hello World!"); } +} diff --git a/testing/openjdk12/TestCryptoLevel.java b/testing/openjdk12/TestCryptoLevel.java new file mode 100644 index 0000000000..3ed6c8dc15 --- /dev/null +++ b/testing/openjdk12/TestCryptoLevel.java @@ -0,0 +1,72 @@ +/* TestCryptoLevel -- Ensure unlimited crypto policy is in use. + Copyright (C) 2012 Red Hat, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program 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 Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; + +import java.security.Permission; +import java.security.PermissionCollection; + +public class TestCryptoLevel +{ + public static void main(String[] args) + throws NoSuchFieldException, ClassNotFoundException, + IllegalAccessException, InvocationTargetException + { + Class<?> cls = null; + Method def = null, exempt = null; + + try + { + cls = Class.forName("javax.crypto.JceSecurity"); + } + catch (ClassNotFoundException ex) + { + System.err.println("Running a non-Sun JDK."); + System.exit(0); + } + try + { + def = cls.getDeclaredMethod("getDefaultPolicy"); + exempt = cls.getDeclaredMethod("getExemptPolicy"); + } + catch (NoSuchMethodException ex) + { + System.err.println("Running IcedTea with the original crypto patch."); + System.exit(0); + } + def.setAccessible(true); + exempt.setAccessible(true); + PermissionCollection defPerms = (PermissionCollection) def.invoke(null); + PermissionCollection exemptPerms = (PermissionCollection) exempt.invoke(null); + Class<?> apCls = Class.forName("javax.crypto.CryptoAllPermission"); + Field apField = apCls.getDeclaredField("INSTANCE"); + apField.setAccessible(true); + Permission allPerms = (Permission) apField.get(null); + if (defPerms.implies(allPerms) && (exemptPerms == null || exemptPerms.implies(allPerms))) + { + System.err.println("Running with the unlimited policy."); + System.exit(0); + } + else + { + System.err.println("WARNING: Running with a restricted crypto policy."); + System.exit(-1); + } + } +} diff --git a/testing/openjdk12/TestECDSA.java b/testing/openjdk12/TestECDSA.java new file mode 100644 index 0000000000..abd81d1ced --- /dev/null +++ b/testing/openjdk12/TestECDSA.java @@ -0,0 +1,49 @@ +/* TestECDSA -- Ensure ECDSA signatures are working. + Copyright (C) 2016 Red Hat, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program 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 Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +import java.math.BigInteger; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.Signature; + +/** + * @test + */ +public class TestECDSA { + + public static void main(String[] args) throws Exception { + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC"); + KeyPair key = keyGen.generateKeyPair(); + + byte[] data = "This is a string to sign".getBytes("UTF-8"); + + Signature dsa = Signature.getInstance("NONEwithECDSA"); + dsa.initSign(key.getPrivate()); + dsa.update(data); + byte[] sig = dsa.sign(); + System.out.println("Signature: " + new BigInteger(1, sig).toString(16)); + + Signature dsaCheck = Signature.getInstance("NONEwithECDSA"); + dsaCheck.initVerify(key.getPublic()); + dsaCheck.update(data); + boolean success = dsaCheck.verify(sig); + if (!success) { + throw new RuntimeException("Test failed. Signature verification error"); + } + System.out.println("Test passed."); + } +} diff --git a/testing/openjdk12/aarch64.patch b/testing/openjdk12/aarch64.patch new file mode 100644 index 0000000000..26484ca080 --- /dev/null +++ b/testing/openjdk12/aarch64.patch @@ -0,0 +1,10 @@ +--- old/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp ++++ new/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp +@@ -77,7 +77,6 @@ + # include <pwd.h> + # include <poll.h> + # include <ucontext.h> +-# include <fpu_control.h> + + #ifdef BUILTIN_SIM + #define REG_SP REG_RSP diff --git a/testing/openjdk12/arm.patch b/testing/openjdk12/arm.patch new file mode 100644 index 0000000000..d31699a2bd --- /dev/null +++ b/testing/openjdk12/arm.patch @@ -0,0 +1,28 @@ +--- old/src/hotspot/os_cpu/linux_arm/os_linux_arm.cpp ++++ new/src/hotspot/os_cpu/linux_arm/os_linux_arm.cpp +@@ -71,7 +71,6 @@ + # include <pwd.h> + # include <poll.h> + # include <ucontext.h> +-# include <fpu_control.h> + # include <asm/ptrace.h> + + #define SPELL_REG_SP "sp" +@@ -91,6 +90,17 @@ + return (char*) -1; + } + ++// Stupid hack as the origin if below doesnt compile with gcc 8.2.0: ++// ++// os_linux_arm.cpp:114:5: error: missing binary operator before token "(" ++// #if NGREG == 16 ++// ^~~~~ ++// ++// The NGREG is 18, so force it to that value. ++#ifdef NGREG ++# undef NGREG ++#endif ++#define NGREG 18 + + #if NGREG == 16 + // These definitions are based on the observation that until diff --git a/testing/openjdk12/build.patch b/testing/openjdk12/build.patch new file mode 100644 index 0000000000..2195d15f83 --- /dev/null +++ b/testing/openjdk12/build.patch @@ -0,0 +1,517 @@ +--- old/make/ReleaseFile.gmk ++++ new/make/ReleaseFile.gmk +@@ -53,6 +53,7 @@ + $(call info-file-item, "JAVA_VERSION_DATE", "$(VERSION_DATE)") + $(call info-file-item, "OS_NAME", "$(RELEASE_FILE_OS_NAME)") + $(call info-file-item, "OS_ARCH", "$(RELEASE_FILE_OS_ARCH)") ++ $(call info-file-item, "LIBC", "musl") + endef + + # Param 1 - The file containing the MODULES list +--- old/make/hotspot/lib/CompileJvm.gmk ++++ new/make/hotspot/lib/CompileJvm.gmk +@@ -71,6 +71,7 @@ + -DHOTSPOT_BUILD_USER='"$(USERNAME)"' \ + -DHOTSPOT_VM_DISTRO='"$(HOTSPOT_VM_DISTRO)"' \ + -DCPU='"$(OPENJDK_TARGET_CPU_VM_VERSION)"' \ ++ -DLIBC='"musl"' \ + # + + ################################################################################ +--- old/make/lib/CoreLibraries.gmk ++++ new/make/lib/CoreLibraries.gmk +@@ -194,6 +194,7 @@ + endif + + LIBJLI_CFLAGS += $(LIBZ_CFLAGS) ++LIBJLI_CFLAGS += -DLIBC=\"musl\" + + ifneq ($(USE_EXTERNAL_LIBZ), true) + LIBJLI_EXTRA_FILES += \ +--- old/src/hotspot/os/linux/os_linux.cpp ++++ new/src/hotspot/os/linux/os_linux.cpp +@@ -99,7 +99,6 @@ + # include <string.h> + # include <syscall.h> + # include <sys/sysinfo.h> +-# include <gnu/libc-version.h> + # include <sys/ipc.h> + # include <sys/shm.h> + # include <link.h> +@@ -519,6 +518,11 @@ + // detecting pthread library + + void os::Linux::libpthread_init() { ++#if !defined(__GLIBC__) && !defined(__UCLIBC__) ++ // Hard code Alpine Linux supported musl compatible settings ++ os::Linux::set_glibc_version("glibc 2.9"); ++ os::Linux::set_libpthread_version("NPTL"); ++#else + // Save glibc and pthread version strings. + #if !defined(_CS_GNU_LIBC_VERSION) || \ + !defined(_CS_GNU_LIBPTHREAD_VERSION) +@@ -536,6 +540,7 @@ + str = (char *)malloc(n, mtInternal); + confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n); + os::Linux::set_libpthread_version(str); ++#endif + } + + ///////////////////////////////////////////////////////////////////////////// +@@ -2855,20 +2860,36 @@ + extern "C" JNIEXPORT void numa_warn(int number, char *where, ...) { } + extern "C" JNIEXPORT void numa_error(char *where) { } + ++static void* dlvsym_if_available(void* handle, const char* name, const char* version) { ++ typedef void* (*dlvsym_func_type)(void* handle, const char* name, const char* version); ++ static dlvsym_func_type dlvsym_func; ++ static bool initialized = false; ++ ++ if (!initialized) { ++ dlvsym_func = (dlvsym_func_type)dlsym(RTLD_NEXT, "dlvsym"); ++ initialized = true; ++ } ++ ++ if (dlvsym_func != NULL) { ++ void *f = dlvsym_func(handle, name, version); ++ if (f != NULL) { ++ return f; ++ } ++ } ++ ++ return dlsym(handle, name); ++} ++ + // Handle request to load libnuma symbol version 1.1 (API v1). If it fails + // load symbol from base version instead. + void* os::Linux::libnuma_dlsym(void* handle, const char *name) { +- void *f = dlvsym(handle, name, "libnuma_1.1"); +- if (f == NULL) { +- f = dlsym(handle, name); +- } +- return f; ++ return dlvsym_if_available(handle, name, "libnuma_1.1"); + } + + // Handle request to load libnuma symbol version 1.2 (API v2) only. + // Return NULL if the symbol is not defined in this particular version. + void* os::Linux::libnuma_v2_dlsym(void* handle, const char* name) { +- return dlvsym(handle, name, "libnuma_1.2"); ++ return dlvsym_if_available(handle, name, "libnuma_1.2"); + } + + bool os::Linux::libnuma_init() { +--- old/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp ++++ new/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp +@@ -75,9 +75,6 @@ + # include <pwd.h> + # include <poll.h> + # include <ucontext.h> +-#ifndef AMD64 +-# include <fpu_control.h> +-#endif + + #ifdef AMD64 + #define REG_SP REG_RSP +--- old/src/hotspot/share/gc/shared/genCollectedHeap.cpp ++++ new/src/hotspot/share/gc/shared/genCollectedHeap.cpp +@@ -1148,7 +1148,7 @@ + static ScratchBlock *removeSmallestScratch(ScratchBlock **prev_ptr) { + bool first = true; + size_t min_size = 0; // "first" makes this conceptually infinite. +- ScratchBlock **smallest_ptr, *smallest; ++ ScratchBlock **smallest_ptr = NULL, *smallest; + ScratchBlock *cur = *prev_ptr; + while (cur) { + assert(*prev_ptr == cur, "just checking"); +--- old/src/hotspot/share/runtime/vm_version.cpp ++++ new/src/hotspot/share/runtime/vm_version.cpp +@@ -270,7 +270,7 @@ + #endif + + #define INTERNAL_VERSION_SUFFIX VM_RELEASE ")" \ +- " for " OS "-" CPU FLOAT_ARCH_STR \ ++ " for " OS "-" CPU FLOAT_ARCH_STR LIBC \ + " JRE (" VERSION_STRING "), built on " __DATE__ " " __TIME__ \ + " by " XSTR(HOTSPOT_BUILD_USER) " with " HOTSPOT_BUILD_COMPILER + +--- old/src/hotspot/share/utilities/globalDefinitions_gcc.hpp ++++ new/src/hotspot/share/utilities/globalDefinitions_gcc.hpp +@@ -204,7 +204,7 @@ + #elif defined(__APPLE__) + inline int g_isnan(double f) { return isnan(f); } + #elif defined(LINUX) || defined(_ALLBSD_SOURCE) +-inline int g_isnan(float f) { return isnanf(f); } ++inline int g_isnan(float f) { return isnan(f); } + inline int g_isnan(double f) { return isnan(f); } + #else + #error "missing platform-specific definition here" +--- old/src/java.base/linux/native/libnet/linux_close.c ++++ new/src/java.base/linux/native/libnet/linux_close.c +@@ -60,7 +60,7 @@ + /* + * Signal to unblock thread + */ +-static int sigWakeup = (__SIGRTMAX - 2); ++static int sigWakeup; + + /* + * fdTable holds one entry per file descriptor, up to a certain +@@ -149,6 +149,7 @@ + /* + * Setup the signal handler + */ ++ sigWakeup = SIGRTMAX - 2; + sa.sa_handler = sig_wakeup; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); +--- old/src/java.base/unix/native/libjava/childproc.c ++++ new/src/java.base/unix/native/libjava/childproc.c +@@ -234,7 +234,13 @@ + { + if (envp == NULL || (char **) envp == environ) { + execvp(file, (char **) argv); +- return; ++ // ENOEXEC indicates that the file header was not recognized. The musl C ++ // library does not implement the fallback to /bin/sh for that case, so fall ++ // through to the code below which implements that fallback using ++ // execve_with_shell_fallback. ++ if (errno != ENOEXEC) { ++ return; ++ } + } + + if (*file == '\0') { +--- old/src/java.base/unix/native/libjava/jdk_util_md.h ++++ new/src/java.base/unix/native/libjava/jdk_util_md.h +@@ -37,7 +37,7 @@ + #define ISNAND(d) isnan(d) + #elif defined(__linux__) || defined(_ALLBSD_SOURCE) + #include <math.h> +-#define ISNANF(f) isnanf(f) ++#define ISNANF(f) isnan(f) + #define ISNAND(d) isnan(d) + #elif defined(_AIX) + #include <math.h> +--- old/src/java.base/unix/native/libjli/java_md_solinux.c ++++ new/src/java.base/unix/native/libjli/java_md_solinux.c +@@ -235,6 +235,39 @@ + char *dmllp = NULL; + char *p; /* a utility pointer */ + ++#ifdef __linux ++#ifndef LIBC ++#error "LIBC not set" ++#endif ++ ++ if (strcmp(LIBC, "musl") == 0) { ++ /* ++ * The musl library loader requires LD_LIBRARY_PATH to be set in ++ * order to correctly resolve the dependency libjava.so has on libjvm.so. ++ * ++ * Specifically, it differs from glibc in the sense that even if ++ * libjvm.so has already been loaded it will not be considered a ++ * candidate for resolving the dependency unless the *full* path ++ * of the already loaded library matches the dependency being loaded. ++ * ++ * libjvm.so is being loaded by the launcher using a long path to ++ * dlopen, not just the basename of the library. Typically this ++ * is something like "../lib/server/libjvm.so". However, if/when ++ * libjvm.so later tries to dlopen libjava.so (which it does in ++ * order to get access to a few functions implemented in ++ * libjava.so) the musl loader will, as part of loading ++ * dependent libraries, try to load libjvm.so using only its ++ * basename "libjvm.so". Since this does not match the longer ++ * path path it was first loaded with, the already loaded ++ * library is not considered a candidate, and the loader will ++ * instead look for libjvm.so elsewhere. If it's not in ++ * LD_LIBRARY_PATH the dependency load will fail, and libjava.so ++ * will therefore fail as well. ++ */ ++ return JNI_TRUE; ++ } ++#endif ++ + #ifdef AIX + /* We always have to set the LIBPATH on AIX because ld doesn't support $ORIGIN. */ + return JNI_TRUE; +--- old/src/java.base/unix/native/libnio/ch/NativeThread.c ++++ new/src/java.base/unix/native/libnio/ch/NativeThread.c +@@ -36,7 +36,7 @@ + #ifdef __linux__ + #include <pthread.h> + /* Also defined in net/linux_close.c */ +- #define INTERRUPT_SIGNAL (__SIGRTMAX - 2) ++ #define INTERRUPT_SIGNAL (SIGRTMAX - 2) + #elif defined(_AIX) + #include <pthread.h> + /* Also defined in net/aix_close.c */ +--- old/src/java.desktop/unix/native/libawt_xawt/xawt/XToolkit.c ++++ new/src/java.desktop/unix/native/libawt_xawt/xawt/XToolkit.c +@@ -27,9 +27,6 @@ + #include <X11/Xutil.h> + #include <X11/Xos.h> + #include <X11/Xatom.h> +-#ifdef __linux__ +-#include <execinfo.h> +-#endif + + #include <jvm.h> + #include <jni.h> +@@ -790,26 +787,6 @@ + } + return ret; + } +- +-#ifdef __linux__ +-void print_stack(void) +-{ +- void *array[10]; +- size_t size; +- char **strings; +- size_t i; +- +- size = backtrace (array, 10); +- strings = backtrace_symbols (array, size); +- +- fprintf (stderr, "Obtained %zd stack frames.\n", size); +- +- for (i = 0; i < size; i++) +- fprintf (stderr, "%s\n", strings[i]); +- +- free (strings); +-} +-#endif + + Window get_xawt_root_shell(JNIEnv *env) { + static jclass classXRootWindow = NULL; +--- old/src/jdk.jdwp.agent/share/native/libjdwp/util.h ++++ new/src/jdk.jdwp.agent/share/native/libjdwp/util.h +@@ -35,15 +35,15 @@ + #ifdef DEBUG + /* Just to make sure these interfaces are not used here. */ + #undef free +- #define free(p) Do not use this interface. ++ #define free do_not_use_this_interface_free + #undef malloc +- #define malloc(p) Do not use this interface. ++ #define malloc do_not_use_this_interface_malloc + #undef calloc +- #define calloc(p) Do not use this interface. ++ #define calloc do_not_use_this_interface_calloc + #undef realloc +- #define realloc(p) Do not use this interface. ++ #define realloc do_not_use_this_interface_realloc + #undef strdup +- #define strdup(p) Do not use this interface. ++ #define strdup do_not_use_this_interface_strdup + #endif + + #include "log_messages.h" +--- old/test/hotspot/jtreg/runtime/StackGuardPages/exeinvoke.c ++++ new/test/hotspot/jtreg/runtime/StackGuardPages/exeinvoke.c +@@ -33,6 +33,7 @@ + + #include <assert.h> + #include <jni.h> ++#include <jvm.h> + #include <alloca.h> + #include <signal.h> + #include <string.h> +@@ -91,6 +92,20 @@ + } + } + ++int get_java_stacksize () { ++ size_t stacksize; ++ pthread_attr_t attr; ++ JDK1_1InitArgs jdk_args; ++ ++ jdk_args.version = JNI_VERSION_1_1; ++ JNI_GetDefaultJavaVMInitArgs(&jdk_args); ++ if (jdk_args.javaStackSize <= 0) { ++ fprintf(stderr, "Test ERROR. Can't get a valid value for the default stacksize.\n"); ++ exit(7); ++ } ++ return jdk_args.javaStackSize; ++} ++ + void *run_java_overflow (void *p) { + JNIEnv *env; + jclass class_id; +@@ -254,13 +269,19 @@ + exit(7); + } + ++ int stack_size = get_java_stacksize(); + pthread_t thr; ++ pthread_attr_t thread_attr; + ++ pthread_attr_init(&thread_attr); ++ pthread_attr_setstacksize(&thread_attr, stack_size); ++ + if (argc > 1 && strcmp(argv[1], "test_java_overflow") == 0) { + printf("\nTesting JAVA_OVERFLOW\n"); + + printf("Testing stack guard page behaviour for other thread\n"); +- pthread_create (&thr, NULL, run_java_overflow, NULL); ++ ++ pthread_create (&thr, &thread_attr, run_java_overflow, NULL); + pthread_join (thr, NULL); + + printf("Testing stack guard page behaviour for initial thread\n"); +@@ -273,7 +294,7 @@ + printf("\nTesting NATIVE_OVERFLOW\n"); + + printf("Testing stack guard page behaviour for other thread\n"); +- pthread_create (&thr, NULL, run_native_overflow, NULL); ++ pthread_create (&thr, &thread_attr, run_native_overflow, NULL); + pthread_join (thr, NULL); + + printf("Testing stack guard page behaviour for initial thread\n"); +--- old/test/jdk/java/lang/ProcessBuilder/Basic.java ++++ new/test/jdk/java/lang/ProcessBuilder/Basic.java +@@ -396,8 +396,8 @@ + if (failed != 0) throw new Error("null PATH"); + } else if (action.equals("PATH search algorithm")) { + equal(System.getenv("PATH"), "dir1:dir2:"); +- check(new File("/bin/true").exists()); +- check(new File("/bin/false").exists()); ++ check(new File(TrueExe.path()).exists()); ++ check(new File(FalseExe.path()).exists()); + String[] cmd = {"prog"}; + ProcessBuilder pb1 = new ProcessBuilder(cmd); + ProcessBuilder pb2 = new ProcessBuilder(cmd); +@@ -438,13 +438,13 @@ + checkPermissionDenied(pb); + + // continue searching if EACCES +- copy("/bin/true", "dir2/prog"); ++ copy(TrueExe.path(), "dir2/prog"); + equal(run(pb).exitValue(), True.exitValue()); + new File("dir1/prog").delete(); + new File("dir2/prog").delete(); + + new File("dir2/prog").mkdirs(); +- copy("/bin/true", "dir1/prog"); ++ copy(TrueExe.path(), "dir1/prog"); + equal(run(pb).exitValue(), True.exitValue()); + + // Check empty PATH component means current directory. +@@ -460,10 +460,10 @@ + pb.command(command); + File prog = new File("./prog"); + // "Normal" binaries +- copy("/bin/true", "./prog"); ++ copy(TrueExe.path(), "./prog"); + equal(run(pb).exitValue(), + True.exitValue()); +- copy("/bin/false", "./prog"); ++ copy(FalseExe.path(), "./prog"); + equal(run(pb).exitValue(), + False.exitValue()); + prog.delete(); +@@ -518,12 +518,12 @@ + new File("dir2/prog").delete(); + new File("prog").delete(); + new File("dir3").mkdirs(); +- copy("/bin/true", "dir1/prog"); +- copy("/bin/false", "dir3/prog"); ++ copy(TrueExe.path(), "dir1/prog"); ++ copy(FalseExe.path(), "dir3/prog"); + pb.environment().put("PATH","dir3"); + equal(run(pb).exitValue(), True.exitValue()); +- copy("/bin/true", "dir3/prog"); +- copy("/bin/false", "dir1/prog"); ++ copy(TrueExe.path(), "dir3/prog"); ++ copy(FalseExe.path(), "dir1/prog"); + equal(run(pb).exitValue(), False.exitValue()); + + } finally { +@@ -620,6 +620,13 @@ + new File("/bin/false").exists()); + } + ++ static class BusyBox { ++ public static boolean is() { return is; } ++ private static final boolean is = ++ (! Windows.is() && ++ new File("/bin/busybox").exists()); ++ } ++ + static class UnicodeOS { + public static boolean is() { return is; } + private static final String osName = System.getProperty("os.name"); +@@ -658,6 +665,45 @@ + } + } + ++ // On alpine linux, /bin/true and /bin/false are just links to /bin/busybox. ++ // Some tests copy /bin/true and /bin/false to files with a different filename. ++ // However, copying the busbox executable into a file with a different name ++ // won't result in the expected return codes. As workaround, we create ++ // executable files that can be copied and produce the exepected return ++ // values. We use this workaround, if we find the busybox executable. ++ ++ private static class TrueExe { ++ public static String path() { return path; } ++ private static final String path = path0(); ++ private static String path0(){ ++ if (!BusyBox.is()) { ++ return "/bin/true"; ++ } ++ else { ++ File trueExe = new File("true"); ++ setFileContents(trueExe, "#!/bin/true\n"); ++ trueExe.setExecutable(true); ++ return trueExe.getAbsolutePath(); ++ } ++ } ++ } ++ ++ private static class FalseExe { ++ public static String path() { return path; } ++ private static final String path = path0(); ++ private static String path0(){ ++ if (!BusyBox.is()) { ++ return "/bin/false"; ++ } ++ else { ++ File falseExe = new File("false"); ++ setFileContents(falseExe, "#!/bin/false\n"); ++ falseExe.setExecutable(true); ++ return falseExe.getAbsolutePath(); ++ } ++ } ++ } ++ + static class EnglishUnix { + private static final Boolean is = + (! Windows.is() && isEnglish("LANG") && isEnglish("LC_ALL")); +@@ -1961,7 +2007,7 @@ + //---------------------------------------------------------------- + try { + new File("suBdiR").mkdirs(); +- copy("/bin/true", "suBdiR/unliKely"); ++ copy(TrueExe.path(), "suBdiR/unliKely"); + final ProcessBuilder pb = + new ProcessBuilder(new String[]{"unliKely"}); + pb.environment().put("PATH", "suBdiR"); +--- old/test/jdk/java/lang/ProcessHandle/InfoTest.java ++++ new/test/jdk/java/lang/ProcessHandle/InfoTest.java +@@ -298,7 +298,14 @@ + } + if (info.command().isPresent()) { + String command = info.command().get(); +- String expected = Platform.isWindows() ? "sleep.exe" : "sleep"; ++ String expected = "sleep"; ++ if (Platform.isWindows()) { ++ expected = "sleep.exe"; ++ } else if (new File("/bin/busybox").exists()) { ++ // With busybox sleep is just a sym link to busybox. ++ // The busbox executable is seen as ProcessHandle.Info command. ++ expected = "busybox"; ++ } + Assert.assertTrue(command.endsWith(expected), "Command: expected: \'" + + expected + "\', actual: " + command); + diff --git a/testing/openjdk12/ppc64le.patch b/testing/openjdk12/ppc64le.patch new file mode 100644 index 0000000000..d3b4ae0131 --- /dev/null +++ b/testing/openjdk12/ppc64le.patch @@ -0,0 +1,183 @@ +--- old/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp ++++ new/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp +@@ -1290,7 +1290,11 @@ + // the safepoing polling page. + ucontext_t* uc = (ucontext_t*) ucontext; + // Set polling address. ++#if defined(__GLIBC__) || defined(__UCLIBC__) + address addr = (address)uc->uc_mcontext.regs->gpr[ra] + (ssize_t)ds; ++#else // Musl ++ address addr = (address)uc->uc_mcontext.gp_regs[ra] + (ssize_t) ds; ++#endif + if (polling_address_ptr != NULL) { + *polling_address_ptr = addr; + } +@@ -1353,11 +1357,20 @@ + || (is_stdu(instruction) && rs == 1)) { + int ds = inv_ds_field(instruction); + // return banged address ++#if defined(__GLIBC__) || defined(__UCLIBC__) + return ds+(address)uc->uc_mcontext.regs->gpr[ra]; ++#else // Musl ++ return ds+(address)uc->uc_mcontext.gp_regs[ra]; ++#endif + } else if (is_stdux(instruction) && rs == 1) { + int rb = inv_rb_field(instruction); ++#if defined(__GLIBC__) || defined(__UCLIBC__) + address sp = (address)uc->uc_mcontext.regs->gpr[1]; + long rb_val = (long)uc->uc_mcontext.regs->gpr[rb]; ++#else // Musl ++ address sp = (address)uc->uc_mcontext.gp_regs[1]; ++ long rb_val = (long)uc->uc_mcontext.gp_regs[rb]; ++#endif + return ra != 1 || rb_val >= 0 ? NULL // not a stack bang + : sp + rb_val; // banged address + } +--- old/src/hotspot/cpu/ppc/vm_version_ppc.cpp ++++ new/src/hotspot/cpu/ppc/vm_version_ppc.cpp +@@ -768,7 +768,7 @@ + unsigned long auxv = getauxval(AT_HWCAP2); + + if (auxv & PPC_FEATURE2_HTM_NOSC) { +- if (auxv & PPC_FEATURE2_HAS_HTM) { ++ if (auxv & PPC_FEATURE2_HTM) { + // TM on POWER8 and POWER9 in compat mode (VM) is supported by the JVM. + // TM on POWER9 DD2.1 NV (baremetal) is not supported by the JVM (TM on + // POWER9 DD2.1 NV has a few issues that need a couple of firmware +--- old/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp ++++ new/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp +@@ -108,24 +108,42 @@ + // - if uc was filled by getcontext(), it is undefined - getcontext() does not fill + // it because the volatile registers are not needed to make setcontext() work. + // Hopefully it was zero'd out beforehand. ++#if defined(__GLIBC__) || defined(__UCLIBC__) + guarantee(uc->uc_mcontext.regs != NULL, "only use ucontext_get_pc in sigaction context"); + return (address)uc->uc_mcontext.regs->nip; ++#else // Musl ++ guarantee(uc->uc_mcontext.gp_regs != NULL, "only use ucontext_get_pc in sigaction context"); ++ return (address)uc->uc_mcontext.gp_regs[32]; ++#endif + } + + // modify PC in ucontext. + // Note: Only use this for an ucontext handed down to a signal handler. See comment + // in ucontext_get_pc. + void os::Linux::ucontext_set_pc(ucontext_t * uc, address pc) { ++#if defined(__GLIBC__) || defined(__UCLIBC__) + guarantee(uc->uc_mcontext.regs != NULL, "only use ucontext_set_pc in sigaction context"); + uc->uc_mcontext.regs->nip = (unsigned long)pc; ++#else // Musl ++ guarantee(uc->uc_mcontext.gp_regs != NULL, "only use ucontext_set_pc in sigaction context"); ++ uc->uc_mcontext.gp_regs[32] = (unsigned long)pc; ++#endif + } + + static address ucontext_get_lr(const ucontext_t * uc) { ++#if defined(__GLIBC__) || defined(__UCLIBC__) + return (address)uc->uc_mcontext.regs->link; ++#else // Musl ++ return (address)uc->uc_mcontext.gp_regs[36]; ++#endif + } + + intptr_t* os::Linux::ucontext_get_sp(const ucontext_t * uc) { ++#if defined(__GLIBC__) || defined(__UCLIBC__) + return (intptr_t*)uc->uc_mcontext.regs->gpr[1/*REG_SP*/]; ++#else // Musl ++ return (intptr_t*)uc->uc_mcontext.gp_regs[1/*REG_SP*/]; ++#endif + } + + intptr_t* os::Linux::ucontext_get_fp(const ucontext_t * uc) { +@@ -255,7 +273,13 @@ + // 3.2.1 "Machine State Register"), however note that ISA notation for bit + // numbering is MSB 0, so for normal bit numbering (LSB 0) they come to be + // bits 33 and 34. It's not related to endianness, just a notation matter. ++#if defined(__GLIBC__) || defined(__UCLIBC__) + if (second_uc->uc_mcontext.regs->msr & 0x600000000) { ++#else // Musl ++ // why 33? ++ // see comment for glibc NGREG: "r0-r31, nip, msr, lr, etc." ++ if (second_uc->uc_mcontext.gp_regs[33] & 0x600000000) { ++#endif + if (TraceTraps) { + tty->print_cr("caught signal in transaction, " + "ignoring to jump to abort handler"); +@@ -554,6 +578,7 @@ + const ucontext_t* uc = (const ucontext_t*)context; + + st->print_cr("Registers:"); ++#if defined(__GLIBC__) || defined(__UCLIBC__) + st->print("pc =" INTPTR_FORMAT " ", uc->uc_mcontext.regs->nip); + st->print("lr =" INTPTR_FORMAT " ", uc->uc_mcontext.regs->link); + st->print("ctr=" INTPTR_FORMAT " ", uc->uc_mcontext.regs->ctr); +@@ -562,8 +587,18 @@ + st->print("r%-2d=" INTPTR_FORMAT " ", i, uc->uc_mcontext.regs->gpr[i]); + if (i % 3 == 2) st->cr(); + } ++#else // Musl ++ st->print("pc =" INTPTR_FORMAT " ", uc->uc_mcontext.gp_regs[32]); ++ st->print("lr =" INTPTR_FORMAT " ", uc->uc_mcontext.gp_regs[36]); ++ st->print("ctr=" INTPTR_FORMAT " ", uc->uc_mcontext.gp_regs[35]); + st->cr(); ++ for (int i = 0; i < 32; i++) { ++ st->print("r%-2d=" INTPTR_FORMAT " ", i, uc->uc_mcontext.gp_regs[i]); ++ if (i % 3 == 2) st->cr(); ++ } ++#endif + st->cr(); ++ st->cr(); + + intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc); + st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", p2i(sp)); +@@ -587,12 +622,22 @@ + st->print_cr("Register to memory mapping:"); + st->cr(); + ++#if defined(__GLIBC__) || defined(__UCLIBC__) + st->print("pc ="); print_location(st, (intptr_t)uc->uc_mcontext.regs->nip); + st->print("lr ="); print_location(st, (intptr_t)uc->uc_mcontext.regs->link); + st->print("ctr ="); print_location(st, (intptr_t)uc->uc_mcontext.regs->ctr); ++#else // Musl ++ st->print("pc ="); print_location(st, (intptr_t)uc->uc_mcontext.gp_regs[32]); ++ st->print("lr ="); print_location(st, (intptr_t)uc->uc_mcontext.gp_regs[36]); ++ st->print("ctr ="); print_location(st, (intptr_t)uc->uc_mcontext.gp_regs[35]); ++#endif + for (int i = 0; i < 32; i++) { + st->print("r%-2d=", i); ++#if defined(__GLIBC__) || defined(__UCLIBC__) + print_location(st, uc->uc_mcontext.regs->gpr[i]); ++#else // Musl ++ print_location(st, uc->uc_mcontext.gp_regs[i]); ++#endif + } + st->cr(); + } +--- old/src/hotspot/os_cpu/linux_ppc/thread_linux_ppc.cpp ++++ new/src/hotspot/os_cpu/linux_ppc/thread_linux_ppc.cpp +@@ -56,8 +56,13 @@ + // if we were running Java code when SIGPROF came in. + if (isInJava) { + ucontext_t* uc = (ucontext_t*) ucontext; ++#if defined(__GLIBC__) || defined(__UCLIBC__) + frame ret_frame((intptr_t*)uc->uc_mcontext.regs->gpr[1/*REG_SP*/], + (address)uc->uc_mcontext.regs->nip); ++#else // Musl ++ frame ret_frame((intptr_t*)uc->uc_mcontext.gp_regs[1/*REG_SP*/], ++ (address)uc->uc_mcontext.gp_regs[32]); ++#endif + + if (ret_frame.pc() == NULL) { + // ucontext wasn't useful +@@ -69,7 +74,11 @@ + if (!((Method*)(istate->method))->is_metaspace_object()) { + return false; + } ++#if defined(__GLIBC__) || defined(__UCLIBC__) + uint64_t reg_bcp = uc->uc_mcontext.regs->gpr[14/*R14_bcp*/]; ++#else // Musl ++ uint64_t reg_bcp = uc->uc_mcontext.gp_regs[14/*R14_bcp*/]; ++#endif + uint64_t istate_bcp = istate->bcp; + uint64_t code_start = (uint64_t)(((Method*)(istate->method))->code_base()); + uint64_t code_end = (uint64_t)(((Method*)istate->method)->code_base() + ((Method*)istate->method)->code_size()); diff --git a/testing/openjdk12/x86.patch b/testing/openjdk12/x86.patch new file mode 100644 index 0000000000..8425b794f0 --- /dev/null +++ b/testing/openjdk12/x86.patch @@ -0,0 +1,140 @@ +--- old/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp ++++ new/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp +@@ -90,6 +90,126 @@ + #define SPELL_REG_FP "ebp" + #endif // AMD64 + ++// ============================================================================== ++// Taken from glibc 2.28 ++// source: https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86/fpu_control.h;h=4cb98c5679b2897ff4e5826d228cba6be589e24d;hb=3c03baca37fdcb52c3881e653ca392bba7a99c2b ++// ============================================================================== ++#ifndef AMD64 ++/* FPU control word bits. x86 version. ++ Copyright (C) 1993-2018 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Olaf Flebbe. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#ifndef _FPU_CONTROL_H ++#define _FPU_CONTROL_H 1 ++ ++/* Note that this file sets on x86-64 only the x87 FPU, it does not ++ touch the SSE unit. */ ++ ++/* Here is the dirty part. Set up your 387 through the control word ++ * (cw) register. ++ * ++ * 15-13 12 11-10 9-8 7-6 5 4 3 2 1 0 ++ * | reserved | IC | RC | PC | reserved | PM | UM | OM | ZM | DM | IM ++ * ++ * IM: Invalid operation mask ++ * DM: Denormalized operand mask ++ * ZM: Zero-divide mask ++ * OM: Overflow mask ++ * UM: Underflow mask ++ * PM: Precision (inexact result) mask ++ * ++ * Mask bit is 1 means no interrupt. ++ * ++ * PC: Precision control ++ * 11 - round to extended precision ++ * 10 - round to double precision ++ * 00 - round to single precision ++ * ++ * RC: Rounding control ++ * 00 - rounding to nearest ++ * 01 - rounding down (toward - infinity) ++ * 10 - rounding up (toward + infinity) ++ * 11 - rounding toward zero ++ * ++ * IC: Infinity control ++ * That is for 8087 and 80287 only. ++ * ++ * The hardware default is 0x037f which we use. ++ */ ++ ++#include <features.h> ++ ++/* masking of interrupts */ ++#define _FPU_MASK_IM 0x01 ++#define _FPU_MASK_DM 0x02 ++#define _FPU_MASK_ZM 0x04 ++#define _FPU_MASK_OM 0x08 ++#define _FPU_MASK_UM 0x10 ++#define _FPU_MASK_PM 0x20 ++ ++/* precision control */ ++#define _FPU_EXTENDED 0x300 /* libm requires double extended precision. */ ++#define _FPU_DOUBLE 0x200 ++#define _FPU_SINGLE 0x0 ++ ++/* rounding control */ ++#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ ++#define _FPU_RC_DOWN 0x400 ++#define _FPU_RC_UP 0x800 ++#define _FPU_RC_ZERO 0xC00 ++ ++#define _FPU_RESERVED 0xF0C0 /* Reserved bits in cw */ ++ ++ ++/* The fdlibm code requires strict IEEE double precision arithmetic, ++ and no interrupts for exceptions, rounding to nearest. */ ++ ++#define _FPU_DEFAULT 0x037f ++ ++/* IEEE: same as above. */ ++#define _FPU_IEEE 0x037f ++ ++/* Type of the control word. */ ++typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__))); ++ ++/* Macros for accessing the hardware control word. "*&" is used to ++ work around a bug in older versions of GCC. __volatile__ is used ++ to support combination of writing the control register and reading ++ it back. Without __volatile__, the old value may be used for reading ++ back under compiler optimization. ++ ++ Note that the use of these macros is not sufficient anymore with ++ recent hardware nor on x86-64. Some floating point operations are ++ executed in the SSE/SSE2 engines which have their own control and ++ status register. */ ++#define _FPU_GETCW(cw) __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw)) ++#define _FPU_SETCW(cw) __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw)) ++ ++/* Default control word set at startup. */ ++extern fpu_control_t __fpu_control; ++ ++#endif /* fpu_control.h */ ++ ++#endif // AMD64 ++// ============================================================================== ++// ============================================================================== ++// ============================================================================== ++ + address os::current_stack_pointer() { + #ifdef SPARC_WORKS + void *esp; +--- old/make/hotspot/lib/JvmOverrideFiles.gmk ++++ new/make/hotspot/lib/JvmOverrideFiles.gmk +@@ -80,7 +80,7 @@ + # Declare variables for each source file that needs the pic flag like this: + # BUILD_JVM_<srcfile>_CXXFLAGS := -fno-PIC + # This will get implicitly picked up by SetupNativeCompilation below. +- $(foreach s, $(NONPIC_SRC), $(eval BUILD_LIBJVM_$(notdir $s)_CXXFLAGS := -fno-PIC)) ++ #$(foreach s, $(NONPIC_SRC), $(eval BUILD_LIBJVM_$(notdir $s)_CXXFLAGS := -fno-PIC)) + endif + + else ifeq ($(OPENJDK_TARGET_OS), solaris) |