pkgsrc-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

CVS commit: pkgsrc/lang/openjdk21



Module Name:    pkgsrc
Committed By:   pho
Date:           Mon Aug 11 18:06:32 UTC 2025

Modified Files:
        pkgsrc/lang/openjdk21: Makefile bootstrap.mk distinfo hacks.mk
            options.mk
Added Files:
        pkgsrc/lang/openjdk21/patches:
            patch-src_hotspot_cpu_aarch64_jniFastGetField__aarch64.cpp
            patch-src_hotspot_os__cpu_bsd__aarch64_os__bsd__aarch64.cpp
            patch-src_hotspot_share_runtime_threadWXSetters.inline.hpp

Log Message:
lang/openjdk21: Workaround for the VM dying on Apple Silicon chips

See the patch for threadWXSetters.inline.hpp for details. I rebuilt the
bootkit for aarch64 with new patches applied. This may cause some
performance regression on Cortex series, but as I stated in the patch
comment, relying on implementation details of a particular chip is
fundamentally unsound, and that's why it didn't work on Apple Silicon in
the first place.

But since the upstream has stated they are knowingly doing this, the chance
of these patches getting accepted is slim, if not zero.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 pkgsrc/lang/openjdk21/Makefile
cvs rdiff -u -r1.2 -r1.3 pkgsrc/lang/openjdk21/bootstrap.mk
cvs rdiff -u -r1.9 -r1.10 pkgsrc/lang/openjdk21/distinfo
cvs rdiff -u -r1.1 -r1.2 pkgsrc/lang/openjdk21/hacks.mk
cvs rdiff -u -r1.3 -r1.4 pkgsrc/lang/openjdk21/options.mk
cvs rdiff -u -r0 -r1.1 \
    pkgsrc/lang/openjdk21/patches/patch-src_hotspot_cpu_aarch64_jniFastGetField__aarch64.cpp \
    pkgsrc/lang/openjdk21/patches/patch-src_hotspot_os__cpu_bsd__aarch64_os__bsd__aarch64.cpp \
    pkgsrc/lang/openjdk21/patches/patch-src_hotspot_share_runtime_threadWXSetters.inline.hpp

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: pkgsrc/lang/openjdk21/Makefile
diff -u pkgsrc/lang/openjdk21/Makefile:1.18 pkgsrc/lang/openjdk21/Makefile:1.19
--- pkgsrc/lang/openjdk21/Makefile:1.18 Sun Jun 15 13:45:03 2025
+++ pkgsrc/lang/openjdk21/Makefile      Mon Aug 11 18:06:32 2025
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.18 2025/06/15 13:45:03 ryoon Exp $
+# $NetBSD: Makefile,v 1.19 2025/08/11 18:06:32 pho Exp $
 
 DISTNAME=      jdk21u-${GITHUB_TAG:C/\+/-/}
 PKGNAME=       openjdk21-1.${GITHUB_TAG:C/\+/./:C/jdk-([.0-9]+).*/\1/}
@@ -50,6 +50,7 @@ CONFIG_GUESS_OVERRIDE+=       make/autoconf/bu
 CONFIG_SUB_OVERRIDE+=  make/autoconf/build-aux/autoconf-config.sub
 CONFIG_GUESS_OVERRIDE+=        make/autoconf/build-aux/autoconf-config.guess
 USE_LANGUAGES=         c c++
+USE_CXX_FEATURES=      c++14
 USE_TOOLS+=            bash gmake pax pkg-config unzip:run zip:run autoconf automake
 UNLIMIT_RESOURCES=     datasize stacksize virtualsize cputime
 
@@ -58,6 +59,10 @@ BUILDLINK_PASSTHRU_DIRS+=    ${ALT_BOOTDIR}
 # Try to use less POSIX semaphores (large MAKE_JOBS can consume them all)
 BOOT_JVMARGS=  -XX:+UnlockDiagnosticVMOptions
 
+# ${WRKSRC}/doc/building.mk explicitly states that its Makefiles are unsafe
+# to use -j.
+MAKE_JOBS_SAFE=        no
+
 CONFIGURE_ARGS+=       --openjdk-target=${MACHINE_GNU_PLATFORM}
 CONFIGURE_ARGS+=       --with-boot-jdk=${ALT_BOOTDIR}
 CONFIGURE_ARGS+=       --with-boot-jdk-jvmargs=${BOOT_JVMARGS:Q}
@@ -134,6 +139,42 @@ SUBST_FILES.fontpaths=             src/java.desktop
 SUBST_FILES.fontpaths+=                src/java.desktop/unix/native/common/awt/fontpath.c
 SUBST_VARS.fontpaths=          PREFIX BUILDLINK_PREFIX.fontconfig
 
+.if ${MACHINE_ARCH} == "aarch64"
+# See patches/patch-*threadWXSetters* for details.
+SUBST_CLASSES+=                        aa64-membar
+SUBST_STAGE.aa64-membar=       pre-build
+SUBST_MESSAGE.aa64-membar=     Fixing cache coherency issues
+SUBST_SED.aa64-membar=         -e 's/MACOS_AARCH64_ONLY(ThreadWXEnable /AARCH64_ONLY(ThreadWXEnable /'
+SUBST_FILES.aa64-membar+=      src/hotspot/os/posix/signals_posix.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/c1/c1_Runtime1.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/code/nmethod.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/gc/shared/barrierSetNMethod.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/gc/x/xBarrierSetNMethod.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/gc/z/zBarrierSetNMethod.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/interpreter/interpreterRuntime.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/jfr/instrumentation/jfrJvmtiAgent.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/jfr/jni/jfrJniMethod.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/jfr/recorder/storage/jfrStorage.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/jfr/support/jfrIntrinsics.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/jfr/writers/jfrJavaEventWriter.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/jniCheck.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/jvmtiEnter.xsl
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/jvmtiEnv.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/jvmtiExport.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/jvmtiExtensions.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/unsafe.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/upcallLinker.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/prims/whitebox.inline.hpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/runtime/continuationFreezeThaw.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/runtime/deoptimization.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/runtime/interfaceSupport.inline.hpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/runtime/javaThread.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/runtime/safepoint.cpp
+SUBST_FILES.aa64-membar+=      src/hotspot/share/runtime/sharedRuntime.cpp
+.endif
+
 .if ${OPSYS} == "NetBSD"
 # NetBSD's EVFILT_* EV_* are different from FreeBSD/OpenBSD's values.
 SUBST_CLASSES+=                        kqueue

Index: pkgsrc/lang/openjdk21/bootstrap.mk
diff -u pkgsrc/lang/openjdk21/bootstrap.mk:1.2 pkgsrc/lang/openjdk21/bootstrap.mk:1.3
--- pkgsrc/lang/openjdk21/bootstrap.mk:1.2      Thu Dec  7 16:26:37 2023
+++ pkgsrc/lang/openjdk21/bootstrap.mk  Mon Aug 11 18:06:32 2025
@@ -1,11 +1,11 @@
-# $NetBSD: bootstrap.mk,v 1.2 2023/12/07 16:26:37 tnn Exp $
+# $NetBSD: bootstrap.mk,v 1.3 2025/08/11 18:06:32 pho Exp $
 
 .if ${OPSYS} == "NetBSD" && ${OPSYS_VERSION} < 090000
 PKG_FAIL_REASON+=              "Only supports NetBSD >= 9"
 .endif
 
-.if (!empty(MACHINE_PLATFORM:MNetBSD-*-aarch64) || !empty(MACHINE_PLATFORM:MNetBSD-*-*earm*)) && ${OPSYS_VERSION} < 099983
-PKG_FAIL_REASON+=              "PR 55248: please update to NetBSD >= 9.99.83 to use this package"
+.if !empty(MACHINE_PLATFORM:MNetBSD-*-aarch64) && ${OPSYS_VERSION} < 090400
+PKG_FAIL_REASON+=              "Only supports NetBSD >= 9.4"
 .endif
 
 ONLY_FOR_PLATFORM+=            NetBSD-*-i386
@@ -25,11 +25,11 @@ EXTRACT_ONLY+=                      ${BOOT.nb9-amd64}
 .endif
 
 ONLY_FOR_PLATFORM+=            NetBSD-*-aarch64
-BOOT.nb9-aarch64=              bootstrap-jdk-1.21.0.1.12-netbsd-9-aarch64-20231207.tar.xz
-SITES.${BOOT.nb9-aarch64}=     ${MASTER_SITE_LOCAL:=openjdk21/}
+BOOT.nb10-aarch64=             bootstrap-jdk-1.21.0.7.6-netbsd-10-aarch64-20250811.tar.xz
+SITES.${BOOT.nb10-aarch64}=    ${MASTER_SITE_LOCAL:=openjdk21/}
 .if !empty(MACHINE_PLATFORM:MNetBSD-*-aarch64) || make(distinfo)
-DISTFILES+=                    ${BOOT.nb9-aarch64}
-EXTRACT_ONLY+=                 ${BOOT.nb9-aarch64}
+DISTFILES+=                    ${BOOT.nb10-aarch64}
+EXTRACT_ONLY+=                 ${BOOT.nb10-aarch64}
 .endif
 
 #ONLY_FOR_PLATFORM+=           NetBSD-*-earmv[67]hf

Index: pkgsrc/lang/openjdk21/distinfo
diff -u pkgsrc/lang/openjdk21/distinfo:1.9 pkgsrc/lang/openjdk21/distinfo:1.10
--- pkgsrc/lang/openjdk21/distinfo:1.9  Sun Jun 15 13:45:03 2025
+++ pkgsrc/lang/openjdk21/distinfo      Mon Aug 11 18:06:32 2025
@@ -1,14 +1,14 @@
-$NetBSD: distinfo,v 1.9 2025/06/15 13:45:03 ryoon Exp $
+$NetBSD: distinfo,v 1.10 2025/08/11 18:06:32 pho Exp $
 
-BLAKE2s (bootstrap-jdk-1.21.0.1.12-netbsd-9-aarch64-20231207.tar.xz) = a4e3fae37a90bcf53a842b94529aa46d5702785e0db27b2bcad0c692012f7953
-SHA512 (bootstrap-jdk-1.21.0.1.12-netbsd-9-aarch64-20231207.tar.xz) = 78563a04627e9cac7da620f4a888b6ad5ab4906cae4738ed4049495a7a07501a740af43557541e06c204503a581ac1be1f250195b3ba7fa882cdbfd09689e9bb
-Size (bootstrap-jdk-1.21.0.1.12-netbsd-9-aarch64-20231207.tar.xz) = 112924460 bytes
 BLAKE2s (bootstrap-jdk-1.21.0.1.12-netbsd-9-amd64-20231207.tar.xz) = 017a9d787a34faa997d72ac69bcafd9c8ab72354e3a1b751d1cb5d376b364f72
 SHA512 (bootstrap-jdk-1.21.0.1.12-netbsd-9-amd64-20231207.tar.xz) = 7ec4208363f44a378674a2b87687ab7facb60bf73118ebd4bec35f7912f073365b36efc4c4b3c034bc448139cb81106e18d6d3b1db45f4ab086ce1ed72bc21bf
 Size (bootstrap-jdk-1.21.0.1.12-netbsd-9-amd64-20231207.tar.xz) = 113417260 bytes
 BLAKE2s (bootstrap-jdk-1.21.0.1.12-netbsd-9-i386-20231207.tar.xz) = 6df557871e6795552305b28d778bcf8724b06e981ec72b35d2e5406cf1f25591
 SHA512 (bootstrap-jdk-1.21.0.1.12-netbsd-9-i386-20231207.tar.xz) = 15d1e8c3b9e440eb446857c42528d5d409baa6b173742930ec5dfe55ba1501e49af789ea75c8cc78eba6b977d7be2b2b4854d9657d75095c55d3941370ff7b94
 Size (bootstrap-jdk-1.21.0.1.12-netbsd-9-i386-20231207.tar.xz) = 111820092 bytes
+BLAKE2s (bootstrap-jdk-1.21.0.7.6-netbsd-10-aarch64-20250811.tar.xz) = 0ee9c4b9d6e62a67af62d62121769121d475e9c3a8d7c25a32cd70f62d01b873
+SHA512 (bootstrap-jdk-1.21.0.7.6-netbsd-10-aarch64-20250811.tar.xz) = 7b8b17b9a077ea45d92ad9c855df6f831d0f1233166cf9e1af0e16ed0a747575be0a361c398b981d59aee2c09f1ea3e1dcceef68c9876a6efce3c6a94b7c7e50
+Size (bootstrap-jdk-1.21.0.7.6-netbsd-10-aarch64-20250811.tar.xz) = 112607360 bytes
 BLAKE2s (jdk21u-jdk-21.0.7-6-1.tar.gz) = a4e744d0c83f45b107209d7ef700601f8f5ffd05a250f35913fda2c36a93822f
 SHA512 (jdk21u-jdk-21.0.7-6-1.tar.gz) = 0d08e2a5a9e24fbf8649cfefe835d3ee3a3a33d8af796d0595e0a8a3f73795246c4ac0a3d7ecb4a05a512045cddbc1c6d5c7b7cc0405790ce28f3a5592e9c8ce
 Size (jdk21u-jdk-21.0.7-6-1.tar.gz) = 113408248 bytes
@@ -21,6 +21,9 @@ SHA1 (patch-make_autoconf_lib-bundled.m4
 SHA1 (patch-make_autoconf_lib-freetype.m4) = bd791b99e4fd87f24432831fba1e814dd199445f
 SHA1 (patch-make_autoconf_lib-x11.m4) = 38038e6d7cfc2d15fb3537a52f11d2961cc2ec99
 SHA1 (patch-make_lib_Awt2dLibraries.gmk) = d69fa8c5cab173be2f41cfbd6479dad60a6337db
+SHA1 (patch-src_hotspot_cpu_aarch64_jniFastGetField__aarch64.cpp) = 60fc611b4b90ca9c534f1128256506c1ef9912bc
+SHA1 (patch-src_hotspot_os__cpu_bsd__aarch64_os__bsd__aarch64.cpp) = 61789f5d3956f45cd6b8c50038e3b27b281f0081
 SHA1 (patch-src_hotspot_os_bsd_os__bsd.cpp) = 5561ed502aa925cd3d0514c7ec298e0491d14ffc
+SHA1 (patch-src_hotspot_share_runtime_threadWXSetters.inline.hpp) = f704bb060803e500415b5d300e26857cf7288ca5
 SHA1 (patch-src_java.desktop_bsd_data_fontconfig_fontconfig.properties) = 32eda43f536dc3a9afb4f1f5f7acae8cb020d546
 SHA1 (patch-src_java.desktop_unix_native_common_awt_fontpath.c) = 4a65df0bf84af967f230636f1da1ec75fbb3f691

Index: pkgsrc/lang/openjdk21/hacks.mk
diff -u pkgsrc/lang/openjdk21/hacks.mk:1.1 pkgsrc/lang/openjdk21/hacks.mk:1.2
--- pkgsrc/lang/openjdk21/hacks.mk:1.1  Wed Nov 22 14:06:50 2023
+++ pkgsrc/lang/openjdk21/hacks.mk      Mon Aug 11 18:06:32 2025
@@ -1,4 +1,4 @@
-# $NetBSD: hacks.mk,v 1.1 2023/11/22 14:06:50 ryoon Exp $
+# $NetBSD: hacks.mk,v 1.2 2025/08/11 18:06:32 pho Exp $
 
 .if !defined(OPENJDK17_HACKS_MK)
 OPENJDK17_HACKS_MK=    # empty
@@ -18,9 +18,12 @@ post-wrapper:
 # JDK can correctly build itself. Compiling or running programs other than
 # openjdk itself on such hardware may still cause unexpected behaviour.
 #
-
-.if !empty(MACHINE_PLATFORM:MNetBSD-*-*arm*)   || \
-       !empty(MACHINE_PLATFORM:MNetBSD-*-aarch64)
+# The issue has been fixed in OpenJDK 21 for aarch64. We aren't sure if
+# it's still an issue on 32bit ARM. Probably not? You know when the issue
+# bites you: javac enters into an infinite loop while parsing subnormal
+# numeric constants.
+#
+.if ${MACHINE_PLATFORM:MNetBSD-*-*arm*}
 PKG_HACKS+=            broken-ieee-floats
 SUBST_CLASSES+=                fpu
 SUBST_STAGE.fpu=       pre-build

Index: pkgsrc/lang/openjdk21/options.mk
diff -u pkgsrc/lang/openjdk21/options.mk:1.3 pkgsrc/lang/openjdk21/options.mk:1.4
--- pkgsrc/lang/openjdk21/options.mk:1.3        Wed Dec  6 12:51:24 2023
+++ pkgsrc/lang/openjdk21/options.mk    Mon Aug 11 18:06:32 2025
@@ -1,4 +1,4 @@
-# $NetBSD: options.mk,v 1.3 2023/12/06 12:51:24 tnn Exp $
+# $NetBSD: options.mk,v 1.4 2025/08/11 18:06:32 pho Exp $
 
 PKG_OPTIONS_VAR=               PKG_OPTIONS.openjdk21
 PKG_OPTIONS_OPTIONAL_GROUPS=   variant
@@ -49,8 +49,10 @@ BUILDLINK_DEPMETHOD.libXt?=  build
 .include "../../x11/libXtst/buildlink3.mk"
 .include "../../x11/libXrandr/buildlink3.mk"
 .else
+CONFIGURE_ARGS+=       --x-includes=${X11BASE}/include
+CONFIGURE_ARGS+=       --x-libraries=${X11BASE}/lib
 CONFIGURE_ARGS+=       --enable-headless-only
-# We apparently still need the Xlib headers to build headless. why?
+# We apparently still need the Xlib headers and libraries to build headless. why?
 BUILDLINK_DEPMETHOD.libX11?=   build
 .include "../../x11/libX11/buildlink3.mk"
 BUILDLINK_DEPMETHOD.libXext?=build

Added files:

Index: pkgsrc/lang/openjdk21/patches/patch-src_hotspot_cpu_aarch64_jniFastGetField__aarch64.cpp
diff -u /dev/null pkgsrc/lang/openjdk21/patches/patch-src_hotspot_cpu_aarch64_jniFastGetField__aarch64.cpp:1.1
--- /dev/null   Mon Aug 11 18:06:32 2025
+++ pkgsrc/lang/openjdk21/patches/patch-src_hotspot_cpu_aarch64_jniFastGetField__aarch64.cpp    Mon Aug 11 18:06:32 2025
@@ -0,0 +1,32 @@
+$NetBSD: patch-src_hotspot_cpu_aarch64_jniFastGetField__aarch64.cpp,v 1.1 2025/08/11 18:06:32 pho Exp $
+
+Workaround for the Hotspot VM dying on Apple Silicon chips. See
+the patch to threadWXSetters.inline.hpp for details.
+
+--- src/hotspot/cpu/aarch64/jniFastGetField_aarch64.cpp.orig   2025-04-19 18:18:28.000000000 +0000
++++ src/hotspot/cpu/aarch64/jniFastGetField_aarch64.cpp
+@@ -59,8 +59,6 @@ static const Register result        = r7
+ // (8262896).  So each FastGetXXXField is wrapped into a C++ statically
+ // compiled template function that optionally switches to WXExec if necessary.
+ 
+-#ifdef __APPLE__
+-
+ static address generated_fast_get_field[T_LONG + 1 - T_BOOLEAN];
+ 
+ template<int BType> struct BasicTypeToJni {};
+@@ -87,15 +85,6 @@ address JNI_FastGetField::generate_fast_
+   return (address)static_fast_get_field_wrapper<BType>;
+ }
+ 
+-#else // __APPLE__
+-
+-template<int BType>
+-address JNI_FastGetField::generate_fast_get_int_field1() {
+-  return generate_fast_get_int_field0((BasicType)BType);
+-}
+-
+-#endif // __APPLE__
+-
+ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
+   const char *name;
+   switch (type) {
Index: pkgsrc/lang/openjdk21/patches/patch-src_hotspot_os__cpu_bsd__aarch64_os__bsd__aarch64.cpp
diff -u /dev/null pkgsrc/lang/openjdk21/patches/patch-src_hotspot_os__cpu_bsd__aarch64_os__bsd__aarch64.cpp:1.1
--- /dev/null   Mon Aug 11 18:06:32 2025
+++ pkgsrc/lang/openjdk21/patches/patch-src_hotspot_os__cpu_bsd__aarch64_os__bsd__aarch64.cpp   Mon Aug 11 18:06:32 2025
@@ -0,0 +1,19 @@
+$NetBSD: patch-src_hotspot_os__cpu_bsd__aarch64_os__bsd__aarch64.cpp,v 1.1 2025/08/11 18:06:32 pho Exp $
+
+Workaround for the Hotspot VM dying on Apple Silicon chips. See
+the patch to threadWXSetters.inline.hpp for details.
+
+--- src/hotspot/os_cpu/bsd_aarch64/os_bsd_aarch64.cpp.orig     2025-04-19 18:18:28.000000000 +0000
++++ src/hotspot/os_cpu/bsd_aarch64/os_bsd_aarch64.cpp
+@@ -694,6 +694,11 @@ bool PosixSignals::pd_hotspot_signal_han
+     assert(sig == info->si_signo, "bad siginfo");
+   }
+ */
++
++  // Enable WXWrite: this function is called by the signal handler at arbitrary
++  // point of execution.
++  ThreadWXEnable wx(WXWrite, thread);
++
+   // decide if this trap can be handled by a stub
+   address stub = nullptr;
+ 
Index: pkgsrc/lang/openjdk21/patches/patch-src_hotspot_share_runtime_threadWXSetters.inline.hpp
diff -u /dev/null pkgsrc/lang/openjdk21/patches/patch-src_hotspot_share_runtime_threadWXSetters.inline.hpp:1.1
--- /dev/null   Mon Aug 11 18:06:32 2025
+++ pkgsrc/lang/openjdk21/patches/patch-src_hotspot_share_runtime_threadWXSetters.inline.hpp    Mon Aug 11 18:06:32 2025
@@ -0,0 +1,63 @@
+$NetBSD: patch-src_hotspot_share_runtime_threadWXSetters.inline.hpp,v 1.1 2025/08/11 18:06:32 pho Exp $
+
+Workaround for the Hotspot VM dying on Apple Silicon chips:
+https://mail-index.netbsd.org/tech-pkg/2025/07/12/msg031385.html
+
+The problem is basically that Hotspot outrightly violates the architecture
+spec, and then it does all kinds of weird workarounds to compensate,
+assuming their workarounds happen to work on some implementations of actual
+chips. It essentially relies on implementation details of chips:
+https://cr.openjdk.org/~jrose/jvm/hotspot-cmc.html
+
+However, their workaround does not work on Apple Silicon. It's not Apple's
+fault, because Hotspot knowingly violates the spec. The problem does not
+come to the surface on Darwin/aarch64 but it's only by an accident:
+Darwin/aarch64 strictly forbids executing code in writable pages, and
+provides a non-portable function pthread_jit_write_protect_np(), which
+Hotspot uses every time it needs to modify code in memory.
+
+The function temporarily write-protects every executable page in the entire
+process space but only for the calling thread, so that the thread can
+execute code in pages that are otherwise writable. The important fact is
+that the function happens to issue data and instruction memory barriers
+(i.e. DSB and ISB) in its implementation. It turned out these barriers were
+what made Hotspot work on Apple Silicon.
+
+So, in order to make it work on non-Darwin OSes on Apple Silicon, and
+possibly on other non-Cortex aarch64 chips, we must issue memory barriers
+every time it would call pthread_jit_write_protect_np() on
+Darwin/aarch64. FreeBSD suffers from the same problem:
+https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=265284
+
+--- src/hotspot/share/runtime/threadWXSetters.inline.hpp.orig  2025-08-01 07:55:07.225394550 +0000
++++ src/hotspot/share/runtime/threadWXSetters.inline.hpp
+@@ -43,6 +43,29 @@ public:
+     }
+   }
+ };
++#elif defined(AARCH64)
++class ThreadWXEnable  {
++  WXMode _new_mode;
++public:
++  ThreadWXEnable(WXMode new_mode, Thread*) :
++    _new_mode(new_mode)
++  {
++    if (_new_mode == WXExec) {
++      // We are going to execute some code that has been potentially
++      // modified.
++      __asm__ __volatile__ ("dsb\tsy\n"
++                            "isb\tsy" : : : "memory");
++    }
++  }
++  ~ThreadWXEnable() {
++    if (_new_mode == WXWrite) {
++      // We may have modified some code that is going to be executed
++      // outside of this block.
++      __asm__ __volatile__ ("dsb\tsy\n"
++                            "isb\tsy" : : : "memory");
++    }
++  }
++};
+ #endif // __APPLE__ && AARCH64
+ 
+ #endif // SHARE_RUNTIME_THREADWXSETTERS_INLINE_HPP



Home | Main Index | Thread Index | Old Index